Patchwork [6/9] Remove Guile GDB object property mechanism

login
register
mail settings
Submitter Andy Wingo
Date April 9, 2014, 4:08 p.m.
Message ID <1397059725-18066-11-git-send-email-wingo@igalia.com>
Download mbox | patch
Permalink /patch/450/
State Changes Requested
Headers show

Comments

Andy Wingo - April 9, 2014, 4:08 p.m.
* gdb/guile/guile-internal.h: Remove scm_gsmob / GDB_SMOB_HEAD base
  type; it only served as something to which object properties could be
  attached: a use case already served by Guile's own object properties.
  (gdbscm_init_gsmob, gdbscm_mark_gsmob, gdbscm_mark_chained_gsmob)
  (gdbscm_mark_eqable_gsmob): Remove these now-unneeded functions.

* gdb/guile/scm-gsmob.c (gdbscm_init_gsmob, gdbscm_mark_gsmob)
  (gdbscm_mark_chained_gsmob, gdbscm_mark_eqable_gsmob): Remove.
  (gdbscm_gsmob_property, gdbscm_set_gsmob_property_x)
  (gdbscm_gsmob_has_property_p, add_property_name)
  (gdbscm_gsmob_properties): Remove these public interfaces, and remove
  them from gsmob_functions.

* gdb/guile/scm-arch.c:
* gdb/guile/scm-block.c:
* gdb/guile/scm-breakpoint.c:
* gdb/guile/scm-exception.c:
* gdb/guile/scm-frame.c:
* gdb/guile/scm-iterator.c:
* gdb/guile/scm-lazy-string.c:
* gdb/guile/scm-objfile.c:
* gdb/guile/scm-pretty-print.c:
* gdb/guile/scm-symbol.c:
* gdb/guile/scm-symtab.c:
* gdb/guile/scm-type.c:
* gdb/guile/scm-value.c: Adapt to not include a gdb_gsmob base member,
  for basic gsmobs, and to not call init/mark functions.

* gdb/doc/guile.texi (GDB Scheme Data Types): Update.

* gdb/guile/lib/gdb.scm (gdb-object-property, set-gdb-object-property)
  (gdb-object-has-property?, gdb-object-properties): Remove.

* gdb/testsuite/gdb.guile/scm-breakpoint.exp:
* gdb/testsuite/gdb.guile/scm-gsmob.exp: Update to use plain old object
  properties instead of gdb-object-properties.
---
 gdb/doc/guile.texi                         |  27 ----
 gdb/guile/guile-internal.h                 |  43 +-----
 gdb/guile/lib/gdb.scm                      |   4 -
 gdb/guile/scm-arch.c                       |   9 +-
 gdb/guile/scm-block.c                      |  15 +-
 gdb/guile/scm-breakpoint.c                 |   9 +-
 gdb/guile/scm-exception.c                  |   8 +-
 gdb/guile/scm-frame.c                      |   5 +-
 gdb/guile/scm-gsmob.c                      | 216 +----------------------------
 gdb/guile/scm-iterator.c                   |   8 +-
 gdb/guile/scm-lazy-string.c                |   9 +-
 gdb/guile/scm-objfile.c                    |   9 +-
 gdb/guile/scm-pretty-print.c               |  16 +--
 gdb/guile/scm-symbol.c                     |   5 +-
 gdb/guile/scm-symtab.c                     |  14 +-
 gdb/guile/scm-type.c                       |  13 +-
 gdb/guile/scm-value.c                      |   8 +-
 gdb/testsuite/gdb.guile/scm-breakpoint.exp |  14 +-
 gdb/testsuite/gdb.guile/scm-gsmob.exp      |  20 ++-
 19 files changed, 47 insertions(+), 405 deletions(-)

Patch

diff --git a/gdb/doc/guile.texi b/gdb/doc/guile.texi
index f7204e9..be3176b 100644
--- a/gdb/doc/guile.texi
+++ b/gdb/doc/guile.texi
@@ -342,33 +342,6 @@  Return the kind of the @value{GDBN} object, e.g., @code{<gdb:breakpoint>},
 as a symbol.
 @end deffn
 
