diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2012-04-03 11:20:41 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2012-04-03 11:20:41 -0700 |
commit | 1ce504148e960fa8fdd3701977786b99a7437f57 (patch) | |
tree | 30414fdc38771f8aac55cb880d437f8d1db5a87d | |
parent | 06ced4e18fd69399e7419a59dbe477e9a92c23e1 (diff) | |
download | txr-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.
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | eval.c | 2 | ||||
-rw-r--r-- | gc.c | 6 | ||||
-rw-r--r-- | gc.h | 1 | ||||
-rw-r--r-- | hash.c | 2 | ||||
-rw-r--r-- | lib.c | 9 | ||||
-rw-r--r-- | lib.h | 2 |
7 files changed, 32 insertions, 7 deletions
@@ -1,3 +1,20 @@ +2012-04-03 Kaz Kylheku <kaz@kylheku.com> + + * 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. + 2012-04-02 Kaz Kylheku <kaz@kylheku.com> * configure: Support a gen-gc configuration variable which @@ -983,7 +983,7 @@ static val op_modplace(val form, val env) val inc = or2(eval(newform, env, form), one); return set(*loc, minus(*loc, inc)); } else if (op == push_s) { - return push(newval, loc); + return mpush(newval, *loc); } else if (op == pop_s) { if (third_arg_p) eval_error(form, lit("~a: superfluous argument"), op, place, nao); @@ -561,6 +561,12 @@ void gc_mutated(val obj) gc(); } +val gc_push(val obj, val *plist) +{ + gc_mutated(obj); + return push(obj, plist); +} + #endif /* @@ -37,6 +37,7 @@ int gc_is_reachable(val); #if CONFIG_GEN_GC val gc_set(val *, val); +val gc_push(val, val *); void gc_mutated(val); #endif @@ -415,7 +415,7 @@ val sethash(val hash, val key, val value) val pushhash(val hash, val key, val value) { val new_p; - push(value, gethash_l(hash, key, &new_p)); + mpush(value, *gethash_l(hash, key, &new_p)); return new_p; } @@ -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; } @@ -231,9 +231,11 @@ union obj { #if CONFIG_GEN_GC #define set(place, val) ((place) = (val)) #define mut(obj) +#define mpush(val, place) (push(val, &(place))) #else #define set(place, val) (gc_set(&(place), val)) #define mut(obj) (gc_mutated(obj)); +#define mpush(val, place) (gc_push(val, &(place))) #endif INLINE cnum tag(val obj) { return ((cnum) obj) & TAG_MASK; } |