~ chicken-core (chicken-5) 74561c9598d0acb97c328f9719827a2989607079
commit 74561c9598d0acb97c328f9719827a2989607079
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Feb 12 10:10:36 2010 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Fri Feb 12 10:10:36 2010 +0100
gc symbols in weak mode only if the plist is empty
diff --git a/c-backend.scm b/c-backend.scm
index 17c15e3e..edbd6438 100644
--- a/c-backend.scm
+++ b/c-backend.scm
@@ -853,6 +853,8 @@
(unless direct (gen #t "C_word *a;"))
(when looping (gen #t "loop:"))
(when (and direct (not unsafe) (not disable-stack-overflow-checking))
+ ;;XXX this can be lifted out of the loop, if the procedure
+ ;; does not allocate (suggested by Benedikt Rosenau):
(gen #t "C_stack_check;") ) ] )
(when (and external (not unsafe) (not no-argc-checks) (not customizable))
;; (not customizable) implies empty-closure
diff --git a/runtime.c b/runtime.c
index 39f31da7..b225e15f 100644
--- a/runtime.c
+++ b/runtime.c
@@ -2810,7 +2810,7 @@ C_regparm void C_fcall C_reclaim(void *trampoline, void *proc)
if(C_enable_gcweak) {
/* Check entries in weak item table and recover items ref'd only
- * once and which are unbound symbols: */
+ * once, which are unbound symbols and have an empty property-lists: */
weakn = 0;
wep = weak_item_table;
@@ -2820,7 +2820,9 @@ C_regparm void C_fcall C_reclaim(void *trampoline, void *proc)
item = fptr_to_ptr(item);
container = wep->container & ~WEAK_COUNTER_MASK;
- if(C_header_bits(item) == C_SYMBOL_TYPE && C_u_i_car(item) == C_SCHEME_UNBOUND) {
+ if(C_header_bits(item) == C_SYMBOL_TYPE &&
+ C_block_item(item, 0) == C_SCHEME_UNBOUND &&
+ C_block_item(item, 2) == C_SCHEME_END_OF_LIST) {
++weakn;
#ifdef PARANOIA
item = C_u_i_cdr(item);
Trap