From 1702ed8df842ca7c80c293e4e5f353dbf370c0fd Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 30 Nov 2011 08:10:42 -0800 Subject: * 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. --- ChangeLog | 9 +++++++++ eval.c | 15 ++++++++++++--- lib.h | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 71b672e1..1a9afc59 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2011-11-30 Kaz Kylheku + + * 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. + 2011-11-30 Kaz Kylheku * txr.vim: New operators added. 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); } diff --git a/lib.h b/lib.h index aa3064f0..732c5eb8 100644 --- a/lib.h +++ b/lib.h @@ -506,7 +506,7 @@ INLINE val eq(val a, val b) { return ((a) == (b) ? t : nil); } #define if3(a, b, c) ((a) ? (b) : (c)) -#define or2(a, b) ((a) ? (a) : (b)) +INLINE val or2(val a, val b) { return a ? a : b; } #define or3(a, b, c) or2(a, or2(b, c)) -- cgit v1.2.3