summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-04-03 11:20:41 -0700
committerKaz Kylheku <kaz@kylheku.com>2012-04-03 11:20:41 -0700
commit1ce504148e960fa8fdd3701977786b99a7437f57 (patch)
tree30414fdc38771f8aac55cb880d437f8d1db5a87d /lib.c
parent06ced4e18fd69399e7419a59dbe477e9a92c23e1 (diff)
downloadtxr-1ce504148e960fa8fdd3701977786b99a7437f57.tar.gz
txr-1ce504148e960fa8fdd3701977786b99a7437f57.tar.bz2
txr-1ce504148e960fa8fdd3701977786b99a7437f57.zip
* eval.c (op_modplace): push replaced with mpush (mutating push).
* gc.c (gc_push): New function. * gc.h (gc_push): Declared. * hash.c (pushhash): Use mpush. * lib.c (push): Reverted to unsafe operation. TODO comment replaced with warning. (lazy_flatten_scan): push occurence commented as safe. (lazy_stream_func): Unsafe push replaced with mpush. * lib.h (mpush): New macro.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/lib.c b/lib.c
index 436a47ee..4cef5ba4 100644
--- a/lib.c
+++ b/lib.c
@@ -361,9 +361,8 @@ val pop(val *plist)
val push(val value, val *plist)
{
- /* TODO: doing set here is suboptimal since
- it is often used for just a local var. */
- return set(*plist, cons(value, *plist));
+ /* Unsafe for mutating object fields: use mpush macro. */
+ return *plist = cons(value, *plist);
}
val copy_list(val list)
@@ -759,7 +758,7 @@ static val lazy_flatten_scan(val list, val *escape)
} else if (atom(a)) {
return list;
} else do {
- push(cdr(list), escape);
+ push(cdr(list), escape); /* safe mutation: *escape is a local var */
list = a;
a = car(list);
} while (consp(a));
@@ -3328,7 +3327,7 @@ static val lazy_stream_func(val env, val lcons)
close_stream(stream, t);
if (ahead)
- push(ahead, cdr_l(env));
+ mpush(ahead, *cdr_l(env));
return next;
}