guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

replacing smobs with structs


From: Andy Wingo
Subject: replacing smobs with structs
Date: Mon, 17 Dec 2007 23:57:45 +0100
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1.50 (gnu/linux)

Hi,

I recently came to the realization that it is possible to wrap C
pointers with structs. This might satisfy some of the things that Marco
was looking at.

The basic idea is to make a struct with a "uo" or "ur" slot, which wraps
an untagged C word. You then set the slot value in C via the normal
methods, as the second word of the struct cell is the array of
scheme-accessible values in the struct.

You can set a free function, but you have to do it per instance, with
the apparently misnamed SCM_SET_VTABLE_DESTRUCTOR macro (misnamed
because it can work on all struct instances). Unfortunately you still
have to chain up to the previous value of the free function, which is a
pain.

This solution is not ideal for other reasons: the wasted two words
because a struct is a double-cell; the fact that the struct data is
allocated with scm_gc_malloc, more heavyweight than a SMOB; that the
struct data has a bunch of padding -- besides the free function, some
other slots, and extra padding to ensure 8-byte alignment; and the
general undocumented state of everything.

On the plus side, GOOPS objects are structs, so you can make a pointer
wrapper that really is an object. You have one GOOPS object instead of
GOOPS with a slot for a SMOB. Marginally less memory and marshalling
bloat.

It seems like what you need to do is to have `compute-get-n-set' return
a <foreign-slot>, and then set it from C.

Instantiating a wrapper from C would probably have to be done via
`allocate-instance', setting the foreign slot, the `initialize' on the
instance. This works one layer down in the initialization MOP.

I have yet to code this up, but I'm thinking of doing so in Guile-GNOME,
which will cut out a layer from the code. I just wanted to throw these
ideas out there if anyone had experience with similar things.

Cheers,

Andy
-- 
http://wingolog.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]