mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-04 22:15:12 +08:00
Allow more Python scalar conversions
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.
This commit is contained in:
@ -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>
|
2018-09-23 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* ctf.c (ctf_start): Use gdb_fopen_cloexec.
|
* ctf.c (ctf_start): Use gdb_fopen_cloexec.
|
||||||
|
@ -1497,6 +1497,12 @@ valpy_int (PyObject *self)
|
|||||||
|
|
||||||
TRY
|
TRY
|
||||||
{
|
{
|
||||||
|
if (is_floating_value (value))
|
||||||
|
{
|
||||||
|
type = builtin_type_pylong;
|
||||||
|
value = value_cast (type, value);
|
||||||
|
}
|
||||||
|
|
||||||
if (!is_integral_type (type))
|
if (!is_integral_type (type))
|
||||||
error (_("Cannot convert value to int."));
|
error (_("Cannot convert value to int."));
|
||||||
|
|
||||||
@ -1522,6 +1528,12 @@ valpy_long (PyObject *self)
|
|||||||
|
|
||||||
TRY
|
TRY
|
||||||
{
|
{
|
||||||
|
if (is_floating_value (value))
|
||||||
|
{
|
||||||
|
type = builtin_type_pylong;
|
||||||
|
value = value_cast (type, value);
|
||||||
|
}
|
||||||
|
|
||||||
type = check_typedef (type);
|
type = check_typedef (type);
|
||||||
|
|
||||||
if (!is_integral_type (type)
|
if (!is_integral_type (type)
|
||||||
@ -1554,10 +1566,17 @@ valpy_float (PyObject *self)
|
|||||||
{
|
{
|
||||||
type = check_typedef (type);
|
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))
|
||||||
error (_("Cannot convert value to float."));
|
|
||||||
|
|
||||||
d = target_float_to_host_double (value_contents (value), type);
|
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."));
|
||||||
}
|
}
|
||||||
CATCH (except, RETURN_MASK_ALL)
|
CATCH (except, RETURN_MASK_ALL)
|
||||||
{
|
{
|
||||||
|
@ -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>
|
2018-09-20 Hafiz Abid Qadeer <abidh@codesourcery.com>
|
||||||
|
|
||||||
gdb.base/reggroups.exp (fetch_reggroups): Add '_' in match pattern.
|
gdb.base/reggroups.exp (fetch_reggroups): Add '_' in match pattern.
|
||||||
|
@ -483,6 +483,18 @@ proc test_value_hash {} {
|
|||||||
gdb_test "python print (one.__hash__() == hash(one))" "True" "test inbuilt 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.
|
# Build C version of executable. C++ is built later.
|
||||||
if { [build_inferior "${binfile}" "c"] < 0 } {
|
if { [build_inferior "${binfile}" "c"] < 0 } {
|
||||||
return -1
|
return -1
|
||||||
@ -501,6 +513,7 @@ test_value_compare
|
|||||||
test_objfiles
|
test_objfiles
|
||||||
test_parse_and_eval
|
test_parse_and_eval
|
||||||
test_value_hash
|
test_value_hash
|
||||||
|
test_float_conversion
|
||||||
|
|
||||||
# The following tests require execution.
|
# The following tests require execution.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user