[6/9] Remove Guile GDB object property mechanism

Message ID 1397060028-18158-7-git-send-email-wingo@igalia.com
State Changes Requested, archived
Headers

Commit Message

Andy Wingo April 9, 2014, 4:13 p.m. UTC
  * 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(-)
  

Comments

Doug Evans April 12, 2014, 7:23 p.m. UTC | #1
Andy Wingo <wingo@igalia.com> writes:

> * 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.

I realize I wasn't going to say anything more about changelogs, but alas
the above is insufficient.  My understanding of community rules, and I
can imagine there being differing opinions, is that shortcuts like this
are not allowed.  No disagreement that some brevity would be nice, but
IME the community frowns on it.  [More clarity on the subject would be nice.]
Each change to each file needs to be documented.  E.g.,

	* scm-arch.c (_arch_smob): Delete member base.  All uses updated.

or some such, depending on the change.

I started out with having a simple "aux" field in gsmobs so that 
one could store arbitrary data with them without having to resort to
object properties (storing data for an "object" in a global side table
is a hack I'm not fond of).
I think I'll go back to having just "aux".
  
Andy Wingo April 17, 2014, 9:54 a.m. UTC | #2
On Sat 12 Apr 2014 21:23, Doug Evans <xdje42@gmail.com> writes:

> Andy Wingo <wingo@igalia.com> writes:
>
>> * 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.
>
> I realize I wasn't going to say anything more about changelogs, but alas
> the above is insufficient.  My understanding of community rules, and I
> can imagine there being differing opinions, is that shortcuts like this
> are not allowed.  No disagreement that some brevity would be nice, but
> IME the community frowns on it.  [More clarity on the subject would be nice.]
> Each change to each file needs to be documented.  E.g.,
>
> 	* scm-arch.c (_arch_smob): Delete member base.  All uses updated.
>
> or some such, depending on the change.

Alack.  Will fix, but what a slog...

> I started out with having a simple "aux" field in gsmobs so that 
> one could store arbitrary data with them without having to resort to
> object properties (storing data for an "object" in a global side table
> is a hack I'm not fond of).
> I think I'll go back to having just "aux".

Just my opinion, but I think this is the wrong approach.  For one, you
have to make a new API, where there is a perfectly good and
well-understood one in Guile.  Less code is better code.  You add
overhead for these properties to every object, where the vast majority
of objects will never need it.  It doesn't compose on a modular level --
you can't hide a property on an object from other modules, as you can
with `make-object-property'.  And finally, a weak lookaside table is a
semantically equivalent option, and is not bad, perf-wise.

Again, just MHO :)

Regards,

Andy
  

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"