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?


[Note: I'm resending this because I got no response.  Perhaps my change in
 subject will attract people's attention...]

I cannot get this tag stuff to work (see my message "global variables &
data tags") 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

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