aboutsummaryrefslogtreecommitdiff
path: root/gdb/python
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2016-11-21 18:02:11 -0700
committerTom Tromey <tom@tromey.com>2017-01-10 19:14:12 -0700
commiteb115069323087e15210c09e3b581be0f6fb5852 (patch)
treea75b8fad89deba750322443fbd0275b3faed3cf9 /gdb/python
parent906768f970826102252e8cfd30ee72da71de29f7 (diff)
Add scoped_value_mark
This adds a scoped_value_mark class, that records the value mark in the constructor and then calls value_free_to_mark in the destructor. It then updates various spots in gdb to use this class, rather than a cleanup. It would be better overall to replace "struct value *" with a shared_ptr, maybe eliminating the need for this class (watchpoints would perhaps need some new mechanism as well). However, that's difficult to do. 2017-01-10 Tom Tromey <tom@tromey.com> * python/py-value.c (valpy_dereference, valpy_referenced_value) (valpy_reference_value, valpy_const_value, valpy_get_address) (valpy_get_dynamic_type, valpy_lazy_string, valpy_do_cast) (valpy_getitem, valpy_call, valpy_binop_throw, valpy_negative) (valpy_absolute, valpy_richcompare_throw): Use scoped_value_mark. * dwarf2loc.c (dwarf2_loc_desc_get_symbol_read_needs): Use scoped_value_mark. * dwarf2-frame.c (execute_stack_op): Use scoped_value_mark. * value.h (scoped_value_mark): New class.
Diffstat (limited to 'gdb/python')
-rw-r--r--gdb/python/py-value.c62
1 files changed, 18 insertions, 44 deletions
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index 97136e3141..8f3164b53c 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -178,11 +178,10 @@ valpy_dereference (PyObject *self, PyObject *args)
TRY
{
struct value *res_val;
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
res_val = value_ind (((value_object *) self)->value);
result = value_to_value_object (res_val);
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -209,7 +208,7 @@ valpy_referenced_value (PyObject *self, PyObject *args)
TRY
{
struct value *self_val, *res_val;
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
self_val = ((value_object *) self)->value;
switch (TYPE_CODE (check_typedef (value_type (self_val))))
@@ -226,7 +225,6 @@ valpy_referenced_value (PyObject *self, PyObject *args)
}
result = value_to_value_object (res_val);
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -247,12 +245,10 @@ valpy_reference_value (PyObject *self, PyObject *args)
TRY
{
struct value *self_val;
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
self_val = ((value_object *) self)->value;
result = value_to_value_object (value_ref (self_val));
-
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -273,13 +269,11 @@ valpy_const_value (PyObject *self, PyObject *args)
TRY
{
struct value *self_val, *res_val;
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
self_val = ((value_object *) self)->value;
res_val = make_cv_value (1, 0, self_val);
result = value_to_value_object (res_val);
-
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -301,12 +295,10 @@ valpy_get_address (PyObject *self, void *closure)
TRY
{
struct value *res_val;
- struct cleanup *cleanup
- = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
res_val = value_addr (val_obj->value);
val_obj->address = value_to_value_object (res_val);
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -354,7 +346,7 @@ valpy_get_dynamic_type (PyObject *self, void *closure)
TRY
{
struct value *val = obj->value;
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
type = value_type (val);
type = check_typedef (type);
@@ -387,8 +379,6 @@ valpy_get_dynamic_type (PyObject *self, void *closure)
/* Re-use object's static type. */
type = NULL;
}
-
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -428,7 +418,7 @@ valpy_lazy_string (PyObject *self, PyObject *args, PyObject *kw)
TRY
{
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
if (TYPE_CODE (value_type (value)) == TYPE_CODE_PTR)
value = value_ind (value);
@@ -436,8 +426,6 @@ valpy_lazy_string (PyObject *self, PyObject *args, PyObject *kw)
str_obj = gdbpy_create_lazy_string_object (value_address (value), length,
user_encoding,
value_type (value));
-
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -514,7 +502,7 @@ valpy_do_cast (PyObject *self, PyObject *args, enum exp_opcode op)
{
struct value *val = ((value_object *) self)->value;
struct value *res_val;
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
if (op == UNOP_DYNAMIC_CAST)
res_val = value_dynamic_cast (type, val);
@@ -527,7 +515,6 @@ valpy_do_cast (PyObject *self, PyObject *args, enum exp_opcode op)
}
result = value_to_value_object (res_val);
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -737,8 +724,8 @@ valpy_getitem (PyObject *self, PyObject *key)
TRY
{
struct value *tmp = self_value->value;
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
struct value *res_val = NULL;
+ scoped_value_mark free_values;
if (field)
res_val = value_struct_elt (&tmp, NULL, field.get (), NULL,
@@ -783,7 +770,6 @@ valpy_getitem (PyObject *self, PyObject *key)
if (res_val)
result = value_to_value_object (res_val);
- do_cleanups (cleanup);
}
CATCH (ex, RETURN_MASK_ALL)
{
@@ -861,12 +847,11 @@ valpy_call (PyObject *self, PyObject *args, PyObject *keywords)
TRY
{
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (mark);
+ scoped_value_mark free_values;
struct value *return_value;
return_value = call_function_by_hand (function, args_count, vargs);
result = value_to_value_object (return_value);
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -1014,11 +999,12 @@ valpy_binop_throw (enum valpy_opcode opcode, PyObject *self, PyObject *other)
PyObject *result = NULL;
struct value *arg1, *arg2;
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
struct value *res_val = NULL;
enum exp_opcode op = OP_NULL;
int handled = 0;
+ scoped_value_mark free_values;
+
/* If the gdb.Value object is the second operand, then it will be
passed to us as the OTHER argument, and SELF will be an entirely
different kind of object, altogether. Because of this, we can't
@@ -1026,17 +1012,11 @@ valpy_binop_throw (enum valpy_opcode opcode, PyObject *self, PyObject *other)
python as well. */
arg1 = convert_value_from_python (self);
if (arg1 == NULL)
- {
- do_cleanups (cleanup);
- return NULL;
- }
+ return NULL;
arg2 = convert_value_from_python (other);
if (arg2 == NULL)
- {
- do_cleanups (cleanup);
- return NULL;
- }
+ return NULL;
switch (opcode)
{
@@ -1130,7 +1110,6 @@ valpy_binop_throw (enum valpy_opcode opcode, PyObject *self, PyObject *other)
if (res_val)
result = value_to_value_object (res_val);
- do_cleanups (cleanup);
return result;
}
@@ -1209,12 +1188,11 @@ valpy_negative (PyObject *self)
TRY
{
/* Perhaps overkill, but consistency has some virtue. */
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
struct value *val;
val = value_neg (((value_object *) self)->value);
result = value_to_value_object (val);
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -1239,12 +1217,10 @@ valpy_absolute (PyObject *self)
TRY
{
- struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+ scoped_value_mark free_values;
if (value_less (value, value_zero (value_type (value), not_lval)))
isabs = 0;
-
- do_cleanups (cleanup);
}
CATCH (except, RETURN_MASK_ALL)
{
@@ -1362,15 +1338,14 @@ valpy_richcompare_throw (PyObject *self, PyObject *other, int op)
int result;
struct value *value_other;
struct value *value_self;
- struct value *mark = value_mark ();
struct cleanup *cleanup;
+ scoped_value_mark free_values;
+
value_other = convert_value_from_python (other);
if (value_other == NULL)
return -1;
- cleanup = make_cleanup_value_free_to_mark (mark);
-
value_self = ((value_object *) self)->value;
switch (op)
@@ -1403,7 +1378,6 @@ valpy_richcompare_throw (PyObject *self, PyObject *other, int op)
break;
}
- do_cleanups (cleanup);
return result;
}