diff options
-rw-r--r-- | gdb/testsuite/gdb.base/max-value-size.exp | 3 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-xmethods.exp | 17 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-xmethods.py | 17 | ||||
-rw-r--r-- | gdb/value.c | 38 |
4 files changed, 61 insertions, 14 deletions
diff --git a/gdb/testsuite/gdb.base/max-value-size.exp b/gdb/testsuite/gdb.base/max-value-size.exp index cc9ae77..199067f 100644 --- a/gdb/testsuite/gdb.base/max-value-size.exp +++ b/gdb/testsuite/gdb.base/max-value-size.exp @@ -53,6 +53,9 @@ proc do_value_printing { max_value_size test_prefix } { gdb_test "p/d one_hundred" " = \\{0 <repeats 100 times>\\}" } gdb_test "p/d one_hundred \[99\]" " = 0" + # Verify that accessing value history is undisturbed. + gdb_test "p/d \$2" " = \\{0 <repeats 100 times>\\}" + gdb_test "p/d \$2 \[99\]" " = 0" } } diff --git a/gdb/testsuite/gdb.python/py-xmethods.exp b/gdb/testsuite/gdb.python/py-xmethods.exp index 97d5604..0174b17 100644 --- a/gdb/testsuite/gdb.python/py-xmethods.exp +++ b/gdb/testsuite/gdb.python/py-xmethods.exp @@ -160,3 +160,20 @@ gdb_test_no_output "enable xmethod progspace E_methods;method_int" gdb_test "pt e.method('a')" "type = void" gdb_test "pt e.method(10)" \ "NotImplementedError.*Error while fetching result type of an xmethod worker defined in Python." + +# Verify `max-value-size' obedience with `gdb.Value.const_value'. +gdb_test "p a1.getarray()" \ + "From Python <A_getarray>.* = \\{0, 1, 2, 3, 4, 5, 6, 7, 8, 9\\}" \ + "after: a1.getarray" +gdb_test "p b1.getarray()" \ + "From Python <B_getarray>.* = \\{0, 1, 2, 3, 4, 5, 6, 7, 8, 9\\}" \ + "after: b1.getarray" +gdb_test_no_output "python gdb.set_parameter('max-value-size', 16)" +gdb_test "p a1.getarray()" \ + "From Python <A_getarray>.*value requires $decimal bytes,\ + which is more than max-value-size" \ + "after: a1.getarray (max-value-size)" +gdb_test "p b1.getarray()" \ + "From Python <B_getarray>.*value requires $decimal bytes,\ + which is more than max-value-size" \ + "after: b1.getarray (max-value-size)" diff --git a/gdb/testsuite/gdb.python/py-xmethods.py b/gdb/testsuite/gdb.python/py-xmethods.py index 61d2853..20dc397 100644 --- a/gdb/testsuite/gdb.python/py-xmethods.py +++ b/gdb/testsuite/gdb.python/py-xmethods.py @@ -39,6 +39,11 @@ def A_geta(obj): return obj["a"] +def A_getarray(obj): + print("From Python <A_getarray>:") + return obj["array"] + + def A_getarrayind(obj, index): print("From Python <A_getarrayind>:") return obj["array"][index] @@ -48,12 +53,18 @@ def A_indexoper(obj, index): return obj["array"][index].reference_value() +def B_getarray(obj): + print("From Python <B_getarray>:") + return obj["array"].const_value() + + def B_indexoper(obj, index): return obj["array"][index].const_value().reference_value() type_A = gdb.parse_and_eval("(dop::A *) 0").type.target() type_B = gdb.parse_and_eval("(dop::B *) 0").type.target() +type_array = gdb.parse_and_eval("(int[10] *) 0").type.target() type_int = gdb.parse_and_eval("(int *) 0").type.target() @@ -211,12 +222,18 @@ global_dm_list = [ SimpleXMethodMatcher(r"plus_plus_A", r"^dop::A$", r"operator\+\+", plus_plus_A), SimpleXMethodMatcher(r"A_geta", r"^dop::A$", r"^geta$", A_geta), SimpleXMethodMatcher( + r"A_getarray", r"^dop::A$", r"^getarray$", A_getarray, type_array + ), + SimpleXMethodMatcher( r"A_getarrayind", r"^dop::A$", r"^getarrayind$", A_getarrayind, type_int ), SimpleXMethodMatcher( r"A_indexoper", r"^dop::A$", r"operator\[\]", A_indexoper, type_int ), SimpleXMethodMatcher( + r"B_getarray", r"^dop::B$", r"^getarray$", B_getarray, type_array + ), + SimpleXMethodMatcher( r"B_indexoper", r"^dop::B$", r"operator\[\]", B_indexoper, type_int ), ] diff --git a/gdb/value.c b/gdb/value.c index e3f60e7..09e10b9 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1034,31 +1034,42 @@ check_type_length_before_alloc (const struct type *type) } } -/* Allocate the contents of VAL if it has not been allocated yet. */ +/* Allocate the contents of VAL if it has not been allocated yet. + If CHECK_SIZE is true, then apply the usual max-value-size checks. */ static void -allocate_value_contents (struct value *val) +allocate_value_contents (struct value *val, bool check_size) { if (!val->contents) { - check_type_length_before_alloc (val->enclosing_type); + if (check_size) + check_type_length_before_alloc (val->enclosing_type); val->contents.reset ((gdb_byte *) xzalloc (val->enclosing_type->length ())); } } -/* Allocate a value and its contents for type TYPE. */ +/* Allocate a value and its contents for type TYPE. If CHECK_SIZE is true, + then apply the usual max-value-size checks. */ -struct value * -allocate_value (struct type *type) +static struct value * +allocate_value (struct type *type, bool check_size) { struct value *val = allocate_value_lazy (type); - allocate_value_contents (val); + allocate_value_contents (val, check_size); val->lazy = 0; return val; } +/* Allocate a value and its contents for type TYPE. */ + +struct value * +allocate_value (struct type *type) +{ + return allocate_value (type, true); +} + /* Allocate a value that has the correct length for COUNT repetitions of type TYPE. */ @@ -1169,7 +1180,7 @@ value_contents_raw (struct value *value) struct gdbarch *arch = get_value_arch (value); int unit_size = gdbarch_addressable_memory_unit_size (arch); - allocate_value_contents (value); + allocate_value_contents (value, true); ULONGEST length = value_type (value)->length (); return gdb::make_array_view @@ -1179,7 +1190,7 @@ value_contents_raw (struct value *value) gdb::array_view<gdb_byte> value_contents_all_raw (struct value *value) { - allocate_value_contents (value); + allocate_value_contents (value, true); ULONGEST length = value_enclosing_type (value)->length (); return gdb::make_array_view (value->contents.get (), length); @@ -1752,9 +1763,8 @@ value_release_to_mark (const struct value *mark) return result; } -/* Return a copy of the value ARG. - It contains the same contents, for same memory address, - but it's a different block of storage. */ +/* Return a copy of the value ARG. It contains the same contents, + for the same memory address, but it's a different block of storage. */ struct value * value_copy (const value *arg) @@ -1765,7 +1775,7 @@ value_copy (const value *arg) if (value_lazy (arg)) val = allocate_value_lazy (encl_type); else - val = allocate_value (encl_type); + val = allocate_value (encl_type, false); val->type = arg->type; VALUE_LVAL (val) = arg->lval; val->location = arg->location; @@ -4162,7 +4172,7 @@ void value_fetch_lazy (struct value *val) { gdb_assert (value_lazy (val)); - allocate_value_contents (val); + allocate_value_contents (val, true); /* A value is either lazy, or fully fetched. The availability/validity is only established as we try to fetch a value. */ |