-Every @value{GDBN} object provides a common set of functions for
-extending them in simple ways.  Each @value{GDBN} object has a list of
-properties, initially empty.  These properties are akin to Guile's
-object properties, but are stored with the @value{GDBN} object
-(@pxref{Object Properties,,, guile, GNU Guile Reference Manual}).
-Property names can be any @code{eq?}-able value, but it is recommended
-that they be symbols.
-
-@deffn {Scheme Procedure} set-gdb-object-property! object property-name value
-Set the value of property @code{property-name} to value @code{value}.
-The result is unspecified.
-@end deffn
-
-@deffn {Scheme Procedure} gdb-object-property object property-name
-Return the value of property @code{property-name}.
-If the property isn't present then @code{#f} is returned.
-@end deffn
-
-@deffn {Scheme Procedure} gdb-object-has-property? object property-name
-Return @code{#t} if @value{GDBN} object has property @code{property-name}.
-Otherwise return @code{#f}.
-@end deffn
-
-@deffn {Scheme Procedure} gdb-object-properties object
-Return an unsorted list of names of properties.
-@end deffn
-
 @value{GDBN} defines the following object types:
 
 @table @code
diff --git a/gdb/guile/guile-internal.h b/gdb/guile/guile-internal.h
index f95f092..bc3f55d 100644
--- a/gdb/guile/guile-internal.h
+++ b/gdb/guile/guile-internal.h
@@ -155,42 +155,23 @@  extern int gdbscm_is_procedure (SCM proc);
 
 /* GDB smobs, from scm-smob.c */
 
-/* All gdb smobs must contain one of the following as the first member:
-   gdb_smob, chained_gdb_smob, or eqable_gdb_smob.
+/* Chained GDB smobs should have chained_gdb_smob as their first member.  The
+   next,prev members of chained_gdb_smob allow for chaining gsmobs together so
+   that, for example, when an objfile is deleted we can clean up all smobs that
+   reference it.
 
-   The next,prev members of chained_gdb_smob allow for chaining gsmobs
-   together so that, for example, when an objfile is deleted we can clean up
-   all smobs that reference it.
-
-   The containing_scm member of eqable_gdb_smob allows for returning the
-   same gsmob instead of creating a new one, allowing them to be eq?-able.
-
-   IMPORTANT: chained_gdb_smob and eqable_gdb-smob are a "subclasses" of
-   gdb_smob.  The layout of chained_gdb_smob,eqable_gdb_smob must match
-   gdb_smob as if it is a subclass.  To that end we use macro GDB_SMOB_HEAD
-   to ensure this.  */
-
-#define GDB_SMOB_HEAD					\
-  /* Property list for externally added fields.  */	\
-  SCM properties;
-
-typedef struct
-{
-  GDB_SMOB_HEAD
-} gdb_smob;
+   Eq-able GDB smobs should have eqable_gdb_smob as their first member.  The
+   containing_scm member of eqable_gdb_smob allows for returning the same gsmob
+   instead of creating a new one, allowing them to be eq?-able.  */
 
 typedef struct _chained_gdb_smob
 {
-  GDB_SMOB_HEAD
-
   struct _chained_gdb_smob *prev;
   struct _chained_gdb_smob *next;
 } chained_gdb_smob;
 
 typedef struct _eqable_gdb_smob
 {
-  GDB_SMOB_HEAD
-
   /* The object we are contained in.
      This can be used for several purposes.
      This is used by the eq? machinery:  We need to be able to see if we have
@@ -204,8 +185,6 @@  typedef struct _eqable_gdb_smob
   SCM containing_scm;
 } eqable_gdb_smob;
 
-#undef GDB_SMOB_HEAD
-
 struct objfile;
 struct objfile_data;
 
@@ -215,19 +194,11 @@  typedef int (gsmob_pred_func) (SCM);
 
 extern scm_t_bits gdbscm_make_smob_type (const char *name, size_t size);
 
-extern void gdbscm_init_gsmob (gdb_smob *base);
-
 extern void gdbscm_init_chained_gsmob (chained_gdb_smob *base);
 
 extern void gdbscm_init_eqable_gsmob (eqable_gdb_smob *base,
 				      SCM containing_scm);
 
-extern SCM gdbscm_mark_gsmob (gdb_smob *base);
-
-extern SCM gdbscm_mark_chained_gsmob (chained_gdb_smob *base);
-
-extern SCM gdbscm_mark_eqable_gsmob (eqable_gdb_smob *base);
-
 extern void gdbscm_add_objfile_ref (struct objfile *objfile,
 				    const struct objfile_data *data_key,
 				    chained_gdb_smob *g_smob);
diff --git a/gdb/guile/lib/gdb.scm b/gdb/guile/lib/gdb.scm
index 396ccd2..a3245f8 100644
--- a/gdb/guile/lib/gdb.scm
+++ b/gdb/guile/lib/gdb.scm
@@ -273,10 +273,6 @@ 
  ;; scm-gsmob.c
 
  gdb-object-kind
- gdb-object-property
- set-gdb-object-property!
- gdb-object-has-property?
- gdb-object-properties
 
  <gdb:value>
  <gdb:block>
diff --git a/gdb/guile/scm-arch.c b/gdb/guile/scm-arch.c
index fa578f3..6a805c6 100644
--- a/gdb/guile/scm-arch.c
+++ b/gdb/guile/scm-arch.c
@@ -31,9 +31,6 @@ 
 
 struct _arch_smob
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   struct gdbarch *gdbarch;
 };
 
@@ -53,10 +50,7 @@  static int arscm_is_arch (SCM);
 static SCM
 arscm_mark_arch_smob (SCM self)
 {
-  arch_smob *a_smob = (arch_smob *) SCM_SMOB_DATA (self);
-
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&a_smob->base);
+  return SCM_BOOL_F;
 }
 
 /* The smob "print" function for <gdb:arch>.  */
@@ -88,7 +82,6 @@  arscm_make_arch_smob (struct gdbarch *gdbarch)
 
   a_smob->gdbarch = gdbarch;
   a_scm = scm_new_smob (arch_smob_tag, (scm_t_bits) a_smob);
-  gdbscm_init_gsmob (&a_smob->base);
 
   return a_scm;
 }
diff --git a/gdb/guile/scm-block.c b/gdb/guile/scm-block.c
index 4e1748e..8f39e7c 100644
--- a/gdb/guile/scm-block.c
+++ b/gdb/guile/scm-block.c
@@ -56,9 +56,6 @@  typedef struct _block_smob
 
 typedef struct
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   /* The iterator for that block.  */
   struct block_iterator iter;
 
@@ -125,10 +122,7 @@  bkscm_objfile_block_map (struct objfile *objfile)
 static SCM
 bkscm_mark_block_smob (SCM self)
 {
-  block_smob *b_smob = (block_smob *) SCM_SMOB_DATA (self);
-
-  /* Do this last.  */
-  return gdbscm_mark_eqable_gsmob (&b_smob->base);
+  return SCM_BOOL_F;
 }
 
 /* The smob "free" function for <gdb:block>.  */
@@ -540,11 +534,7 @@  gdbscm_block_symbols (SCM self)
 static SCM
 bkscm_mark_block_syms_progress_smob (SCM self)
 {
-  block_syms_progress_smob *i_smob
-    = (block_syms_progress_smob *) SCM_SMOB_DATA (self);
-
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&i_smob->base);
+  return SCM_BOOL_F;
 }
 
 /* The smob "print" function for <gdb:block-symbols-iterator>.  */
@@ -607,7 +597,6 @@  bkscm_make_block_syms_progress_smob (void)
   memset (&i_smob->iter, 0, sizeof (i_smob->iter));
   i_smob->initialized_p = 0;
   smob = scm_new_smob (block_syms_progress_smob_tag, (scm_t_bits) i_smob);
-  gdbscm_init_gsmob (&i_smob->base);
 
   return smob;
 }
