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:
parent
c08ebb301f
commit
f605705d2f
3 changed files with 99 additions and 34 deletions
|
@ -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
|
||||||
|
|
11
marshal.c
11
marshal.c
|
@ -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
114
parse.y
|
@ -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 '%';
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue