summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-02-19 06:43:34 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-02-19 06:43:34 +0000
commitf605705d2fbe5969af797cd6b5dc800bfcd47aad (patch)
tree2f85cafd0a557607ea9f6301363acefe61539e42
parentc08ebb301f304e316c853e210c2fbc7554de60f6 (diff)
* marshal.c (r_object): complete restoration before calling
r_regist(). * parse.y (yylex): operators in the "op" rule should make lex_state EXPR_ARG on EXPR_FNAME and EXPR_DOT. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@2091 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--marshal.c11
-rw-r--r--parse.y114
3 files changed, 99 insertions, 34 deletions
diff --git a/ChangeLog b/ChangeLog
index ad0826c93a..2aa91dc976 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Tue Feb 19 14:45:32 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * marshal.c (r_object): complete restoration before calling
+ r_regist().
+
+ * parse.y (yylex): operators in the "op" rule should make
+ lex_state EXPR_ARG on EXPR_FNAME and EXPR_DOT.
+
Tue Feb 19 13:38:10 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* variable.c (rb_cvar_set): define new class variable if it's not
diff --git a/marshal.c b/marshal.c
index a8e21c30b3..6e22bcc0b2 100644
--- a/marshal.c
+++ b/marshal.c
@@ -902,11 +902,10 @@ r_object(arg)
volatile long len = r_long(arg); /* gcc 2.7.2.3 -O2 bug?? */
v = rb_ary_new2(len);
- r_regist(v, arg);
while (len--) {
rb_ary_push(v, r_object(arg));
}
- return v;
+ return r_regist(v, arg);;
}
case TYPE_HASH:
@@ -915,7 +914,6 @@ r_object(arg)
long len = r_long(arg);
v = rb_hash_new();
- r_regist(v, arg);
while (len--) {
VALUE key = r_object(arg);
VALUE value = r_object(arg);
@@ -924,7 +922,7 @@ r_object(arg)
if (type == TYPE_HASH_DEF) {
RHASH(v)->ifnone = r_object(arg);
}
- return v;
+ return r_regist(v, arg);
}
case TYPE_STRUCT:
@@ -946,7 +944,6 @@ r_object(arg)
rb_ary_push(values, Qnil);
}
v = rb_struct_alloc(klass, values);
- r_regist(v, arg);
for (i=0; i<len; i++) {
slot = r_symbol(arg);
@@ -958,6 +955,7 @@ r_object(arg)
}
rb_struct_aset(v, INT2FIX(i), r_object(arg));
}
+ r_regist(v, arg);
return v;
}
break;
@@ -985,9 +983,8 @@ r_object(arg)
if (TYPE(v) != T_OBJECT) {
rb_raise(rb_eArgError, "dump format error");
}
- r_regist(v, arg);
r_ivar(v, arg);
- return v;
+ return r_regist(v, arg);
}
break;
diff --git a/parse.y b/parse.y
index 7ce6d889f1..9307b7e144 100644
--- a/parse.y
+++ b/parse.y
@@ -2854,31 +2854,38 @@ yylex()
case '*':
if ((c = nextc()) == '*') {
- lex_state = EXPR_BEG;
if (nextc() == '=') {
+ lex_state = EXPR_BEG;
yylval.id = tPOW;
return tOP_ASGN;
}
pushback(c);
- return tPOW;
- }
- if (c == '=') {
- yylval.id = '*';
- lex_state = EXPR_BEG;
- return tOP_ASGN;
- }
- pushback(c);
- if (lex_state == EXPR_ARG && space_seen && !ISSPACE(c)){
- rb_warning("`*' interpreted as argument prefix");
- c = tSTAR;
- }
- else if (lex_state == EXPR_BEG || lex_state == EXPR_MID) {
- c = tSTAR;
+ c = tPOW;
}
else {
- c = '*';
+ if (c == '=') {
+ yylval.id = '*';
+ lex_state = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(c);
+ if (lex_state == EXPR_ARG && space_seen && !ISSPACE(c)){
+ rb_warning("`*' interpreted as argument prefix");
+ c = tSTAR;
+ }
+ else if (lex_state == EXPR_BEG || lex_state == EXPR_MID) {
+ c = tSTAR;
+ }
+ else {
+ c = '*';
+ }
+ }
+ switch (lex_state) {
+ case EXPR_FNAME: case EXPR_DOT:
+ lex_state = EXPR_ARG; break;
+ default:
+ lex_state = EXPR_BEG; break;
}
- lex_state = EXPR_BEG;
return c;
case '!':
@@ -2914,7 +2921,12 @@ yylex()
}
}
- lex_state = EXPR_BEG;
+ switch (lex_state) {
+ case EXPR_FNAME: case EXPR_DOT:
+ lex_state = EXPR_ARG; break;
+ default:
+ lex_state = EXPR_BEG; break;
+ }
if ((c = nextc()) == '=') {
if ((c = nextc()) == '=') {
return tEQQ;
@@ -2947,7 +2959,12 @@ yylex()
}
pushback(c2);
}
- lex_state = EXPR_BEG;
+ switch (lex_state) {
+ case EXPR_FNAME: case EXPR_DOT:
+ lex_state = EXPR_ARG; break;
+ default:
+ lex_state = EXPR_BEG; break;
+ }
if (c == '=') {
if ((c = nextc()) == '>') {
return tCMP;
@@ -2957,6 +2974,7 @@ yylex()
}
if (c == '<') {
if (nextc() == '=') {
+ lex_state = EXPR_BEG;
yylval.id = tLSHFT;
return tOP_ASGN;
}
@@ -2967,12 +2985,18 @@ yylex()
return '<';
case '>':
- lex_state = EXPR_BEG;
+ switch (lex_state) {
+ case EXPR_FNAME: case EXPR_DOT:
+ lex_state = EXPR_ARG; break;
+ default:
+ lex_state = EXPR_BEG; break;
+ }
if ((c = nextc()) == '=') {
return tGEQ;
}
if (c == '>') {
if ((c = nextc()) == '=') {
+ lex_state = EXPR_BEG;
yylval.id = tRSHFT;
return tOP_ASGN;
}
@@ -3041,12 +3065,17 @@ yylex()
else {
c = '&';
}
- lex_state = EXPR_BEG;
+ switch (lex_state) {
+ case EXPR_FNAME: case EXPR_DOT:
+ lex_state = EXPR_ARG; break;
+ default:
+ lex_state = EXPR_BEG;
+ }
return c;
case '|':
- lex_state = EXPR_BEG;
if ((c = nextc()) == '|') {
+ lex_state = EXPR_BEG;
if ((c = nextc()) == '=') {
yylval.id = tOROP;
return tOP_ASGN;
@@ -3054,16 +3083,24 @@ yylex()
pushback(c);
return tOROP;
}
- else if (c == '=') {
+ if (c == '=') {
+ lex_state = EXPR_BEG;
yylval.id = '|';
return tOP_ASGN;
}
+ if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
+ lex_state = EXPR_ARG;
+ }
+ else {
+ lex_state = EXPR_BEG;
+ }
pushback(c);
return '|';
case '+':
c = nextc();
if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
+ lex_state = EXPR_ARG;
if (c == '@') {
return tUPLUS;
}
@@ -3093,6 +3130,7 @@ yylex()
case '-':
c = nextc();
if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
+ lex_state = EXPR_ARG;
if (c == '@') {
return tUMINUS;
}
@@ -3361,15 +3399,26 @@ yylex()
return parse_regx('/', '/');
}
}
- lex_state = EXPR_BEG;
+ switch (lex_state) {
+ case EXPR_FNAME: case EXPR_DOT:
+ lex_state = EXPR_ARG; break;
+ default:
+ lex_state = EXPR_BEG; break;
+ }
return '/';
case '^':
- lex_state = EXPR_BEG;
if ((c = nextc()) == '=') {
+ lex_state = EXPR_BEG;
yylval.id = '^';
return tOP_ASGN;
}
+ switch (lex_state) {
+ case EXPR_FNAME: case EXPR_DOT:
+ lex_state = EXPR_ARG; break;
+ default:
+ lex_state = EXPR_BEG; break;
+ }
pushback(c);
return '^';
@@ -3384,7 +3433,12 @@ yylex()
pushback(c);
}
}
- lex_state = EXPR_BEG;
+ switch (lex_state) {
+ case EXPR_FNAME: case EXPR_DOT:
+ lex_state = EXPR_ARG; break;
+ default:
+ lex_state = EXPR_BEG; break;
+ }
return '~';
case '(':
@@ -3402,6 +3456,7 @@ yylex()
case '[':
if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
+ lex_state = EXPR_ARG;
if ((c = nextc()) == ']') {
if ((c = nextc()) == '=') {
return tASET;
@@ -3493,7 +3548,12 @@ yylex()
if (lex_state == EXPR_ARG && space_seen && !ISSPACE(c)) {
goto quotation;
}
- lex_state = EXPR_BEG;
+ switch (lex_state) {
+ case EXPR_FNAME: case EXPR_DOT:
+ lex_state = EXPR_ARG; break;
+ default:
+ lex_state = EXPR_BEG; break;
+ }
pushback(c);
return '%';