gdb
* c-lang.c (evaluate_subexp_c): Use expect_type if it is not NULL. gdb/testsuite * gdb.base/charset.exp (string_display): Add tests to assign to arrays. * gdb.base/charset.c (short_array, int_array, long_array): New.
This commit is contained in:
parent
1ce749055f
commit
c50491a797
5 changed files with 69 additions and 4 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2011-05-23 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
* c-lang.c (evaluate_subexp_c): Use expect_type if it is not
|
||||||
|
NULL.
|
||||||
|
|
||||||
2011-05-23 Doug Evans <dje@google.com>
|
2011-05-23 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
* python/lib/gdb/printing.py (register_pretty_printer): Add missing
|
* python/lib/gdb/printing.py (register_pretty_printer): Add missing
|
||||||
|
|
42
gdb/c-lang.c
42
gdb/c-lang.c
|
@ -978,6 +978,7 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
|
||||||
struct value *result;
|
struct value *result;
|
||||||
enum c_string_type dest_type;
|
enum c_string_type dest_type;
|
||||||
const char *dest_charset;
|
const char *dest_charset;
|
||||||
|
int satisfy_expected = 0;
|
||||||
|
|
||||||
obstack_init (&output);
|
obstack_init (&output);
|
||||||
cleanup = make_cleanup_obstack_free (&output);
|
cleanup = make_cleanup_obstack_free (&output);
|
||||||
|
@ -1014,6 +1015,22 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
|
||||||
/* Ensure TYPE_LENGTH is valid for TYPE. */
|
/* Ensure TYPE_LENGTH is valid for TYPE. */
|
||||||
check_typedef (type);
|
check_typedef (type);
|
||||||
|
|
||||||
|
/* If the caller expects an array of some integral type,
|
||||||
|
satisfy them. If something odder is expected, rely on the
|
||||||
|
caller to cast. */
|
||||||
|
if (expect_type && TYPE_CODE (expect_type) == TYPE_CODE_ARRAY)
|
||||||
|
{
|
||||||
|
struct type *element_type
|
||||||
|
= check_typedef (TYPE_TARGET_TYPE (expect_type));
|
||||||
|
|
||||||
|
if (TYPE_CODE (element_type) == TYPE_CODE_INT
|
||||||
|
|| TYPE_CODE (element_type) == TYPE_CODE_CHAR)
|
||||||
|
{
|
||||||
|
type = element_type;
|
||||||
|
satisfy_expected = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dest_charset = charset_for_string_type (dest_type, exp->gdbarch);
|
dest_charset = charset_for_string_type (dest_type, exp->gdbarch);
|
||||||
|
|
||||||
++*pos;
|
++*pos;
|
||||||
|
@ -1036,7 +1053,9 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
|
||||||
if (noside == EVAL_SKIP)
|
if (noside == EVAL_SKIP)
|
||||||
{
|
{
|
||||||
/* Return a dummy value of the appropriate type. */
|
/* Return a dummy value of the appropriate type. */
|
||||||
if ((dest_type & C_CHAR) != 0)
|
if (expect_type != NULL)
|
||||||
|
result = allocate_value (expect_type);
|
||||||
|
else if ((dest_type & C_CHAR) != 0)
|
||||||
result = allocate_value (type);
|
result = allocate_value (type);
|
||||||
else
|
else
|
||||||
result = value_cstring ("", 0, type);
|
result = value_cstring ("", 0, type);
|
||||||
|
@ -1061,6 +1080,27 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
|
||||||
/* Write the terminating character. */
|
/* Write the terminating character. */
|
||||||
for (i = 0; i < TYPE_LENGTH (type); ++i)
|
for (i = 0; i < TYPE_LENGTH (type); ++i)
|
||||||
obstack_1grow (&output, 0);
|
obstack_1grow (&output, 0);
|
||||||
|
|
||||||
|
if (satisfy_expected)
|
||||||
|
{
|
||||||
|
LONGEST low_bound, high_bound;
|
||||||
|
int element_size = TYPE_LENGTH (type);
|
||||||
|
|
||||||
|
if (get_discrete_bounds (TYPE_INDEX_TYPE (expect_type),
|
||||||
|
&low_bound, &high_bound) < 0)
|
||||||
|
{
|
||||||
|
low_bound = 0;
|
||||||
|
high_bound = (TYPE_LENGTH (expect_type) / element_size) - 1;
|
||||||
|
}
|
||||||
|
if (obstack_object_size (&output) / element_size
|
||||||
|
> (high_bound - low_bound + 1))
|
||||||
|
error (_("Too many array elements"));
|
||||||
|
|
||||||
|
result = allocate_value (expect_type);
|
||||||
|
memcpy (value_contents_raw (result), obstack_base (&output),
|
||||||
|
obstack_object_size (&output));
|
||||||
|
}
|
||||||
|
else
|
||||||
result = value_cstring (obstack_base (&output),
|
result = value_cstring (obstack_base (&output),
|
||||||
obstack_object_size (&output),
|
obstack_object_size (&output),
|
||||||
type);
|
type);
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
2011-05-23 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
* gdb.base/charset.exp (string_display): Add tests to assign to
|
||||||
|
arrays.
|
||||||
|
* gdb.base/charset.c (short_array, int_array, long_array): New.
|
||||||
|
|
||||||
2011-05-20 Pedro Alves <pedro@codesourcery.com>
|
2011-05-20 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
Cope with async mode.
|
Cope with async mode.
|
||||||
|
|
|
@ -73,6 +73,11 @@ char32_t *String32;
|
||||||
typedef wchar_t my_wchar_t;
|
typedef wchar_t my_wchar_t;
|
||||||
my_wchar_t myvar;
|
my_wchar_t myvar;
|
||||||
|
|
||||||
|
/* Some arrays for simple assignment tests. */
|
||||||
|
short short_array[3];
|
||||||
|
int int_array[3];
|
||||||
|
long long_array[3];
|
||||||
|
|
||||||
void
|
void
|
||||||
init_string (char string[],
|
init_string (char string[],
|
||||||
char x,
|
char x,
|
||||||
|
|
|
@ -625,4 +625,13 @@ if {$wchar_size == 4} {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
foreach name {short int long} {
|
||||||
|
# We're really just checking to make sure this doesn't give an
|
||||||
|
# error.
|
||||||
|
gdb_test "print ${name}_array = \"hi\"" \
|
||||||
|
" = {.*}" \
|
||||||
|
"assign string to $name array"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
gdb_exit
|
gdb_exit
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue