aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.python
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2017-03-15 15:35:13 -0700
committerDoug Evans <dje@google.com>2017-03-16 09:28:11 -0700
commit34b433203b5f56149c27a8dfea21a921392cb158 (patch)
treec45039a326c7863be84bcbe3e552b2a28ee209ae /gdb/testsuite/gdb.python
parenta3a5feccd26be653efbdf1408874b98962baaa50 (diff)
downloadgdb-34b433203b5f56149c27a8dfea21a921392cb158.zip
gdb-34b433203b5f56149c27a8dfea21a921392cb158.tar.gz
gdb-34b433203b5f56149c27a8dfea21a921392cb158.tar.bz2
Fix various python lazy string bugs.
gdb/ChangeLog: PR python/17728, python/18439, python/18779 * python/py-lazy-string.c (lazy_string_object): Clarify use of LENGTH member. Change type of TYPE member to PyObject *. All uses updated. (stpy_convert_to_value): Fix handling of TYPE_CODE_PTR. (gdbpy_create_lazy_string_object): Flag bad length values. Handle TYPE_CODE_ARRAY with possibly different user-provided length. Handle typedefs in incoming type. (stpy_lazy_string_elt_type): New function. (gdbpy_extract_lazy_string): Call it. * python/py-value.c (valpy_lazy_string): Flag bad length values. Fix handling of TYPE_CODE_PTR. Handle TYPE_CODE_ARRAY. Handle typedefs in incoming type. gdb/testsuite/ChangeLog: PR python/17728, python/18439, python/18779 * gdb.python/py-value.c (main) Delete locals sptr, sn. * gdb.python/py-lazy-string.c (pointer): New typedef. (main): New locals ptr, array, typedef_ptr. * gdb.python/py-value.exp: Move lazy string tests to ... * gdb.python/py-lazy-string.exp: ... here. Add more tests for pointer, array, typedef lazy strings.
Diffstat (limited to 'gdb/testsuite/gdb.python')
-rw-r--r--gdb/testsuite/gdb.python/py-lazy-string.c3
-rw-r--r--gdb/testsuite/gdb.python/py-lazy-string.exp42
-rw-r--r--gdb/testsuite/gdb.python/py-value.c2
-rw-r--r--gdb/testsuite/gdb.python/py-value.exp24
4 files changed, 41 insertions, 30 deletions
diff --git a/gdb/testsuite/gdb.python/py-lazy-string.c b/gdb/testsuite/gdb.python/py-lazy-string.c
index 105c559..41011ce 100644
--- a/gdb/testsuite/gdb.python/py-lazy-string.c
+++ b/gdb/testsuite/gdb.python/py-lazy-string.c
@@ -18,6 +18,9 @@
int
main ()
{
+ const char *ptr = "pointer";
+ const char array[] = "array";
+ pointer typedef_ptr = "typedef pointer";
const char *null = 0;
return 0; /* break here */
diff --git a/gdb/testsuite/gdb.python/py-lazy-string.exp b/gdb/testsuite/gdb.python/py-lazy-string.exp
index e3054f6..ff95a2e 100644
--- a/gdb/testsuite/gdb.python/py-lazy-string.exp
+++ b/gdb/testsuite/gdb.python/py-lazy-string.exp
@@ -34,9 +34,43 @@ if ![runto_main ] {
gdb_breakpoint [gdb_get_line_number "break here"]
gdb_continue_to_breakpoint "break here"
-gdb_test_no_output "python null = gdb.parse_and_eval(\"null\")"
+gdb_py_test_silent_cmd "python null = gdb.parse_and_eval(\"null\")" "get null value" 1
-gdb_test "python print(null.lazy_string(length=0).value())" \
- "gdb.MemoryError: Cannot create a value from NULL.*Error while executing Python code."
+gdb_py_test_silent_cmd "python nullstr = null.lazy_string(length=0)" "create a null lazy string" 1
+gdb_test "python print (nullstr.length)" "0" "null lazy string length"
+gdb_test "python print (nullstr.address)" "0" "null lazy string address"
+gdb_test "python print (nullstr.type)" "const char \\*" "null lazy string type"
+gdb_test "python print(nullstr.value())" \
+ "gdb.MemoryError: Cannot create a value from NULL.*Error while executing Python code." \
+ "create value from NULL"
gdb_test "python print(null.lazy_string(length=3).value())" \
- "gdb.MemoryError: Cannot create a lazy string with address 0x0, and a non-zero length.*Error while executing Python code."
+ "gdb.MemoryError: Cannot create a lazy string with address 0x0, and a non-zero length.*Error while executing Python code." \
+ "null lazy string with non-zero length"
+gdb_test "python print(null.lazy_string(length=-2))" \
+ "ValueError: Invalid length.*Error while executing Python code." \
+ "bad length"
+
+foreach var_spec { { "ptr" "pointer" "const char \\*" -1 } \
+ { "array" "array" "const char \\[6\\]" 6 } \
+ { "typedef_ptr" "typedef pointer" "pointer" -1 } } {
+ set var [lindex $var_spec 0]
+ set value [lindex $var_spec 1]
+ set type [lindex $var_spec 2]
+ set length [lindex $var_spec 3]
+ with_test_prefix $var {
+ gdb_test "print $var" "\"$value\""
+ gdb_py_test_silent_cmd "python $var = gdb.history (0)" "get value from history" 1
+ gdb_py_test_silent_cmd "python l$var = $var.lazy_string()" "acquire lazy string" 1
+ gdb_test "python print ($var.type)" "$type" "string type name equality"
+ gdb_test "python print (l$var.type)" "$type" "lazy-string type name equality"
+ gdb_test "python print (l$var.length)" "$length" "lazy string length"
+ gdb_test "python print (l$var.value())" "\"$value\"" "lazy string value"
+ gdb_py_test_silent_cmd "python l2$var = $var.lazy_string(length=2)" "acquire lazy string, length 2" 1
+ gdb_test "python print (l2$var.length)" "2" "lazy string length 2"
+ gdb_test "python print (l2$var.value())" "\"[string range $value 0 1]\"" "lazy string length 2 value"
+ # This test will have to wait until gdb can handle it. There's no way,
+ # currently, to internally specify an array of length zero in the C
+ # language support. PR 20786
+ #gdb_test "python print ($var.lazy_string(length=0).value())" "\"\"" "empty lazy string value"
+ }
+}
diff --git a/gdb/testsuite/gdb.python/py-value.c b/gdb/testsuite/gdb.python/py-value.c
index d90b15e..b25b8a6 100644
--- a/gdb/testsuite/gdb.python/py-value.c
+++ b/gdb/testsuite/gdb.python/py-value.c
@@ -90,13 +90,11 @@ main (int argc, char *argv[])
char nullst[17] = "divide\0et\0impera";
void (*fp1) (void) = &func1;
int (*fp2) (int, int) = &func2;
- const char *sptr = "pointer";
const char *embed = "embedded x\201\202\203\204";
int a[3] = {1,2,3};
int *p = a;
int i = 2;
int *ptr_i = &i;
- const char *sn = 0;
struct str *xstr;
/* Prevent gcc from optimizing argv[] out. */
diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.python/py-value.exp
index d9a4d20..1781887 100644
--- a/gdb/testsuite/gdb.python/py-value.exp
+++ b/gdb/testsuite/gdb.python/py-value.exp
@@ -317,29 +317,6 @@ proc test_value_in_inferior {} {
"read string beyond declared size"
}
-proc test_lazy_strings {} {
-
- global hex
-
- gdb_test "print sptr" "\"pointer\""
- gdb_py_test_silent_cmd "python sptr = gdb.history (0)" "Get value from history" 1
-
- gdb_py_test_silent_cmd "python lstr = sptr.lazy_string()" "Aquire lazy string" 1
- gdb_test "python print (lstr.type)" "const char \*." "test lazy-string type name equality"
- gdb_test "python print (sptr.type)" "const char \*." "test string type name equality"
-
- # Prevent symbol on address 0x0 being printed.
- gdb_test_no_output "set print symbol off"
- gdb_test "print sn" "0x0"
-
- gdb_py_test_silent_cmd "python snptr = gdb.history (0)" "Get value from history" 1
- gdb_test "python snstr = snptr.lazy_string(length=5)" ".*Cannot create a lazy string with address.*" "test lazy string"
- gdb_py_test_silent_cmd "python snstr = snptr.lazy_string(length=0)" "Succesfully create a lazy string" 1
- gdb_test "python print (snstr.length)" "0" "test lazy string length"
- gdb_test "python print (snstr.address)" "0" "test lazy string address"
-}
-
-
proc test_inferior_function_call {} {
global gdb_prompt hex decimal
@@ -534,7 +511,6 @@ if ![runto_main] then {
test_value_in_inferior
test_inferior_function_call
-test_lazy_strings
test_value_after_death
# Test either C or C++ values.