diff --git a/gdb/guile/scm-breakpoint.c b/gdb/guile/scm-breakpoint.c
index d022377..a66b82e 100644
--- a/gdb/guile/scm-breakpoint.c
+++ b/gdb/guile/scm-breakpoint.c
@@ -38,9 +38,6 @@ 
 
 typedef struct gdbscm_breakpoint_object
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   /* The breakpoint number according to gdb.
      This is recorded here because BP will be NULL when deleted.  */
   int number;
@@ -83,10 +80,7 @@  bpscm_mark_breakpoint_smob (SCM self)
   /* We don't mark containing_scm here.  It is just a backlink to our
      container, and is gc'protected until the breakpoint is deleted.  */
 
-  scm_gc_mark (bp_smob->stop);
-
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&bp_smob->base);
+  return bp_smob->stop;
 }
 
 /* The smob "free" function for <gdb:breakpoint>.  */
@@ -192,7 +186,6 @@  bpscm_make_breakpoint_smob (void)
   bp_smob->stop = SCM_BOOL_F;
   bp_scm = scm_new_smob (breakpoint_smob_tag, (scm_t_bits) bp_smob);
   bp_smob->containing_scm = bp_scm;
-  gdbscm_init_gsmob (&bp_smob->base);
 
   return bp_scm;
 }
diff --git a/gdb/guile/scm-exception.c b/gdb/guile/scm-exception.c
index a96a350..316f0b4 100644
--- a/gdb/guile/scm-exception.c
+++ b/gdb/guile/scm-exception.c
@@ -40,9 +40,6 @@ 
 
 typedef struct
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   /* The key and args parameters to "throw".  */
   SCM key;
   SCM args;
@@ -109,9 +106,7 @@  exscm_mark_exception_smob (SCM self)
   exception_smob *e_smob = (exception_smob *) SCM_SMOB_DATA (self);
 
   scm_gc_mark (e_smob->key);
-  scm_gc_mark (e_smob->args);
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&e_smob->base);
+  return e_smob->args;
 }
 
 /* The smob "print" function for <gdb:exception>.  */
@@ -145,7 +140,6 @@  gdbscm_make_exception (SCM key, SCM args)
   e_smob->key = key;
   e_smob->args = args;
   smob = scm_new_smob (exception_smob_tag, (scm_t_bits) e_smob);
-  gdbscm_init_gsmob (&e_smob->base);
 
   ++gdbscm_exception_count;
 
diff --git a/gdb/guile/scm-frame.c b/gdb/guile/scm-frame.c
index 6031a7f..ee30597 100644
--- a/gdb/guile/scm-frame.c
+++ b/gdb/guile/scm-frame.c
@@ -135,10 +135,7 @@  frscm_inferior_frame_map (struct inferior *inferior)
 static SCM
 frscm_mark_frame_smob (SCM self)
 {
-  frame_smob *f_smob = (frame_smob *) SCM_SMOB_DATA (self);
-
-  /* Do this last.  */
-  return gdbscm_mark_eqable_gsmob (&f_smob->base);
+  return SCM_BOOL_F;
 }
 
 /* The smob "free" function for <gdb:frame>.  */
diff --git a/gdb/guile/scm-gsmob.c b/gdb/guile/scm-gsmob.c
index 1ca6af3..ef9ecb9 100644
--- a/gdb/guile/scm-gsmob.c
+++ b/gdb/guile/scm-gsmob.c
@@ -30,25 +30,16 @@ 
    specify the gdb smob kind, that is left for another day if it ever is
    needed.
 
-   We want the objects we export to Scheme to be extensible by the user.
-   A gsmob (gdb smob) adds a simple API on top of smobs to support this.
-   This allows GDB objects to be easily extendable in a useful manner.
-   To that end, all smobs in gdb have gdb_smob as the first member.
-
-   On top of gsmobs there are "chained gsmobs".  They are used to assist with
-   life-time tracking of GDB objects vs Scheme objects.  Gsmobs can "subclass"
+   Some GDB smobs are "chained gsmobs".  They are used to assist with life-time
+   tracking of GDB objects vs Scheme objects.  Gsmobs can "subclass"
    chained_gdb_smob, which contains a doubly-linked list to assist with
    life-time tracking.
 
