2008/8/16 Han-Wen Nienhuys <[EMAIL PROTECTED]>: > Running the test suite through valgrind, I get some fishy errors. > > Can someone shed a light on this? The culprit seems to be > > #define SCM_NUMBER_OF_SLOTS(x) \ > ((SCM_STRUCT_DATA (x)[scm_struct_i_n_words]) - scm_struct_n_extra_words) > > where scm_struct_i_n_words is -2
This is severely bitrotted code. There are at least three errors associated with this: 1. scm_struct_i_n_words is an offset in a vtable (a GOOPS class is a vtable), but %fast-slot-ref passes an instance 2. The value at this location apparently now is the number of slots with nonnegative index (contrary to what is said by some comment in the code), so scm_struct_n_extra_words should not be subtracted 3. It's not sensible to access slots this way (as in %fast-slot-ref/set!) since different kinds of slots have different representations of their data. However, when working with the MOP (as active-slot.scm does) some kind of more direct or raw access to the slots may be required. Unfortunately, I don't have time to fix this. I suggest that some Guile developer removes %fast-slot-ref/set! and supplies some other (more clean) way of supporting the code in active-slot.scm. Also, make sure to check that these primitives are not used anywhere else. I apologize if I'm the reason for parts or all of this mess. Best regards, Mikael D.