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]

implementing data tags via object properties -- help with debugging?


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);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]