-   On top of gsmobs there are also "eqable gsmobs".  Gsmobs can "subclass"
-   eqable_gdb_smob instead of gdb_smob, and is used to make gsmobs eq?-able.
-   This is done by recording all gsmobs in a hash table and before creating a
-   gsmob first seeing if it's already in the table.  Eqable gsmobs can also be
-   used where lifetime-tracking is required.
-
-   Gsmobs (and chained/eqable gsmobs) add an extra field that is used to
-   record extra data: "properties".  It is a table of key/value pairs
-   that can be set with set-gdb-object-property!, gdb-object-property.  */
+   Some other GDB smobs are "eqable gsmobs".  Gsmob implementations can
+   "subclass" eqable_gdb_smob to make gsmobs eq?-able.  This is done by
+   recording all gsmobs in a hash table and before creating a gsmob first seeing
+   if it's already in the table.  Eqable gsmobs can also be used where
+   lifetime-tracking is required.  */
 
 #include "defs.h"
 #include "hashtab.h"
@@ -61,15 +52,6 @@ 
 
 static htab_t registered_gsmobs;
 
-/* Gsmob properties are initialize stored as an alist to minimize space
-   usage: GDB can be used to debug some really big programs, and property
-   lists generally have very few elements.  Once the list grows to this
-   many elements then we switch to a hash table.
-   The smallest Guile hashtable in 2.0 uses a vector of 31 elements.
-   The value we use here is large enough to hold several expected uses,
-   without being so large that we might as well just use a hashtable.  */
-#define SMOB_PROP_HTAB_THRESHOLD 7
-
 /* Hash function for registered_gsmobs hash table.  */
 
 static hashval_t
@@ -136,14 +118,6 @@  gdbscm_make_smob_type (const char *name, size_t size)
   return result;
 }
 
-/* Initialize a gsmob.  */
-
-void
-gdbscm_init_gsmob (gdb_smob *base)
-{
-  base->properties = SCM_EOL;
-}
-
 /* Initialize a chained_gdb_smob.
    This is the same as gdbscm_init_gsmob except that it also sets prev,next
    to NULL.  */
@@ -151,7 +125,6 @@  gdbscm_init_gsmob (gdb_smob *base)
 void
 gdbscm_init_chained_gsmob (chained_gdb_smob *base)
 {
-  gdbscm_init_gsmob ((gdb_smob *) base);
   base->prev = NULL;
   base->next = NULL;
 }
@@ -163,50 +136,9 @@  gdbscm_init_chained_gsmob (chained_gdb_smob *base)
 void
 gdbscm_init_eqable_gsmob (eqable_gdb_smob *base, SCM containing_scm)
 {
-  gdbscm_init_gsmob ((gdb_smob *) base);
   base->containing_scm = containing_scm;
 }
 
-/* Call this from each smob's "mark" routine.
-   In general, this should be called as:
-   return gdbscm_mark_gsmob (base);  */
-
-SCM
-gdbscm_mark_gsmob (gdb_smob *base)
-{
-  /* Return the last one to mark as an optimization.
-     The marking infrastructure will mark it for us.  */
-  return base->properties;
-}
-
-/* Call this from each smob's "mark" routine.
-   In general, this should be called as:
-   return gdbscm_mark_chained_gsmob (base);  */
-
-SCM
-gdbscm_mark_chained_gsmob (chained_gdb_smob *base)
-{
-  /* Return the last one to mark as an optimization.
-     The marking infrastructure will mark it for us.  */
-  return base->properties;
-}
-
-/* Call this from each smob's "mark" routine.
-   In general, this should be called as:
-   return gdbscm_mark_eqable_gsmob (base);  */
-
-SCM
-gdbscm_mark_eqable_gsmob (eqable_gdb_smob *base)
-{
-  /* There's no need to mark containing_scm.
-     Any references to it either come from Scheme in which case it will be
-     marked through them, or there's a reference to the smob from gdb in
-     which case the smob is GC-protected.  */
-
-  /* Return the last one to mark as an optimization.
-     The marking infrastructure will mark it for us.  */
-  return base->properties;
-}
 
 /* gsmob accessors */
 
@@ -246,124 +178,6 @@  gdbscm_gsmob_kind (SCM self)
   return result;
 }
 
