summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-06-26 09:45:09 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-06-26 09:45:09 +0000
commit05da25f297c4d26b6bb454a9649b1dd63a102910 (patch)
tree568d1118ca9c2c7bfbcaf2d2132a7e870367d407 /parse.y
parent839f4c5f3fdb4ea6b270fce17f1c3881060087d4 (diff)
980626
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@255 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y49
1 files changed, 40 insertions, 9 deletions
diff --git a/parse.y b/parse.y
index 2ae06640fe..a7844d4386 100644
--- a/parse.y
+++ b/parse.y
@@ -570,7 +570,6 @@ reswords : k__LINE__ | k__FILE__ | klBEGIN | klEND
arg : variable '=' arg
{
- value_expr($3);
$$ = assignable($1, $3);
fixpos($$, $3);
}
@@ -592,7 +591,6 @@ arg : variable '=' arg
}
| variable tOP_ASGN arg
{
- value_expr($3);
if (is_local_id($1)) {
if (local_id($1)||!dyna_in_block()) {
local_cnt($1);
@@ -601,26 +599,58 @@ arg : variable '=' arg
dyna_var_asgn($1, TRUE);
}
}
- $$ = assignable($1,call_op(gettable($1),$2,1,$3));
+ if ($2 == tOROP) {
+ $$ = NEW_UNLESS(gettable($1), assignable($1, $3), 0);
+ }
+ else if ($2 == tANDOP) {
+ $$ = NEW_IF(gettable($1), assignable($1, $3), 0);
+ }
+ else {
+ $$ = assignable($1,call_op(gettable($1),$2,1,$3));
+ }
fixpos($$, $3);
}
| primary '[' aref_args ']' tOP_ASGN arg
{
- NODE *args = NEW_LIST($6);
+ if ($5 == tOROP) {
+ $$ = NEW_UNLESS(NEW_CALL($1, tAREF, $3), aryset($1, $3, $6), 0);
+ }
+ else if ($5 == tANDOP) {
+ $$ = NEW_IF(NEW_CALL($1, tAREF, $3), aryset($1, $3, $6), 0);
+ }
+ else {
+ NODE *args = NEW_LIST($6);
- list_append($3, NEW_NIL());
- list_concat(args, $3);
- $$ = NEW_OP_ASGN1($1, $5, args);
+ list_append($3, NEW_NIL());
+ list_concat(args, $3);
+ $$ = NEW_OP_ASGN1($1, $5, args);
+ }
fixpos($$, $1);
}
| primary '.' tIDENTIFIER tOP_ASGN arg
{
- $$ = NEW_OP_ASGN2($1, $3, $4, $5);
+ if ($4 == tOROP) {
+ $$ = NEW_UNLESS(new_call($1, $3, 0), attrset($1, $3, $5), 0);
+ }
+ else if ($4 == tANDOP) {
+ $$ = NEW_IF(new_call($1, $3, 0), attrset($1, $3, $5), 0);
+ }
+ else {
+ $$ = NEW_OP_ASGN2($1, $3, $4, $5);
+ }
fixpos($$, $1);
}
| primary '.' tCONSTANT tOP_ASGN arg
{
- $$ = NEW_OP_ASGN2($1, $3, $4, $5);
+ if ($4 == tOROP) {
+ $$ = NEW_UNLESS(new_call($1, $3, 0), attrset($1, $3, $5), 0);
+ }
+ else if ($4 == tANDOP) {
+ $$ = NEW_IF(new_call($1, $3, 0), attrset($1, $3, $5), 0);
+ }
+ else {
+ $$ = NEW_OP_ASGN2($1, $3, $4, $5);
+ }
fixpos($$, $1);
}
| backref tOP_ASGN arg
@@ -3435,6 +3465,7 @@ assignable(id, val)
{
NODE *lhs = 0;
+ value_expr(val);
if (id == kSELF) {
yyerror("Can't change the value of self");
}