diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-11-30 08:10:42 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-11-30 08:10:42 -0800 |
commit | 1702ed8df842ca7c80c293e4e5f353dbf370c0fd (patch) | |
tree | d5085bb9a976a975653333a164f84d072170c69a /eval.c | |
parent | 80af0b52d0ad27cd9cad279818e9066a1d8139c2 (diff) | |
download | txr-1702ed8df842ca7c80c293e4e5f353dbf370c0fd.tar.gz txr-1702ed8df842ca7c80c293e4e5f353dbf370c0fd.tar.bz2 txr-1702ed8df842ca7c80c293e4e5f353dbf370c0fd.zip |
* eval.c (op_modplace): Bugfix: conflation of new value and
increment value. Separate new value and increment value, and check
number of arguments.
* lib.h (or2): Turned into inline function due to multiple
argument evaluation.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -509,7 +509,8 @@ static val op_modplace(val form, val env) { val op = first(form); val place = second(form); - val inc = or2(eval(third(form), env, form), num(1)); + val third_arg_p = rest(rest(form)); + val newval = if3(car(third_arg_p), eval(third(form), env, form), nil); val *loc = 0; val binding = nil; @@ -547,14 +548,22 @@ static val op_modplace(val form, val env) eval_error(form, lit("~a: place ~s doesn't exist"), op, place, nao); if (op == set_s) { - return *loc = inc; + if (!third_arg_p) + eval_error(form, lit("~a: missing argument"), op, place, nao); + return *loc = newval; } else if (op == inc_s) { + val inc = or2(newval, num(1)); return *loc = plus(*loc, inc); } else if (op == dec_s) { + val inc = or2(newval, num(1)); return *loc = plus(*loc, inc); } else if (op == push_s) { - return push(inc, loc); + if (!third_arg_p) + eval_error(form, lit("~a: missing argument"), op, place, nao); + return push(newval, loc); } else if (op == pop_s) { + if (third_arg_p) + eval_error(form, lit("~a: superfluous argument"), op, place, nao); return pop(loc); } |