On Oct 13, 2006, at 6:42 AM, Peter Karman wrote:
David Balmain scribbled on 10/13/06 1:21 AM:
I don't know how much of Ferret's binding code you've looked at but
you may have noticed a lot of my structs have a ref_cnt variable.
That
way, every time a struct gets wrapped in a ruby object, it's ref_cnt
is incremented. When the object goes out of scope and is garbage
collected the ref_cnt is decremented (and the object deleted if
ref_cnt = 0). I think as far as supporting multiple languages like we
are attempting to do with Lucy, this is the easiest way to go, since
it should work for all languages.
fwiw, I have used the above approach in Perl myself. I just increm/
decrem the refcnt in XS (Perl) space, in the DESTROY method.
I like this approach better, and I've now changed KinoSearch to use it.
One minor theoretical problem with subclassing. Say you have a
struct that holds a TermDocs.
typedef struct lucy_SomeStruct {
struct lucy_TermDocs *term_docs;
/* ... */
} lucy_SomeStruct;
A Perl object created off of that has to take the class
"Lucy::Index::TermDocs", rather than "Lucy::Index::SegTermDocs" or
"Lucy::Index::MultiTermDocs". That's not quite right.
/* This is an XS binding */
lucy_TermDocs*
get_term_docs(self)
lucy_SomeStruct *self;
CODE:
RETVAL = self->term_docs;
OUTPUT: RETVAL
However, you can only fake OOP so well with C, and this limitation
hasn't triggered any glitches yet. We'll see what happens when I
port IndexReader, SegReader, and MultiReader to C -- they'll all
appear to be "IndexReader" from Perl-space. Dunno if that will break
something.
I also had to jettison a scheme I'd devised for generalizing object-
method callbacks to [your_language_here], but that might be for the
best. :)
Marvin Humphrey
Rectangular Research
http://www.rectangular.com/