xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/python/py-symbol.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* Python interface to symbols.
2 
3    Copyright (C) 2008-2023 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include "defs.h"
21 #include "block.h"
22 #include "frame.h"
23 #include "symtab.h"
24 #include "python-internal.h"
25 #include "objfiles.h"
26 #include "symfile.h"
27 
28 struct symbol_object {
29   PyObject_HEAD
30   /* The GDB symbol structure this object is wrapping.  */
31   struct symbol *symbol;
32   /* A symbol object is associated with an objfile, so keep track with
33      doubly-linked list, rooted in the objfile.  This lets us
34      invalidate the underlying struct symbol when the objfile is
35      deleted.  */
36   symbol_object *prev;
37   symbol_object *next;
38 };
39 
40 /* Require a valid symbol.  All access to symbol_object->symbol should be
41    gated by this call.  */
42 #define SYMPY_REQUIRE_VALID(symbol_obj, symbol)		\
43   do {							\
44     symbol = symbol_object_to_symbol (symbol_obj);	\
45     if (symbol == NULL)					\
46       {							\
47 	PyErr_SetString (PyExc_RuntimeError,		\
48 			 _("Symbol is invalid."));	\
49 	return NULL;					\
50       }							\
51   } while (0)
52 
53 /* A deleter that is used when an objfile is about to be freed.  */
54 struct symbol_object_deleter
55 {
56   void operator() (symbol_object *obj)
57   {
58     while (obj)
59       {
60 	symbol_object *next = obj->next;
61 
62 	obj->symbol = NULL;
63 	obj->next = NULL;
64 	obj->prev = NULL;
65 
66 	obj = next;
67       }
68   }
69 };
70 
71 static const registry<objfile>::key<symbol_object, symbol_object_deleter>
72      sympy_objfile_data_key;
73 
74 static PyObject *
75 sympy_str (PyObject *self)
76 {
77   PyObject *result;
78   struct symbol *symbol = NULL;
79 
80   SYMPY_REQUIRE_VALID (self, symbol);
81 
82   result = PyUnicode_FromString (symbol->print_name ());
83 
84   return result;
85 }
86 
87 static PyObject *
88 sympy_get_type (PyObject *self, void *closure)
89 {
90   struct symbol *symbol = NULL;
91 
92   SYMPY_REQUIRE_VALID (self, symbol);
93 
94   if (symbol->type () == NULL)
95     {
96       Py_INCREF (Py_None);
97       return Py_None;
98     }
99 
100   return type_to_type_object (symbol->type ());
101 }
102 
103 static PyObject *
104 sympy_get_symtab (PyObject *self, void *closure)
105 {
106   struct symbol *symbol = NULL;
107 
108   SYMPY_REQUIRE_VALID (self, symbol);
109 
110   if (!symbol->is_objfile_owned ())
111     Py_RETURN_NONE;
112 
113   return symtab_to_symtab_object (symbol->symtab ());
114 }
115 
116 static PyObject *
117 sympy_get_name (PyObject *self, void *closure)
118 {
119   struct symbol *symbol = NULL;
120 
121   SYMPY_REQUIRE_VALID (self, symbol);
122 
123   return PyUnicode_FromString (symbol->natural_name ());
124 }
125 
126 static PyObject *
127 sympy_get_linkage_name (PyObject *self, void *closure)
128 {
129   struct symbol *symbol = NULL;
130 
131   SYMPY_REQUIRE_VALID (self, symbol);
132 
133   return PyUnicode_FromString (symbol->linkage_name ());
134 }
135 
136 static PyObject *
137 sympy_get_print_name (PyObject *self, void *closure)
138 {
139   struct symbol *symbol = NULL;
140 
141   SYMPY_REQUIRE_VALID (self, symbol);
142 
143   return sympy_str (self);
144 }
145 
146 static PyObject *
147 sympy_get_addr_class (PyObject *self, void *closure)
148 {
149   struct symbol *symbol = NULL;
150 
151   SYMPY_REQUIRE_VALID (self, symbol);
152 
153   return gdb_py_object_from_longest (symbol->aclass ()).release ();
154 }
155 
156 static PyObject *
157 sympy_is_argument (PyObject *self, void *closure)
158 {
159   struct symbol *symbol = NULL;
160 
161   SYMPY_REQUIRE_VALID (self, symbol);
162 
163   return PyBool_FromLong (symbol->is_argument ());
164 }
165 
166 static PyObject *
167 sympy_is_constant (PyObject *self, void *closure)
168 {
169   struct symbol *symbol = NULL;
170   enum address_class theclass;
171 
172   SYMPY_REQUIRE_VALID (self, symbol);
173 
174   theclass = symbol->aclass ();
175 
176   return PyBool_FromLong (theclass == LOC_CONST || theclass == LOC_CONST_BYTES);
177 }
178 
179 static PyObject *
180 sympy_is_function (PyObject *self, void *closure)
181 {
182   struct symbol *symbol = NULL;
183   enum address_class theclass;
184 
185   SYMPY_REQUIRE_VALID (self, symbol);
186 
187   theclass = symbol->aclass ();
188 
189   return PyBool_FromLong (theclass == LOC_BLOCK);
190 }
191 
192 static PyObject *
193 sympy_is_variable (PyObject *self, void *closure)
194 {
195   struct symbol *symbol = NULL;
196   enum address_class theclass;
197 
198   SYMPY_REQUIRE_VALID (self, symbol);
199 
200   theclass = symbol->aclass ();
201 
202   return PyBool_FromLong (!symbol->is_argument ()
203 			  && (theclass == LOC_LOCAL || theclass == LOC_REGISTER
204 			      || theclass == LOC_STATIC || theclass == LOC_COMPUTED
205 			      || theclass == LOC_OPTIMIZED_OUT));
206 }
207 
208 /* Implementation of gdb.Symbol.needs_frame -> Boolean.
209    Returns true iff the symbol needs a frame for evaluation.  */
210 
211 static PyObject *
212 sympy_needs_frame (PyObject *self, void *closure)
213 {
214   struct symbol *symbol = NULL;
215   int result = 0;
216 
217   SYMPY_REQUIRE_VALID (self, symbol);
218 
219   try
220     {
221       result = symbol_read_needs_frame (symbol);
222     }
223   catch (const gdb_exception &except)
224     {
225       GDB_PY_HANDLE_EXCEPTION (except);
226     }
227 
228   if (result)
229     Py_RETURN_TRUE;
230   Py_RETURN_FALSE;
231 }
232 
233 /* Implementation of gdb.Symbol.line -> int.
234    Returns the line number at which the symbol was defined.  */
235 
236 static PyObject *
237 sympy_line (PyObject *self, void *closure)
238 {
239   struct symbol *symbol = NULL;
240 
241   SYMPY_REQUIRE_VALID (self, symbol);
242 
243   return gdb_py_object_from_longest (symbol->line ()).release ();
244 }
245 
246 /* Implementation of gdb.Symbol.is_valid (self) -> Boolean.
247    Returns True if this Symbol still exists in GDB.  */
248 
249 static PyObject *
250 sympy_is_valid (PyObject *self, PyObject *args)
251 {
252   struct symbol *symbol = NULL;
253 
254   symbol = symbol_object_to_symbol (self);
255   if (symbol == NULL)
256     Py_RETURN_FALSE;
257 
258   Py_RETURN_TRUE;
259 }
260 
261 /* Implementation of gdb.Symbol.value (self[, frame]) -> gdb.Value.  Returns
262    the value of the symbol, or an error in various circumstances.  */
263 
264 static PyObject *
265 sympy_value (PyObject *self, PyObject *args)
266 {
267   struct symbol *symbol = NULL;
268   frame_info_ptr frame_info = NULL;
269   PyObject *frame_obj = NULL;
270   struct value *value = NULL;
271 
272   if (!PyArg_ParseTuple (args, "|O", &frame_obj))
273     return NULL;
274 
275   if (frame_obj != NULL && !PyObject_TypeCheck (frame_obj, &frame_object_type))
276     {
277       PyErr_SetString (PyExc_TypeError, "argument is not a frame");
278       return NULL;
279     }
280 
281   SYMPY_REQUIRE_VALID (self, symbol);
282   if (symbol->aclass () == LOC_TYPEDEF)
283     {
284       PyErr_SetString (PyExc_TypeError, "cannot get the value of a typedef");
285       return NULL;
286     }
287 
288   try
289     {
290       if (frame_obj != NULL)
291 	{
292 	  frame_info = frame_object_to_frame_info (frame_obj);
293 	  if (frame_info == NULL)
294 	    error (_("invalid frame"));
295 	}
296 
297       if (symbol_read_needs_frame (symbol) && frame_info == NULL)
298 	error (_("symbol requires a frame to compute its value"));
299 
300       /* TODO: currently, we have no way to recover the block in which SYMBOL
301 	 was found, so we have no block to pass to read_var_value.  This will
302 	 yield an incorrect value when symbol is not local to FRAME_INFO (this
303 	 can happen with nested functions).  */
304       value = read_var_value (symbol, NULL, frame_info);
305     }
306   catch (const gdb_exception &except)
307     {
308       GDB_PY_HANDLE_EXCEPTION (except);
309     }
310 
311   return value_to_value_object (value);
312 }
313 
314 /* Given a symbol, and a symbol_object that has previously been
315    allocated and initialized, populate the symbol_object with the
316    struct symbol data.  Also, register the symbol_object life-cycle
317    with the life-cycle of the object file associated with this
318    symbol, if needed.  */
319 static void
320 set_symbol (symbol_object *obj, struct symbol *symbol)
321 {
322   obj->symbol = symbol;
323   obj->prev = NULL;
324   if (symbol->is_objfile_owned ()
325       && symbol->symtab () != NULL)
326     {
327       struct objfile *objfile = symbol->objfile ();
328 
329       obj->next = sympy_objfile_data_key.get (objfile);
330       if (obj->next)
331 	obj->next->prev = obj;
332       sympy_objfile_data_key.set (objfile, obj);
333     }
334   else
335     obj->next = NULL;
336 }
337 
338 /* Create a new symbol object (gdb.Symbol) that encapsulates the struct
339    symbol object from GDB.  */
340 PyObject *
341 symbol_to_symbol_object (struct symbol *sym)
342 {
343   symbol_object *sym_obj;
344 
345   sym_obj = PyObject_New (symbol_object, &symbol_object_type);
346   if (sym_obj)
347     set_symbol (sym_obj, sym);
348 
349   return (PyObject *) sym_obj;
350 }
351 
352 /* Return the symbol that is wrapped by this symbol object.  */
353 struct symbol *
354 symbol_object_to_symbol (PyObject *obj)
355 {
356   if (! PyObject_TypeCheck (obj, &symbol_object_type))
357     return NULL;
358   return ((symbol_object *) obj)->symbol;
359 }
360 
361 static void
362 sympy_dealloc (PyObject *obj)
363 {
364   symbol_object *sym_obj = (symbol_object *) obj;
365 
366   if (sym_obj->prev)
367     sym_obj->prev->next = sym_obj->next;
368   else if (sym_obj->symbol != NULL
369 	   && sym_obj->symbol->is_objfile_owned ()
370 	   && sym_obj->symbol->symtab () != NULL)
371     sympy_objfile_data_key.set (sym_obj->symbol->objfile (), sym_obj->next);
372   if (sym_obj->next)
373     sym_obj->next->prev = sym_obj->prev;
374   sym_obj->symbol = NULL;
375   Py_TYPE (obj)->tp_free (obj);
376 }
377 
378 /* Implementation of
379    gdb.lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this)
380    A tuple with 2 elements is always returned.  The first is the symbol
381    object or None, the second is a boolean with the value of
382    is_a_field_of_this (see comment in lookup_symbol_in_language).  */
383 
384 PyObject *
385 gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
386 {
387   int domain = VAR_DOMAIN;
388   struct field_of_this_result is_a_field_of_this;
389   const char *name;
390   static const char *keywords[] = { "name", "block", "domain", NULL };
391   struct symbol *symbol = NULL;
392   PyObject *block_obj = NULL, *sym_obj, *bool_obj;
393   const struct block *block = NULL;
394 
395   if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name,
396 					&block_object_type, &block_obj,
397 					&domain))
398     return NULL;
399 
400   if (block_obj)
401     block = block_object_to_block (block_obj);
402   else
403     {
404       frame_info_ptr selected_frame;
405 
406       try
407 	{
408 	  selected_frame = get_selected_frame (_("No frame selected."));
409 	  block = get_frame_block (selected_frame, NULL);
410 	}
411       catch (const gdb_exception &except)
412 	{
413 	  GDB_PY_HANDLE_EXCEPTION (except);
414 	}
415     }
416 
417   try
418     {
419       symbol = lookup_symbol (name, block, (domain_enum) domain,
420 			      &is_a_field_of_this).symbol;
421     }
422   catch (const gdb_exception &except)
423     {
424       GDB_PY_HANDLE_EXCEPTION (except);
425     }
426 
427   gdbpy_ref<> ret_tuple (PyTuple_New (2));
428   if (ret_tuple == NULL)
429     return NULL;
430 
431   if (symbol)
432     {
433       sym_obj = symbol_to_symbol_object (symbol);
434       if (!sym_obj)
435 	return NULL;
436     }
437   else
438     {
439       sym_obj = Py_None;
440       Py_INCREF (Py_None);
441     }
442   PyTuple_SET_ITEM (ret_tuple.get (), 0, sym_obj);
443 
444   bool_obj = PyBool_FromLong (is_a_field_of_this.type != NULL);
445   PyTuple_SET_ITEM (ret_tuple.get (), 1, bool_obj);
446 
447   return ret_tuple.release ();
448 }
449 
450 /* Implementation of
451    gdb.lookup_global_symbol (name [, domain]) -> symbol or None.  */
452 
453 PyObject *
454 gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
455 {
456   int domain = VAR_DOMAIN;
457   const char *name;
458   static const char *keywords[] = { "name", "domain", NULL };
459   struct symbol *symbol = NULL;
460   PyObject *sym_obj;
461 
462   if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
463 					&domain))
464     return NULL;
465 
466   try
467     {
468       symbol = lookup_global_symbol (name, NULL, (domain_enum) domain).symbol;
469     }
470   catch (const gdb_exception &except)
471     {
472       GDB_PY_HANDLE_EXCEPTION (except);
473     }
474 
475   if (symbol)
476     {
477       sym_obj = symbol_to_symbol_object (symbol);
478       if (!sym_obj)
479 	return NULL;
480     }
481   else
482     {
483       sym_obj = Py_None;
484       Py_INCREF (Py_None);
485     }
486 
487   return sym_obj;
488 }
489 
490 /* Implementation of
491    gdb.lookup_static_symbol (name [, domain]) -> symbol or None.  */
492 
493 PyObject *
494 gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
495 {
496   const char *name;
497   int domain = VAR_DOMAIN;
498   static const char *keywords[] = { "name", "domain", NULL };
499   struct symbol *symbol = NULL;
500   PyObject *sym_obj;
501 
502   if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
503 					&domain))
504     return NULL;
505 
506   /* In order to find static symbols associated with the "current" object
507      file ahead of those from other object files, we first need to see if
508      we can acquire a current block.  If this fails however, then we still
509      want to search all static symbols, so don't throw an exception just
510      yet.  */
511   const struct block *block = NULL;
512   try
513     {
514       frame_info_ptr selected_frame
515 	= get_selected_frame (_("No frame selected."));
516       block = get_frame_block (selected_frame, NULL);
517     }
518   catch (const gdb_exception &except)
519     {
520       /* Nothing.  */
521     }
522 
523   try
524     {
525       if (block != nullptr)
526 	symbol
527 	  = lookup_symbol_in_static_block (name, block,
528 					   (domain_enum) domain).symbol;
529 
530       if (symbol == nullptr)
531 	symbol = lookup_static_symbol (name, (domain_enum) domain).symbol;
532     }
533   catch (const gdb_exception &except)
534     {
535       GDB_PY_HANDLE_EXCEPTION (except);
536     }
537 
538   if (symbol)
539     {
540       sym_obj = symbol_to_symbol_object (symbol);
541       if (!sym_obj)
542 	return NULL;
543     }
544   else
545     {
546       sym_obj = Py_None;
547       Py_INCREF (Py_None);
548     }
549 
550   return sym_obj;
551 }
552 
553 /* Implementation of
554    gdb.lookup_static_symbols (name [, domain]) -> symbol list.
555 
556    Returns a list of all static symbols matching NAME in DOMAIN.  */
557 
558 PyObject *
559 gdbpy_lookup_static_symbols (PyObject *self, PyObject *args, PyObject *kw)
560 {
561   const char *name;
562   int domain = VAR_DOMAIN;
563   static const char *keywords[] = { "name", "domain", NULL };
564 
565   if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
566 					&domain))
567     return NULL;
568 
569   gdbpy_ref<> return_list (PyList_New (0));
570   if (return_list == NULL)
571     return NULL;
572 
573   try
574     {
575       /* Expand any symtabs that contain potentially matching symbols.  */
576       lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
577       expand_symtabs_matching (NULL, lookup_name, NULL, NULL,
578 			       SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
579 			       ALL_DOMAIN);
580 
581       for (objfile *objfile : current_program_space->objfiles ())
582 	{
583 	  for (compunit_symtab *cust : objfile->compunits ())
584 	    {
585 	      const struct blockvector *bv;
586 
587 	      bv = cust->blockvector ();
588 	      const struct block *block = bv->static_block ();
589 
590 	      if (block != nullptr)
591 		{
592 		  symbol *symbol = lookup_symbol_in_static_block
593 		    (name, block, (domain_enum) domain).symbol;
594 
595 		  if (symbol != nullptr)
596 		    {
597 		      PyObject *sym_obj
598 			= symbol_to_symbol_object (symbol);
599 		      if (PyList_Append (return_list.get (), sym_obj) == -1)
600 			return NULL;
601 		    }
602 		}
603 	    }
604 	}
605     }
606   catch (const gdb_exception &except)
607     {
608       GDB_PY_HANDLE_EXCEPTION (except);
609     }
610 
611   return return_list.release ();
612 }
613 
614 int
615 gdbpy_initialize_symbols (void)
616 {
617   if (PyType_Ready (&symbol_object_type) < 0)
618     return -1;
619 
620   if (PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNDEF", LOC_UNDEF) < 0
621       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST",
622 				  LOC_CONST) < 0
623       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_STATIC",
624 				  LOC_STATIC) < 0
625       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGISTER",
626 				  LOC_REGISTER) < 0
627       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_ARG",
628 				  LOC_ARG) < 0
629       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REF_ARG",
630 				  LOC_REF_ARG) < 0
631       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LOCAL",
632 				  LOC_LOCAL) < 0
633       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_TYPEDEF",
634 				  LOC_TYPEDEF) < 0
635       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LABEL",
636 				  LOC_LABEL) < 0
637       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_BLOCK",
638 				  LOC_BLOCK) < 0
639       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST_BYTES",
640 				  LOC_CONST_BYTES) < 0
641       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNRESOLVED",
642 				  LOC_UNRESOLVED) < 0
643       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_OPTIMIZED_OUT",
644 				  LOC_OPTIMIZED_OUT) < 0
645       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMPUTED",
646 				  LOC_COMPUTED) < 0
647       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMMON_BLOCK",
648 				  LOC_COMMON_BLOCK) < 0
649       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGPARM_ADDR",
650 				  LOC_REGPARM_ADDR) < 0
651       || PyModule_AddIntConstant (gdb_module, "SYMBOL_UNDEF_DOMAIN",
652 				  UNDEF_DOMAIN) < 0
653       || PyModule_AddIntConstant (gdb_module, "SYMBOL_VAR_DOMAIN",
654 				  VAR_DOMAIN) < 0
655       || PyModule_AddIntConstant (gdb_module, "SYMBOL_STRUCT_DOMAIN",
656 				  STRUCT_DOMAIN) < 0
657       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LABEL_DOMAIN",
658 				  LABEL_DOMAIN) < 0
659       || PyModule_AddIntConstant (gdb_module, "SYMBOL_MODULE_DOMAIN",
660 				  MODULE_DOMAIN) < 0
661       || PyModule_AddIntConstant (gdb_module, "SYMBOL_COMMON_BLOCK_DOMAIN",
662 				  COMMON_BLOCK_DOMAIN) < 0)
663     return -1;
664 
665   /* These remain defined for compatibility, but as they were never
666      correct, they are no longer documented.  Eventually we can remove
667      them.  These exist because at one time, enum search_domain and
668      enum domain_enum_tag were combined -- but different values were
669      used differently.  Here we try to give them values that will make
670      sense if they are passed to gdb.lookup_symbol.  */
671   if (PyModule_AddIntConstant (gdb_module, "SYMBOL_VARIABLES_DOMAIN",
672 			       VAR_DOMAIN) < 0
673       || PyModule_AddIntConstant (gdb_module, "SYMBOL_FUNCTIONS_DOMAIN",
674 				  VAR_DOMAIN) < 0
675       || PyModule_AddIntConstant (gdb_module, "SYMBOL_TYPES_DOMAIN",
676 				  VAR_DOMAIN) < 0)
677     return -1;
678 
679   return gdb_pymodule_addobject (gdb_module, "Symbol",
680 				 (PyObject *) &symbol_object_type);
681 }
682 
683 
684 
685 static gdb_PyGetSetDef symbol_object_getset[] = {
686   { "type", sympy_get_type, NULL,
687     "Type of the symbol.", NULL },
688   { "symtab", sympy_get_symtab, NULL,
689     "Symbol table in which the symbol appears.", NULL },
690   { "name", sympy_get_name, NULL,
691     "Name of the symbol, as it appears in the source code.", NULL },
692   { "linkage_name", sympy_get_linkage_name, NULL,
693     "Name of the symbol, as used by the linker (i.e., may be mangled).",
694     NULL },
695   { "print_name", sympy_get_print_name, NULL,
696     "Name of the symbol in a form suitable for output.\n\
697 This is either name or linkage_name, depending on whether the user asked GDB\n\
698 to display demangled or mangled names.", NULL },
699   { "addr_class", sympy_get_addr_class, NULL, "Address class of the symbol." },
700   { "is_argument", sympy_is_argument, NULL,
701     "True if the symbol is an argument of a function." },
702   { "is_constant", sympy_is_constant, NULL,
703     "True if the symbol is a constant." },
704   { "is_function", sympy_is_function, NULL,
705     "True if the symbol is a function or method." },
706   { "is_variable", sympy_is_variable, NULL,
707     "True if the symbol is a variable." },
708   { "needs_frame", sympy_needs_frame, NULL,
709     "True if the symbol requires a frame for evaluation." },
710   { "line", sympy_line, NULL,
711     "The source line number at which the symbol was defined." },
712   { NULL }  /* Sentinel */
713 };
714 
715 static PyMethodDef symbol_object_methods[] = {
716   { "is_valid", sympy_is_valid, METH_NOARGS,
717     "is_valid () -> Boolean.\n\
718 Return true if this symbol is valid, false if not." },
719   { "value", sympy_value, METH_VARARGS,
720     "value ([frame]) -> gdb.Value\n\
721 Return the value of the symbol." },
722   {NULL}  /* Sentinel */
723 };
724 
725 PyTypeObject symbol_object_type = {
726   PyVarObject_HEAD_INIT (NULL, 0)
727   "gdb.Symbol",			  /*tp_name*/
728   sizeof (symbol_object),	  /*tp_basicsize*/
729   0,				  /*tp_itemsize*/
730   sympy_dealloc,		  /*tp_dealloc*/
731   0,				  /*tp_print*/
732   0,				  /*tp_getattr*/
733   0,				  /*tp_setattr*/
734   0,				  /*tp_compare*/
735   0,				  /*tp_repr*/
736   0,				  /*tp_as_number*/
737   0,				  /*tp_as_sequence*/
738   0,				  /*tp_as_mapping*/
739   0,				  /*tp_hash */
740   0,				  /*tp_call*/
741   sympy_str,			  /*tp_str*/
742   0,				  /*tp_getattro*/
743   0,				  /*tp_setattro*/
744   0,				  /*tp_as_buffer*/
745   Py_TPFLAGS_DEFAULT,		  /*tp_flags*/
746   "GDB symbol object",		  /*tp_doc */
747   0,				  /*tp_traverse */
748   0,				  /*tp_clear */
749   0,				  /*tp_richcompare */
750   0,				  /*tp_weaklistoffset */
751   0,				  /*tp_iter */
752   0,				  /*tp_iternext */
753   symbol_object_methods,	  /*tp_methods */
754   0,				  /*tp_members */
755   symbol_object_getset		  /*tp_getset */
756 };
757