X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-frame.c;h=03273217076ac3783de041e21bcaf7a2c06ec62a;hb=7d7167ce1b93f8bb151daa2572314987eaeb9e3c;hp=6e9e5d355ac8fcede95c7725aec075a06627dbb3;hpb=f92adf3ccc9f87786c3ed6ca1bf2ced52cfbcd62;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index 6e9e5d355a..0327321707 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -1,6 +1,6 @@ /* Python interface to stack frames - Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2008-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -21,13 +21,13 @@ #include "charset.h" #include "block.h" #include "frame.h" -#include "exceptions.h" #include "symtab.h" #include "stack.h" #include "value.h" #include "python-internal.h" #include "symfile.h" #include "objfiles.h" +#include "user-regs.h" typedef struct { PyObject_HEAD @@ -54,15 +54,14 @@ typedef struct { error (_("Frame is invalid.")); \ } while (0) -static PyTypeObject frame_object_type; - /* Returns the frame_info object corresponding to the given Python Frame object. If the frame doesn't exist anymore (the frame id doesn't correspond to any frame in the inferior), returns NULL. */ -static struct frame_info * -frame_object_to_frame_info (frame_object *frame_obj) +struct frame_info * +frame_object_to_frame_info (PyObject *obj) { + frame_object *frame_obj = (frame_object *) obj; struct frame_info *frame; frame = frame_find_by_id (frame_obj->frame_id); @@ -81,17 +80,10 @@ frame_object_to_frame_info (frame_object *frame_obj) static PyObject * frapy_str (PyObject *self) { - char *s; - PyObject *result; - struct ui_file *strfile; - - strfile = mem_fileopen (); - fprint_frame_id (strfile, ((frame_object *) self)->frame_id); - s = ui_file_xstrdup (strfile, NULL); - result = PyString_FromString (s); - xfree (s); + string_file strfile; - return result; + fprint_frame_id (&strfile, ((frame_object *) self)->frame_id); + return PyString_FromString (strfile.c_str ()); } /* Implementation of gdb.Frame.is_valid (self) -> Boolean. @@ -101,9 +93,17 @@ frapy_str (PyObject *self) static PyObject * frapy_is_valid (PyObject *self, PyObject *args) { - struct frame_info *frame; + struct frame_info *frame = NULL; + + try + { + frame = frame_object_to_frame_info (self); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } - frame = frame_object_to_frame_info ((frame_object *) self); if (frame == NULL) Py_RETURN_FALSE; @@ -117,21 +117,26 @@ static PyObject * frapy_name (PyObject *self, PyObject *args) { struct frame_info *frame; - char *name; + gdb::unique_xmalloc_ptr name; enum language lang; PyObject *result; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + FRAPY_REQUIRE_VALID (self, frame); - find_frame_funname (frame, &name, &lang); + name = find_frame_funname (frame, &lang, NULL); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); } - GDB_PY_HANDLE_EXCEPTION (except); if (name) - result = PyUnicode_Decode (name, strlen (name), host_charset (), NULL); + { + result = PyUnicode_Decode (name.get (), strlen (name.get ()), + host_charset (), NULL); + } else { result = Py_None; @@ -149,19 +154,42 @@ frapy_type (PyObject *self, PyObject *args) { struct frame_info *frame; enum frame_type type = NORMAL_FRAME;/* Initialize to appease gcc warning. */ - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + FRAPY_REQUIRE_VALID (self, frame); type = get_frame_type (frame); } - GDB_PY_HANDLE_EXCEPTION (except); + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } return PyInt_FromLong (type); } +/* Implementation of gdb.Frame.architecture (self) -> gdb.Architecture. + Returns the frame's architecture as a gdb.Architecture object. */ + +static PyObject * +frapy_arch (PyObject *self, PyObject *args) +{ + struct frame_info *frame = NULL; /* Initialize to appease gcc warning. */ + frame_object *obj = (frame_object *) self; + + try + { + FRAPY_REQUIRE_VALID (self, frame); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + + return gdbarch_to_arch_object (obj->gdbarch); +} + /* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer. Returns one of the gdb.FRAME_UNWIND_* constants. */ @@ -169,14 +197,16 @@ static PyObject * frapy_unwind_stop_reason (PyObject *self, PyObject *args) { struct frame_info *frame = NULL; /* Initialize to appease gcc warning. */ - volatile struct gdb_exception except; enum unwind_stop_reason stop_reason; - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + FRAPY_REQUIRE_VALID (self, frame); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); } - GDB_PY_HANDLE_EXCEPTION (except); stop_reason = get_frame_unwind_stop_reason (frame); @@ -191,17 +221,55 @@ frapy_pc (PyObject *self, PyObject *args) { CORE_ADDR pc = 0; /* Initialize to appease gcc warning. */ struct frame_info *frame; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + FRAPY_REQUIRE_VALID (self, frame); pc = get_frame_pc (frame); } - GDB_PY_HANDLE_EXCEPTION (except); + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } - return PyLong_FromUnsignedLongLong (pc); + return gdb_py_long_from_ulongest (pc); +} + +/* Implementation of gdb.Frame.read_register (self, register) -> gdb.Value. + Returns the value of a register in this frame. */ + +static PyObject * +frapy_read_register (PyObject *self, PyObject *args) +{ + const char *regnum_str; + struct value *val = NULL; + + if (!PyArg_ParseTuple (args, "s", ®num_str)) + return NULL; + + try + { + struct frame_info *frame; + int regnum; + + FRAPY_REQUIRE_VALID (self, frame); + + regnum = user_reg_map_name_to_regnum (get_frame_arch (frame), + regnum_str, + strlen (regnum_str)); + if (regnum >= 0) + val = value_of_register (regnum, frame); + + if (val == NULL) + PyErr_SetString (PyExc_ValueError, _("Unknown register.")); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + + return val == NULL ? NULL : value_to_value_object (val); } /* Implementation of gdb.Frame.block (self) -> gdb.Block. @@ -211,28 +279,35 @@ static PyObject * frapy_block (PyObject *self, PyObject *args) { struct frame_info *frame; - struct block *block = NULL; - volatile struct gdb_exception except; - struct symtab_and_line sal; + const struct block *block = NULL, *fn_block; - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); - - find_frame_sal (frame, &sal); - block = block_for_pc (get_frame_address_in_block (frame)); + FRAPY_REQUIRE_VALID (self, frame); + block = get_frame_block (frame, NULL); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); } - GDB_PY_HANDLE_EXCEPTION (except); - if (!sal.symtab || !sal.symtab->objfile) + for (fn_block = block; + fn_block != NULL && BLOCK_FUNCTION (fn_block) == NULL; + fn_block = BLOCK_SUPERBLOCK (fn_block)) + ; + + if (block == NULL || fn_block == NULL || BLOCK_FUNCTION (fn_block) == NULL) { PyErr_SetString (PyExc_RuntimeError, - _("Cannot locate object file for block.")); + _("Cannot locate block for frame.")); return NULL; } if (block) - return block_to_block_object (block, sal.symtab->objfile); + { + return block_to_block_object + (block, symbol_objfile (BLOCK_FUNCTION (fn_block))); + } Py_RETURN_NONE; } @@ -246,15 +321,20 @@ frapy_function (PyObject *self, PyObject *args) { struct symbol *sym = NULL; struct frame_info *frame; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + enum language funlang; - sym = find_pc_function (get_frame_address_in_block (frame)); + FRAPY_REQUIRE_VALID (self, frame); + + gdb::unique_xmalloc_ptr funname + = find_frame_funname (frame, &funlang, &sym); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); } - GDB_PY_HANDLE_EXCEPTION (except); if (sym) return symbol_to_symbol_object (sym); @@ -265,38 +345,41 @@ frapy_function (PyObject *self, PyObject *args) /* Convert a frame_info struct to a Python Frame object. Sets a Python exception and returns NULL on error. */ -static frame_object * +PyObject * frame_info_to_frame_object (struct frame_info *frame) { - frame_object *frame_obj; - - frame_obj = PyObject_New (frame_object, &frame_object_type); + gdbpy_ref frame_obj (PyObject_New (frame_object, + &frame_object_type)); if (frame_obj == NULL) - { - PyErr_SetString (PyExc_MemoryError, - _("Could not allocate frame object.")); - return NULL; - } + return NULL; - /* Try to get the previous frame, to determine if this is the last frame - in a corrupt stack. If so, we need to store the frame_id of the next - frame and not of this one (which is possibly invalid). */ - if (get_prev_frame (frame) == NULL - && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON - && get_next_frame (frame) != NULL) + try { - frame_obj->frame_id = get_frame_id (get_next_frame (frame)); - frame_obj->frame_id_is_next = 1; + + /* Try to get the previous frame, to determine if this is the last frame + in a corrupt stack. If so, we need to store the frame_id of the next + frame and not of this one (which is possibly invalid). */ + if (get_prev_frame (frame) == NULL + && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON + && get_next_frame (frame) != NULL) + { + frame_obj->frame_id = get_frame_id (get_next_frame (frame)); + frame_obj->frame_id_is_next = 1; + } + else + { + frame_obj->frame_id = get_frame_id (frame); + frame_obj->frame_id_is_next = 0; + } + frame_obj->gdbarch = get_frame_arch (frame); } - else + catch (const gdb_exception &except) { - frame_obj->frame_id = get_frame_id (frame); - frame_obj->frame_id_is_next = 0; + gdbpy_convert_exception (except); + return NULL; } - frame_obj->gdbarch = get_frame_arch (frame); - - return frame_obj; + return (PyObject *) frame_obj.release (); } /* Implementation of gdb.Frame.older (self) -> gdb.Frame. @@ -306,24 +389,27 @@ frame_info_to_frame_object (struct frame_info *frame) static PyObject * frapy_older (PyObject *self, PyObject *args) { - struct frame_info *frame, *prev; - volatile struct gdb_exception except; + struct frame_info *frame, *prev = NULL; PyObject *prev_obj = NULL; /* Initialize to appease gcc warning. */ - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + FRAPY_REQUIRE_VALID (self, frame); prev = get_prev_frame (frame); - if (prev) - prev_obj = (PyObject *) frame_info_to_frame_object (prev); - else - { - Py_INCREF (Py_None); - prev_obj = Py_None; - } } - GDB_PY_HANDLE_EXCEPTION (except); + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + + if (prev) + prev_obj = frame_info_to_frame_object (prev); + else + { + Py_INCREF (Py_None); + prev_obj = Py_None; + } return prev_obj; } @@ -335,24 +421,27 @@ frapy_older (PyObject *self, PyObject *args) static PyObject * frapy_newer (PyObject *self, PyObject *args) { - struct frame_info *frame, *next; - volatile struct gdb_exception except; + struct frame_info *frame, *next = NULL; PyObject *next_obj = NULL; /* Initialize to appease gcc warning. */ - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + FRAPY_REQUIRE_VALID (self, frame); next = get_next_frame (frame); - if (next) - next_obj = (PyObject *) frame_info_to_frame_object (next); - else - { - Py_INCREF (Py_None); - next_obj = Py_None; - } } - GDB_PY_HANDLE_EXCEPTION (except); + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + + if (next) + next_obj = frame_info_to_frame_object (next); + else + { + Py_INCREF (Py_None); + next_obj = Py_None; + } return next_obj; } @@ -364,18 +453,19 @@ static PyObject * frapy_find_sal (PyObject *self, PyObject *args) { struct frame_info *frame; - struct symtab_and_line sal; - volatile struct gdb_exception except; PyObject *sal_obj = NULL; /* Initialize to appease gcc warning. */ - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + FRAPY_REQUIRE_VALID (self, frame); - find_frame_sal (frame, &sal); + symtab_and_line sal = find_frame_sal (frame); sal_obj = symtab_and_line_to_sal_object (sal); } - GDB_PY_HANDLE_EXCEPTION (except); + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } return sal_obj; } @@ -385,15 +475,16 @@ frapy_find_sal (PyObject *self, PyObject *args) start the search from that block, otherwise search from the frame's current block (determined by examining the resume address of the frame). The variable argument must be a string or an instance of a - gdb.Symbol. The block argument must be an instance of gdb.Block. */ + gdb.Symbol. The block argument must be an instance of gdb.Block. Returns + NULL on error, with a python exception set. */ static PyObject * frapy_read_var (PyObject *self, PyObject *args) { struct frame_info *frame; PyObject *sym_obj, *block_obj = NULL; struct symbol *var = NULL; /* gcc-4.3.2 false warning. */ + const struct block *block = NULL; struct value *val = NULL; - volatile struct gdb_exception except; if (!PyArg_ParseTuple (args, "O|O", &sym_obj, &block_obj)) return NULL; @@ -402,15 +493,11 @@ frapy_read_var (PyObject *self, PyObject *args) var = symbol_object_to_symbol (sym_obj); else if (gdbpy_is_string (sym_obj)) { - char *var_name; - struct block *block = NULL; - struct cleanup *cleanup; - volatile struct gdb_exception except; + gdb::unique_xmalloc_ptr + var_name (python_string_to_target_string (sym_obj)); - var_name = python_string_to_target_string (sym_obj); if (!var_name) return NULL; - cleanup = make_cleanup (xfree, var_name); if (block_obj) { @@ -423,26 +510,30 @@ frapy_read_var (PyObject *self, PyObject *args) } } - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + struct block_symbol lookup_sym; + FRAPY_REQUIRE_VALID (self, frame); if (!block) - block = block_for_pc (get_frame_address_in_block (frame)); - var = lookup_symbol (var_name, block, VAR_DOMAIN, NULL); + block = get_frame_block (frame, NULL); + lookup_sym = lookup_symbol (var_name.get (), block, VAR_DOMAIN, NULL); + var = lookup_sym.symbol; + block = lookup_sym.block; + } + catch (const gdb_exception &except) + { + gdbpy_convert_exception (except); + return NULL; } - GDB_PY_HANDLE_EXCEPTION (except); if (!var) { PyErr_Format (PyExc_ValueError, - _("Variable '%s' not found."), var_name); - do_cleanups (cleanup); + _("Variable '%s' not found."), var_name.get ()); return NULL; } - - do_cleanups (cleanup); } else { @@ -451,20 +542,15 @@ frapy_read_var (PyObject *self, PyObject *args) return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID ((frame_object *) self, frame); + FRAPY_REQUIRE_VALID (self, frame); - val = read_var_value (var, frame); + val = read_var_value (var, block, frame); } - GDB_PY_HANDLE_EXCEPTION (except); - - if (!val) + catch (const gdb_exception &except) { - PyErr_Format (PyExc_ValueError, - _("Variable cannot be found for symbol '%s'."), - SYMBOL_NATURAL_NAME (var)); - return NULL; + GDB_PY_HANDLE_EXCEPTION (except); } return value_to_value_object (val); @@ -476,38 +562,59 @@ static PyObject * frapy_select (PyObject *self, PyObject *args) { struct frame_info *fi; - frame_object *frame = (frame_object *) self; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + try { - FRAPY_REQUIRE_VALID (frame, fi); + FRAPY_REQUIRE_VALID (self, fi); select_frame (fi); } - GDB_PY_HANDLE_EXCEPTION (except); + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } Py_RETURN_NONE; } +/* Implementation of gdb.newest_frame () -> gdb.Frame. + Returns the newest frame object. */ + +PyObject * +gdbpy_newest_frame (PyObject *self, PyObject *args) +{ + struct frame_info *frame = NULL; + + try + { + frame = get_current_frame (); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + + return frame_info_to_frame_object (frame); +} + /* Implementation of gdb.selected_frame () -> gdb.Frame. Returns the selected frame object. */ PyObject * gdbpy_selected_frame (PyObject *self, PyObject *args) { - struct frame_info *frame; - frame_object *frame_obj = NULL; /* Initialize to appease gcc warning. */ - volatile struct gdb_exception except; + struct frame_info *frame = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + try { frame = get_selected_frame ("No frame is currently selected."); - frame_obj = frame_info_to_frame_object (frame); } - GDB_PY_HANDLE_EXCEPTION (except); + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } - return (PyObject *) frame_obj; + return frame_info_to_frame_object (frame); } /* Implementation of gdb.stop_reason_string (Integer) -> String. @@ -522,14 +629,14 @@ gdbpy_frame_stop_reason_string (PyObject *self, PyObject *args) if (!PyArg_ParseTuple (args, "i", &reason)) return NULL; - if (reason < 0 || reason > UNWIND_NO_SAVED_PC) + if (reason < UNWIND_FIRST || reason > UNWIND_LAST) { - PyErr_SetString (PyExc_ValueError, + PyErr_SetString (PyExc_ValueError, _("Invalid frame stop reason.")); return NULL; } - str = frame_stop_reason_string (reason); + str = unwind_stop_reason_to_string ((enum unwind_stop_reason) reason); return PyUnicode_Decode (str, strlen (str), host_charset (), NULL); } @@ -562,34 +669,36 @@ frapy_richcompare (PyObject *self, PyObject *other, int op) /* Sets up the Frame API in the gdb module. */ -void +int gdbpy_initialize_frames (void) { + frame_object_type.tp_new = PyType_GenericNew; if (PyType_Ready (&frame_object_type) < 0) - return; - - /* Note: These would probably be best exposed as class attributes of Frame, - but I don't know how to do it except by messing with the type's dictionary. - That seems too messy. */ - PyModule_AddIntConstant (gdb_module, "NORMAL_FRAME", NORMAL_FRAME); - PyModule_AddIntConstant (gdb_module, "DUMMY_FRAME", DUMMY_FRAME); - PyModule_AddIntConstant (gdb_module, "SIGTRAMP_FRAME", SIGTRAMP_FRAME); - PyModule_AddIntConstant (gdb_module, "SENTINEL_FRAME", SENTINEL_FRAME); - PyModule_AddIntConstant (gdb_module, - "FRAME_UNWIND_NO_REASON", UNWIND_NO_REASON); - PyModule_AddIntConstant (gdb_module, - "FRAME_UNWIND_NULL_ID", UNWIND_NULL_ID); - PyModule_AddIntConstant (gdb_module, - "FRAME_UNWIND_FIRST_ERROR", UNWIND_FIRST_ERROR); - PyModule_AddIntConstant (gdb_module, - "FRAME_UNWIND_INNER_ID", UNWIND_INNER_ID); - PyModule_AddIntConstant (gdb_module, - "FRAME_UNWIND_SAME_ID", UNWIND_SAME_ID); - PyModule_AddIntConstant (gdb_module, - "FRAME_UNWIND_NO_SAVED_PC", UNWIND_NO_SAVED_PC); - - Py_INCREF (&frame_object_type); - PyModule_AddObject (gdb_module, "Frame", (PyObject *) &frame_object_type); + return -1; + + /* Note: These would probably be best exposed as class attributes of + Frame, but I don't know how to do it except by messing with the + type's dictionary. That seems too messy. */ + if (PyModule_AddIntConstant (gdb_module, "NORMAL_FRAME", NORMAL_FRAME) < 0 + || PyModule_AddIntConstant (gdb_module, "DUMMY_FRAME", DUMMY_FRAME) < 0 + || PyModule_AddIntConstant (gdb_module, "INLINE_FRAME", INLINE_FRAME) < 0 + || PyModule_AddIntConstant (gdb_module, "TAILCALL_FRAME", + TAILCALL_FRAME) < 0 + || PyModule_AddIntConstant (gdb_module, "SIGTRAMP_FRAME", + SIGTRAMP_FRAME) < 0 + || PyModule_AddIntConstant (gdb_module, "ARCH_FRAME", ARCH_FRAME) < 0 + || PyModule_AddIntConstant (gdb_module, "SENTINEL_FRAME", + SENTINEL_FRAME) < 0) + return -1; + +#define SET(name, description) \ + if (PyModule_AddIntConstant (gdb_module, "FRAME_"#name, name) < 0) \ + return -1; +#include "unwind_stop_reasons.def" +#undef SET + + return gdb_pymodule_addobject (gdb_module, "Frame", + (PyObject *) &frame_object_type); } @@ -604,12 +713,18 @@ Return the function name of the frame, or None if it can't be determined." }, { "type", frapy_type, METH_NOARGS, "type () -> Integer.\n\ Return the type of the frame." }, + { "architecture", frapy_arch, METH_NOARGS, + "architecture () -> gdb.Architecture.\n\ +Return the architecture of the frame." }, { "unwind_stop_reason", frapy_unwind_stop_reason, METH_NOARGS, "unwind_stop_reason () -> Integer.\n\ Return the reason why it's not possible to find frames older than this." }, { "pc", frapy_pc, METH_NOARGS, "pc () -> Long.\n\ Return the frame's resume address." }, + { "read_register", frapy_read_register, METH_VARARGS, + "read_register (register_name) -> gdb.Value\n\ +Return the value of the register in the frame." }, { "block", frapy_block, METH_NOARGS, "block () -> gdb.Block.\n\ Return the frame's code block." }, @@ -633,9 +748,8 @@ Return the value of the variable in this frame." }, {NULL} /* Sentinel */ }; -static PyTypeObject frame_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /* ob_size */ +PyTypeObject frame_object_type = { + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Frame", /* tp_name */ sizeof (frame_object), /* tp_basicsize */ 0, /* tp_itemsize */ @@ -672,5 +786,4 @@ static PyTypeObject frame_object_type = { 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ - PyType_GenericNew /* tp_new */ };