Allow more Python scalar conversions
authorTom Tromey <tom@tromey.com>
Sat, 15 Sep 2018 04:31:12 +0000 (22:31 -0600)
committerTom Tromey <tom@tromey.com>
Mon, 24 Sep 2018 05:12:59 +0000 (23:12 -0600)
PR python/18352 points out that the gdb Python code can't convert an
integer-valued gdb.Value to a Python float.  While writing the test I
noticed that, similarly, converting integer gdb.Values to float does
not work.  However, all of these cases seem reasonable.

gdb/ChangeLog
2018-09-23  Tom Tromey  <tom@tromey.com>

PR python/18352;
* python/py-value.c (valpy_float): Allow conversions from int or
char.
(valpy_int, valpy_long): Allow conversions from float.

gdb/testsuite/ChangeLog
2018-09-23  Tom Tromey  <tom@tromey.com>

PR python/18352;
* gdb.python/py-value.exp (test_float_conversion): New proc.
Use it.

gdb/ChangeLog
gdb/python/py-value.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-value.exp

index d864e431f5606fb69c64e5f3e70219ce2591495a..bef96c0193f472952a05cb3033174d34c2cc6ecc 100644 (file)
@@ -1,3 +1,10 @@
+2018-09-23  Tom Tromey  <tom@tromey.com>
+
+       PR python/18352;
+       * python/py-value.c (valpy_float): Allow conversions from int or
+       char.
+       (valpy_int, valpy_long): Allow conversions from float.
+
 2018-09-23  Tom Tromey  <tom@tromey.com>
 
        * ctf.c (ctf_start): Use gdb_fopen_cloexec.
index 1b880fa191709c10011b154c4b0e4db6af3ff959..9abcf9212e6580337cef235fe9242e51940479ee 100644 (file)
@@ -1497,6 +1497,12 @@ valpy_int (PyObject *self)
 
   TRY
     {
+      if (is_floating_value (value))
+       {
+         type = builtin_type_pylong;
+         value = value_cast (type, value);
+       }
+
       if (!is_integral_type (type))
        error (_("Cannot convert value to int."));
 
@@ -1522,6 +1528,12 @@ valpy_long (PyObject *self)
 
   TRY
     {
+      if (is_floating_value (value))
+       {
+         type = builtin_type_pylong;
+         value = value_cast (type, value);
+       }
+
       type = check_typedef (type);
 
       if (!is_integral_type (type)
@@ -1554,10 +1566,17 @@ valpy_float (PyObject *self)
     {
       type = check_typedef (type);
 
-      if (TYPE_CODE (type) != TYPE_CODE_FLT || !is_floating_value (value))
+      if (TYPE_CODE (type) == TYPE_CODE_FLT && is_floating_value (value))
+       d = target_float_to_host_double (value_contents (value), type);
+      else if (TYPE_CODE (type) == TYPE_CODE_INT)
+       {
+         /* Note that valpy_long accepts TYPE_CODE_PTR and some
+            others here here -- but casting a pointer or bool to a
+            float seems wrong.  */
+         d = value_as_long (value);
+       }
+      else
        error (_("Cannot convert value to float."));
-
-      d = target_float_to_host_double (value_contents (value), type);
     }
   CATCH (except, RETURN_MASK_ALL)
     {
index 3fabd80aeb9b9d4f36044dd1ecba12bd15639f55..4f7fa938ebfaf964a4b5004d5968fd0b86e273d3 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-23  Tom Tromey  <tom@tromey.com>
+
+       PR python/18352;
+       * gdb.python/py-value.exp (test_float_conversion): New proc.
+       Use it.
+
 2018-09-20  Hafiz Abid Qadeer  <abidh@codesourcery.com>
 
        gdb.base/reggroups.exp (fetch_reggroups): Add '_' in match pattern.
index eb82a7776fa9cf5db39881d72a6eb148eb010fb5..ac08faa3f6f7f1d1d1cd487655061ab5b258682c 100644 (file)
@@ -483,6 +483,18 @@ proc test_value_hash {} {
     gdb_test "python print (one.__hash__() == hash(one))" "True" "test inbuilt hash"
 }
 
+proc test_float_conversion {} {
+    global gdb_py_is_py3k
+    gdb_test "python print(int(gdb.Value(0)))" "0"
+    gdb_test "python print(int(gdb.Value(2.5)))" "2"
+    if {!$gdb_py_is_py3k} {
+       gdb_test "python print(long(gdb.Value(0)))" "0"
+       gdb_test "python print(long(gdb.Value(2.5)))" "2"
+    }
+    gdb_test "python print(float(gdb.Value(2.5)))" "2\\.5"
+    gdb_test "python print(float(gdb.Value(0)))" "0\\.0"
+}
+
 # Build C version of executable.  C++ is built later.
 if { [build_inferior "${binfile}" "c"] < 0 } {
     return -1
@@ -501,6 +513,7 @@ test_value_compare
 test_objfiles
 test_parse_and_eval
 test_value_hash
+test_float_conversion
 
 # The following tests require execution.