-/* (gdb-object-property gsmob property) -> object
-   If property isn't present then #f is returned.  */
-
-static SCM
-gdbscm_gsmob_property (SCM self, SCM property)
-{
-  SCM smob;
-  gdb_smob *base;
-
-  smob = gsscm_get_gsmob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
-  base = (gdb_smob *) SCM_SMOB_DATA (self);
-
-  /* Have we switched to a hash table?  */
-  if (gdbscm_is_true (scm_hash_table_p (base->properties)))
-    return scm_hashq_ref (base->properties, property, SCM_BOOL_F);
-
-  return scm_assq_ref (base->properties, property);
-}
-
-/* (set-gdb-object-property! gsmob property new-value) -> unspecified */
-
-static SCM
-gdbscm_set_gsmob_property_x (SCM self, SCM property, SCM new_value)
-{
-  SCM smob, alist;
-  gdb_smob *base;
-
-  smob = gsscm_get_gsmob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
-  base = (gdb_smob *) SCM_SMOB_DATA (self);
-
-  /* Have we switched to a hash table?  */
-  if (gdbscm_is_true (scm_hash_table_p (base->properties)))
-    {
-      scm_hashq_set_x (base->properties, property, new_value);
-      return SCM_UNSPECIFIED;
-    }
-
-  alist = scm_assq_set_x (base->properties, property, new_value);
-
-  /* Did we grow the list?  */
-  if (!scm_is_eq (alist, base->properties))
-    {
-      /* If we grew the list beyond a threshold in size,
-	 switch to a hash table.  */
-      if (scm_ilength (alist) >= SMOB_PROP_HTAB_THRESHOLD)
-	{
-	  SCM elm, htab;
-
-	  htab = scm_c_make_hash_table (SMOB_PROP_HTAB_THRESHOLD);
-	  for (elm = alist; elm != SCM_EOL; elm = scm_cdr (elm))
-	    scm_hashq_set_x (htab, scm_caar (elm), scm_cdar (elm));
-	  base->properties = htab;
-	  return SCM_UNSPECIFIED;
-	}
-    }
-
-  base->properties = alist;
-  return SCM_UNSPECIFIED;
-}
-
-/* (gdb-object-has-property? gsmob property) -> boolean */
-
-static SCM
-gdbscm_gsmob_has_property_p (SCM self, SCM property)
-{
-  SCM smob, handle;
-  gdb_smob *base;
-
-  smob = gsscm_get_gsmob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
-  base = (gdb_smob *) SCM_SMOB_DATA (self);
-
-  if (gdbscm_is_true (scm_hash_table_p (base->properties)))
-    handle = scm_hashq_get_handle (base->properties, property);
-  else
-    handle = scm_assq (property, base->properties);
-
-  return scm_from_bool (gdbscm_is_true (handle));
-}
-
-/* Helper function for gdbscm_gsmob_properties.  */
-
-static SCM
-add_property_name (void *closure, SCM handle)
-{
-  SCM *resultp = closure;
-
-  *resultp = scm_cons (scm_car (handle), *resultp);
-  return SCM_UNSPECIFIED;
-}
-
-/* (gdb-object-properties gsmob) -> list
-   The list is unsorted.  */
-
-static SCM
-gdbscm_gsmob_properties (SCM self)
-{
-  SCM smob, handle, result;
-  gdb_smob *base;
-
-  smob = gsscm_get_gsmob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
-  base = (gdb_smob *) SCM_SMOB_DATA (self);
-
-  result = SCM_EOL;
-  if (gdbscm_is_true (scm_hash_table_p (base->properties)))
-    {
-      scm_internal_hash_for_each_handle (add_property_name, &result,
-					 base->properties);
-    }
-  else
-    {
-      SCM elm;
-
-      for (elm = base->properties; elm != SCM_EOL; elm = scm_cdr (elm))
-	result = scm_cons (scm_caar (elm), result);
-    }
-
-  return result;
-}
 
 /* When underlying gdb data structures are deleted, we need to update any
    smobs with references to them.  There are several smobs that reference
@@ -463,22 +277,6 @@  static const scheme_function gsmob_functions[] =
     "\
 Return the kind of the GDB object, e.g., <gdb:breakpoint>, as a symbol." },
 
-  { "gdb-object-property", 2, 0, 0, gdbscm_gsmob_property,
-    "\
-Return the specified property of the GDB object." },
-
-  { "set-gdb-object-property!", 3, 0, 0, gdbscm_set_gsmob_property_x,
-    "\
-Set the specified property of the GDB object." },
-
-  { "gdb-object-has-property?", 2, 0, 0, gdbscm_gsmob_has_property_p,
-    "\
-Return #t if the specified property is present." },
-
-  { "gdb-object-properties", 1, 0, 0, gdbscm_gsmob_properties,
-    "\
-Return an unsorted list of names of properties." },
-
   END_FUNCTIONS
 };
 
diff --git a/gdb/guile/scm-iterator.c b/gdb/guile/scm-iterator.c
index a6deb84..080339b 100644
--- a/gdb/guile/scm-iterator.c
+++ b/gdb/guile/scm-iterator.c
@@ -60,9 +60,6 @@ 
 
 struct _iterator_smob
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   /* The object being iterated over.  */
   SCM object;
 
@@ -119,9 +116,7 @@  itscm_mark_iterator_smob (SCM self)
 
   scm_gc_mark (i_smob->object);
   scm_gc_mark (i_smob->progress);
-  scm_gc_mark (i_smob->next_x);
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&i_smob->base);
+  return i_smob->next_x;
 }
 
 /* The smob "print" function for <gdb:iterator>.  */
@@ -160,7 +155,6 @@  itscm_make_iterator_smob (SCM object, SCM progress, SCM next)
   i_smob->progress = progress;
   i_smob->next_x = next;
   i_scm = scm_new_smob (iterator_smob_tag, (scm_t_bits) i_smob);
-  gdbscm_init_gsmob (&i_smob->base);
 
   return i_scm;
 }
diff --git a/gdb/guile/scm-lazy-string.c b/gdb/guile/scm-lazy-string.c
index e965d01..9409379 100644
--- a/gdb/guile/scm-lazy-string.c
+++ b/gdb/guile/scm-lazy-string.c
@@ -33,9 +33,6 @@ 
 
 typedef struct
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   /*  Holds the address of the lazy string.  */
   CORE_ADDR address;
 
