X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/e8e7d10c39955e7ff99ff42f6f16d6befe2fa12e..db1337cc8300bb44f8ccf9dced3e122b6e50b4c9:/gdb/python/python.c?ds=inline diff --git a/gdb/python/python.c b/gdb/python/python.c index 9ed9b6b1ca..1a0562a227 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1,6 +1,6 @@ /* General python/gdb code - Copyright (C) 2008-2017 Free Software Foundation, Inc. + Copyright (C) 2008-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -90,7 +90,6 @@ const struct extension_language_defn extension_language_python = #include "cli/cli-decode.h" #include "charset.h" #include "top.h" -#include "solib.h" #include "python-internal.h" #include "linespec.h" #include "source.h" @@ -190,12 +189,7 @@ const struct extension_language_ops python_extension_ops = gdbpy_before_prompt_hook, - gdbpy_clone_xmethod_worker_data, - gdbpy_free_xmethod_worker_data, gdbpy_get_matching_xmethod_workers, - gdbpy_get_xmethod_arg_types, - gdbpy_get_xmethod_result_type, - gdbpy_invoke_xmethod }; /* Architecture and language to be used in callbacks from @@ -390,12 +384,12 @@ gdbpy_eval_from_control_command (const struct extension_language_defn *extlang, { int ret; - if (cmd->body_count != 1) + if (cmd->body_list_1 != nullptr) error (_("Invalid \"python\" block structure.")); gdbpy_enter enter_py (get_current_arch (), current_language); - std::string script = compute_python_string (cmd->body_list[0]); + std::string script = compute_python_string (cmd->body_list_0.get ()); ret = PyRun_SimpleString (script.c_str ()); if (ret) error (_("Error while executing Python code.")); @@ -418,7 +412,7 @@ python_command (const char *arg, int from_tty) } else { - command_line_up l = get_command_line (python_control, ""); + counted_command_line l = get_command_line (python_control, ""); execute_control_command_untraced (l.get ()); } @@ -472,6 +466,7 @@ gdbpy_parameter_value (enum var_types type, void *var) Py_RETURN_NONE; /* Fall through. */ case var_zinteger: + case var_zuinteger_unlimited: return PyLong_FromLong (* (int *) var); case var_uinteger: @@ -482,6 +477,12 @@ gdbpy_parameter_value (enum var_types type, void *var) Py_RETURN_NONE; return PyLong_FromUnsignedLong (val); } + + case var_zuinteger: + { + unsigned int val = * (unsigned int *) var; + return PyLong_FromUnsignedLong (val); + } } return PyErr_Format (PyExc_RuntimeError, @@ -586,20 +587,41 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) { struct interp *interp; - scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); + std::string arg_copy = arg; + bool first = true; + char *save_ptr = nullptr; + auto reader + = [&] () + { + const char *result = strtok_r (first ? &arg_copy[0] : nullptr, + "\n", &save_ptr); + first = false; + return result; + }; - scoped_restore save_uiout = make_scoped_restore (¤t_uiout); + counted_command_line lines = read_command_lines_1 (reader, 1, nullptr); - /* Use the console interpreter uiout to have the same print format - for console or MI. */ - interp = interp_lookup (current_ui, "console"); - current_uiout = interp_ui_out (interp); + { + scoped_restore save_async = make_scoped_restore (¤t_ui->async, + 0); - scoped_restore preventer = prevent_dont_repeat (); - if (to_string) - to_string_res = execute_command_to_string (arg, from_tty); - else - execute_command (arg, from_tty); + scoped_restore save_uiout = make_scoped_restore (¤t_uiout); + + /* Use the console interpreter uiout to have the same print format + for console or MI. */ + interp = interp_lookup (current_ui, "console"); + current_uiout = interp->interp_ui_out (); + + scoped_restore preventer = prevent_dont_repeat (); + if (to_string) + to_string_res = execute_control_commands_to_string (lines.get (), + from_tty); + else + execute_control_commands (lines.get (), from_tty); + } + + /* Do any commands attached to breakpoint we stopped at. */ + bpstat_do_actions (); } CATCH (except, RETURN_MASK_ALL) { @@ -607,39 +629,11 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) } END_CATCH - /* Do any commands attached to breakpoint we stopped at. */ - bpstat_do_actions (); - if (to_string) return PyString_FromString (to_string_res.c_str ()); Py_RETURN_NONE; } -/* Implementation of gdb.solib_name (Long) -> String. - Returns the name of the shared library holding a given address, or None. */ - -static PyObject * -gdbpy_solib_name (PyObject *self, PyObject *args) -{ - char *soname; - PyObject *str_obj; - gdb_py_ulongest pc; - - if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc)) - return NULL; - - soname = solib_name_from_address (current_program_space, pc); - if (soname) - str_obj = host_string_to_python_string (soname); - else - { - str_obj = Py_None; - Py_INCREF (Py_None); - } - - return str_obj; -} - /* Implementation of Python rbreak command. Take a REGEX and optionally a MINSYMS, THROTTLE and SYMTABS keyword and return a Python list that contains newly set breakpoints that match that @@ -838,7 +832,8 @@ gdbpy_decode_line (PyObject *self, PyObject *args) return NULL; if (arg != NULL) - location = string_to_event_location_basic (&arg, python_language); + location = string_to_event_location_basic (&arg, python_language, + symbol_name_match_type::WILD); std::vector decoded_sals; symtab_and_line def_sal; @@ -880,10 +875,7 @@ gdbpy_decode_line (PyObject *self, PyObject *args) } } else - { - result.reset (Py_None); - Py_INCREF (Py_None); - } + result = gdbpy_ref<>::new_reference (Py_None); gdbpy_ref<> return_result (PyTuple_New (2)); if (return_result == NULL) @@ -896,10 +888,7 @@ gdbpy_decode_line (PyObject *self, PyObject *args) return NULL; } else - { - unparsed.reset (Py_None); - Py_INCREF (Py_None); - } + unparsed = gdbpy_ref<>::new_reference (Py_None); PyTuple_SetItem (return_result.get (), 0, unparsed.release ()); PyTuple_SetItem (return_result.get (), 1, result.release ()); @@ -930,36 +919,6 @@ gdbpy_parse_and_eval (PyObject *self, PyObject *args) return value_to_value_object (result); } -/* Implementation of gdb.find_pc_line function. - Returns the gdb.Symtab_and_line object corresponding to a PC value. */ - -static PyObject * -gdbpy_find_pc_line (PyObject *self, PyObject *args) -{ - gdb_py_ulongest pc_llu; - PyObject *result = NULL; /* init for gcc -Wall */ - - if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc_llu)) - return NULL; - - TRY - { - struct symtab_and_line sal; - CORE_ADDR pc; - - pc = (CORE_ADDR) pc_llu; - sal = find_pc_line (pc, 0); - result = symtab_and_line_to_sal_object (sal); - } - CATCH (except, RETURN_MASK_ALL) - { - GDB_PY_HANDLE_EXCEPTION (except); - } - END_CATCH - - return result; -} - /* Implementation of gdb.invalidate_cached_frames. */ static PyObject * @@ -1321,20 +1280,6 @@ gdbpy_print_stack (void) -/* Return the current Progspace. - There always is one. */ - -static PyObject * -gdbpy_get_current_progspace (PyObject *unused1, PyObject *unused2) -{ - PyObject *result; - - result = pspace_to_pspace_object (current_program_space); - if (result) - Py_INCREF (result); - return result; -} - /* Return a sequence holding all the Progspaces. */ static PyObject * @@ -1348,9 +1293,9 @@ gdbpy_progspaces (PyObject *unused1, PyObject *unused2) ALL_PSPACES (ps) { - PyObject *item = pspace_to_pspace_object (ps); + gdbpy_ref<> item = pspace_to_pspace_object (ps); - if (!item || PyList_Append (list.get (), item) == -1) + if (item == NULL || PyList_Append (list.get (), item.get ()) == -1) return NULL; } @@ -1414,37 +1359,10 @@ gdbpy_execute_objfile_script (const struct extension_language_defn *extlang, static PyObject * gdbpy_get_current_objfile (PyObject *unused1, PyObject *unused2) { - PyObject *result; - if (! gdbpy_current_objfile) Py_RETURN_NONE; - result = objfile_to_objfile_object (gdbpy_current_objfile); - if (result) - Py_INCREF (result); - return result; -} - -/* Return a sequence holding all the Objfiles. */ - -static PyObject * -gdbpy_objfiles (PyObject *unused1, PyObject *unused2) -{ - struct objfile *objf; - - gdbpy_ref<> list (PyList_New (0)); - if (list == NULL) - return NULL; - - ALL_OBJFILES (objf) - { - PyObject *item = objfile_to_objfile_object (objf); - - if (!item || PyList_Append (list.get (), item) == -1) - return NULL; - } - - return list.release (); + return objfile_to_objfile_object (gdbpy_current_objfile).release (); } /* Compute the list of active python type printers and store them in @@ -1586,7 +1504,7 @@ python_interactive_command (const char *arg, int from_tty) error (_("Python scripting is not supported in this copy of GDB.")); else { - command_line_up l = get_command_line (python_control, ""); + counted_command_line l = get_command_line (python_control, ""); execute_control_command_untraced (l.get ()); } @@ -1655,11 +1573,21 @@ finalize_python (void *ignore) restore_active_ext_lang (previous_active); } +#ifdef IS_PY3K +/* This is called via the PyImport_AppendInittab mechanism called + during initialization, to make the built-in _gdb module known to + Python. */ +PyMODINIT_FUNC +init__gdb_module (void) +{ + return PyModule_Create (&python_GdbModuleDef); +} +#endif + static bool do_start_initialization () { #ifdef IS_PY3K - int i; size_t progsize, count; wchar_t *progname_copy; #endif @@ -1696,6 +1624,9 @@ do_start_initialization () remain alive for the duration of the program's execution, so it is not freed after this call. */ Py_SetProgramName (progname_copy); + + /* Define _gdb as a built-in module. */ + PyImport_AppendInittab ("_gdb", init__gdb_module); #else Py_SetProgramName (progname.release ()); #endif @@ -1705,9 +1636,7 @@ do_start_initialization () PyEval_InitThreads (); #ifdef IS_PY3K - gdb_module = PyModule_Create (&python_GdbModuleDef); - /* Add _gdb module to the list of known built-in modules. */ - _PyImport_FixupBuiltin (gdb_module, "_gdb"); + gdb_module = PyImport_ImportModule ("_gdb"); #else gdb_module = Py_InitModule ("_gdb", python_GdbMethods); #endif @@ -1852,7 +1781,7 @@ Evaluate a Python command.\n\ \n\ The command can be given as an argument, for instance:\n\ \n\ - python print 23\n\ + python print (23)\n\ \n\ If no argument is given, the following lines are read and used\n\ as the Python commands. Type a line containing \"end\" to indicate\n\ @@ -2011,15 +1940,11 @@ set to True." }, { "default_visualizer", gdbpy_default_visualizer, METH_VARARGS, "Find the default visualizer for a Value." }, - { "current_progspace", gdbpy_get_current_progspace, METH_NOARGS, - "Return the current Progspace." }, { "progspaces", gdbpy_progspaces, METH_NOARGS, "Return a sequence of all progspaces." }, { "current_objfile", gdbpy_get_current_objfile, METH_NOARGS, "Return the current Objfile being loaded, or None." }, - { "objfiles", gdbpy_objfiles, METH_NOARGS, - "Return a sequence of all loaded objfiles." }, { "newest_frame", gdbpy_newest_frame, METH_NOARGS, "newest_frame () -> gdb.Frame.\n\ @@ -2065,11 +1990,6 @@ Look up the specified objfile.\n\ If by_build_id is True, the objfile is looked up by using name\n\ as its build id." }, - { "block_for_pc", gdbpy_block_for_pc, METH_VARARGS, - "Return the block containing the given pc value, or None." }, - { "solib_name", gdbpy_solib_name, METH_VARARGS, - "solib_name (Long) -> String.\n\ -Return the name of the shared library holding a given address, or None." }, { "decode_line", gdbpy_decode_line, METH_VARARGS, "decode_line (String) -> Tuple. Decode a string argument the way\n\ that 'break' or 'edit' does. Return a tuple containing two elements.\n\ @@ -2081,9 +2001,6 @@ gdb.Symtab_and_line objects (or None)."}, "parse_and_eval (String) -> Value.\n\ Parse String as an expression, evaluate it, and return the result as a Value." }, - { "find_pc_line", gdbpy_find_pc_line, METH_VARARGS, - "find_pc_line (pc) -> Symtab_and_line.\n\ -Return the gdb.Symtab_and_line object corresponding to the pc value." }, { "post_event", gdbpy_post_event, METH_VARARGS, "Post an event into gdb's event loop." }, @@ -2121,6 +2038,14 @@ Return a tuple containing all inferiors." }, Invalidate any cached frame objects in gdb.\n\ Intended for internal use only." }, + { "convenience_variable", gdbpy_convenience_variable, METH_VARARGS, + "convenience_variable (NAME) -> value.\n\ +Return the value of the convenience variable $NAME,\n\ +or None if not set." }, + { "set_convenience_variable", gdbpy_set_convenience_variable, METH_VARARGS, + "convenience_variable (NAME, VALUE) -> None.\n\ +Set the value of the convenience variable $NAME." }, + {NULL, NULL, 0, NULL} };