1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
matz 2002-02-19 06:43:34 +00:00
parent c08ebb301f
commit f605705d2f
3 changed files with 99 additions and 34 deletions

View file

@ -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> 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 * variable.c (rb_cvar_set): define new class variable if it's not

View file

@ -902,11 +902,10 @@ r_object(arg)
volatile long len = r_long(arg); /* gcc 2.7.2.3 -O2 bug?? */ volatile long len = r_long(arg); /* gcc 2.7.2.3 -O2 bug?? */
v = rb_ary_new2(len); v = rb_ary_new2(len);
r_regist(v, arg);
while (len--) { while (len--) {
rb_ary_push(v, r_object(arg)); rb_ary_push(v, r_object(arg));
} }
return v; return r_regist(v, arg);;
} }
case TYPE_HASH: case TYPE_HASH:
@ -915,7 +914,6 @@ r_object(arg)
long len = r_long(arg); long len = r_long(arg);
v = rb_hash_new(); v = rb_hash_new();
r_regist(v, arg);
while (len--) { while (len--) {
VALUE key = r_object(arg); VALUE key = r_object(arg);
VALUE value = r_object(arg); VALUE value = r_object(arg);
@ -924,7 +922,7 @@ r_object(arg)
if (type == TYPE_HASH_DEF) { if (type == TYPE_HASH_DEF) {
RHASH(v)->ifnone = r_object(arg); RHASH(v)->ifnone = r_object(arg);
} }
return v; return r_regist(v, arg);
} }
case TYPE_STRUCT: case TYPE_STRUCT:
@ -946,7 +944,6 @@ r_object(arg)
rb_ary_push(values, Qnil); rb_ary_push(values, Qnil);
} }
v = rb_struct_alloc(klass, values); v = rb_struct_alloc(klass, values);
r_regist(v, arg);
for (i=0; i<len; i++) { for (i=0; i<len; i++) {
slot = r_symbol(arg); slot = r_symbol(arg);
@ -958,6 +955,7 @@ r_object(arg)
} }
rb_struct_aset(v, INT2FIX(i), r_object(arg)); rb_struct_aset(v, INT2FIX(i), r_object(arg));
} }
r_regist(v, arg);
return v; return v;
} }
break; break;
@ -985,9 +983,8 @@ r_object(arg)
if (TYPE(v) != T_OBJECT) { if (TYPE(v) != T_OBJECT) {
rb_raise(rb_eArgError, "dump format error"); rb_raise(rb_eArgError, "dump format error");
} }
r_regist(v, arg);
r_ivar(v, arg); r_ivar(v, arg);
return v; return r_regist(v, arg);
} }
break; break;

114
parse.y
View file

@ -2854,31 +2854,38 @@ yylex()
case '*': case '*':
if ((c = nextc()) == '*') { if ((c = nextc()) == '*') {
lex_state = EXPR_BEG;
if (nextc() == '=') { if (nextc() == '=') {
lex_state = EXPR_BEG;
yylval.id = tPOW; yylval.id = tPOW;
return tOP_ASGN; return tOP_ASGN;
} }
pushback(c); pushback(c);
return tPOW; c = 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;
} }
else { 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; return c;
case '!': 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()) == '=') {
if ((c = nextc()) == '=') { if ((c = nextc()) == '=') {
return tEQQ; return tEQQ;
@ -2947,7 +2959,12 @@ yylex()
} }
pushback(c2); 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 == '=') {
if ((c = nextc()) == '>') { if ((c = nextc()) == '>') {
return tCMP; return tCMP;
@ -2957,6 +2974,7 @@ yylex()
} }
if (c == '<') { if (c == '<') {
if (nextc() == '=') { if (nextc() == '=') {
lex_state = EXPR_BEG;
yylval.id = tLSHFT; yylval.id = tLSHFT;
return tOP_ASGN; return tOP_ASGN;
} }
@ -2967,12 +2985,18 @@ yylex()
return '<'; return '<';
case '>': 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()) == '=') { if ((c = nextc()) == '=') {
return tGEQ; return tGEQ;
} }
if (c == '>') { if (c == '>') {
if ((c = nextc()) == '=') { if ((c = nextc()) == '=') {
lex_state = EXPR_BEG;
yylval.id = tRSHFT; yylval.id = tRSHFT;
return tOP_ASGN; return tOP_ASGN;
} }
@ -3041,12 +3065,17 @@ yylex()
else { else {
c = '&'; 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; return c;
case '|': case '|':
lex_state = EXPR_BEG;
if ((c = nextc()) == '|') { if ((c = nextc()) == '|') {
lex_state = EXPR_BEG;
if ((c = nextc()) == '=') { if ((c = nextc()) == '=') {
yylval.id = tOROP; yylval.id = tOROP;
return tOP_ASGN; return tOP_ASGN;
@ -3054,16 +3083,24 @@ yylex()
pushback(c); pushback(c);
return tOROP; return tOROP;
} }
else if (c == '=') { if (c == '=') {
lex_state = EXPR_BEG;
yylval.id = '|'; yylval.id = '|';
return tOP_ASGN; return tOP_ASGN;
} }
if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
lex_state = EXPR_ARG;
}
else {
lex_state = EXPR_BEG;
}
pushback(c); pushback(c);
return '|'; return '|';
case '+': case '+':
c = nextc(); c = nextc();
if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
lex_state = EXPR_ARG;
if (c == '@') { if (c == '@') {
return tUPLUS; return tUPLUS;
} }
@ -3093,6 +3130,7 @@ yylex()
case '-': case '-':
c = nextc(); c = nextc();
if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
lex_state = EXPR_ARG;
if (c == '@') { if (c == '@') {
return tUMINUS; return tUMINUS;
} }
@ -3361,15 +3399,26 @@ yylex()
return parse_regx('/', '/'); 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 '/'; return '/';
case '^': case '^':
lex_state = EXPR_BEG;
if ((c = nextc()) == '=') { if ((c = nextc()) == '=') {
lex_state = EXPR_BEG;
yylval.id = '^'; yylval.id = '^';
return tOP_ASGN; 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); pushback(c);
return '^'; return '^';
@ -3384,7 +3433,12 @@ yylex()
pushback(c); 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 '~'; return '~';
case '(': case '(':
@ -3402,6 +3456,7 @@ yylex()
case '[': case '[':
if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
lex_state = EXPR_ARG;
if ((c = nextc()) == ']') { if ((c = nextc()) == ']') {
if ((c = nextc()) == '=') { if ((c = nextc()) == '=') {
return tASET; return tASET;
@ -3493,7 +3548,12 @@ yylex()
if (lex_state == EXPR_ARG && space_seen && !ISSPACE(c)) { if (lex_state == EXPR_ARG && space_seen && !ISSPACE(c)) {
goto quotation; 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); pushback(c);
return '%'; return '%';