diff options
author | Stephen Dolan <mu@netsoc.tcd.ie> | 2013-05-13 16:04:30 +0100 |
---|---|---|
committer | Stephen Dolan <mu@netsoc.tcd.ie> | 2013-05-13 16:04:30 +0100 |
commit | d8706fd4607ee1b5b56debd4da39e3314739f126 (patch) | |
tree | f9f4d4309c573074cc2da0be8c1cabe3eade6364 /parser.y | |
parent | e13f24ab45c2bc6fead9d698bdeaa84746761692 (diff) |
Fix the //= operator.
Closes #62.
Diffstat (limited to 'parser.y')
-rw-r--r-- | parser.y | 12 |
1 files changed, 11 insertions, 1 deletions
@@ -163,6 +163,16 @@ static block gen_binop(block a, block b, int op) { static block gen_format(block a, jv fmt) { return BLOCK(a, gen_call("format", BLOCK(gen_lambda(gen_const(fmt))))); } + +static block gen_definedor_assign(block object, block val) { + block tmp = block_bind(gen_op_var_unbound(STOREV, "tmp"), + gen_noop(), OP_HAS_VARIABLE); + return BLOCK(gen_op_simple(DUP), + val, tmp, + gen_call("_modify", BLOCK(gen_lambda(object), + gen_lambda(gen_definedor(gen_noop(), + gen_op_var_bound(LOADV, tmp)))))); +} static block gen_update(block object, block val, int optype) { block tmp = block_bind(gen_op_var_unbound(STOREV, "tmp"), @@ -235,7 +245,7 @@ Exp "//" Exp { } | Exp "//=" Exp { - $$ = gen_update($1, gen_definedor(gen_noop(), $3), 0); + $$ = gen_definedor_assign($1, $3); } | Exp "|=" Exp { |