summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-11-30 08:10:42 -0800
committerKaz Kylheku <kaz@kylheku.com>2011-11-30 08:10:42 -0800
commit1702ed8df842ca7c80c293e4e5f353dbf370c0fd (patch)
treed5085bb9a976a975653333a164f84d072170c69a /eval.c
parent80af0b52d0ad27cd9cad279818e9066a1d8139c2 (diff)
downloadtxr-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.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/eval.c b/eval.c
index 5e1c7d13..c932c51b 100644
--- a/eval.c
+++ b/eval.c
@@ -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);
}