summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--numeric.c9
-rw-r--r--parse.y4
3 files changed, 20 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 698807ac50..61326ee40b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Mon Jun 10 19:02:19 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
+
+ * numeric.c (fix_lshift): negative shift count means right shift.
+
+ * numeric.c (fix_rshift): return -1 when left side operand is
+ negative.
+
+ * parse.y (yylex): `0_' should be an error. (ruby-bugs-ja:PR#239)
+
Sun Jun 9 17:40:41 2002 Takaaki Tateishi <ttate@kt.jaist.ac.jp>
* ext/dl: change the callback mechanism.
diff --git a/numeric.c b/numeric.c
index accd581133..6722ab0c99 100644
--- a/numeric.c
+++ b/numeric.c
@@ -1422,6 +1422,8 @@ fix_xor(x, y)
return rb_int2inum(val);
}
+static VALUE fix_rshift _((VALUE, VALUE));
+
static VALUE
fix_lshift(x, y)
VALUE x, y;
@@ -1430,6 +1432,8 @@ fix_lshift(x, y)
val = NUM2LONG(x);
width = NUM2LONG(y);
+ if (width < 0)
+ return fix_rshift(x, INT2FIX(-width));
if (width > (sizeof(VALUE)*CHAR_BIT-1)
|| ((unsigned long)val)>>(sizeof(VALUE)*CHAR_BIT-1-width) > 0) {
return rb_big_lshift(rb_int2big(val), y);
@@ -1448,11 +1452,12 @@ fix_rshift(x, y)
if (i < 0)
return fix_lshift(x, INT2FIX(-i));
if (i == 0) return x;
+ val = FIX2LONG(x);
if (i >= sizeof(long)*CHAR_BIT-1) {
- if (i < 0) return INT2FIX(-1);
+ if (val < 0) return INT2FIX(-1);
return INT2FIX(0);
}
- val = RSHIFT(FIX2LONG(x), i);
+ val = RSHIFT(val, i);
return INT2FIX(val);
}
diff --git a/parse.y b/parse.y
index 02b75b4410..f32dafebf1 100644
--- a/parse.y
+++ b/parse.y
@@ -3491,6 +3491,10 @@ yylex()
yylval.val = rb_cstr_to_inum(tok(), 8, Qfalse);
return tINTEGER;
}
+ if (nondigit) {
+ pushback(c);
+ goto trailing_uc;
+ }
}
if (c > '7' && c <= '9') {
yyerror("Illegal octal digit");