This is the mail archive of the
guile@cygnus.com
mailing list for the guile project.
Re: global variables & data tags (a la X-Windows callbacks)
- To: guile@cygnus.com
- Subject: Re: global variables & data tags (a la X-Windows callbacks)
- From: robertb@continuumsi.com (Robert Brown)
- Date: Wed, 5 May 1999 12:17:17 -0400
Sorry to do this to everybody, but I cannot get this tag stuff to work and
was hoping someone could help me debug it. For some reason, every time I
call gh_get_tag_data() (see below), I receive a different (and seemingly
random) value. And I assume that that's because gh_eval_str() is
returning a different SCM object each time I call it, even if I call it
with the same string.
I tried stepping through the code, but what the SCM/Guile interpreter is doing
is mystifying. So, I don't understand its return values.
Does anybody see what's wrong with the code below for accomplishing my
goals and how it might be changed to do what I want?
-------------------------------------------------------------------------------
struct genericptr {
void* ptr;
SCM name;
};
static SCM
mark_genericptr (SCM genericptr_smob)
{
struct genericptr *genericptr = (struct genericptr *) SCM_CDR (genericptr_smob);
scm_gc_mark (genericptr->name);
return SCM_UNSPECIFIED;
}
static scm_sizet
free_genericptr (SCM genericptr_smob)
{
struct genericptr *genericptr = (struct genericptr *) SCM_CDR (genericptr_smob);
scm_sizet size = sizeof (struct genericptr);
free (genericptr);
return size;
}
SCM gh_ptr2scm(void* ptr)
{
struct genericptr* newlib;
SCM genericptr_smob;
static scm_smobfuns genericptr_funs = {
mark_genericptr, free_genericptr, 0, 0
};
newlib=(struct genericptr *)scm_must_malloc(sizeof(struct genericptr), "genericptr");
newlib->ptr=ptr;
newlib->name=gh_str02scm("genericptr");
SCM_NEWCELL (genericptr_smob);
SCM_SETCDR (genericptr_smob, newlib);
SCM_SETCAR (genericptr_smob, scm_newsmob(&genericptr_funs));
return genericptr_smob;
}
void* gh_scm2ptr(SCM ptr)
{
return (void*)SCM_CDR(ptr);
}
void gh_set_ext_data(SCM scm, void* ptr)
{
scm_set_object_property_x(scm, gh_symbol2scm("genericptr"), gh_ptr2scm(ptr));
}
void* gh_get_ext_data(SCM scm)
{
return gh_scm2ptr(scm_object_property(scm, gh_symbol2scm("genericptr")));
}
void* gh_get_tag_data(const char* procname)
{
return gh_scm2ptr(scm_object_property(gh_eval_str((char*)procname), gh_symbol2scm("genericptr")));
}
SCM ServerReadSymbols(SCM scmx)
{
.
.
.
ReadSymbols(x, (Library*)gh_get_tag_data("ReadSymbols"));
.
.
.
}
.
.
.
gh_set_ext_data(gh_new_procedure1_0("ReadSymbols", ServerReadSymbols),
(void*)lib);
--
Robert Brown | Continuum Software, Inc.
email:robertb@continuumsi.com | 800 West Cummings Park, Ste 4950
http://www.continuumsi.com/~robertb | Woburn, MA 01801-6504
voice: 781-932-8400 x100 | fax: 781-932-2558