From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25420 invoked by alias); 24 Aug 2011 15:11:56 -0000 Received: (qmail 25322 invoked by uid 22791); 24 Aug 2011 15:11:48 -0000 X-SWARE-Spam-Status: No, hits=-2.6 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_BJ,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-yi0-f41.google.com (HELO mail-yi0-f41.google.com) (209.85.218.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 24 Aug 2011 15:11:19 +0000 Received: by yib2 with SMTP id 2so1001267yib.0 for ; Wed, 24 Aug 2011 08:11:19 -0700 (PDT) Received: by 10.101.210.31 with SMTP id m31mr4746361anq.169.1314198678367; Wed, 24 Aug 2011 08:11:18 -0700 (PDT) Received: from localhost.localdomain (c-98-232-221-4.hsd1.or.comcast.net [98.232.221.4]) by mx.google.com with ESMTPS id d7sm968071anb.40.2011.08.24.08.11.17 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 24 Aug 2011 08:11:18 -0700 (PDT) From: matt rice To: gdb-patches@sourceware.org Cc: matt rice Subject: [PATCH 4/7] [python] API for macros: Add methods to get a gdb.Macro. Date: Wed, 24 Aug 2011 15:12:00 -0000 Message-Id: <1314198654-9008-5-git-send-email-ratmice@gmail.com> In-Reply-To: <1314198654-9008-1-git-send-email-ratmice@gmail.com> References: <1314198654-9008-1-git-send-email-ratmice@gmail.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-08/txt/msg00447.txt.bz2 2011-08-23 Matt Rice PR python/10807 * py-symtab.c (stpy_dealloc): Call super's tp_free. (salpy_macros, stpy_macros, stpy_macro_named): New methods. (sal_object_methods, stpy_object_methods): Add new methods to method list. --- gdb/python/py-symtab.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 112 insertions(+), 0 deletions(-) diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c index 107cdec..1bceeb6 100644 --- a/gdb/python/py-symtab.c +++ b/gdb/python/py-symtab.c @@ -22,6 +22,8 @@ #include "symtab.h" #include "source.h" #include "python-internal.h" +#include "py-macro.h" +#include "macroscope.h" #include "objfiles.h" typedef struct stpy_symtab_object { @@ -138,6 +140,35 @@ stpy_fullname (PyObject *self, PyObject *args) Py_RETURN_NONE; } +static PyObject * +stpy_macros (PyObject *self, PyObject *args) +{ + struct symtab *st = symtab_object_to_symtab (self); + PyObject *result; + enum macro_walk_result walk_result; + struct macropy_user_data mud; + + STPY_REQUIRE_VALID (self, st); + + result = PyList_New (0); + if (result == NULL) + return NULL; + + mud.list = result; + mud.objfile = macro_table_objfile (st->macro_table); + walk_result = macro_for_each (st->macro_table, + pymacro_add_macro_to_list, + &mud); + + if (walk_result == macro_walk_aborted) + { + Py_DECREF (result); + return NULL; + } + + return result; +} + /* Implementation of gdb.Symtab.is_valid (self) -> Boolean. Returns True if this Symbol table still exists in GDB. */ @@ -191,6 +222,7 @@ stpy_dealloc (PyObject *obj) if (symtab->next) symtab->next->prev = symtab->prev; symtab->symtab = NULL; + obj->ob_type->tp_free (obj); } @@ -242,6 +274,75 @@ salpy_is_valid (PyObject *self, PyObject *args) Py_RETURN_TRUE; } +static PyObject * +salpy_macros (PyObject *self, PyObject *args) +{ + struct symtab_and_line *sal; + PyObject *result; + enum macro_walk_result walk_result; + struct macropy_user_data mud; + struct macro_scope *ms; + + SALPY_REQUIRE_VALID (self, sal); + + ms = sal_macro_scope (*sal); + + result = PyList_New (0); + if (result == NULL) + return NULL; + + mud.list = result; + mud.objfile = macro_table_objfile (ms->file->table); + walk_result = macro_for_each_in_scope (ms->file, ms->line, + pymacro_add_macro_to_list, &mud); + + if (walk_result == macro_walk_aborted) + { + Py_DECREF (result); + return NULL; + } + + return result; +} + +static PyObject * +salpy_macro_named (PyObject *self, PyObject *args) +{ + struct symtab_and_line *sal; + struct macro_scope *ms; + const struct macro_definition *mdef; + char *macro_name; + struct cleanup *cleanup_chain; + struct macro_source_file *file; + struct objfile *objfile; + PyObject *result; + int line; + + if (!PyArg_ParseTuple (args, "s", ¯o_name)) + return NULL; + + SALPY_REQUIRE_VALID (self, sal); + + ms = sal_macro_scope (*sal); + cleanup_chain = make_cleanup (free_current_contents, &ms); + if (ms == NULL) + goto none_exit; + + mdef = macro_lookup_definition (ms->file, ms->line, macro_name); + if (mdef == NULL) + goto none_exit; + + file = macro_definition_location(ms->file, ms->line, macro_name, &line); + objfile = macro_table_objfile(ms->file->table); + result = macropy_object_create (objfile, macro_name, mdef, file, line); + do_cleanups (cleanup_chain); + return result; + + none_exit: + do_cleanups (cleanup_chain); + return Py_None; +} + static void salpy_dealloc (PyObject *self) { @@ -477,6 +578,9 @@ Return true if this symbol table is valid, false if not." }, { "fullname", stpy_fullname, METH_NOARGS, "fullname () -> String.\n\ Return the symtab's full source filename." }, + { "macros", stpy_macros, METH_NOARGS, + "macros () -> List.\n\ +Return a list of macros in the symtab." }, {NULL} /* Sentinel */ }; @@ -526,6 +630,14 @@ static PyMethodDef sal_object_methods[] = { { "is_valid", salpy_is_valid, METH_NOARGS, "is_valid () -> Boolean.\n\ Return true if this symbol table and line is valid, false if not." }, + { "macro_named", salpy_macro_named, METH_VARARGS, + "macro_named (name) -> Macro.\n\ +Return the macro object for the given name, or None if the \ +macro cannot be found." }, + { "macros", salpy_macros, METH_NOARGS, + "macros () -> List.\n\ +Return all the macros which are available at the symbol table and line \ +object's location." }, {NULL} /* Sentinel */ }; -- 1.7.4.4