xref: /dflybsd-src/contrib/gdb-7/gdb/python/py-symbol.c (revision de8e141f24382815c10a4012d209bbbf7abf1112)
1c50c785cSJohn Marino /* Python interface to symbols.
2c50c785cSJohn Marino 
3*ef5ccd6cSJohn Marino    Copyright (C) 2008-2013 Free Software Foundation, Inc.
4c50c785cSJohn Marino 
5c50c785cSJohn Marino    This file is part of GDB.
6c50c785cSJohn Marino 
7c50c785cSJohn Marino    This program is free software; you can redistribute it and/or modify
8c50c785cSJohn Marino    it under the terms of the GNU General Public License as published by
9c50c785cSJohn Marino    the Free Software Foundation; either version 3 of the License, or
10c50c785cSJohn Marino    (at your option) any later version.
11c50c785cSJohn Marino 
12c50c785cSJohn Marino    This program is distributed in the hope that it will be useful,
13c50c785cSJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
14c50c785cSJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15c50c785cSJohn Marino    GNU General Public License for more details.
16c50c785cSJohn Marino 
17c50c785cSJohn Marino    You should have received a copy of the GNU General Public License
18c50c785cSJohn Marino    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19c50c785cSJohn Marino 
20c50c785cSJohn Marino #include "defs.h"
21c50c785cSJohn Marino #include "block.h"
22c50c785cSJohn Marino #include "exceptions.h"
23c50c785cSJohn Marino #include "frame.h"
24c50c785cSJohn Marino #include "symtab.h"
25c50c785cSJohn Marino #include "python-internal.h"
26c50c785cSJohn Marino #include "objfiles.h"
27c50c785cSJohn Marino 
28c50c785cSJohn Marino typedef struct sympy_symbol_object {
29c50c785cSJohn Marino   PyObject_HEAD
30c50c785cSJohn Marino   /* The GDB symbol structure this object is wrapping.  */
31c50c785cSJohn Marino   struct symbol *symbol;
32c50c785cSJohn Marino   /* A symbol object is associated with an objfile, so keep track with
33c50c785cSJohn Marino      doubly-linked list, rooted in the objfile.  This lets us
34c50c785cSJohn Marino      invalidate the underlying struct symbol when the objfile is
35c50c785cSJohn Marino      deleted.  */
36c50c785cSJohn Marino   struct sympy_symbol_object *prev;
37c50c785cSJohn Marino   struct sympy_symbol_object *next;
38c50c785cSJohn Marino } symbol_object;
39c50c785cSJohn Marino 
40c50c785cSJohn Marino /* Require a valid symbol.  All access to symbol_object->symbol should be
41c50c785cSJohn Marino    gated by this call.  */
42c50c785cSJohn Marino #define SYMPY_REQUIRE_VALID(symbol_obj, symbol)		\
43c50c785cSJohn Marino   do {							\
44c50c785cSJohn Marino     symbol = symbol_object_to_symbol (symbol_obj);	\
45c50c785cSJohn Marino     if (symbol == NULL)					\
46c50c785cSJohn Marino       {							\
47c50c785cSJohn Marino 	PyErr_SetString (PyExc_RuntimeError,		\
48c50c785cSJohn Marino 			 _("Symbol is invalid."));	\
49c50c785cSJohn Marino 	return NULL;					\
50c50c785cSJohn Marino       }							\
51c50c785cSJohn Marino   } while (0)
52c50c785cSJohn Marino 
53c50c785cSJohn Marino static const struct objfile_data *sympy_objfile_data_key;
54c50c785cSJohn Marino 
55c50c785cSJohn Marino static PyObject *
sympy_str(PyObject * self)56c50c785cSJohn Marino sympy_str (PyObject *self)
57c50c785cSJohn Marino {
58c50c785cSJohn Marino   PyObject *result;
59c50c785cSJohn Marino   struct symbol *symbol = NULL;
60c50c785cSJohn Marino 
61c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
62c50c785cSJohn Marino 
63c50c785cSJohn Marino   result = PyString_FromString (SYMBOL_PRINT_NAME (symbol));
64c50c785cSJohn Marino 
65c50c785cSJohn Marino   return result;
66c50c785cSJohn Marino }
67c50c785cSJohn Marino 
68c50c785cSJohn Marino static PyObject *
sympy_get_type(PyObject * self,void * closure)69a45ae5f8SJohn Marino sympy_get_type (PyObject *self, void *closure)
70a45ae5f8SJohn Marino {
71a45ae5f8SJohn Marino   struct symbol *symbol = NULL;
72a45ae5f8SJohn Marino 
73a45ae5f8SJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
74a45ae5f8SJohn Marino 
75a45ae5f8SJohn Marino   if (SYMBOL_TYPE (symbol) == NULL)
76a45ae5f8SJohn Marino     {
77a45ae5f8SJohn Marino       Py_INCREF (Py_None);
78a45ae5f8SJohn Marino       return Py_None;
79a45ae5f8SJohn Marino     }
80a45ae5f8SJohn Marino 
81a45ae5f8SJohn Marino   return type_to_type_object (SYMBOL_TYPE (symbol));
82a45ae5f8SJohn Marino }
83a45ae5f8SJohn Marino 
84a45ae5f8SJohn Marino static PyObject *
sympy_get_symtab(PyObject * self,void * closure)85c50c785cSJohn Marino sympy_get_symtab (PyObject *self, void *closure)
86c50c785cSJohn Marino {
87c50c785cSJohn Marino   struct symbol *symbol = NULL;
88c50c785cSJohn Marino 
89c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
90c50c785cSJohn Marino 
91c50c785cSJohn Marino   return symtab_to_symtab_object (SYMBOL_SYMTAB (symbol));
92c50c785cSJohn Marino }
93c50c785cSJohn Marino 
94c50c785cSJohn Marino static PyObject *
sympy_get_name(PyObject * self,void * closure)95c50c785cSJohn Marino sympy_get_name (PyObject *self, void *closure)
96c50c785cSJohn Marino {
97c50c785cSJohn Marino   struct symbol *symbol = NULL;
98c50c785cSJohn Marino 
99c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
100c50c785cSJohn Marino 
101c50c785cSJohn Marino   return PyString_FromString (SYMBOL_NATURAL_NAME (symbol));
102c50c785cSJohn Marino }
103c50c785cSJohn Marino 
104c50c785cSJohn Marino static PyObject *
sympy_get_linkage_name(PyObject * self,void * closure)105c50c785cSJohn Marino sympy_get_linkage_name (PyObject *self, void *closure)
106c50c785cSJohn Marino {
107c50c785cSJohn Marino   struct symbol *symbol = NULL;
108c50c785cSJohn Marino 
109c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
110c50c785cSJohn Marino 
111c50c785cSJohn Marino   return PyString_FromString (SYMBOL_LINKAGE_NAME (symbol));
112c50c785cSJohn Marino }
113c50c785cSJohn Marino 
114c50c785cSJohn Marino static PyObject *
sympy_get_print_name(PyObject * self,void * closure)115c50c785cSJohn Marino sympy_get_print_name (PyObject *self, void *closure)
116c50c785cSJohn Marino {
117c50c785cSJohn Marino   struct symbol *symbol = NULL;
118c50c785cSJohn Marino 
119c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
120c50c785cSJohn Marino 
121c50c785cSJohn Marino   return sympy_str (self);
122c50c785cSJohn Marino }
123c50c785cSJohn Marino 
124c50c785cSJohn Marino static PyObject *
sympy_get_addr_class(PyObject * self,void * closure)125c50c785cSJohn Marino sympy_get_addr_class (PyObject *self, void *closure)
126c50c785cSJohn Marino {
127c50c785cSJohn Marino   struct symbol *symbol = NULL;
128c50c785cSJohn Marino 
129c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
130c50c785cSJohn Marino 
131c50c785cSJohn Marino   return PyInt_FromLong (SYMBOL_CLASS (symbol));
132c50c785cSJohn Marino }
133c50c785cSJohn Marino 
134c50c785cSJohn Marino static PyObject *
sympy_is_argument(PyObject * self,void * closure)135c50c785cSJohn Marino sympy_is_argument (PyObject *self, void *closure)
136c50c785cSJohn Marino {
137c50c785cSJohn Marino   struct symbol *symbol = NULL;
138c50c785cSJohn Marino 
139c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
140c50c785cSJohn Marino 
141c50c785cSJohn Marino   return PyBool_FromLong (SYMBOL_IS_ARGUMENT (symbol));
142c50c785cSJohn Marino }
143c50c785cSJohn Marino 
144c50c785cSJohn Marino static PyObject *
sympy_is_constant(PyObject * self,void * closure)145c50c785cSJohn Marino sympy_is_constant (PyObject *self, void *closure)
146c50c785cSJohn Marino {
147c50c785cSJohn Marino   struct symbol *symbol = NULL;
148c50c785cSJohn Marino   enum address_class class;
149c50c785cSJohn Marino 
150c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
151c50c785cSJohn Marino 
152c50c785cSJohn Marino   class = SYMBOL_CLASS (symbol);
153c50c785cSJohn Marino 
154c50c785cSJohn Marino   return PyBool_FromLong (class == LOC_CONST || class == LOC_CONST_BYTES);
155c50c785cSJohn Marino }
156c50c785cSJohn Marino 
157c50c785cSJohn Marino static PyObject *
sympy_is_function(PyObject * self,void * closure)158c50c785cSJohn Marino sympy_is_function (PyObject *self, void *closure)
159c50c785cSJohn Marino {
160c50c785cSJohn Marino   struct symbol *symbol = NULL;
161c50c785cSJohn Marino   enum address_class class;
162c50c785cSJohn Marino 
163c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
164c50c785cSJohn Marino 
165c50c785cSJohn Marino   class = SYMBOL_CLASS (symbol);
166c50c785cSJohn Marino 
167c50c785cSJohn Marino   return PyBool_FromLong (class == LOC_BLOCK);
168c50c785cSJohn Marino }
169c50c785cSJohn Marino 
170c50c785cSJohn Marino static PyObject *
sympy_is_variable(PyObject * self,void * closure)171c50c785cSJohn Marino sympy_is_variable (PyObject *self, void *closure)
172c50c785cSJohn Marino {
173c50c785cSJohn Marino   struct symbol *symbol = NULL;
174c50c785cSJohn Marino   enum address_class class;
175c50c785cSJohn Marino 
176c50c785cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
177c50c785cSJohn Marino 
178c50c785cSJohn Marino   class = SYMBOL_CLASS (symbol);
179c50c785cSJohn Marino 
180c50c785cSJohn Marino   return PyBool_FromLong (!SYMBOL_IS_ARGUMENT (symbol)
181c50c785cSJohn Marino 			  && (class == LOC_LOCAL || class == LOC_REGISTER
182c50c785cSJohn Marino 			      || class == LOC_STATIC || class == LOC_COMPUTED
183c50c785cSJohn Marino 			      || class == LOC_OPTIMIZED_OUT));
184c50c785cSJohn Marino }
185c50c785cSJohn Marino 
186*ef5ccd6cSJohn Marino /* Implementation of gdb.Symbol.needs_frame -> Boolean.
187*ef5ccd6cSJohn Marino    Returns true iff the symbol needs a frame for evaluation.  */
188*ef5ccd6cSJohn Marino 
189*ef5ccd6cSJohn Marino static PyObject *
sympy_needs_frame(PyObject * self,void * closure)190*ef5ccd6cSJohn Marino sympy_needs_frame (PyObject *self, void *closure)
191*ef5ccd6cSJohn Marino {
192*ef5ccd6cSJohn Marino   struct symbol *symbol = NULL;
193*ef5ccd6cSJohn Marino   volatile struct gdb_exception except;
194*ef5ccd6cSJohn Marino   int result = 0;
195*ef5ccd6cSJohn Marino 
196*ef5ccd6cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
197*ef5ccd6cSJohn Marino 
198*ef5ccd6cSJohn Marino   TRY_CATCH (except, RETURN_MASK_ALL)
199*ef5ccd6cSJohn Marino     {
200*ef5ccd6cSJohn Marino       result = symbol_read_needs_frame (symbol);
201*ef5ccd6cSJohn Marino     }
202*ef5ccd6cSJohn Marino   GDB_PY_HANDLE_EXCEPTION (except);
203*ef5ccd6cSJohn Marino 
204*ef5ccd6cSJohn Marino   if (result)
205*ef5ccd6cSJohn Marino     Py_RETURN_TRUE;
206*ef5ccd6cSJohn Marino   Py_RETURN_FALSE;
207*ef5ccd6cSJohn Marino }
208*ef5ccd6cSJohn Marino 
209*ef5ccd6cSJohn Marino /* Implementation of gdb.Symbol.line -> int.
210*ef5ccd6cSJohn Marino    Returns the line number at which the symbol was defined.  */
211*ef5ccd6cSJohn Marino 
212*ef5ccd6cSJohn Marino static PyObject *
sympy_line(PyObject * self,void * closure)213*ef5ccd6cSJohn Marino sympy_line (PyObject *self, void *closure)
214*ef5ccd6cSJohn Marino {
215*ef5ccd6cSJohn Marino   struct symbol *symbol = NULL;
216*ef5ccd6cSJohn Marino 
217*ef5ccd6cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
218*ef5ccd6cSJohn Marino 
219*ef5ccd6cSJohn Marino   return PyInt_FromLong (SYMBOL_LINE (symbol));
220*ef5ccd6cSJohn Marino }
221*ef5ccd6cSJohn Marino 
222c50c785cSJohn Marino /* Implementation of gdb.Symbol.is_valid (self) -> Boolean.
223c50c785cSJohn Marino    Returns True if this Symbol still exists in GDB.  */
224c50c785cSJohn Marino 
225c50c785cSJohn Marino static PyObject *
sympy_is_valid(PyObject * self,PyObject * args)226c50c785cSJohn Marino sympy_is_valid (PyObject *self, PyObject *args)
227c50c785cSJohn Marino {
228c50c785cSJohn Marino   struct symbol *symbol = NULL;
229c50c785cSJohn Marino 
230c50c785cSJohn Marino   symbol = symbol_object_to_symbol (self);
231c50c785cSJohn Marino   if (symbol == NULL)
232c50c785cSJohn Marino     Py_RETURN_FALSE;
233c50c785cSJohn Marino 
234c50c785cSJohn Marino   Py_RETURN_TRUE;
235c50c785cSJohn Marino }
236c50c785cSJohn Marino 
237*ef5ccd6cSJohn Marino /* Implementation of gdb.Symbol.value (self[, frame]) -> gdb.Value.  Returns
238*ef5ccd6cSJohn Marino    the value of the symbol, or an error in various circumstances.  */
239*ef5ccd6cSJohn Marino 
240*ef5ccd6cSJohn Marino static PyObject *
sympy_value(PyObject * self,PyObject * args)241*ef5ccd6cSJohn Marino sympy_value (PyObject *self, PyObject *args)
242*ef5ccd6cSJohn Marino {
243*ef5ccd6cSJohn Marino   struct symbol *symbol = NULL;
244*ef5ccd6cSJohn Marino   struct frame_info *frame_info = NULL;
245*ef5ccd6cSJohn Marino   PyObject *frame_obj = NULL;
246*ef5ccd6cSJohn Marino   struct value *value = NULL;
247*ef5ccd6cSJohn Marino   volatile struct gdb_exception except;
248*ef5ccd6cSJohn Marino 
249*ef5ccd6cSJohn Marino   if (!PyArg_ParseTuple (args, "|O", &frame_obj))
250*ef5ccd6cSJohn Marino     return NULL;
251*ef5ccd6cSJohn Marino 
252*ef5ccd6cSJohn Marino   if (frame_obj != NULL && !PyObject_TypeCheck (frame_obj, &frame_object_type))
253*ef5ccd6cSJohn Marino     {
254*ef5ccd6cSJohn Marino       PyErr_SetString (PyExc_TypeError, "argument is not a frame");
255*ef5ccd6cSJohn Marino       return NULL;
256*ef5ccd6cSJohn Marino     }
257*ef5ccd6cSJohn Marino 
258*ef5ccd6cSJohn Marino   SYMPY_REQUIRE_VALID (self, symbol);
259*ef5ccd6cSJohn Marino   if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
260*ef5ccd6cSJohn Marino     {
261*ef5ccd6cSJohn Marino       PyErr_SetString (PyExc_TypeError, "cannot get the value of a typedef");
262*ef5ccd6cSJohn Marino       return NULL;
263*ef5ccd6cSJohn Marino     }
264*ef5ccd6cSJohn Marino 
265*ef5ccd6cSJohn Marino   TRY_CATCH (except, RETURN_MASK_ALL)
266*ef5ccd6cSJohn Marino     {
267*ef5ccd6cSJohn Marino       if (frame_obj != NULL)
268*ef5ccd6cSJohn Marino 	{
269*ef5ccd6cSJohn Marino 	  frame_info = frame_object_to_frame_info (frame_obj);
270*ef5ccd6cSJohn Marino 	  if (frame_info == NULL)
271*ef5ccd6cSJohn Marino 	    error (_("invalid frame"));
272*ef5ccd6cSJohn Marino 	}
273*ef5ccd6cSJohn Marino 
274*ef5ccd6cSJohn Marino       if (symbol_read_needs_frame (symbol) && frame_info == NULL)
275*ef5ccd6cSJohn Marino 	error (_("symbol requires a frame to compute its value"));
276*ef5ccd6cSJohn Marino 
277*ef5ccd6cSJohn Marino       value = read_var_value (symbol, frame_info);
278*ef5ccd6cSJohn Marino     }
279*ef5ccd6cSJohn Marino   GDB_PY_HANDLE_EXCEPTION (except);
280*ef5ccd6cSJohn Marino 
281*ef5ccd6cSJohn Marino   return value_to_value_object (value);
282*ef5ccd6cSJohn Marino }
283*ef5ccd6cSJohn Marino 
284c50c785cSJohn Marino /* Given a symbol, and a symbol_object that has previously been
285c50c785cSJohn Marino    allocated and initialized, populate the symbol_object with the
286c50c785cSJohn Marino    struct symbol data.  Also, register the symbol_object life-cycle
287c50c785cSJohn Marino    with the life-cycle of the object file associated with this
288c50c785cSJohn Marino    symbol, if needed.  */
289c50c785cSJohn Marino static void
set_symbol(symbol_object * obj,struct symbol * symbol)290c50c785cSJohn Marino set_symbol (symbol_object *obj, struct symbol *symbol)
291c50c785cSJohn Marino {
292c50c785cSJohn Marino   obj->symbol = symbol;
293c50c785cSJohn Marino   obj->prev = NULL;
294c50c785cSJohn Marino   if (SYMBOL_SYMTAB (symbol))
295c50c785cSJohn Marino     {
296c50c785cSJohn Marino       obj->next = objfile_data (SYMBOL_SYMTAB (symbol)->objfile,
297c50c785cSJohn Marino 				sympy_objfile_data_key);
298c50c785cSJohn Marino 
299c50c785cSJohn Marino       if (obj->next)
300c50c785cSJohn Marino 	obj->next->prev = obj;
301c50c785cSJohn Marino       set_objfile_data (SYMBOL_SYMTAB (symbol)->objfile,
302c50c785cSJohn Marino 			sympy_objfile_data_key, obj);
303c50c785cSJohn Marino     }
304c50c785cSJohn Marino   else
305c50c785cSJohn Marino     obj->next = NULL;
306c50c785cSJohn Marino }
307c50c785cSJohn Marino 
308c50c785cSJohn Marino /* Create a new symbol object (gdb.Symbol) that encapsulates the struct
309c50c785cSJohn Marino    symbol object from GDB.  */
310c50c785cSJohn Marino PyObject *
symbol_to_symbol_object(struct symbol * sym)311c50c785cSJohn Marino symbol_to_symbol_object (struct symbol *sym)
312c50c785cSJohn Marino {
313c50c785cSJohn Marino   symbol_object *sym_obj;
314c50c785cSJohn Marino 
315c50c785cSJohn Marino   sym_obj = PyObject_New (symbol_object, &symbol_object_type);
316c50c785cSJohn Marino   if (sym_obj)
317c50c785cSJohn Marino     set_symbol (sym_obj, sym);
318c50c785cSJohn Marino 
319c50c785cSJohn Marino   return (PyObject *) sym_obj;
320c50c785cSJohn Marino }
321c50c785cSJohn Marino 
322c50c785cSJohn Marino /* Return the symbol that is wrapped by this symbol object.  */
323c50c785cSJohn Marino struct symbol *
symbol_object_to_symbol(PyObject * obj)324c50c785cSJohn Marino symbol_object_to_symbol (PyObject *obj)
325c50c785cSJohn Marino {
326c50c785cSJohn Marino   if (! PyObject_TypeCheck (obj, &symbol_object_type))
327c50c785cSJohn Marino     return NULL;
328c50c785cSJohn Marino   return ((symbol_object *) obj)->symbol;
329c50c785cSJohn Marino }
330c50c785cSJohn Marino 
331c50c785cSJohn Marino static void
sympy_dealloc(PyObject * obj)332c50c785cSJohn Marino sympy_dealloc (PyObject *obj)
333c50c785cSJohn Marino {
334c50c785cSJohn Marino   symbol_object *sym_obj = (symbol_object *) obj;
335c50c785cSJohn Marino 
336c50c785cSJohn Marino   if (sym_obj->prev)
337c50c785cSJohn Marino     sym_obj->prev->next = sym_obj->next;
338*ef5ccd6cSJohn Marino   else if (sym_obj->symbol && SYMBOL_SYMTAB (sym_obj->symbol))
339c50c785cSJohn Marino     {
340c50c785cSJohn Marino       set_objfile_data (SYMBOL_SYMTAB (sym_obj->symbol)->objfile,
341c50c785cSJohn Marino 			sympy_objfile_data_key, sym_obj->next);
342c50c785cSJohn Marino     }
343c50c785cSJohn Marino   if (sym_obj->next)
344c50c785cSJohn Marino     sym_obj->next->prev = sym_obj->prev;
345c50c785cSJohn Marino   sym_obj->symbol = NULL;
346c50c785cSJohn Marino }
347c50c785cSJohn Marino 
348c50c785cSJohn Marino /* Implementation of
349c50c785cSJohn Marino    gdb.lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this)
350c50c785cSJohn Marino    A tuple with 2 elements is always returned.  The first is the symbol
351c50c785cSJohn Marino    object or None, the second is a boolean with the value of
352c50c785cSJohn Marino    is_a_field_of_this (see comment in lookup_symbol_in_language).  */
353c50c785cSJohn Marino 
354c50c785cSJohn Marino PyObject *
gdbpy_lookup_symbol(PyObject * self,PyObject * args,PyObject * kw)355c50c785cSJohn Marino gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
356c50c785cSJohn Marino {
357*ef5ccd6cSJohn Marino   int domain = VAR_DOMAIN;
358*ef5ccd6cSJohn Marino   struct field_of_this_result is_a_field_of_this;
359c50c785cSJohn Marino   const char *name;
360c50c785cSJohn Marino   static char *keywords[] = { "name", "block", "domain", NULL };
361a45ae5f8SJohn Marino   struct symbol *symbol = NULL;
362c50c785cSJohn Marino   PyObject *block_obj = NULL, *ret_tuple, *sym_obj, *bool_obj;
363a45ae5f8SJohn Marino   const struct block *block = NULL;
364a45ae5f8SJohn Marino   volatile struct gdb_exception except;
365c50c785cSJohn Marino 
366c50c785cSJohn Marino   if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name,
367c50c785cSJohn Marino 				     &block_object_type, &block_obj, &domain))
368c50c785cSJohn Marino     return NULL;
369c50c785cSJohn Marino 
370c50c785cSJohn Marino   if (block_obj)
371c50c785cSJohn Marino     block = block_object_to_block (block_obj);
372c50c785cSJohn Marino   else
373c50c785cSJohn Marino     {
374c50c785cSJohn Marino       struct frame_info *selected_frame;
375c50c785cSJohn Marino       volatile struct gdb_exception except;
376c50c785cSJohn Marino 
377c50c785cSJohn Marino       TRY_CATCH (except, RETURN_MASK_ALL)
378c50c785cSJohn Marino 	{
379c50c785cSJohn Marino 	  selected_frame = get_selected_frame (_("No frame selected."));
380c50c785cSJohn Marino 	  block = get_frame_block (selected_frame, NULL);
381c50c785cSJohn Marino 	}
382c50c785cSJohn Marino       GDB_PY_HANDLE_EXCEPTION (except);
383c50c785cSJohn Marino     }
384c50c785cSJohn Marino 
385a45ae5f8SJohn Marino   TRY_CATCH (except, RETURN_MASK_ALL)
386a45ae5f8SJohn Marino     {
387c50c785cSJohn Marino       symbol = lookup_symbol (name, block, domain, &is_a_field_of_this);
388a45ae5f8SJohn Marino     }
389a45ae5f8SJohn Marino   GDB_PY_HANDLE_EXCEPTION (except);
390c50c785cSJohn Marino 
391c50c785cSJohn Marino   ret_tuple = PyTuple_New (2);
392c50c785cSJohn Marino   if (!ret_tuple)
393c50c785cSJohn Marino     return NULL;
394c50c785cSJohn Marino 
395c50c785cSJohn Marino   if (symbol)
396c50c785cSJohn Marino     {
397c50c785cSJohn Marino       sym_obj = symbol_to_symbol_object (symbol);
398c50c785cSJohn Marino       if (!sym_obj)
399c50c785cSJohn Marino 	{
400c50c785cSJohn Marino 	  Py_DECREF (ret_tuple);
401c50c785cSJohn Marino 	  return NULL;
402c50c785cSJohn Marino 	}
403c50c785cSJohn Marino     }
404c50c785cSJohn Marino   else
405c50c785cSJohn Marino     {
406c50c785cSJohn Marino       sym_obj = Py_None;
407c50c785cSJohn Marino       Py_INCREF (Py_None);
408c50c785cSJohn Marino     }
409c50c785cSJohn Marino   PyTuple_SET_ITEM (ret_tuple, 0, sym_obj);
410c50c785cSJohn Marino 
411*ef5ccd6cSJohn Marino   bool_obj = (is_a_field_of_this.type != NULL) ? Py_True : Py_False;
412c50c785cSJohn Marino   Py_INCREF (bool_obj);
413c50c785cSJohn Marino   PyTuple_SET_ITEM (ret_tuple, 1, bool_obj);
414c50c785cSJohn Marino 
415c50c785cSJohn Marino   return ret_tuple;
416c50c785cSJohn Marino }
417c50c785cSJohn Marino 
418c50c785cSJohn Marino /* Implementation of
419c50c785cSJohn Marino    gdb.lookup_global_symbol (name [, domain]) -> symbol or None.  */
420c50c785cSJohn Marino 
421c50c785cSJohn Marino PyObject *
gdbpy_lookup_global_symbol(PyObject * self,PyObject * args,PyObject * kw)422c50c785cSJohn Marino gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
423c50c785cSJohn Marino {
424c50c785cSJohn Marino   int domain = VAR_DOMAIN;
425c50c785cSJohn Marino   const char *name;
426c50c785cSJohn Marino   static char *keywords[] = { "name", "domain", NULL };
427a45ae5f8SJohn Marino   struct symbol *symbol = NULL;
428c50c785cSJohn Marino   PyObject *sym_obj;
429a45ae5f8SJohn Marino   volatile struct gdb_exception except;
430c50c785cSJohn Marino 
431c50c785cSJohn Marino   if (! PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
432c50c785cSJohn Marino 				     &domain))
433c50c785cSJohn Marino     return NULL;
434c50c785cSJohn Marino 
435a45ae5f8SJohn Marino   TRY_CATCH (except, RETURN_MASK_ALL)
436a45ae5f8SJohn Marino     {
437c50c785cSJohn Marino       symbol = lookup_symbol_global (name, NULL, domain);
438a45ae5f8SJohn Marino     }
439a45ae5f8SJohn Marino   GDB_PY_HANDLE_EXCEPTION (except);
440c50c785cSJohn Marino 
441c50c785cSJohn Marino   if (symbol)
442c50c785cSJohn Marino     {
443c50c785cSJohn Marino       sym_obj = symbol_to_symbol_object (symbol);
444c50c785cSJohn Marino       if (!sym_obj)
445c50c785cSJohn Marino 	return NULL;
446c50c785cSJohn Marino     }
447c50c785cSJohn Marino   else
448c50c785cSJohn Marino     {
449c50c785cSJohn Marino       sym_obj = Py_None;
450c50c785cSJohn Marino       Py_INCREF (Py_None);
451c50c785cSJohn Marino     }
452c50c785cSJohn Marino 
453c50c785cSJohn Marino   return sym_obj;
454c50c785cSJohn Marino }
455c50c785cSJohn Marino 
456c50c785cSJohn Marino /* This function is called when an objfile is about to be freed.
457c50c785cSJohn Marino    Invalidate the symbol as further actions on the symbol would result
458c50c785cSJohn Marino    in bad data.  All access to obj->symbol should be gated by
459c50c785cSJohn Marino    SYMPY_REQUIRE_VALID which will raise an exception on invalid
460c50c785cSJohn Marino    symbols.  */
461c50c785cSJohn Marino static void
del_objfile_symbols(struct objfile * objfile,void * datum)462c50c785cSJohn Marino del_objfile_symbols (struct objfile *objfile, void *datum)
463c50c785cSJohn Marino {
464c50c785cSJohn Marino   symbol_object *obj = datum;
465c50c785cSJohn Marino   while (obj)
466c50c785cSJohn Marino     {
467c50c785cSJohn Marino       symbol_object *next = obj->next;
468c50c785cSJohn Marino 
469c50c785cSJohn Marino       obj->symbol = NULL;
470c50c785cSJohn Marino       obj->next = NULL;
471c50c785cSJohn Marino       obj->prev = NULL;
472c50c785cSJohn Marino 
473c50c785cSJohn Marino       obj = next;
474c50c785cSJohn Marino     }
475c50c785cSJohn Marino }
476c50c785cSJohn Marino 
477c50c785cSJohn Marino void
gdbpy_initialize_symbols(void)478c50c785cSJohn Marino gdbpy_initialize_symbols (void)
479c50c785cSJohn Marino {
480c50c785cSJohn Marino   if (PyType_Ready (&symbol_object_type) < 0)
481c50c785cSJohn Marino     return;
482c50c785cSJohn Marino 
483c50c785cSJohn Marino   /* Register an objfile "free" callback so we can properly
484c50c785cSJohn Marino      invalidate symbol when an object file that is about to be
485c50c785cSJohn Marino      deleted.  */
486c50c785cSJohn Marino   sympy_objfile_data_key
487c50c785cSJohn Marino     = register_objfile_data_with_cleanup (NULL, del_objfile_symbols);
488c50c785cSJohn Marino 
489c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNDEF", LOC_UNDEF);
490c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST", LOC_CONST);
491c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_STATIC", LOC_STATIC);
492c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGISTER", LOC_REGISTER);
493c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_ARG", LOC_ARG);
494c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REF_ARG", LOC_REF_ARG);
495c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LOCAL", LOC_LOCAL);
496c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_TYPEDEF", LOC_TYPEDEF);
497c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LABEL", LOC_LABEL);
498c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_BLOCK", LOC_BLOCK);
499c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST_BYTES",
500c50c785cSJohn Marino 			   LOC_CONST_BYTES);
501c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNRESOLVED",
502c50c785cSJohn Marino 			   LOC_UNRESOLVED);
503c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_OPTIMIZED_OUT",
504c50c785cSJohn Marino 			   LOC_OPTIMIZED_OUT);
505c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMPUTED", LOC_COMPUTED);
506c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGPARM_ADDR",
507c50c785cSJohn Marino 			   LOC_REGPARM_ADDR);
508c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_UNDEF_DOMAIN", UNDEF_DOMAIN);
509c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_VAR_DOMAIN", VAR_DOMAIN);
510c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_STRUCT_DOMAIN", STRUCT_DOMAIN);
511c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_LABEL_DOMAIN", LABEL_DOMAIN);
512c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_VARIABLES_DOMAIN",
513c50c785cSJohn Marino 			   VARIABLES_DOMAIN);
514c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_FUNCTIONS_DOMAIN",
515c50c785cSJohn Marino 			   FUNCTIONS_DOMAIN);
516c50c785cSJohn Marino   PyModule_AddIntConstant (gdb_module, "SYMBOL_TYPES_DOMAIN", TYPES_DOMAIN);
517c50c785cSJohn Marino 
518c50c785cSJohn Marino   Py_INCREF (&symbol_object_type);
519c50c785cSJohn Marino   PyModule_AddObject (gdb_module, "Symbol", (PyObject *) &symbol_object_type);
520c50c785cSJohn Marino }
521c50c785cSJohn Marino 
522c50c785cSJohn Marino 
523c50c785cSJohn Marino 
524c50c785cSJohn Marino static PyGetSetDef symbol_object_getset[] = {
525a45ae5f8SJohn Marino   { "type", sympy_get_type, NULL,
526a45ae5f8SJohn Marino     "Type of the symbol.", NULL },
527c50c785cSJohn Marino   { "symtab", sympy_get_symtab, NULL,
528c50c785cSJohn Marino     "Symbol table in which the symbol appears.", NULL },
529c50c785cSJohn Marino   { "name", sympy_get_name, NULL,
530c50c785cSJohn Marino     "Name of the symbol, as it appears in the source code.", NULL },
531c50c785cSJohn Marino   { "linkage_name", sympy_get_linkage_name, NULL,
532c50c785cSJohn Marino     "Name of the symbol, as used by the linker (i.e., may be mangled).",
533c50c785cSJohn Marino     NULL },
534c50c785cSJohn Marino   { "print_name", sympy_get_print_name, NULL,
535c50c785cSJohn Marino     "Name of the symbol in a form suitable for output.\n\
536c50c785cSJohn Marino This is either name or linkage_name, depending on whether the user asked GDB\n\
537c50c785cSJohn Marino to display demangled or mangled names.", NULL },
538c50c785cSJohn Marino   { "addr_class", sympy_get_addr_class, NULL, "Address class of the symbol." },
539c50c785cSJohn Marino   { "is_argument", sympy_is_argument, NULL,
540c50c785cSJohn Marino     "True if the symbol is an argument of a function." },
541c50c785cSJohn Marino   { "is_constant", sympy_is_constant, NULL,
542c50c785cSJohn Marino     "True if the symbol is a constant." },
543c50c785cSJohn Marino   { "is_function", sympy_is_function, NULL,
544c50c785cSJohn Marino     "True if the symbol is a function or method." },
545c50c785cSJohn Marino   { "is_variable", sympy_is_variable, NULL,
546c50c785cSJohn Marino     "True if the symbol is a variable." },
547*ef5ccd6cSJohn Marino   { "needs_frame", sympy_needs_frame, NULL,
548*ef5ccd6cSJohn Marino     "True if the symbol requires a frame for evaluation." },
549*ef5ccd6cSJohn Marino   { "line", sympy_line, NULL,
550*ef5ccd6cSJohn Marino     "The source line number at which the symbol was defined." },
551c50c785cSJohn Marino   { NULL }  /* Sentinel */
552c50c785cSJohn Marino };
553c50c785cSJohn Marino 
554c50c785cSJohn Marino static PyMethodDef symbol_object_methods[] = {
555c50c785cSJohn Marino   { "is_valid", sympy_is_valid, METH_NOARGS,
556c50c785cSJohn Marino     "is_valid () -> Boolean.\n\
557c50c785cSJohn Marino Return true if this symbol is valid, false if not." },
558*ef5ccd6cSJohn Marino   { "value", sympy_value, METH_VARARGS,
559*ef5ccd6cSJohn Marino     "value ([frame]) -> gdb.Value\n\
560*ef5ccd6cSJohn Marino Return the value of the symbol." },
561c50c785cSJohn Marino   {NULL}  /* Sentinel */
562c50c785cSJohn Marino };
563c50c785cSJohn Marino 
564c50c785cSJohn Marino PyTypeObject symbol_object_type = {
565*ef5ccd6cSJohn Marino   PyVarObject_HEAD_INIT (NULL, 0)
566c50c785cSJohn Marino   "gdb.Symbol",			  /*tp_name*/
567c50c785cSJohn Marino   sizeof (symbol_object),	  /*tp_basicsize*/
568c50c785cSJohn Marino   0,				  /*tp_itemsize*/
569c50c785cSJohn Marino   sympy_dealloc,		  /*tp_dealloc*/
570c50c785cSJohn Marino   0,				  /*tp_print*/
571c50c785cSJohn Marino   0,				  /*tp_getattr*/
572c50c785cSJohn Marino   0,				  /*tp_setattr*/
573c50c785cSJohn Marino   0,				  /*tp_compare*/
574c50c785cSJohn Marino   0,				  /*tp_repr*/
575c50c785cSJohn Marino   0,				  /*tp_as_number*/
576c50c785cSJohn Marino   0,				  /*tp_as_sequence*/
577c50c785cSJohn Marino   0,				  /*tp_as_mapping*/
578c50c785cSJohn Marino   0,				  /*tp_hash */
579c50c785cSJohn Marino   0,				  /*tp_call*/
580c50c785cSJohn Marino   sympy_str,			  /*tp_str*/
581c50c785cSJohn Marino   0,				  /*tp_getattro*/
582c50c785cSJohn Marino   0,				  /*tp_setattro*/
583c50c785cSJohn Marino   0,				  /*tp_as_buffer*/
584c50c785cSJohn Marino   Py_TPFLAGS_DEFAULT,		  /*tp_flags*/
585c50c785cSJohn Marino   "GDB symbol object",		  /*tp_doc */
586c50c785cSJohn Marino   0,				  /*tp_traverse */
587c50c785cSJohn Marino   0,				  /*tp_clear */
588c50c785cSJohn Marino   0,				  /*tp_richcompare */
589c50c785cSJohn Marino   0,				  /*tp_weaklistoffset */
590c50c785cSJohn Marino   0,				  /*tp_iter */
591c50c785cSJohn Marino   0,				  /*tp_iternext */
592c50c785cSJohn Marino   symbol_object_methods,	  /*tp_methods */
593c50c785cSJohn Marino   0,				  /*tp_members */
594c50c785cSJohn Marino   symbol_object_getset		  /*tp_getset */
595c50c785cSJohn Marino };
596