@@ -68,10 +65,7 @@  static scm_t_bits lazy_string_smob_tag;
 static SCM
 lsscm_mark_lazy_string_smob (SCM self)
 {
-  lazy_string_smob *ls_smob = (lazy_string_smob *) SCM_SMOB_DATA (self);
-
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&ls_smob->base);
+  return SCM_BOOL_F;
 }
 
 /* The smob "free" function for <gdb:lazy-string>.  */
@@ -132,7 +126,6 @@  lsscm_make_lazy_string_smob (CORE_ADDR address, int length,
   ls_smob->type = type;
 
   ls_scm = scm_new_smob (lazy_string_smob_tag, (scm_t_bits) ls_smob);
-  gdbscm_init_gsmob (&ls_smob->base);
 
   return ls_scm;
 }
diff --git a/gdb/guile/scm-objfile.c b/gdb/guile/scm-objfile.c
index 70f7e33..693d404 100644
--- a/gdb/guile/scm-objfile.c
+++ b/gdb/guile/scm-objfile.c
@@ -30,9 +30,6 @@ 
 
 struct _objfile_smob
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   /* The corresponding objfile.  */
   struct objfile *objfile;
 
@@ -69,13 +66,10 @@  ofscm_mark_objfile_smob (SCM self)
 {
   objfile_smob *o_smob = (objfile_smob *) SCM_SMOB_DATA (self);
 
-  scm_gc_mark (o_smob->pretty_printers);
-
   /* We don't mark containing_scm here.  It is just a backlink to our
      container, and is gc-protected until the objfile is deleted.  */
 
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&o_smob->base);
+  return o_smob->pretty_printers;
 }
 
 /* The smob "print" function for <gdb:objfile>.  */
@@ -113,7 +107,6 @@  ofscm_make_objfile_smob (void)
   o_smob->pretty_printers = SCM_EOL;
   o_scm = scm_new_smob (objfile_smob_tag, (scm_t_bits) o_smob);
   o_smob->containing_scm = o_scm;
-  gdbscm_init_gsmob (&o_smob->base);
 
   return o_scm;
 }
diff --git a/gdb/guile/scm-pretty-print.c b/gdb/guile/scm-pretty-print.c
index 1b9902f4..f25eac3 100644
--- a/gdb/guile/scm-pretty-print.c
+++ b/gdb/guile/scm-pretty-print.c
@@ -62,9 +62,6 @@  enum display_hint
 
 typedef struct
 {
-  /* This must appear first.  */
-  gdb_smob base;
-
   /* A string representing the name of the printer.  */
   SCM name;
 
@@ -84,9 +81,6 @@  typedef struct
 
 typedef struct
 {
-  /* This must appear first.  */
-  gdb_smob base;
-
   /* Either #f or one of the supported display hints: map, array, string.
      If neither of those then the display hint is ignored (treated as #f).  */
   SCM display_hint;
@@ -136,9 +130,7 @@  ppscm_mark_pretty_printer_smob (SCM self)
 
   scm_gc_mark (pp_smob->name);
   scm_gc_mark (pp_smob->enabled);
-  scm_gc_mark (pp_smob->lookup);
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&pp_smob->base);
+  return pp_smob->lookup;
 }
 
 /* The smob "print" function for <gdb:pretty-printer>.  */
@@ -179,7 +171,6 @@  gdbscm_make_pretty_printer (SCM name, SCM lookup)
   pp_smob->lookup = lookup;
   pp_smob->enabled = SCM_BOOL_T;
   smob = scm_new_smob (pretty_printer_smob_tag, (scm_t_bits) pp_smob);
-  gdbscm_init_gsmob (&pp_smob->base);
 
   return smob;
 }
@@ -267,9 +258,7 @@  ppscm_mark_pretty_printer_worker_smob (SCM self)
 
   scm_gc_mark (w_smob->display_hint);
   scm_gc_mark (w_smob->to_string);
-  scm_gc_mark (w_smob->children);
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&w_smob->base);
+  return w_smob->children;
 }
 
 /* The smob "print" function for <gdb:pretty-printer-worker>.  */
@@ -311,7 +300,6 @@  gdbscm_make_pretty_printer_worker (SCM display_hint, SCM to_string,
   w_smob->to_string = to_string;
   w_smob->children = children;
   w_scm = scm_new_smob (pretty_printer_worker_smob_tag, (scm_t_bits) w_smob);
-  gdbscm_init_gsmob (&w_smob->base);
   return w_scm;
 }
 
diff --git a/gdb/guile/scm-symbol.c b/gdb/guile/scm-symbol.c
index 0c5cc05..b6a92a4 100644
--- a/gdb/guile/scm-symbol.c
+++ b/gdb/guile/scm-symbol.c
@@ -100,10 +100,7 @@  syscm_objfile_symbol_map (struct symbol *symbol)
 static SCM
 syscm_mark_symbol_smob (SCM self)
 {
-  symbol_smob *s_smob = (symbol_smob *) SCM_SMOB_DATA (self);
-
-  /* Do this last.  */
-  return gdbscm_mark_eqable_gsmob (&s_smob->base);
+  return SCM_BOOL_F;
 }
 
 /* The smob "free" function for <gdb:symbol>.  */
