This is the mail archive of the guile@cygnus.com mailing list for the guile project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
OK, I have my smobs working with the latest snapshot and I'm not worrying about using SCM_SETGC8MARK( x ); anymore. One problem that I was having with the old system (and still am with the new) is that when I store a list of substrings within my table and I go through a mark stage where I call scm_gc_mark() on any data in the table I get a segmentation violation in the garbage collector (!) I still can't pin down any details more than that but if I store the substrings directly (not in a list) then it doesn't crash even though my code does exactly the same thing (as soon as I get time, I'll fiddle around and get something small that demonstrates this effect). Are there gotchas in using (make-shared-substring) and (substring)? They are essential for working with regexp stuff. Something (probably unrelated) that I noticed is that if your smob checks it's SCM_TYP16() value during garbage collection then it will see the 0x80 flag bit and might fail sanity checks. The safest thing is to mask out the flag bit: static int table_is_table( SCM x ) { if( SCM_NIMP( x )) { long z = SCM_TYP16( x ); z &= 0xff7f; /* clear GC8 bit */ if( z == scm_tc16_table ) return( 1 ); } return( 0 ); } I feel that SCM_TYP16() should mask this and suggest that it be changed. - Tel