This is the mail archive of the
guile@cygnus.com
mailing list for the guile project.
implementing data tags via object properties -- help with debugging?
- To: robertb@continuumsi.com (Robert Brown)
- Subject: implementing data tags via object properties -- help with debugging?
- From: thi <ttn@mingle.glug.org>
- Date: Fri, 7 May 1999 09:24:33 -0700 (PDT)
- Cc: guile@cygnus.com
- References: <19990507140855.15067.qmail@continuumsi.com>
- Reply-To: ttn@netcom.com
one immediately apparent problem is using `gh_eval_str'. you probably
want to simply save the return value of `gh_new_procedure', an SCM.
however, there may be a bigger problem: the stuff below looks like you
are re-implementing smobs. why?
thi
------------------------------------
Robert Brown writes:
> 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);