diff --git a/gdb/guile/scm-symtab.c b/gdb/guile/scm-symtab.c
index 7294fea..9c7f51c 100644
--- a/gdb/guile/scm-symtab.c
+++ b/gdb/guile/scm-symtab.c
@@ -52,9 +52,6 @@  typedef struct
 
 typedef struct
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   /* The <gdb:symtab> object of the symtab.
      We store this instead of a pointer to the symtab_smob because it's not
      clear GC will know the symtab_smob is referenced by us otherwise, and we
@@ -127,10 +124,7 @@  stscm_objfile_symtab_map (struct symtab *symtab)
 static SCM
 stscm_mark_symtab_smob (SCM self)
 {
-  symtab_smob *st_smob = (symtab_smob *) SCM_SMOB_DATA (self);
-
-  /* Do this last.  */
-  return gdbscm_mark_eqable_gsmob (&st_smob->base);
+  return SCM_BOOL_F;
 }
 
 /* The smob "free" function for <gdb:symtab>.  */
@@ -407,10 +401,7 @@  stscm_mark_sal_smob (SCM self)
 {
   sal_smob *s_smob = (sal_smob *) SCM_SMOB_DATA (self);
 
-  scm_gc_mark (s_smob->symtab_scm);
-
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&s_smob->base);
+  return s_smob->symtab_scm;
 }
 
 /* The smob "free" function for <gdb:sal>.  */
@@ -458,7 +449,6 @@  stscm_make_sal_smob (void)
   s_smob->symtab_scm = SCM_BOOL_F;
   memset (&s_smob->sal, 0, sizeof (s_smob->sal));
   s_scm = scm_new_smob (sal_smob_tag, (scm_t_bits) s_smob);
-  gdbscm_init_gsmob (&s_smob->base);
 
   return s_scm;
 }
diff --git a/gdb/guile/scm-type.c b/gdb/guile/scm-type.c
index 9345c28..b65c06a 100644
--- a/gdb/guile/scm-type.c
+++ b/gdb/guile/scm-type.c
@@ -55,9 +55,6 @@  typedef struct _type_smob
 
 typedef struct
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   /* Backlink to the containing <gdb:type> object.  */
   SCM type_scm;
 
@@ -186,10 +183,7 @@  tyscm_type_map (struct type *type)
 static SCM
 tyscm_mark_type_smob (SCM self)
 {
-  type_smob *t_smob = (type_smob *) SCM_SMOB_DATA (self);
-
-  /* Do this last.  */
-  return gdbscm_mark_eqable_gsmob (&t_smob->base);
+  return SCM_BOOL_F;
 }
 
 /* The smob "free" function for <gdb:type>.  */
@@ -422,9 +416,7 @@  tyscm_mark_field_smob (SCM self)
 {
   field_smob *f_smob = (field_smob *) SCM_SMOB_DATA (self);
 
-  scm_gc_mark (f_smob->type_scm);
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&f_smob->base);
+  return f_smob->type_scm;
 }
 
 /* The smob "print" function for <gdb:field>.  */
@@ -458,7 +450,6 @@  tyscm_make_field_smob (SCM type_scm, int field_num)
   f_smob->type_scm = type_scm;
   f_smob->field_num = field_num;
   result = scm_new_smob (field_smob_tag, (scm_t_bits) f_smob);
-  gdbscm_init_gsmob (&f_smob->base);
 
   return result;
 }
diff --git a/gdb/guile/scm-value.c b/gdb/guile/scm-value.c
index 8ca0762..70cc7d0 100644
--- a/gdb/guile/scm-value.c
+++ b/gdb/guile/scm-value.c
@@ -36,9 +36,6 @@ 
 
 typedef struct _value_smob
 {
-  /* This always appears first.  */
-  gdb_smob base;
-
   /* Doubly linked list of values in values_in_scheme.
      IWBN to use a chained_gdb_smob instead, which is doable, it just requires
      a bit more casting than normal.  */
@@ -132,9 +129,7 @@  vlscm_mark_value_smob (SCM self)
 
   scm_gc_mark (v_smob->address);
   scm_gc_mark (v_smob->type);
-  scm_gc_mark (v_smob->dynamic_type);
-  /* Do this last.  */
-  return gdbscm_mark_gsmob (&v_smob->base);
+  return v_smob->dynamic_type;
 }
 
 /* The smob "free" function for <gdb:value>.  */
@@ -238,7 +233,6 @@  vlscm_make_value_smob (void)
   v_smob->dynamic_type = SCM_UNDEFINED;
 
   v_scm = scm_new_smob (value_smob_tag, (scm_t_bits) v_smob);
-  gdbscm_init_gsmob (&v_smob->base);
 
   return v_scm;
 }
