diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-02-28 23:37:45 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-02-28 23:37:45 -0800 |
commit | 752f8309a72bacef5ce03ac8e98211b1df2ff0a8 (patch) | |
tree | 273a223a69d6dfd8f735f18ae07da52141630c39 /lib.c | |
parent | 94750af472e12acf3a5970c98e4dab6feada2e84 (diff) | |
download | txr-752f8309a72bacef5ce03ac8e98211b1df2ff0a8.tar.gz txr-752f8309a72bacef5ce03ac8e98211b1df2ff0a8.tar.bz2 txr-752f8309a72bacef5ce03ac8e98211b1df2ff0a8.zip |
Turn *gensym-counter* into proper special variable.
* eval.c (eval_init): Save *gensym-counter* symbol in gensym_counter_s
symbol variable right after interning, and use zero as the inital value
rather than the gensym_counter variable which is removed now.
* lib.c (gensym_counter_s): New symbol variable.
(gensym_counter): Variable removed.
(gensym): Slight refactoring to avoid a double variable lookup.
Also, for generational GC correctness, use the set macro to update it,
since the variable could live inside heap object and the counter
could overflow to bignums which are heap objects.
(obj_init): Remove initialization of gensym_counter.
* lib.h (gensym_counter_s): Declared.
(gensym_counter): Declaration removed, replaced by macro.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 7 |
1 files changed, 3 insertions, 4 deletions
@@ -86,6 +86,7 @@ val eof_s, eol_s; val error_s, type_error_s, internal_error_s; val numeric_error_s, range_error_s; val query_error_s, file_error_s, process_error_s; +val gensym_counter_s; val nothrow_k, args_k, colon_k, auto_k; @@ -95,8 +96,6 @@ val null_list; val identity_f, equal_f, eql_f, eq_f, car_f, cdr_f, null_f; -val gensym_counter; - val prog_string; static val env_list; @@ -2704,8 +2703,9 @@ val make_sym(val name) val gensym(val prefix) { prefix = default_arg(prefix, lit("g")); + val *gs_loc = &gensym_counter; val name = format(nil, lit("~a~,04a"), prefix, - gensym_counter = plus(gensym_counter, one), nao); + set(*gs_loc, plus(*gs_loc, one)), nao); return make_sym(name); } @@ -5213,7 +5213,6 @@ static void obj_init(void) car_f = func_n1(car); cdr_f = func_n1(cdr); null_f = func_n1(null); - gensym_counter = zero; prog_string = string(progname); } |