зеркало из https://github.com/github/ruby.git
* parse.y (arg): syntaxify tPOW negative number hack.
* parse.y (negate_lit): new function to negate literal numeric values in compile time. * regex.c (re_match_exec): charset info may be stored in MBC region when $KCODE != NONE. * error.c (set_syserr): should preserve duplicated error names. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3397 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
f4f0be3a12
Коммит
affe49b23b
18
ChangeLog
18
ChangeLog
|
@ -6,7 +6,23 @@ Wed Jan 22 23:19:57 2003 NAKAMURA Usaku <usa@ruby-lang.org>
|
|||
|
||||
* win32/win32.c (pipe_exec): remove unnecessary SetStdHandle().
|
||||
|
||||
Tue Jan 21 20:29:31 2003 Michal Rokos <michal@rokos.homeip.net>
|
||||
Wed Jan 22 20:20:59 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* parse.y (arg): syntaxify tPOW negative number hack.
|
||||
|
||||
* parse.y (negate_lit): new function to negate literal numeric
|
||||
values in compile time.
|
||||
|
||||
Wed Jan 22 15:36:54 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* regex.c (re_match_exec): charset info may be stored in MBC
|
||||
region when $KCODE != NONE.
|
||||
|
||||
Wed Jan 22 14:22:53 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* error.c (set_syserr): should preserve duplicated error names.
|
||||
|
||||
=Tue Jan 21 20:29:31 2003 Michal Rokos <michal@rokos.homeip.net>
|
||||
|
||||
* mkmf.rb: make possible to add files to clean and distclean targets
|
||||
|
||||
|
|
5
error.c
5
error.c
|
@ -479,10 +479,13 @@ set_syserr(n, name)
|
|||
VALUE error;
|
||||
|
||||
if (!st_lookup(syserr_tbl, n, &error)) {
|
||||
error = rb_define_class_under(rb_mErrno, name, rb_eSystemCallError);;
|
||||
error = rb_define_class_under(rb_mErrno, name, rb_eSystemCallError);
|
||||
rb_define_const(error, "Errno", INT2NUM(n));
|
||||
st_add_direct(syserr_tbl, n, error);
|
||||
}
|
||||
else {
|
||||
rb_define_const(rb_mErrno, name, error);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
69
parse.y
69
parse.y
|
@ -137,6 +137,7 @@ static NODE *new_evstr();
|
|||
static NODE *call_op();
|
||||
static int in_defined = 0;
|
||||
|
||||
static NODE *negate_lit();
|
||||
static NODE *ret_args();
|
||||
static NODE *arg_blk_pass();
|
||||
static NODE *new_call();
|
||||
|
@ -306,8 +307,9 @@ static void top_local_setup();
|
|||
%left tLSHFT tRSHFT
|
||||
%left '+' '-'
|
||||
%left '*' '/' '%'
|
||||
%right '!' '~' tUPLUS tUMINUS
|
||||
%right tUMINUS_NUM
|
||||
%right tPOW
|
||||
%right '!' '~' tUPLUS tUMINUS
|
||||
|
||||
%token tLAST_TOKEN
|
||||
|
||||
|
@ -1022,26 +1024,15 @@ arg : lhs '=' arg
|
|||
}
|
||||
| arg tPOW arg
|
||||
{
|
||||
int need_negate = Qfalse;
|
||||
|
||||
if ($1 && nd_type($1) == NODE_LIT) {
|
||||
|
||||
switch (TYPE($1->nd_lit)) {
|
||||
case T_FIXNUM:
|
||||
case T_FLOAT:
|
||||
case T_BIGNUM:
|
||||
if (RTEST(rb_funcall($1->nd_lit,'<',1,INT2FIX(0)))) {
|
||||
$1->nd_lit = rb_funcall($1->nd_lit,rb_intern("-@"),0,0);
|
||||
need_negate = Qtrue;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
$$ = call_op($1, tPOW, 1, $3);
|
||||
if (need_negate) {
|
||||
$$ = call_op($$, tUMINUS, 0, 0);
|
||||
}
|
||||
| tUMINUS_NUM tINTEGER tPOW arg
|
||||
{
|
||||
$$ = call_op(call_op($2, tPOW, 1, $4), tUMINUS);
|
||||
}
|
||||
| tUMINUS_NUM tFLOAT tPOW arg
|
||||
{
|
||||
$$ = call_op(call_op($2, tPOW, 1, $4), tUMINUS);
|
||||
}
|
||||
| tUPLUS arg
|
||||
{
|
||||
|
@ -1054,16 +1045,8 @@ arg : lhs '=' arg
|
|||
}
|
||||
| tUMINUS arg
|
||||
{
|
||||
if ($2 && nd_type($2) == NODE_LIT && FIXNUM_P($2->nd_lit)) {
|
||||
long i = FIX2LONG($2->nd_lit);
|
||||
|
||||
$2->nd_lit = LONG2NUM(-i);
|
||||
$$ = $2;
|
||||
}
|
||||
else {
|
||||
$$ = call_op($2, tUMINUS, 0, 0);
|
||||
}
|
||||
}
|
||||
| arg '|' arg
|
||||
{
|
||||
$$ = call_op($1, '|', 1, $3);
|
||||
|
@ -2096,6 +2079,14 @@ dsym : tSYMBEG xstring_contents tSTRING_END
|
|||
|
||||
numeric : tINTEGER
|
||||
| tFLOAT
|
||||
| tUMINUS_NUM tINTEGER %prec tLOWEST
|
||||
{
|
||||
$$ = negate_lit($2);
|
||||
}
|
||||
| tUMINUS_NUM tFLOAT %prec tLOWEST
|
||||
{
|
||||
$$ = negate_lit($2);
|
||||
}
|
||||
;
|
||||
|
||||
variable : tIDENTIFIER
|
||||
|
@ -3654,8 +3645,12 @@ yylex()
|
|||
lex_state = EXPR_BEG;
|
||||
pushback(c);
|
||||
if (ISDIGIT(c)) {
|
||||
#if 0
|
||||
c = '-';
|
||||
goto start_num;
|
||||
#else
|
||||
return tUMINUS_NUM;
|
||||
#endif
|
||||
}
|
||||
return tUMINUS;
|
||||
}
|
||||
|
@ -5268,6 +5263,26 @@ ret_args(node)
|
|||
return node;
|
||||
}
|
||||
|
||||
static NODE*
|
||||
negate_lit(node)
|
||||
NODE *node;
|
||||
{
|
||||
switch (TYPE(node->nd_lit)) {
|
||||
case T_FIXNUM:
|
||||
node->nd_lit = LONG2FIX(-FIX2LONG(node->nd_lit));
|
||||
break;
|
||||
case T_BIGNUM:
|
||||
node->nd_lit = rb_funcall(node->nd_lit,tUMINUS,0,0);
|
||||
break;
|
||||
case T_FLOAT:
|
||||
RFLOAT(node->nd_lit)->value = -RFLOAT(node->nd_lit)->value;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
static NODE *
|
||||
arg_blk_pass(node1, node2)
|
||||
NODE *node1;
|
||||
|
|
8
regex.c
8
regex.c
|
@ -740,7 +740,7 @@ is_in_list(c, b)
|
|||
unsigned long c;
|
||||
const unsigned char *b;
|
||||
{
|
||||
return is_in_list_sbc(c, b) || is_in_list_mbc(c, b);
|
||||
return is_in_list_sbc(c, b) || (current_mbctype ? is_in_list_mbc(c, b) : 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -3838,16 +3838,16 @@ re_match_exec(bufp, string_arg, size, pos, beg, regs)
|
|||
MBC2WC(c, d);
|
||||
not = is_in_list_mbc(c, p);
|
||||
if (!not) {
|
||||
part = not = is_in_list_sbc(cc, p);
|
||||
part = not = is_in_list(cc, p);
|
||||
}
|
||||
} else {
|
||||
not = is_in_list_sbc(c, p);
|
||||
not = is_in_list(c, p);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (TRANSLATE_P())
|
||||
c = (unsigned char)translate[c];
|
||||
not = is_in_list_sbc(c, p);
|
||||
not = is_in_list(c, p);
|
||||
}
|
||||
|
||||
if (*(p - 1) == (unsigned char)charset_not) {
|
||||
|
|
31
time.c
31
time.c
|
@ -236,11 +236,12 @@ time_arg(argc, argv, tm, usec)
|
|||
struct tm *tm;
|
||||
time_t *usec;
|
||||
{
|
||||
VALUE v[7];
|
||||
VALUE v[8];
|
||||
int i;
|
||||
long year;
|
||||
|
||||
MEMZERO(tm, struct tm, 1);
|
||||
*usec = 0;
|
||||
if (argc == 10) {
|
||||
v[0] = argv[5];
|
||||
v[1] = argv[4];
|
||||
|
@ -248,12 +249,13 @@ time_arg(argc, argv, tm, usec)
|
|||
v[3] = argv[2];
|
||||
v[4] = argv[1];
|
||||
v[5] = argv[0];
|
||||
*usec = 0;
|
||||
tm->tm_isdst = RTEST(argv[8]) ? 1 : 0;
|
||||
}
|
||||
else {
|
||||
rb_scan_args(argc, argv, "16", &v[0],&v[1],&v[2],&v[3],&v[4],&v[5],&v[6]);
|
||||
*usec = NIL_P(v[6]) ? 0 : obj2long(v[6]);
|
||||
rb_scan_args(argc, argv, "17", &v[0],&v[1],&v[2],&v[3],&v[4],&v[5],&v[6],&v[7]);
|
||||
/* v[6] may be usec or zone (parsedate) */
|
||||
/* v[7] is wday (parsedate; ignored) */
|
||||
tm->tm_wday = -1;
|
||||
tm->tm_isdst = -1;
|
||||
}
|
||||
|
||||
|
@ -275,25 +277,28 @@ time_arg(argc, argv, tm, usec)
|
|||
if (NIL_P(v[1])) {
|
||||
tm->tm_mon = 0;
|
||||
}
|
||||
else if (TYPE(v[1]) == T_STRING) {
|
||||
else {
|
||||
VALUE s = rb_check_string_type(v[1]);
|
||||
if (!NIL_P(s)) {
|
||||
tm->tm_mon = -1;
|
||||
for (i=0; i<12; i++) {
|
||||
if (RSTRING(v[1])->len == 3 &&
|
||||
if (RSTRING(s)->len == 3 &&
|
||||
strcasecmp(months[i], RSTRING(v[1])->ptr) == 0) {
|
||||
tm->tm_mon = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (tm->tm_mon == -1) {
|
||||
char c = RSTRING(v[1])->ptr[0];
|
||||
char c = RSTRING(s)->ptr[0];
|
||||
|
||||
if ('0' <= c && c <= '9') {
|
||||
tm->tm_mon = obj2long(v[1])-1;
|
||||
tm->tm_mon = obj2long(s)-1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
tm->tm_mon = obj2long(v[1]) - 1;
|
||||
tm->tm_mon = obj2long(v[1])-1;
|
||||
}
|
||||
}
|
||||
if (NIL_P(v[2])) {
|
||||
tm->tm_mday = 1;
|
||||
|
@ -304,6 +309,14 @@ time_arg(argc, argv, tm, usec)
|
|||
tm->tm_hour = NIL_P(v[3])?0:obj2long(v[3]);
|
||||
tm->tm_min = NIL_P(v[4])?0:obj2long(v[4]);
|
||||
tm->tm_sec = NIL_P(v[5])?0:obj2long(v[5]);
|
||||
if (!NIL_P(v[6])) {
|
||||
if (argc == 8) {
|
||||
/* v[6] is timezone, but ignored */
|
||||
}
|
||||
else {
|
||||
*usec = obj2long(v[6]);
|
||||
}
|
||||
}
|
||||
|
||||
/* value validation */
|
||||
if (
|
||||
|
|
Загрузка…
Ссылка в новой задаче