diff options
-rw-r--r-- | gdb/python/py-breakpoint.c | 19 | ||||
-rw-r--r-- | gdb/python/py-cmd.c | 8 | ||||
-rw-r--r-- | gdb/python/py-connection.c | 2 | ||||
-rw-r--r-- | gdb/python/py-finishbreakpoint.c | 6 | ||||
-rw-r--r-- | gdb/python/py-framefilter.c | 12 | ||||
-rw-r--r-- | gdb/python/py-inferior.c | 27 | ||||
-rw-r--r-- | gdb/python/py-membuf.c | 3 | ||||
-rw-r--r-- | gdb/python/py-objfile.c | 2 | ||||
-rw-r--r-- | gdb/python/py-param.c | 4 | ||||
-rw-r--r-- | gdb/python/py-progspace.c | 2 | ||||
-rw-r--r-- | gdb/python/py-tui.c | 18 | ||||
-rw-r--r-- | gdb/python/py-type.c | 4 | ||||
-rw-r--r-- | gdb/python/py-unwind.c | 2 | ||||
-rw-r--r-- | gdb/python/py-utils.c | 10 | ||||
-rw-r--r-- | gdb/python/py-value.c | 21 | ||||
-rw-r--r-- | gdb/python/py-xmethods.c | 12 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 27 | ||||
-rw-r--r-- | gdb/python/python.c | 62 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-inferior.exp | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-lookup-type.exp | 8 |
20 files changed, 146 insertions, 105 deletions
diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index f00bd6f..2fc2037 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -858,7 +858,7 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs) const struct breakpoint_ops *ops = breakpoint_ops_for_event_location (location.get (), false); - create_breakpoint (python_gdbarch, + create_breakpoint (gdbpy_enter::get_gdbarch (), location.get (), NULL, -1, NULL, false, 0, temporary_bp, type, @@ -954,15 +954,13 @@ gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang, int stop; struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object; PyObject *py_bp = (PyObject *) bp_obj; - struct gdbarch *garch; if (bp_obj == NULL) return EXT_LANG_BP_STOP_UNSET; stop = -1; - garch = b->gdbarch ? b->gdbarch : get_current_arch (); - gdbpy_enter enter_py (garch, current_language); + gdbpy_enter enter_py (b->gdbarch); if (bp_obj->is_finish_bp) bpfinishpy_pre_stop_hook (bp_obj); @@ -1005,15 +1003,13 @@ gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang, struct breakpoint *b) { PyObject *py_bp; - struct gdbarch *garch; if (b->py_bp_object == NULL) return 0; py_bp = (PyObject *) b->py_bp_object; - garch = b->gdbarch ? b->gdbarch : get_current_arch (); - gdbpy_enter enter_py (garch, current_language); + gdbpy_enter enter_py (b->gdbarch); return PyObject_HasAttrString (py_bp, stop_func); } @@ -1048,8 +1044,7 @@ gdbpy_breakpoint_created (struct breakpoint *bp) return; } - struct gdbarch *garch = bp->gdbarch ? bp->gdbarch : get_current_arch (); - gdbpy_enter enter_py (garch, current_language); + gdbpy_enter enter_py (bp->gdbarch); if (bppy_pending_object) { @@ -1099,8 +1094,7 @@ gdbpy_breakpoint_deleted (struct breakpoint *b) bp = get_breakpoint (num); if (bp) { - struct gdbarch *garch = bp->gdbarch ? bp->gdbarch : get_current_arch (); - gdbpy_enter enter_py (garch, current_language); + gdbpy_enter enter_py (b->gdbarch); gdbpy_ref<gdbpy_breakpoint_object> bp_obj (bp->py_bp_object); if (bp_obj != NULL) @@ -1131,8 +1125,7 @@ gdbpy_breakpoint_modified (struct breakpoint *b) bp = get_breakpoint (num); if (bp) { - struct gdbarch *garch = bp->gdbarch ? bp->gdbarch : get_current_arch (); - gdbpy_enter enter_py (garch, current_language); + gdbpy_enter enter_py (b->gdbarch); PyObject *bp_obj = (PyObject *) bp->py_bp_object; if (bp_obj) diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c index 3a4e649..b51b05c 100644 --- a/gdb/python/py-cmd.c +++ b/gdb/python/py-cmd.c @@ -90,7 +90,7 @@ cmdpy_dont_repeat (PyObject *self, PyObject *args) static void cmdpy_destroyer (struct cmd_list_element *self, void *context) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; /* Release our hold on the command object. */ gdbpy_ref<cmdpy_object> cmd ((cmdpy_object *) context); @@ -104,7 +104,7 @@ cmdpy_function (const char *args, int from_tty, cmd_list_element *command) { cmdpy_object *obj = (cmdpy_object *) command->context (); - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (! obj) error (_("Invalid invocation of Python command object.")); @@ -223,7 +223,7 @@ cmdpy_completer_handle_brkchars (struct cmd_list_element *command, completion_tracker &tracker, const char *text, const char *word) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; /* Calling our helper to obtain a reference to the PyObject of the Python function. */ @@ -266,7 +266,7 @@ cmdpy_completer (struct cmd_list_element *command, completion_tracker &tracker, const char *text, const char *word) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; /* Calling our helper to obtain a reference to the PyObject of the Python function. */ diff --git a/gdb/python/py-connection.c b/gdb/python/py-connection.c index 7c33a1f..4cdd6ab 100644 --- a/gdb/python/py-connection.c +++ b/gdb/python/py-connection.c @@ -161,7 +161,7 @@ connpy_connection_removed (process_stratum_target *target) if (!gdb_python_initialized) return; - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (!evregpy_no_listeners_p (gdb_py_events.connection_removed)) if (emit_connection_event (target, gdb_py_events.connection_removed) < 0) diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c index 8d5eb42..03bd493 100644 --- a/gdb/python/py-finishbreakpoint.c +++ b/gdb/python/py-finishbreakpoint.c @@ -293,7 +293,7 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) /* Set a breakpoint on the return address. */ event_location_up location = new_address_location (get_frame_pc (prev_frame), NULL, 0); - create_breakpoint (python_gdbarch, + create_breakpoint (gdbpy_enter::get_gdbarch (), location.get (), NULL, thread, NULL, false, 0, 1 /*temp_flag*/, @@ -380,7 +380,7 @@ bpfinishpy_detect_out_scope_cb (struct breakpoint *b, static void bpfinishpy_handle_stop (struct bpstat *bs, int print_frame) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; for (breakpoint *bp : all_breakpoints_safe ()) bpfinishpy_detect_out_scope_cb (bp, bs == NULL ? NULL : bs->breakpoint_at); @@ -392,7 +392,7 @@ bpfinishpy_handle_stop (struct bpstat *bs, int print_frame) static void bpfinishpy_handle_exit (struct inferior *inf) { - gdbpy_enter enter_py (target_gdbarch (), current_language); + gdbpy_enter enter_py (target_gdbarch ()); for (breakpoint *bp : all_breakpoints_safe ()) bpfinishpy_detect_out_scope_cb (bp, nullptr); diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 936354f..7870374 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -74,11 +74,11 @@ extract_sym (PyObject *obj, gdb::unique_xmalloc_ptr<char> *name, if (*name == NULL) return EXT_LANG_BT_ERROR; /* If the API returns a string (and not a symbol), then there is - no symbol derived language available and the frame filter has - either overridden the symbol with a string, or supplied a - entirely synthetic symbol/value pairing. In that case, use - python_language. */ - *language = python_language; + no symbol derived language available and the frame filter has + either overridden the symbol with a string, or supplied a + entirely synthetic symbol/value pairing. In that case, use + the current language. */ + *language = current_language; *sym = NULL; *sym_block = NULL; } @@ -1157,7 +1157,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, return EXT_LANG_BT_NO_FILTERS; } - gdbpy_enter enter_py (gdbarch, current_language); + gdbpy_enter enter_py (gdbarch); /* When we're limiting the number of frames, be careful to request one extra frame, so that we can print a message if there are more diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 45e33f9..46f0c9f 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -86,7 +86,7 @@ python_on_normal_stop (struct bpstat *bs, int print_frame) stop_signal = inferior_thread ()->stop_signal (); - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (emit_stop_event (bs, stop_signal) < 0) gdbpy_print_stack (); @@ -98,7 +98,7 @@ python_on_resume (ptid_t ptid) if (!gdb_python_initialized) return; - gdbpy_enter enter_py (target_gdbarch (), current_language); + gdbpy_enter enter_py (target_gdbarch ()); if (emit_continue_event (ptid) < 0) gdbpy_print_stack (); @@ -110,7 +110,7 @@ python_on_resume (ptid_t ptid) static void python_on_inferior_call_pre (ptid_t thread, CORE_ADDR address) { - gdbpy_enter enter_py (target_gdbarch (), current_language); + gdbpy_enter enter_py (target_gdbarch ()); if (emit_inferior_call_event (INFERIOR_CALL_PRE, thread, address) < 0) gdbpy_print_stack (); @@ -122,7 +122,7 @@ python_on_inferior_call_pre (ptid_t thread, CORE_ADDR address) static void python_on_inferior_call_post (ptid_t thread, CORE_ADDR address) { - gdbpy_enter enter_py (target_gdbarch (), current_language); + gdbpy_enter enter_py (target_gdbarch ()); if (emit_inferior_call_event (INFERIOR_CALL_POST, thread, address) < 0) gdbpy_print_stack (); @@ -135,7 +135,7 @@ python_on_inferior_call_post (ptid_t thread, CORE_ADDR address) static void python_on_memory_change (struct inferior *inferior, CORE_ADDR addr, ssize_t len, const bfd_byte *data) { - gdbpy_enter enter_py (target_gdbarch (), current_language); + gdbpy_enter enter_py (target_gdbarch ()); if (emit_memory_changed_event (addr, len) < 0) gdbpy_print_stack (); @@ -148,7 +148,7 @@ python_on_memory_change (struct inferior *inferior, CORE_ADDR addr, ssize_t len, static void python_on_register_change (struct frame_info *frame, int regnum) { - gdbpy_enter enter_py (target_gdbarch (), current_language); + gdbpy_enter enter_py (target_gdbarch ()); if (emit_register_changed_event (frame, regnum) < 0) gdbpy_print_stack (); @@ -162,7 +162,7 @@ python_inferior_exit (struct inferior *inf) if (!gdb_python_initialized) return; - gdbpy_enter enter_py (target_gdbarch (), current_language); + gdbpy_enter enter_py (target_gdbarch ()); if (inf->has_exit_code) exit_code = &inf->exit_code; @@ -183,8 +183,7 @@ python_new_objfile (struct objfile *objfile) gdbpy_enter enter_py (objfile != NULL ? objfile->arch () - : target_gdbarch (), - current_language); + : target_gdbarch ()); if (objfile == NULL) { @@ -237,7 +236,7 @@ python_new_inferior (struct inferior *inf) if (!gdb_python_initialized) return; - gdbpy_enter enter_py (python_gdbarch, python_language); + gdbpy_enter enter_py; if (evregpy_no_listeners_p (gdb_py_events.new_inferior)) return; @@ -265,7 +264,7 @@ python_inferior_deleted (struct inferior *inf) if (!gdb_python_initialized) return; - gdbpy_enter enter_py (python_gdbarch, python_language); + gdbpy_enter enter_py; if (evregpy_no_listeners_p (gdb_py_events.inferior_deleted)) return; @@ -312,7 +311,7 @@ add_thread_object (struct thread_info *tp) if (!gdb_python_initialized) return; - gdbpy_enter enter_py (python_gdbarch, python_language); + gdbpy_enter enter_py; gdbpy_ref<thread_object> thread_obj = create_thread_object (tp); if (thread_obj == NULL) @@ -348,7 +347,7 @@ delete_thread_object (struct thread_info *tp, int ignore) if (!gdb_python_initialized) return; - gdbpy_enter enter_py (python_gdbarch, python_language); + gdbpy_enter enter_py; gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (tp->inf); if (inf_obj == NULL) @@ -792,7 +791,7 @@ py_free_inferior (struct inferior *inf, void *datum) if (!gdb_python_initialized) return; - gdbpy_enter enter_py (python_gdbarch, python_language); + gdbpy_enter enter_py; gdbpy_ref<inferior_object> inf_obj ((inferior_object *) datum); inf_obj->inferior = NULL; diff --git a/gdb/python/py-membuf.c b/gdb/python/py-membuf.c index e789a78..74cc0fb 100644 --- a/gdb/python/py-membuf.c +++ b/gdb/python/py-membuf.c @@ -83,7 +83,8 @@ mbpy_str (PyObject *self) return PyString_FromFormat (_("Memory buffer for address %s, \ which is %s bytes long."), - paddress (python_gdbarch, membuf_obj->addr), + paddress (gdbpy_enter::get_gdbarch (), + membuf_obj->addr), pulongest (membuf_obj->length)); } diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index 3805224..6055a42 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -661,7 +661,7 @@ gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw) static void py_free_objfile (struct objfile *objfile, void *datum) { - gdbpy_enter enter_py (objfile->arch (), current_language); + gdbpy_enter enter_py (objfile->arch ()); gdbpy_ref<objfile_object> object ((objfile_object *) datum); object->objfile = NULL; } diff --git a/gdb/python/py-param.c b/gdb/python/py-param.c index a25dad3..24678bc 100644 --- a/gdb/python/py-param.c +++ b/gdb/python/py-param.c @@ -396,7 +396,7 @@ get_set_value (const char *args, int from_tty, PyObject *obj = (PyObject *) c->context (); gdb::unique_xmalloc_ptr<char> set_doc_string; - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; gdbpy_ref<> set_doc_func (PyString_FromString ("get_set_string")); if (set_doc_func == NULL) @@ -431,7 +431,7 @@ get_show_value (struct ui_file *file, int from_tty, PyObject *obj = (PyObject *) c->context (); gdb::unique_xmalloc_ptr<char> show_doc_string; - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; gdbpy_ref<> show_doc_func (PyString_FromString ("get_show_string")); if (show_doc_func == NULL) diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c index 8131b66..b27ebf4 100644 --- a/gdb/python/py-progspace.c +++ b/gdb/python/py-progspace.c @@ -472,7 +472,7 @@ py_free_pspace (struct program_space *pspace, void *datum) being deleted. */ struct gdbarch *arch = target_gdbarch (); - gdbpy_enter enter_py (arch, current_language); + gdbpy_enter enter_py (arch); gdbpy_ref<pspace_object> object ((pspace_object *) datum); object->pspace = NULL; } diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c index 97fdfe2..6a92251 100644 --- a/gdb/python/py-tui.c +++ b/gdb/python/py-tui.c @@ -155,7 +155,7 @@ gdbpy_tui_window::is_valid () const tui_py_window::~tui_py_window () { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; /* This can be null if the user-provided Python construction function failed. */ @@ -181,7 +181,7 @@ tui_py_window::rerender () { tui_win_info::rerender (); - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; int h = viewport_height (); int w = viewport_width (); @@ -206,7 +206,7 @@ tui_py_window::rerender () void tui_py_window::do_scroll_horizontal (int num_to_scroll) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (PyObject_HasAttrString (m_window.get (), "hscroll")) { @@ -220,7 +220,7 @@ tui_py_window::do_scroll_horizontal (int num_to_scroll) void tui_py_window::do_scroll_vertical (int num_to_scroll) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (PyObject_HasAttrString (m_window.get (), "vscroll")) { @@ -234,7 +234,7 @@ tui_py_window::do_scroll_vertical (int num_to_scroll) void tui_py_window::click (int mouse_x, int mouse_y, int mouse_button) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (PyObject_HasAttrString (m_window.get (), "click")) { @@ -285,7 +285,7 @@ public: gdbpy_tui_window_maker (const gdbpy_tui_window_maker &other) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; m_constr = other.m_constr; } @@ -297,7 +297,7 @@ public: gdbpy_tui_window_maker &operator= (const gdbpy_tui_window_maker &other) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; m_constr = other.m_constr; return *this; } @@ -312,14 +312,14 @@ private: gdbpy_tui_window_maker::~gdbpy_tui_window_maker () { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; m_constr.reset (nullptr); } tui_win_info * gdbpy_tui_window_maker::operator() (const char *win_name) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; gdbpy_ref<gdbpy_tui_window> wrapper (PyObject_New (gdbpy_tui_window, &gdbpy_tui_window_object_type)); diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 220b0d4..e71e635 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -799,7 +799,7 @@ typy_lookup_typename (const char *type_name, const struct block *block) else if (startswith (type_name, "enum ")) type = lookup_enum (type_name + 5, NULL); else - type = lookup_typename (python_language, + type = lookup_typename (current_language, type_name, block, 0); } catch (const gdb_exception &except) @@ -1089,7 +1089,7 @@ save_objfile_types (struct objfile *objfile, void *datum) /* This prevents another thread from freeing the objects we're operating on. */ - gdbpy_enter enter_py (objfile->arch (), current_language); + gdbpy_enter enter_py (objfile->arch ()); htab_up copied_types = create_copied_types_hash (objfile); diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c index 4fea906..36f42cb 100644 --- a/gdb/python/py-unwind.c +++ b/gdb/python/py-unwind.c @@ -524,7 +524,7 @@ pyuw_sniffer (const struct frame_unwind *self, struct frame_info *this_frame, struct gdbarch *gdbarch = (struct gdbarch *) (self->unwind_data); cached_frame_info *cached_frame; - gdbpy_enter enter_py (gdbarch, current_language); + gdbpy_enter enter_py (gdbarch); pyuw_debug_printf ("frame=%d, sp=%s, pc=%s", frame_relative_level (this_frame), diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c index 79e1c01..73c860b 100644 --- a/gdb/python/py-utils.c +++ b/gdb/python/py-utils.c @@ -93,8 +93,9 @@ unicode_to_encoded_python_string (PyObject *unicode_str, const char *charset) gdb::unique_xmalloc_ptr<char> unicode_to_target_string (PyObject *unicode_str) { - return unicode_to_encoded_string (unicode_str, - target_charset (python_gdbarch)); + return (unicode_to_encoded_string + (unicode_str, + target_charset (gdbpy_enter::get_gdbarch ()))); } /* Returns a PyObject with the contents of the given unicode string @@ -104,8 +105,9 @@ unicode_to_target_string (PyObject *unicode_str) static gdbpy_ref<> unicode_to_target_python_string (PyObject *unicode_str) { - return unicode_to_encoded_python_string (unicode_str, - target_charset (python_gdbarch)); + return (unicode_to_encoded_python_string + (unicode_str, + target_charset (gdbpy_enter::get_gdbarch ()))); } /* Converts a python string (8-bit or unicode) to a target string in diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 70b33d5..d6ceb54 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -35,23 +35,26 @@ GDB (which uses target arithmetic). */ /* Python's integer type corresponds to C's long type. */ -#define builtin_type_pyint builtin_type (python_gdbarch)->builtin_long +#define builtin_type_pyint \ + builtin_type (gdbpy_enter::get_gdbarch ())->builtin_long /* Python's float type corresponds to C's double type. */ -#define builtin_type_pyfloat builtin_type (python_gdbarch)->builtin_double +#define builtin_type_pyfloat \ + builtin_type (gdbpy_enter::get_gdbarch ())->builtin_double /* Python's long type corresponds to C's long long type. */ -#define builtin_type_pylong builtin_type (python_gdbarch)->builtin_long_long +#define builtin_type_pylong \ + builtin_type (gdbpy_enter::get_gdbarch ())->builtin_long_long /* Python's long type corresponds to C's long long type. Unsigned version. */ #define builtin_type_upylong builtin_type \ - (python_gdbarch)->builtin_unsigned_long_long + (gdbpy_enter::get_gdbarch ())->builtin_unsigned_long_long #define builtin_type_pybool \ - language_bool_type (python_language, python_gdbarch) + language_bool_type (current_language, gdbpy_enter::get_gdbarch ()) #define builtin_type_pychar \ - language_string_char_type (python_language, python_gdbarch) + language_string_char_type (current_language, gdbpy_enter::get_gdbarch ()) struct value_object { PyObject_HEAD @@ -754,7 +757,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw) try { common_val_print (((value_object *) self)->value, &stb, 0, - &opts, python_language); + &opts, current_language); } catch (const gdb_exception &except) { @@ -1160,7 +1163,7 @@ valpy_str (PyObject *self) try { common_val_print (((value_object *) self)->value, &stb, 0, - &opts, python_language); + &opts, current_language); } catch (const gdb_exception &except) { @@ -2025,7 +2028,7 @@ gdbpy_convenience_variable (PyObject *self, PyObject *args) if (var != NULL) { - res_val = value_of_internalvar (python_gdbarch, var); + res_val = value_of_internalvar (gdbpy_enter::get_gdbarch (), var); if (value_type (res_val)->code () == TYPE_CODE_VOID) res_val = NULL; } diff --git a/gdb/python/py-xmethods.c b/gdb/python/py-xmethods.c index fd36730..9d58249 100644 --- a/gdb/python/py-xmethods.c +++ b/gdb/python/py-xmethods.c @@ -69,7 +69,7 @@ private: python_xmethod_worker::~python_xmethod_worker () { /* We don't do much here, but we still need the GIL. */ - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; Py_DECREF (m_py_worker); Py_DECREF (m_this_type); @@ -122,7 +122,7 @@ gdbpy_get_matching_xmethod_workers { gdb_assert (obj_type != NULL && method_name != NULL); - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; gdbpy_ref<> py_type (type_to_type_object (obj_type)); if (py_type == NULL) @@ -294,7 +294,7 @@ python_xmethod_worker::do_get_arg_types (std::vector<type *> *arg_types) { /* The gdbpy_enter object needs to be placed first, so that it's the last to be destroyed. */ - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; struct type *obj_type; int i = 1, arg_count; gdbpy_ref<> list_iter; @@ -410,7 +410,7 @@ python_xmethod_worker::do_get_result_type (value *obj, struct type *obj_type, *this_type; int i; - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; /* First see if there is a get_result_type method. If not this could be an old xmethod (pre 7.9.1). */ @@ -502,7 +502,7 @@ struct value * python_xmethod_worker::invoke (struct value *obj, gdb::array_view<value *> args) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; int i; struct type *obj_type, *this_type; @@ -580,7 +580,7 @@ python_xmethod_worker::invoke (struct value *obj, } else { - res = allocate_value (lookup_typename (python_language, + res = allocate_value (lookup_typename (current_language, "void", NULL, 0)); } diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 583989c..ccea5c4 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -625,14 +625,36 @@ class gdbpy_enter { public: - gdbpy_enter (struct gdbarch *gdbarch, const struct language_defn *language); + /* Set the ambient Python architecture to GDBARCH and the language + to LANGUAGE. If GDBARCH is nullptr, then the architecture will + be computed, when needed, using get_current_arch; see the + get_gdbarch method. If LANGUAGE is not nullptr, then the current + language at time of construction will be saved (to be restored on + destruction), and the current language will be set to + LANGUAGE. */ + explicit gdbpy_enter (struct gdbarch *gdbarch = nullptr, + const struct language_defn *language = nullptr); ~gdbpy_enter (); DISABLE_COPY_AND_ASSIGN (gdbpy_enter); + /* Return the current gdbarch, as known to the Python layer. This + is either python_gdbarch (which comes from the most recent call + to the gdbpy_enter constructor), or, if that is nullptr, the + result of get_current_arch. */ + static struct gdbarch *get_gdbarch (); + + /* Called only during gdb shutdown. This sets python_gdbarch to an + acceptable value. */ + static void finalize (); + private: + /* The current gdbarch, according to Python. This can be + nullptr. */ + static struct gdbarch *python_gdbarch; + struct active_ext_lang_state *m_previous_active; PyGILState_STATE m_state; struct gdbarch *m_gdbarch; @@ -680,9 +702,6 @@ private: PyThreadState *m_save; }; -extern struct gdbarch *python_gdbarch; -extern const struct language_defn *python_language; - /* Use this after a TRY_EXCEPT to throw the appropriate Python exception. */ #define GDB_PY_HANDLE_EXCEPTION(Exception) \ diff --git a/gdb/python/python.c b/gdb/python/python.c index 4dcda53..7ddc170 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -192,13 +192,12 @@ const struct extension_language_defn extension_language_python = /* Architecture and language to be used in callbacks from the Python interpreter. */ -struct gdbarch *python_gdbarch; -const struct language_defn *python_language; +struct gdbarch *gdbpy_enter::python_gdbarch; gdbpy_enter::gdbpy_enter (struct gdbarch *gdbarch, const struct language_defn *language) : m_gdbarch (python_gdbarch), - m_language (python_language) + m_language (language == nullptr ? nullptr : current_language) { /* We should not ever enter Python unless initialized. */ if (!gdb_python_initialized) @@ -209,7 +208,8 @@ gdbpy_enter::gdbpy_enter (struct gdbarch *gdbarch, m_state = PyGILState_Ensure (); python_gdbarch = gdbarch; - python_language = language; + if (language != nullptr) + set_language (language->la_language); /* Save it and ensure ! PyErr_Occurred () afterwards. */ m_error.emplace (); @@ -228,12 +228,27 @@ gdbpy_enter::~gdbpy_enter () m_error->restore (); python_gdbarch = m_gdbarch; - python_language = m_language; + if (m_language != nullptr) + set_language (m_language->la_language); restore_active_ext_lang (m_previous_active); PyGILState_Release (m_state); } +struct gdbarch * +gdbpy_enter::get_gdbarch () +{ + if (python_gdbarch != nullptr) + return python_gdbarch; + return get_current_arch (); +} + +void +gdbpy_enter::finalize () +{ + python_gdbarch = target_gdbarch (); +} + /* A helper class to save and restore the GIL, but without touching the other globals that are handled by gdbpy_enter. */ @@ -318,7 +333,7 @@ python_interactive_command (const char *arg, int from_tty) arg = skip_spaces (arg); - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (arg && *arg) { @@ -412,7 +427,7 @@ gdbpy_eval_from_control_command (const struct extension_language_defn *extlang, if (cmd->body_list_1 != nullptr) error (_("Invalid \"python\" block structure.")); - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; std::string script = compute_python_string (cmd->body_list_0.get ()); ret = PyRun_SimpleString (script.c_str ()); @@ -425,7 +440,7 @@ gdbpy_eval_from_control_command (const struct extension_language_defn *extlang, static void python_command (const char *arg, int from_tty) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); @@ -556,7 +571,7 @@ gdbpy_parameter (PyObject *self, PyObject *args) static PyObject * gdbpy_target_charset (PyObject *self, PyObject *args) { - const char *cset = target_charset (python_gdbarch); + const char *cset = target_charset (gdbpy_enter::get_gdbarch ()); return PyUnicode_Decode (cset, strlen (cset), host_charset (), NULL); } @@ -566,7 +581,7 @@ gdbpy_target_charset (PyObject *self, PyObject *args) static PyObject * gdbpy_target_wide_charset (PyObject *self, PyObject *args) { - const char *cset = target_wide_charset (python_gdbarch); + const char *cset = target_wide_charset (gdbpy_enter::get_gdbarch ()); return PyUnicode_Decode (cset, strlen (cset), host_charset (), NULL); } @@ -867,7 +882,7 @@ gdbpy_decode_line (PyObject *self, PyObject *args) } if (arg != NULL) - location = string_to_event_location_basic (&arg, python_language, + location = string_to_event_location_basic (&arg, current_language, symbol_name_match_type::WILD); std::vector<symtab_and_line> decoded_sals; @@ -972,7 +987,7 @@ static void gdbpy_source_script (const struct extension_language_defn *extlang, FILE *file, const char *filename) { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; python_run_simple_file (file, filename); } @@ -1011,7 +1026,7 @@ struct gdbpy_event void operator() () { - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; gdbpy_ref<> call_result (PyObject_CallObject (m_func, NULL)); if (call_result == NULL) @@ -1060,7 +1075,7 @@ gdbpy_before_prompt_hook (const struct extension_language_defn *extlang, if (!gdb_python_initialized) return EXT_LANG_RC_NOP; - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (!evregpy_no_listeners_p (gdb_py_events.before_prompt) && evpy_emit_event (NULL, gdb_py_events.before_prompt) < 0) @@ -1135,7 +1150,7 @@ gdbpy_colorize (const std::string &filename, const std::string &contents) if (!gdb_python_initialized) return {}; - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (gdb_python_module == nullptr || !PyObject_HasAttrString (gdb_python_module, "colorize")) @@ -1400,7 +1415,7 @@ gdbpy_source_objfile_script (const struct extension_language_defn *extlang, if (!gdb_python_initialized) return; - gdbpy_enter enter_py (objfile->arch (), current_language); + gdbpy_enter enter_py (objfile->arch ()); scoped_restore restire_current_objfile = make_scoped_restore (&gdbpy_current_objfile, objfile); @@ -1421,7 +1436,7 @@ gdbpy_execute_objfile_script (const struct extension_language_defn *extlang, if (!gdb_python_initialized) return; - gdbpy_enter enter_py (objfile->arch (), current_language); + gdbpy_enter enter_py (objfile->arch ()); scoped_restore restire_current_objfile = make_scoped_restore (&gdbpy_current_objfile, objfile); @@ -1453,7 +1468,7 @@ gdbpy_start_type_printers (const struct extension_language_defn *extlang, if (!gdb_python_initialized) return; - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; gdbpy_ref<> type_module (PyImport_ImportModule ("gdb.types")); if (type_module == NULL) @@ -1498,7 +1513,7 @@ gdbpy_apply_type_printers (const struct extension_language_defn *extlang, if (!gdb_python_initialized) return EXT_LANG_RC_NOP; - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; gdbpy_ref<> type_obj (type_to_type_object (type)); if (type_obj == NULL) @@ -1561,7 +1576,7 @@ gdbpy_free_type_printers (const struct extension_language_defn *extlang, if (!gdb_python_initialized) return; - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; Py_DECREF (printers); } @@ -1696,8 +1711,7 @@ finalize_python (void *ignore) previous_active = set_active_ext_lang (&extension_language_python); (void) PyGILState_Ensure (); - python_gdbarch = target_gdbarch (); - python_language = current_language; + gdbpy_enter::finalize (); Py_Finalize (); @@ -1756,7 +1770,7 @@ gdbpy_gdb_exiting (int exit_code) if (!gdb_python_initialized) return; - gdbpy_enter enter_py (python_gdbarch, python_language); + gdbpy_enter enter_py; if (emit_exiting_event (exit_code) < 0) gdbpy_print_stack (); @@ -2174,7 +2188,7 @@ gdbpy_initialize (const struct extension_language_defn *extlang) if (!do_start_initialization () && PyErr_Occurred ()) gdbpy_print_stack (); - gdbpy_enter enter_py (get_current_arch (), current_language); + gdbpy_enter enter_py; if (!do_initialize (extlang)) { diff --git a/gdb/testsuite/gdb.python/py-inferior.exp b/gdb/testsuite/gdb.python/py-inferior.exp index 5b5f582..aa78a15 100644 --- a/gdb/testsuite/gdb.python/py-inferior.exp +++ b/gdb/testsuite/gdb.python/py-inferior.exp @@ -220,6 +220,7 @@ with_test_prefix "is_valid" { gdb_test "python print (inf_list\[0\].is_valid())" "True" \ "check inferior validity 1" + # The "dummy" line below used to cause a gdb crash. gdb_test_multiline "install new inferior event handler" \ "python" "" \ "my_inferior_count = 1" "" \ @@ -227,6 +228,7 @@ with_test_prefix "is_valid" { " global my_inferior_count" "" \ " if evt.inferior is not None:" "" \ " my_inferior_count = my_inferior_count + 1" "" \ + " dummy = gdb.Value(True)" "" \ "gdb.events.new_inferior.connect(new_inf_handler)" "" \ "end" "" gdb_test_multiline "install inferior deleted event handler" \ diff --git a/gdb/testsuite/gdb.python/py-lookup-type.exp b/gdb/testsuite/gdb.python/py-lookup-type.exp index 52a1dae..534a5fd 100644 --- a/gdb/testsuite/gdb.python/py-lookup-type.exp +++ b/gdb/testsuite/gdb.python/py-lookup-type.exp @@ -54,3 +54,11 @@ test_lookup_type "opencl" "ushort" test_lookup_type "objective-c" "char" test_lookup_type "pascal" "char" + +# Ensure that the language can be changed from within Python and still +# affect the results. +gdb_test_multiline "look up ada type from another language" \ + "python" "" \ + "gdb.execute('set language ada')" "" \ + "print(gdb.lookup_type('character'))" "" \ + "end" "character" |