Bruno Haible <[email protected]> writes: >> I'm curious, though, what is the benefit of compiling a C program, like >> clisp, with a C++ compiler? > > The benefit is that you can attach all kinds of behaviours to your objects. > > A simple use-case might be to add logging/tracing to specific objects. > > In GNU clisp, which has a compacting garbage collection, the use-case is > to detect situations where the garbage collection could see invalid pointers > and then crash. Example: > > object x = STACK[-3]; /* x is not among the GC roots */ > object y = allocate_cons (); /* may trigger GC */ > Cdr(y) = x; /* storing an invalid object in the heap! */ > > Corrected example: > > object x = STACK[-3]; /* take a value from the stack */ > pushSTACK (x); /* and duplicate it on the stack */ > object y = allocate_cons (); /* may trigger GC */ > Cdr(y) = popSTACK (); > > We don't have a static analyzer for this kind of (frequent) mistakes. > Defining 'object' as a C++ class detects these mistakes at runtime.
Thanks for the detailed response. That is pretty clever. I had a look at the various places under DEBUG_GCSAFETY, but I can't say I understood much more than you already explained. :) Collin
