From patchwork Wed Apr 9 16:08:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Wingo X-Patchwork-Id: 448 Return-Path: X-Original-To: siddhesh@wilcox.dreamhost.com Delivered-To: siddhesh@wilcox.dreamhost.com Received: from homiemail-mx22.g.dreamhost.com (mx2.sub5.homie.mail.dreamhost.com [208.113.200.128]) by wilcox.dreamhost.com (Postfix) with ESMTP id E81EA36005B for ; Wed, 9 Apr 2014 09:10:08 -0700 (PDT) Received: by homiemail-mx22.g.dreamhost.com (Postfix, from userid 14314964) id 983405071426; Wed, 9 Apr 2014 09:10:08 -0700 (PDT) X-Original-To: gdb@patchwork.siddhesh.in Delivered-To: x14314964@homiemail-mx22.g.dreamhost.com Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by homiemail-mx22.g.dreamhost.com (Postfix) with ESMTPS id 712585071410 for ; Wed, 9 Apr 2014 09:10:08 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=BAwOkcBtFaOcNSfdWQKNMTKUnK6ZUUm XHHzdipcubicGckF1Gw8j24gC06RiwJ2tOL0XRLqB5O/Pp9LF6ITjB57hIcj0tTb PwyqXtKBr9KZLmOCUEAZSCiF7FP0p7XqAOsvmE5tpX65FXeGGT9P+6tR5d7o6SHj AcPVAfWZdG8I= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; s=default; bh=xCG416FcUKXhIah5ou1axBXIqlQ=; b=Ua4I4 NfXEIKjDUPhsq/PBRORx2Qn3WInxjO52kyelg0JJYMBiYw9j2Dx402rPo3Lhdn1h W0I79yRGcfiF4zNH+NTlMPVa3Xps2Jt6oNIqVRjz/ePBLmiYZwZZlSqMbUM2C3o/ Q+L0L8PYGJ5ydHzzQ1F5dlZNMoMcyl1fhuwOYQ= Received: (qmail 25744 invoked by alias); 9 Apr 2014 16:09:36 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 25651 invoked by uid 89); 9 Apr 2014 16:09:35 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.8 required=5.0 tests=AWL, BAYES_50, RCVD_IN_DNSWL_NONE, SPF_NEUTRAL autolearn=no version=3.3.2 X-HELO: sasl.smtp.pobox.com Received: from a-pb-sasl-quonix.pobox.com (HELO sasl.smtp.pobox.com) (208.72.237.25) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 09 Apr 2014 16:09:31 +0000 Received: from sasl.smtp.pobox.com (unknown [127.0.0.1]) by a-pb-sasl-quonix.pobox.com (Postfix) with ESMTP id 6486D10FA0; Wed, 9 Apr 2014 12:09:31 -0400 (EDT) Received: from a-pb-sasl-quonix.pobox.com (unknown [127.0.0.1]) by a-pb-sasl-quonix.pobox.com (Postfix) with ESMTP id 5C1DD10F9E; Wed, 9 Apr 2014 12:09:31 -0400 (EDT) Received: from localhost.localdomain (unknown [88.160.190.192]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by a-pb-sasl-quonix.pobox.com (Postfix) with ESMTPSA id C1A0410F9D; Wed, 9 Apr 2014 12:09:28 -0400 (EDT) From: Andy Wingo To: gdb-patches@sourceware.org Cc: Andy Wingo Subject: [PATCH 5/8] Remove Guile GDB object property mechanism Date: Wed, 9 Apr 2014 18:08:37 +0200 Message-Id: <1397059725-18066-9-git-send-email-wingo@igalia.com> In-Reply-To: <1397059725-18066-1-git-send-email-wingo@igalia.com> References: <1397059725-18066-1-git-send-email-wingo@igalia.com> X-Pobox-Relay-ID: 54BB9B12-C001-11E3-8F94-873F0E5B5709-02397024!a-pb-sasl-quonix.pobox.com X-DH-Original-To: gdb@patchwork.siddhesh.in * 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/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 +- 17 files changed, 31 insertions(+), 387 deletions(-) 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{}, 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 57d6472..ec739c7 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 ;; scm-string.c 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 . */ @@ -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 . */ @@ -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 . */ @@ -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 . */ @@ -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 . */ @@ -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 . */ diff --git a/gdb/guile/scm-gsmob.c b/gdb/guile/scm-gsmob.c index 4ba9770..79dc9309 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 @@ -126,14 +108,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. */ @@ -141,7 +115,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; } @@ -153,50 +126,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 */ @@ -236,124 +168,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 @@ -453,22 +267,6 @@ static const scheme_function gsmob_functions[] = "\ Return the kind of the GDB object, e.g., , 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 . */ @@ -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 . */ @@ -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 . */ @@ -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 . */ @@ -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 . */ @@ -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 . */ 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 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 . */ @@ -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 . */ @@ -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 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 . */ @@ -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 . */ @@ -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 . */ @@ -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; }