Skip to content

Commit

Permalink
Assignment to keywords should not stop lexing/parsing in ripper (this…
Browse files Browse the repository at this point in the history
… should

very likely be backported to 9.1).
enebo committed Mar 25, 2018

Verified

This commit was signed with the committer’s verified signature.
headius Charles Oliver Nutter
1 parent f06aa9d commit 957d0f2
Showing 2 changed files with 54 additions and 28 deletions.
43 changes: 28 additions & 15 deletions core/src/main/java/org/jruby/ext/ripper/RipperParser.java
Original file line number Diff line number Diff line change
@@ -2166,37 +2166,43 @@ public Object yyparse (RipperLexer yyLex) throws java.io.IOException {
};
states[97] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to nil");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[98] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't change the value of self");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[99] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to true");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[100] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to false");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[101] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to __FILE__");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[102] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to __LINE__");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
@@ -2292,43 +2298,50 @@ public Object yyparse (RipperLexer yyLex) throws java.io.IOException {
};
states[116] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to nil");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[117] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't change the value of self");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[118] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to true");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[119] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to false");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[120] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to __FILE__");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[121] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to __LINE__");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
states[122] = new RipperParserState() {
@Override public Object execute(RipperParser p, Object yyVal, Object[] yyVals, int yyTop) {
p.yyerror("Can't assign to __ENCODING__");
yyVal = p.dispatch("on_assign_error",
p.dispatch("on_var_field", ((IRubyObject)yyVals[0+yyTop])));
return yyVal;
}
};
@@ -4832,6 +4845,6 @@ public Object yyparse (RipperLexer yyLex) throws java.io.IOException {
}
};
}
// line 2173 "RipperParser.y"
// line 2186 "RipperParser.y"
}
// line 9723 "-"
// line 9736 "-"
39 changes: 26 additions & 13 deletions core/src/main/java/org/jruby/ext/ripper/RipperParser.y
Original file line number Diff line number Diff line change
@@ -552,22 +552,28 @@ mlhs_node : /*mri:user_variable*/ tIDENTIFIER {
$$ = p.dispatch("on_var_field", $1);
} /*mri:user_variable*/
| /*mri:keyword_variable*/ keyword_nil {
p.yyerror("Can't assign to nil");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword_self {
p.yyerror("Can't change the value of self");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword_true {
p.yyerror("Can't assign to true");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword_false {
p.yyerror("Can't assign to false");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword__FILE__ {
p.yyerror("Can't assign to __FILE__");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword__LINE__ {
p.yyerror("Can't assign to __LINE__");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword__ENCODING__ {
p.yyerror("Can't assign to __ENCODING__");
@@ -622,25 +628,32 @@ lhs : /*mri:user_variable*/ tIDENTIFIER {
$$ = p.dispatch("on_var_field", $1);
} /*mri:user_variable*/
| /*mri:keyword_variable*/ keyword_nil {
p.yyerror("Can't assign to nil");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword_self {
p.yyerror("Can't change the value of self");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword_true {
p.yyerror("Can't assign to true");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword_false {
p.yyerror("Can't assign to false");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword__FILE__ {
p.yyerror("Can't assign to __FILE__");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword__LINE__ {
p.yyerror("Can't assign to __LINE__");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
}
| keyword__ENCODING__ {
p.yyerror("Can't assign to __ENCODING__");
$$ = p.dispatch("on_assign_error",
p.dispatch("on_var_field", $1));
} /*mri:keyword_variable*/
| primary_value '[' opt_call_args rbracket {
$$ = p.dispatch("on_aref_field", $1, $3);

0 comments on commit 957d0f2

Please sign in to comment.