OLD | NEW |
1 /* Python interface to symbol tables. | 1 /* Python interface to symbol tables. |
2 | 2 |
3 Copyright (C) 2008-2012 Free Software Foundation, Inc. | 3 Copyright (C) 2008-2013 Free Software Foundation, Inc. |
4 | 4 |
5 This file is part of GDB. | 5 This file is part of GDB. |
6 | 6 |
7 This program is free software; you can redistribute it and/or modify | 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 | 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 | 9 the Free Software Foundation; either version 3 of the License, or |
10 (at your option) any later version. | 10 (at your option) any later version. |
11 | 11 |
12 This program is distributed in the hope that it will be useful, | 12 This program is distributed in the hope that it will be useful, |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 16 matching lines...) Expand all Loading... |
30 /* The GDB Symbol table structure. */ | 30 /* The GDB Symbol table structure. */ |
31 struct symtab *symtab; | 31 struct symtab *symtab; |
32 /* A symtab object is associated with an objfile, so keep track with | 32 /* A symtab object is associated with an objfile, so keep track with |
33 a doubly-linked list, rooted in the objfile. This allows | 33 a doubly-linked list, rooted in the objfile. This allows |
34 invalidation of the underlying struct symtab when the objfile is | 34 invalidation of the underlying struct symtab when the objfile is |
35 deleted. */ | 35 deleted. */ |
36 struct stpy_symtab_object *prev; | 36 struct stpy_symtab_object *prev; |
37 struct stpy_symtab_object *next; | 37 struct stpy_symtab_object *next; |
38 } symtab_object; | 38 } symtab_object; |
39 | 39 |
40 static PyTypeObject symtab_object_type; | 40 static PyTypeObject symtab_object_type |
| 41 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("symtab_object"); |
41 static const struct objfile_data *stpy_objfile_data_key; | 42 static const struct objfile_data *stpy_objfile_data_key; |
42 | 43 |
43 /* Require a valid symbol table. All access to symtab_object->symtab | 44 /* Require a valid symbol table. All access to symtab_object->symtab |
44 should be gated by this call. */ | 45 should be gated by this call. */ |
45 #define STPY_REQUIRE_VALID(symtab_obj, symtab) \ | 46 #define STPY_REQUIRE_VALID(symtab_obj, symtab) \ |
46 do { \ | 47 do { \ |
47 symtab = symtab_object_to_symtab (symtab_obj); \ | 48 symtab = symtab_object_to_symtab (symtab_obj); \ |
48 if (symtab == NULL) \ | 49 if (symtab == NULL) \ |
49 { \ | 50 { \ |
50 PyErr_SetString (PyExc_RuntimeError, \ | 51 PyErr_SetString (PyExc_RuntimeError, \ |
51 _("Symbol Table is invalid.")); \ | 52 _("Symbol Table is invalid.")); \ |
52 return NULL; \ | 53 return NULL; \ |
53 } \ | 54 } \ |
54 } while (0) | 55 } while (0) |
55 | 56 |
56 typedef struct salpy_sal_object { | 57 typedef struct salpy_sal_object { |
57 PyObject_HEAD | 58 PyObject_HEAD |
58 /* The GDB Symbol table structure. */ | 59 /* The GDB Symbol table structure. */ |
59 symtab_object *symtab; | 60 symtab_object *symtab; |
60 /* The GDB Symbol table and line structure. */ | 61 /* The GDB Symbol table and line structure. */ |
61 struct symtab_and_line *sal; | 62 struct symtab_and_line *sal; |
62 /* A Symtab and line object is associated with an objfile, so keep | 63 /* A Symtab and line object is associated with an objfile, so keep |
63 track with a doubly-linked list, rooted in the objfile. This | 64 track with a doubly-linked list, rooted in the objfile. This |
64 allows invalidation of the underlying struct symtab_and_line | 65 allows invalidation of the underlying struct symtab_and_line |
65 when the objfile is deleted. */ | 66 when the objfile is deleted. */ |
66 struct salpy_sal_object *prev; | 67 struct salpy_sal_object *prev; |
67 struct salpy_sal_object *next; | 68 struct salpy_sal_object *next; |
68 } sal_object; | 69 } sal_object; |
69 | 70 |
70 static PyTypeObject sal_object_type; | 71 static PyTypeObject sal_object_type |
| 72 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("sal_object"); |
71 static const struct objfile_data *salpy_objfile_data_key; | 73 static const struct objfile_data *salpy_objfile_data_key; |
72 | 74 |
73 /* Require a valid symbol table and line object. All access to | 75 /* Require a valid symbol table and line object. All access to |
74 sal_object->sal should be gated by this call. */ | 76 sal_object->sal should be gated by this call. */ |
75 #define SALPY_REQUIRE_VALID(sal_obj, sal) \ | 77 #define SALPY_REQUIRE_VALID(sal_obj, sal) \ |
76 do { \ | 78 do { \ |
77 sal = sal_object_to_symtab_and_line (sal_obj); \ | 79 sal = sal_object_to_symtab_and_line (sal_obj); \ |
78 if (sal == NULL) \ | 80 if (sal == NULL) \ |
79 { \ | 81 { \ |
80 PyErr_SetString (PyExc_RuntimeError, \ | 82 PyErr_SetString (PyExc_RuntimeError, \ |
81 _("Symbol Table and Line is invalid.")); \ | 83 _("Symbol Table and Line is invalid.")); \ |
82 return NULL; \ | 84 return NULL; \ |
83 } \ | 85 } \ |
84 } while (0) | 86 } while (0) |
85 | 87 |
86 static PyObject * | 88 static PyObject * |
87 stpy_str (PyObject *self) | 89 stpy_str (PyObject *self) |
88 { | 90 { |
89 PyObject *result; | 91 PyObject *result; |
90 struct symtab *symtab = NULL; | 92 struct symtab *symtab = NULL; |
91 | 93 |
92 STPY_REQUIRE_VALID (self, symtab); | 94 STPY_REQUIRE_VALID (self, symtab); |
93 | 95 |
94 result = PyString_FromString (symtab->filename); | 96 result = PyString_FromString (symtab_to_filename_for_display (symtab)); |
95 | 97 |
96 return result; | 98 return result; |
97 } | 99 } |
98 | 100 |
99 static PyObject * | 101 static PyObject * |
100 stpy_get_filename (PyObject *self, void *closure) | 102 stpy_get_filename (PyObject *self, void *closure) |
101 { | 103 { |
102 PyObject *str_obj; | 104 PyObject *str_obj; |
103 struct symtab *symtab = NULL; | 105 struct symtab *symtab = NULL; |
| 106 const char *filename; |
104 | 107 |
105 STPY_REQUIRE_VALID (self, symtab); | 108 STPY_REQUIRE_VALID (self, symtab); |
| 109 filename = symtab_to_filename_for_display (symtab); |
106 | 110 |
107 str_obj = PyString_Decode (symtab->filename, | 111 str_obj = PyString_Decode (filename, strlen (filename), |
108 » » » strlen (symtab->filename), | |
109 host_charset (), NULL); | 112 host_charset (), NULL); |
110 return str_obj; | 113 return str_obj; |
111 } | 114 } |
112 | 115 |
113 static PyObject * | 116 static PyObject * |
114 stpy_get_objfile (PyObject *self, void *closure) | 117 stpy_get_objfile (PyObject *self, void *closure) |
115 { | 118 { |
116 struct symtab *symtab = NULL; | 119 struct symtab *symtab = NULL; |
117 PyObject *result; | 120 PyObject *result; |
118 | 121 |
119 STPY_REQUIRE_VALID (self, symtab); | 122 STPY_REQUIRE_VALID (self, symtab); |
120 | 123 |
121 result = objfile_to_objfile_object (symtab->objfile); | 124 result = objfile_to_objfile_object (symtab->objfile); |
122 Py_XINCREF (result); | 125 Py_XINCREF (result); |
123 return result; | 126 return result; |
124 } | 127 } |
125 | 128 |
126 static PyObject * | 129 static PyObject * |
127 stpy_fullname (PyObject *self, PyObject *args) | 130 stpy_fullname (PyObject *self, PyObject *args) |
128 { | 131 { |
129 char *fullname; | 132 const char *fullname; |
130 struct symtab *symtab = NULL; | 133 struct symtab *symtab = NULL; |
131 | 134 |
132 STPY_REQUIRE_VALID (self, symtab); | 135 STPY_REQUIRE_VALID (self, symtab); |
133 | 136 |
134 fullname = symtab_to_fullname (symtab); | 137 fullname = symtab_to_fullname (symtab); |
135 if (fullname) | |
136 return PyString_Decode (fullname, strlen (fullname), | |
137 host_charset (), NULL); | |
138 | 138 |
139 Py_RETURN_NONE; | 139 return PyString_Decode (fullname, strlen (fullname), host_charset (), NULL); |
140 } | 140 } |
141 | 141 |
142 /* Implementation of gdb.Symtab.is_valid (self) -> Boolean. | 142 /* Implementation of gdb.Symtab.is_valid (self) -> Boolean. |
143 Returns True if this Symbol table still exists in GDB. */ | 143 Returns True if this Symbol table still exists in GDB. */ |
144 | 144 |
145 static PyObject * | 145 static PyObject * |
146 stpy_is_valid (PyObject *self, PyObject *args) | 146 stpy_is_valid (PyObject *self, PyObject *args) |
147 { | 147 { |
148 struct symtab *symtab = NULL; | 148 struct symtab *symtab = NULL; |
149 | 149 |
(...skipping 29 matching lines...) Expand all Loading... |
179 struct block *block = NULL; | 179 struct block *block = NULL; |
180 struct blockvector *blockvector; | 180 struct blockvector *blockvector; |
181 | 181 |
182 STPY_REQUIRE_VALID (self, symtab); | 182 STPY_REQUIRE_VALID (self, symtab); |
183 | 183 |
184 blockvector = BLOCKVECTOR (symtab); | 184 blockvector = BLOCKVECTOR (symtab); |
185 block = BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK); | 185 block = BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK); |
186 return block_to_block_object (block, symtab->objfile); | 186 return block_to_block_object (block, symtab->objfile); |
187 } | 187 } |
188 | 188 |
| 189 /* Implementation of gdb.Symtab.linetable (self) -> gdb.Linetable. |
| 190 Returns a gdb.Linetable object corresponding to this symbol |
| 191 table. */ |
| 192 |
| 193 static PyObject * |
| 194 stpy_get_linetable (PyObject *self, PyObject *args) |
| 195 { |
| 196 struct symtab *symtab = NULL; |
| 197 |
| 198 STPY_REQUIRE_VALID (self, symtab); |
| 199 |
| 200 return symtab_to_linetable_object (self); |
| 201 } |
| 202 |
189 static PyObject * | 203 static PyObject * |
190 salpy_str (PyObject *self) | 204 salpy_str (PyObject *self) |
191 { | 205 { |
192 char *s, *filename; | 206 char *s; |
| 207 const char *filename; |
193 sal_object *sal_obj; | 208 sal_object *sal_obj; |
194 PyObject *result; | 209 PyObject *result; |
195 struct symtab_and_line *sal = NULL; | 210 struct symtab_and_line *sal = NULL; |
196 | 211 |
197 SALPY_REQUIRE_VALID (self, sal); | 212 SALPY_REQUIRE_VALID (self, sal); |
198 | 213 |
199 sal_obj = (sal_object *) self; | 214 sal_obj = (sal_object *) self; |
200 filename = (sal_obj->symtab == (symtab_object *) Py_None) | 215 filename = (sal_obj->symtab == (symtab_object *) Py_None) |
201 ? "<unknown>" : sal_obj->symtab->symtab->filename; | 216 ? "<unknown>" : symtab_to_filename_for_display (sal_obj->symtab->symtab); |
202 | 217 |
203 s = xstrprintf ("symbol and line for %s, line %d", filename, | 218 s = xstrprintf ("symbol and line for %s, line %d", filename, |
204 sal->line); | 219 sal->line); |
205 | 220 |
206 result = PyString_FromString (s); | 221 result = PyString_FromString (s); |
207 xfree (s); | 222 xfree (s); |
208 | 223 |
209 return result; | 224 return result; |
210 } | 225 } |
211 | 226 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 self_sal->prev->next = self_sal->next; | 315 self_sal->prev->next = self_sal->next; |
301 else if (self_sal->symtab != (symtab_object * ) Py_None) | 316 else if (self_sal->symtab != (symtab_object * ) Py_None) |
302 set_objfile_data (self_sal->symtab->symtab->objfile, | 317 set_objfile_data (self_sal->symtab->symtab->objfile, |
303 salpy_objfile_data_key, self_sal->next); | 318 salpy_objfile_data_key, self_sal->next); |
304 | 319 |
305 if (self_sal->next) | 320 if (self_sal->next) |
306 self_sal->next->prev = self_sal->prev; | 321 self_sal->next->prev = self_sal->prev; |
307 | 322 |
308 Py_DECREF (self_sal->symtab); | 323 Py_DECREF (self_sal->symtab); |
309 xfree (self_sal->sal); | 324 xfree (self_sal->sal); |
310 self_sal->ob_type->tp_free (self); | 325 Py_TYPE (self)->tp_free (self); |
311 } | 326 } |
312 | 327 |
313 /* Given a sal, and a sal_object that has previously been allocated | 328 /* Given a sal, and a sal_object that has previously been allocated |
314 and initialized, populate the sal_object with the struct sal data. | 329 and initialized, populate the sal_object with the struct sal data. |
315 Also, register the sal_object life-cycle with the life-cycle of the | 330 Also, register the sal_object life-cycle with the life-cycle of the |
316 object file associated with this sal, if needed. If a failure | 331 object file associated with this sal, if needed. If a failure |
317 occurs during the sal population, this function will return | 332 occurs during the sal population, this function will return -1. */ |
318 NULL. */ | 333 static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION |
319 static int | |
320 set_sal (sal_object *sal_obj, struct symtab_and_line sal) | 334 set_sal (sal_object *sal_obj, struct symtab_and_line sal) |
321 { | 335 { |
322 symtab_object *symtab_obj; | 336 symtab_object *symtab_obj; |
323 | 337 |
324 if (sal.symtab) | 338 if (sal.symtab) |
325 { | 339 { |
326 symtab_obj = (symtab_object *) symtab_to_symtab_object (sal.symtab); | 340 symtab_obj = (symtab_object *) symtab_to_symtab_object (sal.symtab); |
327 /* If a symtab existed in the sal, but it cannot be duplicated, | 341 /* If a symtab existed in the sal, but it cannot be duplicated, |
328 we exit. */ | 342 we exit. */ |
329 if (symtab_obj == NULL) | 343 if (symtab_obj == NULL) |
330 » return 0; | 344 » return -1; |
331 } | 345 } |
332 else | 346 else |
333 { | 347 { |
334 symtab_obj = (symtab_object *) Py_None; | 348 symtab_obj = (symtab_object *) Py_None; |
335 Py_INCREF (Py_None); | 349 Py_INCREF (Py_None); |
336 } | 350 } |
337 | 351 |
338 sal_obj->sal = xmemdup (&sal, sizeof (struct symtab_and_line), | 352 sal_obj->sal = xmemdup (&sal, sizeof (struct symtab_and_line), |
339 sizeof (struct symtab_and_line)); | 353 sizeof (struct symtab_and_line)); |
340 sal_obj->symtab = symtab_obj; | 354 sal_obj->symtab = symtab_obj; |
341 sal_obj->prev = NULL; | 355 sal_obj->prev = NULL; |
342 | 356 |
343 /* If the SAL does not have a symtab, we do not add it to the | 357 /* If the SAL does not have a symtab, we do not add it to the |
344 objfile cleanup observer linked list. */ | 358 objfile cleanup observer linked list. */ |
345 if (sal_obj->symtab != (symtab_object *)Py_None) | 359 if (sal_obj->symtab != (symtab_object *)Py_None) |
346 { | 360 { |
347 sal_obj->next = objfile_data (sal_obj->symtab->symtab->objfile, | 361 sal_obj->next = objfile_data (sal_obj->symtab->symtab->objfile, |
348 salpy_objfile_data_key); | 362 salpy_objfile_data_key); |
349 if (sal_obj->next) | 363 if (sal_obj->next) |
350 sal_obj->next->prev = sal_obj; | 364 sal_obj->next->prev = sal_obj; |
351 | 365 |
352 set_objfile_data (sal_obj->symtab->symtab->objfile, | 366 set_objfile_data (sal_obj->symtab->symtab->objfile, |
353 salpy_objfile_data_key, sal_obj); | 367 salpy_objfile_data_key, sal_obj); |
354 } | 368 } |
355 else | 369 else |
356 sal_obj->next = NULL; | 370 sal_obj->next = NULL; |
357 | 371 |
358 return 1; | 372 return 0; |
359 } | 373 } |
360 | 374 |
361 /* Given a symtab, and a symtab_object that has previously been | 375 /* Given a symtab, and a symtab_object that has previously been |
362 allocated and initialized, populate the symtab_object with the | 376 allocated and initialized, populate the symtab_object with the |
363 struct symtab data. Also, register the symtab_object life-cycle | 377 struct symtab data. Also, register the symtab_object life-cycle |
364 with the life-cycle of the object file associated with this | 378 with the life-cycle of the object file associated with this |
365 symtab, if needed. */ | 379 symtab, if needed. */ |
366 static void | 380 static void |
367 set_symtab (symtab_object *obj, struct symtab *symtab) | 381 set_symtab (symtab_object *obj, struct symtab *symtab) |
368 { | 382 { |
(...skipping 21 matching lines...) Expand all Loading... |
390 if (symtab_obj) | 404 if (symtab_obj) |
391 set_symtab (symtab_obj, symtab); | 405 set_symtab (symtab_obj, symtab); |
392 | 406 |
393 return (PyObject *) symtab_obj; | 407 return (PyObject *) symtab_obj; |
394 } | 408 } |
395 | 409 |
396 /* Create a new symtab and line (gdb.Symtab_and_line) object | 410 /* Create a new symtab and line (gdb.Symtab_and_line) object |
397 that encapsulates the symtab_and_line structure from GDB. */ | 411 that encapsulates the symtab_and_line structure from GDB. */ |
398 PyObject * | 412 PyObject * |
399 symtab_and_line_to_sal_object (struct symtab_and_line sal) | 413 symtab_and_line_to_sal_object (struct symtab_and_line sal) |
400 | |
401 { | 414 { |
402 sal_object *sal_obj; | 415 sal_object *sal_obj; |
403 int success = 0; | 416 int success = 0; |
404 | 417 |
405 sal_obj = PyObject_New (sal_object, &sal_object_type); | 418 sal_obj = PyObject_New (sal_object, &sal_object_type); |
406 if (sal_obj) | 419 if (sal_obj) |
407 { | 420 { |
408 success = set_sal (sal_obj, sal); | 421 if (set_sal (sal_obj, sal) < 0) |
409 if (!success) | |
410 { | 422 { |
411 Py_DECREF (sal_obj); | 423 Py_DECREF (sal_obj); |
412 return NULL; | 424 return NULL; |
413 } | 425 } |
414 } | 426 } |
415 | 427 |
416 return (PyObject *) sal_obj; | 428 return (PyObject *) sal_obj; |
417 } | 429 } |
418 | 430 |
419 /* Return struct symtab_and_line reference that is wrapped by this | 431 /* Return struct symtab_and_line reference that is wrapped by this |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 invalid symbol table and line objects. */ | 475 invalid symbol table and line objects. */ |
464 static void | 476 static void |
465 del_objfile_sal (struct objfile *objfile, void *datum) | 477 del_objfile_sal (struct objfile *objfile, void *datum) |
466 { | 478 { |
467 sal_object *obj = datum; | 479 sal_object *obj = datum; |
468 | 480 |
469 while (obj) | 481 while (obj) |
470 { | 482 { |
471 sal_object *next = obj->next; | 483 sal_object *next = obj->next; |
472 | 484 |
473 obj->symtab = NULL; | 485 Py_DECREF (obj->symtab); |
| 486 obj->symtab = (symtab_object *) Py_None; |
| 487 Py_INCREF (Py_None); |
| 488 |
474 obj->next = NULL; | 489 obj->next = NULL; |
475 obj->prev = NULL; | 490 obj->prev = NULL; |
476 xfree (obj->sal); | 491 xfree (obj->sal); |
477 obj->sal = NULL; | 492 obj->sal = NULL; |
478 | 493 |
479 obj = next; | 494 obj = next; |
480 } | 495 } |
481 } | 496 } |
482 | 497 |
483 void | 498 int |
484 gdbpy_initialize_symtabs (void) | 499 gdbpy_initialize_symtabs (void) |
485 { | 500 { |
486 symtab_object_type.tp_new = PyType_GenericNew; | 501 symtab_object_type.tp_new = PyType_GenericNew; |
487 if (PyType_Ready (&symtab_object_type) < 0) | 502 if (PyType_Ready (&symtab_object_type) < 0) |
488 return; | 503 return -1; |
489 | 504 |
490 sal_object_type.tp_new = PyType_GenericNew; | 505 sal_object_type.tp_new = PyType_GenericNew; |
491 if (PyType_Ready (&sal_object_type) < 0) | 506 if (PyType_Ready (&sal_object_type) < 0) |
492 return; | 507 return -1; |
493 | 508 |
494 /* Register an objfile "free" callback so we can properly | 509 /* Register an objfile "free" callback so we can properly |
495 invalidate symbol tables, and symbol table and line data | 510 invalidate symbol tables, and symbol table and line data |
496 structures when an object file that is about to be | 511 structures when an object file that is about to be |
497 deleted. */ | 512 deleted. */ |
498 stpy_objfile_data_key | 513 stpy_objfile_data_key |
499 = register_objfile_data_with_cleanup (NULL, del_objfile_symtab); | 514 = register_objfile_data_with_cleanup (NULL, del_objfile_symtab); |
error: old chunk mismatch |
None
OLD | NEW |