aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog26
-rw-r--r--gdb/cp-valprint.c28
-rw-r--r--gdb/extension-priv.h17
-rw-r--r--gdb/extension.c19
-rw-r--r--gdb/extension.h6
-rw-r--r--gdb/guile/guile-internal.h5
-rw-r--r--gdb/guile/scm-pretty-print.c16
-rw-r--r--gdb/guile/scm-value.c18
-rw-r--r--gdb/python/py-prettyprint.c17
-rw-r--r--gdb/python/py-value.c21
-rw-r--r--gdb/python/python-internal.h5
-rw-r--r--gdb/valprint.c17
12 files changed, 119 insertions, 76 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 767f3b7..ac1a4f8 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,31 @@
2020-03-13 Tom Tromey <tom@tromey.com>
+ * valprint.c (do_val_print): Update.
+ * python/python-internal.h (gdbpy_apply_val_pretty_printer): Take
+ a struct value.
+ (value_to_value_object_no_release): Declare.
+ * python/py-value.c (value_to_value_object_no_release): New
+ function.
+ * python/py-prettyprint.c (gdbpy_apply_val_pretty_printer): Take a
+ struct value.
+ * guile/scm-value.c (vlscm_scm_from_value_no_release): New
+ function.
+ * guile/scm-pretty-print.c (gdbscm_apply_val_pretty_printer): Take
+ a struct value.
+ * guile/guile-internal.h (vlscm_scm_from_value_no_release):
+ Declare.
+ (gdbscm_apply_val_pretty_printer): Take a struct value.
+ * extension.h (apply_ext_lang_val_pretty_printer): Take a struct
+ value.
+ * extension.c (apply_ext_lang_val_pretty_printer): Take a struct
+ value.
+ * extension-priv.h (struct extension_language_ops)
+ <apply_val_pretty_printer>: Take a struct value.
+ * cp-valprint.c (cp_print_value): Create a struct value.
+ (cp_print_value): Update.
+
+2020-03-13 Tom Tromey <tom@tromey.com>
+
* ada-valprint.c (print_field_values): Call common_val_print.
2020-03-13 Tom Tromey <tom@tromey.com>
diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c
index 77725b7..5e4cb3c 100644
--- a/gdb/cp-valprint.c
+++ b/gdb/cp-valprint.c
@@ -848,13 +848,15 @@ cp_print_value (struct type *type, struct type *real_type,
/* Attempt to run an extension language pretty-printer on the
baseclass if possible. */
if (!options->raw)
- result
- = apply_ext_lang_val_pretty_printer (baseclass,
- thisoffset + boffset,
- value_address (base_val),
- stream, recurse,
- base_val, options,
- current_language);
+ {
+ struct value *v
+ = value_from_component (base_val, baseclass,
+ thisoffset + boffset);
+ result
+ = apply_ext_lang_val_pretty_printer (v, stream, recurse,
+ options,
+ current_language);
+ }
if (!result)
cp_print_value_fields (baseclass, thistype,
@@ -1006,19 +1008,19 @@ cp_print_value (struct value *val, struct ui_file *stream,
}
else
{
+ struct value *baseclass_val = value_primitive_field (val, 0,
+ i, type);
+
/* Attempt to run an extension language pretty-printer on the
baseclass if possible. */
if (!options->raw)
result
- = apply_ext_lang_val_pretty_printer (baseclass, boffset,
- value_address (base_val),
- stream, recurse,
- base_val, options,
+ = apply_ext_lang_val_pretty_printer (baseclass_val, stream,
+ recurse, options,
current_language);
if (!result)
- cp_print_value_fields (value_primitive_field (val, 0, i, type),
- stream, recurse, options,
+ cp_print_value_fields (baseclass_val, stream, recurse, options,
((struct type **)
obstack_base (&dont_print_vb_obstack)),
0);
diff --git a/gdb/extension-priv.h b/gdb/extension-priv.h
index c356710..8596e0a 100644
--- a/gdb/extension-priv.h
+++ b/gdb/extension-priv.h
@@ -152,19 +152,14 @@ struct extension_language_ops
void (*free_type_printers) (const struct extension_language_defn *,
struct ext_lang_type_printers *);
- /* Try to pretty-print a value of type TYPE located at VAL's contents
- buffer + EMBEDDED_OFFSET, which came from the inferior at address
- ADDRESS + EMBEDDED_OFFSET, onto stdio stream STREAM according to
- OPTIONS.
- VAL is the whole object that came from ADDRESS.
- Returns EXT_LANG_RC_OK upon success, EXT_LANG_RC_NOP if the value
- is not recognized, and EXT_LANG_RC_ERROR if an error was encountered. */
+ /* Try to pretty-print a value, onto stdio stream STREAM according
+ to OPTIONS. VAL is the object to print. Returns EXT_LANG_RC_OK
+ upon success, EXT_LANG_RC_NOP if the value is not recognized, and
+ EXT_LANG_RC_ERROR if an error was encountered. */
enum ext_lang_rc (*apply_val_pretty_printer)
(const struct extension_language_defn *,
- struct type *type,
- LONGEST embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- struct value *val, const struct value_print_options *options,
+ struct value *val, struct ui_file *stream, int recurse,
+ const struct value_print_options *options,
const struct language_defn *language);
/* GDB access to the "frame filter" feature.
diff --git a/gdb/extension.c b/gdb/extension.c
index e2efe0b..09aa7d9 100644
--- a/gdb/extension.c
+++ b/gdb/extension.c
@@ -470,12 +470,9 @@ ext_lang_type_printers::~ext_lang_type_printers ()
}
}
-/* Try to pretty-print a value of type TYPE located at VAL's contents
- buffer + EMBEDDED_OFFSET, which came from the inferior at address
- ADDRESS + EMBEDDED_OFFSET, onto stdio stream STREAM according to
- OPTIONS.
- VAL is the whole object that came from ADDRESS.
- Returns non-zero if the value was successfully pretty-printed.
+/* Try to pretty-print a value onto stdio stream STREAM according to
+ OPTIONS. VAL is the object to print. Returns non-zero if the
+ value was successfully pretty-printed.
Extension languages are tried in the order specified by
extension_languages. The first one to provide a pretty-printed
@@ -488,10 +485,8 @@ ext_lang_type_printers::~ext_lang_type_printers ()
errors that trigger an exception in the extension language. */
int
-apply_ext_lang_val_pretty_printer (struct type *type,
- LONGEST embedded_offset, CORE_ADDR address,
+apply_ext_lang_val_pretty_printer (struct value *val,
struct ui_file *stream, int recurse,
- struct value *val,
const struct value_print_options *options,
const struct language_defn *language)
{
@@ -504,10 +499,8 @@ apply_ext_lang_val_pretty_printer (struct type *type,
if (extlang->ops->apply_val_pretty_printer == NULL)
continue;
- rc = extlang->ops->apply_val_pretty_printer (extlang, type,
- embedded_offset, address,
- stream, recurse, val,
- options, language);
+ rc = extlang->ops->apply_val_pretty_printer (extlang, val, stream,
+ recurse, options, language);
switch (rc)
{
case EXT_LANG_RC_OK:
diff --git a/gdb/extension.h b/gdb/extension.h
index ca3fc14..c840dbc 100644
--- a/gdb/extension.h
+++ b/gdb/extension.h
@@ -283,10 +283,8 @@ extern char *apply_ext_lang_type_printers (struct ext_lang_type_printers *,
struct type *);
extern int apply_ext_lang_val_pretty_printer
- (struct type *type,
- LONGEST embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- struct value *val, const struct value_print_options *options,
+ (struct value *value, struct ui_file *stream, int recurse,
+ const struct value_print_options *options,
const struct language_defn *language);
extern enum ext_lang_bt_status apply_ext_lang_frame_filter
diff --git a/gdb/guile/guile-internal.h b/gdb/guile/guile-internal.h
index 08fcb33..c501e2b 100644
--- a/gdb/guile/guile-internal.h
+++ b/gdb/guile/guile-internal.h
@@ -579,6 +579,7 @@ extern struct value *vlscm_scm_to_value (SCM scm);
extern int vlscm_is_value (SCM scm);
extern SCM vlscm_scm_from_value (struct value *value);
+extern SCM vlscm_scm_from_value_no_release (struct value *value);
extern struct value *vlscm_convert_typed_value_from_scheme
(const char *func_name, int obj_arg_pos, SCM obj,
@@ -602,10 +603,8 @@ extern void gdbscm_preserve_values
extern enum ext_lang_rc gdbscm_apply_val_pretty_printer
(const struct extension_language_defn *,
- struct type *type,
- LONGEST embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int recurse,
struct value *val,
+ struct ui_file *stream, int recurse,
const struct value_print_options *options,
const struct language_defn *language);
diff --git a/gdb/guile/scm-pretty-print.c b/gdb/guile/scm-pretty-print.c
index 3ab1bd1..ccc6164 100644
--- a/gdb/guile/scm-pretty-print.c
+++ b/gdb/guile/scm-pretty-print.c
@@ -943,36 +943,32 @@ ppscm_print_children (SCM printer, enum display_hint hint,
enum ext_lang_rc
gdbscm_apply_val_pretty_printer (const struct extension_language_defn *extlang,
- struct type *type,
- LONGEST embedded_offset, CORE_ADDR address,
+ struct value *value,
struct ui_file *stream, int recurse,
- struct value *val,
const struct value_print_options *options,
const struct language_defn *language)
{
+ struct type *type = value_type (value);
struct gdbarch *gdbarch = get_type_arch (type);
SCM exception = SCM_BOOL_F;
SCM printer = SCM_BOOL_F;
SCM val_obj = SCM_BOOL_F;
- struct value *value;
enum display_hint hint;
enum ext_lang_rc result = EXT_LANG_RC_NOP;
enum string_repr_result print_result;
- if (value_lazy (val))
- value_fetch_lazy (val);
+ if (value_lazy (value))
+ value_fetch_lazy (value);
/* No pretty-printer support for unavailable values. */
- if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type)))
+ if (!value_bytes_available (value, 0, TYPE_LENGTH (type)))
return EXT_LANG_RC_NOP;
if (!gdb_scheme_initialized)
return EXT_LANG_RC_NOP;
/* Instantiate the printer. */
- value = value_from_component (val, type, embedded_offset);
-
- val_obj = vlscm_scm_from_value (value);
+ val_obj = vlscm_scm_from_value_no_release (value);
if (gdbscm_is_exception (val_obj))
{
exception = val_obj;
diff --git a/gdb/guile/scm-value.c b/gdb/guile/scm-value.c
index 020b5e1..53b373e 100644
--- a/gdb/guile/scm-value.c
+++ b/gdb/guile/scm-value.c
@@ -261,6 +261,24 @@ vlscm_scm_from_value (struct value *value)
return v_scm;
}
+/* Create a new <gdb:value> object that encapsulates VALUE.
+ The value is not released from the all_values chain. */
+
+SCM
+vlscm_scm_from_value_no_release (struct value *value)
+{
+ /* N.B. It's important to not cause any side-effects until we know the
+ conversion worked. */
+ SCM v_scm = vlscm_make_value_smob ();
+ value_smob *v_smob = (value_smob *) SCM_SMOB_DATA (v_scm);
+
+ value_incref (value);
+ v_smob->value = value;
+ vlscm_remember_scheme_value (v_smob);
+
+ return v_scm;
+}
+
/* Returns the <gdb:value> object in SELF.
Throws an exception if SELF is not a <gdb:value> object. */
diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c
index deecb12..7cb20df 100644
--- a/gdb/python/py-prettyprint.c
+++ b/gdb/python/py-prettyprint.c
@@ -558,22 +558,20 @@ print_children (PyObject *printer, const char *hint,
enum ext_lang_rc
gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang,
- struct type *type,
- LONGEST embedded_offset, CORE_ADDR address,
+ struct value *value,
struct ui_file *stream, int recurse,
- struct value *val,
const struct value_print_options *options,
const struct language_defn *language)
{
+ struct type *type = value_type (value);
struct gdbarch *gdbarch = get_type_arch (type);
- struct value *value;
enum string_repr_result print_result;
- if (value_lazy (val))
- value_fetch_lazy (val);
+ if (value_lazy (value))
+ value_fetch_lazy (value);
/* No pretty-printer support for unavailable values. */
- if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type)))
+ if (!value_bytes_available (value, 0, TYPE_LENGTH (type)))
return EXT_LANG_RC_NOP;
if (!gdb_python_initialized)
@@ -581,10 +579,7 @@ gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang,
gdbpy_enter enter_py (gdbarch, language);
- /* Instantiate the printer. */
- value = value_from_component (val, type, embedded_offset);
-
- gdbpy_ref<> val_obj (value_to_value_object (value));
+ gdbpy_ref<> val_obj (value_to_value_object_no_release (value));
if (val_obj == NULL)
{
print_stack_unless_memory_error (stream);
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index 497696a..bc75a68 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -1788,6 +1788,27 @@ value_to_value_object (struct value *val)
return (PyObject *) val_obj;
}
+/* Returns an object for a value, but without releasing it from the
+ all_values chain. */
+PyObject *
+value_to_value_object_no_release (struct value *val)
+{
+ value_object *val_obj;
+
+ val_obj = PyObject_New (value_object, &value_object_type);
+ if (val_obj != NULL)
+ {
+ value_incref (val);
+ val_obj->value = val;
+ val_obj->address = NULL;
+ val_obj->type = NULL;
+ val_obj->dynamic_type = NULL;
+ note_value (val_obj);
+ }
+
+ return (PyObject *) val_obj;
+}
+
/* Returns a borrowed reference to the struct value corresponding to
the given value object. */
struct value *
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index bbb66bd..e352b30 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -391,10 +391,8 @@ extern int gdbpy_auto_load_enabled (const struct extension_language_defn *);
extern enum ext_lang_rc gdbpy_apply_val_pretty_printer
(const struct extension_language_defn *,
- struct type *type,
- LONGEST embedded_offset, CORE_ADDR address,
+ struct value *value,
struct ui_file *stream, int recurse,
- struct value *val,
const struct value_print_options *options,
const struct language_defn *language);
extern enum ext_lang_bt_status gdbpy_apply_frame_filter
@@ -456,6 +454,7 @@ PyObject *symbol_to_symbol_object (struct symbol *sym);
PyObject *block_to_block_object (const struct block *block,
struct objfile *objfile);
PyObject *value_to_value_object (struct value *v);
+PyObject *value_to_value_object_no_release (struct value *v);
PyObject *type_to_type_object (struct type *);
PyObject *frame_info_to_frame_object (struct frame_info *frame);
PyObject *symtab_to_linetable_object (PyObject *symtab);
diff --git a/gdb/valprint.c b/gdb/valprint.c
index 5bf874e..07f5c57 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -1279,9 +1279,13 @@ do_val_print (struct value *full_value,
if (!options->raw)
{
- ret = apply_ext_lang_val_pretty_printer (type, embedded_offset,
- address, stream, recurse,
- val, options, language);
+ struct value *v = full_value;
+
+ if (v == nullptr)
+ v = value_from_component (val, type, embedded_offset);
+
+ ret = apply_ext_lang_val_pretty_printer (v, stream, recurse, options,
+ language);
if (ret)
return;
}
@@ -1477,11 +1481,8 @@ value_print (struct value *val, struct ui_file *stream,
if (!options->raw)
{
int r
- = apply_ext_lang_val_pretty_printer (value_type (val),
- value_embedded_offset (val),
- value_address (val),
- stream, 0,
- val, options, current_language);
+ = apply_ext_lang_val_pretty_printer (val, stream, 0, options,
+ current_language);
if (r)
return;