From: Kaz K. <kky...@gm...> - 2008-03-13 17:44:09
|
On Wed, Mar 12, 2008 at 7:32 PM, Sam Steingold <sd...@gn...> wrote: > Kaz Kylheku wrote: > > http://common-lisp.net/project/meta-cvs/downloads/dlvsym-ffi-support.patch > > coerce_ss_name is broken because coerce_ss is GC-unsafe, so after its > first invocation name, orig_name, and orig_ver are invalid. Is that actually true, regarding orig_name and orig_ver? These are the car and cdr fields of name. The callers of coerce_ss_name already ensure that this object is hooked into the stack. Surely the car and cdr values can't be garbage collected if the parent cons is referenced. I just see the problem with ss_name and ss_ver local maygc object coerce_ss_name(object name) // <--- name is hooked into stack { if (consp(name)) { var object orig_name = Car(name); // <--- transitively reachable through name var object orig_ver = Cdr(name) ; // <-/ var object ss_name = coerce_ss(orig_name); // <--- this is not referenced, oops! var object ss_ver = coerce_ss(orig_ver); // <--- this may GC! if (eq(orig_name, ss_name) && eq(orig_ver, ss_ver)) return name; var object cons = allocate_cons(); // <--- this may GC Car(cons) = ss_name; Cdr(cons) = ss_ver; return cons; } else { return coerce_ss(name); } } > you need to push stuff on STACK to save it while you call coerce_ss. > a good check if running your code in clisp configured like this: > ./configure CC=g++ --with-debug --builg build-gxx That's interesting; I will give that a try. |