X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-arch.c;h=a1fdbd61445d28329100fb06ef0ef02b2ab460de;hb=e2882c85786571175a0b0bfc3bcd2f14620b1ea3;hp=a31ffdd9ed8d269096d083e442aab784245cc5bd;hpb=96d9056e29036d7d841e71f60648018f115d808e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c index a31ffdd9ed..a1fdbd6144 100644 --- a/gdb/python/py-arch.c +++ b/gdb/python/py-arch.c @@ -1,6 +1,6 @@ /* Python interface to architecture - Copyright (C) 2013 Free Software Foundation, Inc. + Copyright (C) 2013-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -22,6 +22,7 @@ #include "arch-utils.h" #include "disasm.h" #include "python-internal.h" +#include "py-ref.h" typedef struct arch_object_type_object { PyObject_HEAD @@ -42,7 +43,7 @@ static struct gdbarch_data *arch_object_data = NULL; } \ } while (0) -static PyTypeObject arch_object_type +extern PyTypeObject arch_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("arch_object"); /* Associates an arch_object with GDBARCH as gdbarch_data via the gdbarch @@ -115,33 +116,41 @@ archpy_name (PyObject *self, PyObject *args) static PyObject * archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw) { - static char *keywords[] = { "start_pc", "end_pc", "count", NULL }; + static const char *keywords[] = { "start_pc", "end_pc", "count", NULL }; CORE_ADDR start, end = 0; CORE_ADDR pc; gdb_py_ulongest start_temp; long count = 0, i; - PyObject *result_list, *end_obj = NULL, *count_obj = NULL; + PyObject *end_obj = NULL, *count_obj = NULL; struct gdbarch *gdbarch = NULL; ARCHPY_REQUIRE_VALID (self, gdbarch); - if (!PyArg_ParseTupleAndKeywords (args, kw, GDB_PY_LLU_ARG "|OO", keywords, - &start_temp, &end_obj, &count_obj)) + if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, GDB_PY_LLU_ARG "|OO", + keywords, &start_temp, &end_obj, + &count_obj)) return NULL; start = start_temp; if (end_obj) { + /* Make a long logic check first. In Python 3.x, internally, + all integers are represented as longs. In Python 2.x, there + is still a differentiation internally between a PyInt and a + PyLong. Explicitly do this long check conversion first. In + GDB, for Python 3.x, we #ifdef PyInt = PyLong. This check has + to be done first to ensure we do not lose information in the + conversion process. */ if (PyLong_Check (end_obj)) end = PyLong_AsUnsignedLongLong (end_obj); +#if PY_MAJOR_VERSION == 2 else if (PyInt_Check (end_obj)) /* If the end_pc value is specified without a trailing 'L', end_obj will be an integer and not a long integer. */ end = PyInt_AsLong (end_obj); +#endif else { - Py_DECREF (end_obj); - Py_XDECREF (count_obj); PyErr_SetString (PyExc_TypeError, _("Argument 'end_pc' should be a (long) integer.")); @@ -150,8 +159,6 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw) if (end < start) { - Py_DECREF (end_obj); - Py_XDECREF (count_obj); PyErr_SetString (PyExc_ValueError, _("Argument 'end_pc' should be greater than or " "equal to the argument 'start_pc'.")); @@ -164,8 +171,6 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw) count = PyInt_AsLong (count_obj); if (PyErr_Occurred () || count < 0) { - Py_DECREF (count_obj); - Py_XDECREF (end_obj); PyErr_SetString (PyExc_TypeError, _("Argument 'count' should be an non-negative " "integer.")); @@ -174,7 +179,7 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw) } } - result_list = PyList_New (0); + gdbpy_ref<> result_list (PyList_New (0)); if (result_list == NULL) return NULL; @@ -189,63 +194,41 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw) || (end_obj == NULL && count_obj == NULL && pc == start);) { int insn_len = 0; - char *as = NULL; - struct ui_file *memfile = mem_fileopen (); - PyObject *insn_dict = PyDict_New (); - volatile struct gdb_exception except; + gdbpy_ref<> insn_dict (PyDict_New ()); if (insn_dict == NULL) - { - Py_DECREF (result_list); - ui_file_delete (memfile); - - return NULL; - } - if (PyList_Append (result_list, insn_dict)) - { - Py_DECREF (result_list); - Py_DECREF (insn_dict); - ui_file_delete (memfile); + return NULL; + if (PyList_Append (result_list.get (), insn_dict.get ())) + return NULL; /* PyList_Append Sets the exception. */ - return NULL; /* PyList_Append Sets the exception. */ - } + string_file stb; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { - insn_len = gdb_print_insn (gdbarch, pc, memfile, NULL); + insn_len = gdb_print_insn (gdbarch, pc, &stb, NULL); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { - Py_DECREF (result_list); - ui_file_delete (memfile); - gdbpy_convert_exception (except); return NULL; } + END_CATCH - as = ui_file_xstrdup (memfile, NULL); - if (PyDict_SetItemString (insn_dict, "addr", + if (PyDict_SetItemString (insn_dict.get (), "addr", gdb_py_long_from_ulongest (pc)) - || PyDict_SetItemString (insn_dict, "asm", - PyString_FromString (*as ? as : "")) - || PyDict_SetItemString (insn_dict, "length", + || PyDict_SetItemString (insn_dict.get (), "asm", + PyString_FromString (!stb.empty () + ? stb.c_str () + : "")) + || PyDict_SetItemString (insn_dict.get (), "length", PyInt_FromLong (insn_len))) - { - Py_DECREF (result_list); - - ui_file_delete (memfile); - xfree (as); - - return NULL; - } + return NULL; pc += insn_len; i++; - ui_file_delete (memfile); - xfree (as); } - return result_list; + return result_list.release (); } /* Initializes the Architecture class in the gdb module. */ @@ -274,7 +257,7 @@ END_PC." }, {NULL} /* Sentinel */ }; -static PyTypeObject arch_object_type = { +PyTypeObject arch_object_type = { PyVarObject_HEAD_INIT (NULL, 0) "gdb.Architecture", /* tp_name */ sizeof (arch_object), /* tp_basicsize */