From 94750af472e12acf3a5970c98e4dab6feada2e84 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 28 Feb 2014 23:15:10 -0800 Subject: Change in the design of how special variables work, to fix the broken re-binding. C code now has to go through the dynamic environment lookup to access things like *random-state*, or *stdout*. As part of this, I'm moving some intrinsic variable and function initializations out of eval.c and into their respective modules. Macros are are used to make global variables look like ordinary C variables. This is very similar to the errno trick in POSIX threads implementations. * eval.c (looup_var, lookup_var_l): Restructured to eliminate silly goto, the cobjp handling is gone. (reg_fun, reg_var): Internal function becomes external. reg_var registers a simple cons cell binding now, without any C pointer tricks to real C global variables. (c_var_mark): Static function removed. (c_var_ops): Static struct removed. (eval_init): Numerous initializations for streams, syslog, rand, signals and others moved to their respective modules. The new symbol variables user_package_s, keyword_package_s and system_package_s are interned here, and the variables are created in a special way. * eval.h (reg_var, reg_fun): Declared. * gc.c (prot1): Added assert that the loc pointer isn't null. This happened, and blew up during garbage collection. * lib.c (system_package, keyword_package, user_package): Variables removed these become macros. (system_package_var, keyword_package_var, user_package_var): New global variables. (system_package_s, keyword_package_s, user_package_s): New symbol globals. (get_user_package, get_system_package, get_keyword_package): New functions. (obj_init): Protect new variables. Initialization order of modules tweaked: the modules sig_init, stream_init, and rand_init are moved after eval_init because they register variables. * lib.h (keyword_package, system_pckage, user_package): Variables turned into macros. (system_package_var, keyword_package_var, user_package_var): Declared. (system_package_s, keyword_package_s, user_package_s): Declared. (get_user_package, get_system_package, get_keyword_package): Declared. * rand.c (struct random_state): Renamed to struct rand_state to avoid clash with new random_state macro. (random_state): Global variable removed. (random_state_s): New symbol global. (make_state, rand32, make_random_state, random_fixnum, random): Follow rename of struct random_state. --- tests/011/special-1.txr | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'tests/011/special-1.txr') diff --git a/tests/011/special-1.txr b/tests/011/special-1.txr index 7e51c483..23c15b48 100644 --- a/tests/011/special-1.txr +++ b/tests/011/special-1.txr @@ -4,5 +4,6 @@ (progn ,*forms (get-string-from-stream ,var)))) (let ((x (with-output-to-string (*stdout*) - (format t "hello")))) + (format t "world!")))) + (format *stdout* "Hello, ") (put-line x))) -- cgit v1.2.3