diff --git a/gdb/testsuite/gdb.guile/scm-breakpoint.exp b/gdb/testsuite/gdb.guile/scm-breakpoint.exp
index 4e78791..fd7c970 100644
--- a/gdb/testsuite/gdb.guile/scm-breakpoint.exp
+++ b/gdb/testsuite/gdb.guile/scm-breakpoint.exp
@@ -310,14 +310,14 @@  proc test_bkpt_eval_funcs { } {
 	    "(define set-bp-data-count! set-car!)" "" \
 	    "(define bp-data-inf-i cdr)" "" \
 	    "(define set-bp-data-inf-i! set-cdr!)" "" \
-	    "(define (bp-eval-count bkpt) (bp-data-count (gdb-object-property bkpt 'bp-data)))" "" \
-	    "(define (bp-eval-inf-i bkpt) (bp-data-inf-i (gdb-object-property bkpt 'bp-data)))" "" \
+	    "(define (bp-eval-count bkpt) (bp-data-count (object-property bkpt 'bp-data)))" "" \
+	    "(define (bp-eval-inf-i bkpt) (bp-data-inf-i (object-property bkpt 'bp-data)))" "" \
 	    "(define (make-bp-eval location)" "" \
 	    "  (let ((bp (create-breakpoint! location)))" "" \
-	    "    (set-gdb-object-property! bp 'bp-data (make-bp-data))" "" \
+	    "    (set-object-property! bp 'bp-data (make-bp-data))" "" \
 	    "    (set-breakpoint-stop! bp" "" \
 	    "       (lambda (bkpt)" "" \
-	    "         (let ((data (gdb-object-property bkpt 'bp-data))" "" \
+	    "         (let ((data (object-property bkpt 'bp-data))" "" \
 	    "               (inf-i (parse-and-eval \"i\")))" "" \
 	    "           (set-bp-data-count! data (+ (bp-data-count data) 1))" "" \
 	    "           (set-bp-data-inf-i! data inf-i)" "" \
@@ -329,10 +329,10 @@  proc test_bkpt_eval_funcs { } {
 	    "guile" "" \
 	    "(define (make-bp-also-eval location)" "" \
 	    "  (let ((bp (create-breakpoint! location)))" "" \
-	    "    (set-gdb-object-property! bp 'bp-data (make-bp-data))" "" \
+	    "    (set-object-property! bp 'bp-data (make-bp-data))" "" \
 	    "    (set-breakpoint-stop! bp" "" \
 	    "       (lambda (bkpt)" "" \
-	    "         (let* ((data (gdb-object-property bkpt 'bp-data))" "" \
+	    "         (let* ((data (object-property bkpt 'bp-data))" "" \
 	    "                (count (+ (bp-data-count data) 1)))" "" \
 	    "           (set-bp-data-count! data count)" "" \
 	    "           (= count 9))))" "" \
@@ -343,7 +343,7 @@  proc test_bkpt_eval_funcs { } {
 	    "guile" "" \
 	    "(define (make-bp-basic location)" "" \
 	    "  (let ((bp (create-breakpoint! location)))" "" \
-	    "    (set-gdb-object-property! bp 'bp-data (make-bp-data))" "" \
+	    "    (set-object-property! bp 'bp-data (make-bp-data))" "" \
 	    "    bp))" "" \
 	    "end" ""
 
diff --git a/gdb/testsuite/gdb.guile/scm-gsmob.exp b/gdb/testsuite/gdb.guile/scm-gsmob.exp
index e33d0e1..70c3a65 100644
--- a/gdb/testsuite/gdb.guile/scm-gsmob.exp
+++ b/gdb/testsuite/gdb.guile/scm-gsmob.exp
@@ -45,26 +45,24 @@  proc prop_name { i } {
 # Set and ref the properties in separate loops to verify previously set
 # properties are not lost when we set a new property or switch to htabs.
 for {set i 0} {$i <= $SMOB_PROP_HTAB_THRESHOLD} {incr i} {
-    gdb_test "gu (print (gdb-object-has-property? arch '[prop_name $i]))" \
+    gdb_test "gu (print (object-property arch '[prop_name $i]))" \
 	"= #f" "property prop$i not present before set"
-    gdb_test_no_output "gu (set-gdb-object-property! arch '[prop_name $i] $i)" \
-	"set prop $i"
-    gdb_test "gu (print (gdb-object-has-property? arch '[prop_name $i]))" \
-	"= #t" "property prop$i present after set"
+    gdb_test "gu (print (set-object-property! arch '[prop_name $i] $i))" \
+	"= $i" "set prop $i"
+    gdb_test "gu (print (object-property arch '[prop_name $i]))" \
+	"= $i" "property prop$i present after set"
 }
 for {set i 0} {$i <= $SMOB_PROP_HTAB_THRESHOLD} {incr i} {
-    gdb_test "gu (print (gdb-object-has-property? arch '[prop_name $i]))" \
-	"= #t" "property prop$i present after all set"
-    gdb_test "gu (print (gdb-object-property arch '[prop_name $i]))" \
+    gdb_test "gu (print (object-property arch '[prop_name $i]))" \
 	"= $i" "ref prop $i"
 }
 
-# Verify gsmob-properties.
+# Verify properties.
 set prop_list ""
 for {set i 0} {$i <= $SMOB_PROP_HTAB_THRESHOLD} {incr i} {
     set prop_list "$prop_list [prop_name $i]"
 }
 set prop_list [lsort $prop_list]
 verbose -log "prop_list: $prop_list"
-gdb_test "gu (print (sort (gdb-object-properties arch) (lambda (a b) (string<? (symbol->string a) (symbol->string b)))))" \
-    "= \\($prop_list\\)" "gdb-object-properties"
+gdb_test "gu (print (sort (map car (object-properties arch)) (lambda (a b) (string<? (symbol->string a) (symbol->string b)))))" \
+    "= \\($prop_list\\)" "object-properties"