Add function host_string_to_python_string.

Message ID 001a11438f7c8987ea05272ff754@google.com
State New, archived
Headers

Commit Message

Doug Evans Dec. 18, 2015, 6:04 p.m. UTC
  Hi.

There's a python_string_to_host_string function, but not its counterpart.
I couldn't find anything in the record arguing against its existence,
and there's enough of a use for it so I added it.

Regression tested on amd64-linux.

2015-12-18  Doug Evans  <dje@google.com>

	* python/py-utils.c (host_string_to_python_string): New function.
	* python/python-internal.h (host_string_to_python_string): Declare it.
	* python/py-*.c (*): Update all calls to
	PyString_Decode (str, strlen (str), host_charset (), NULL)
	to use host_string_to_python_string (str) instead.

        str_obj = Py_None;
  

Comments

Joel Brobecker Dec. 18, 2015, 6:24 p.m. UTC | #1
> There's a python_string_to_host_string function, but not its counterpart.
> I couldn't find anything in the record arguing against its existence,
> and there's enough of a use for it so I added it.
> 
> Regression tested on amd64-linux.
> 
> 2015-12-18  Doug Evans  <dje@google.com>
> 
> 	* python/py-utils.c (host_string_to_python_string): New function.
> 	* python/python-internal.h (host_string_to_python_string): Declare it.
> 	* python/py-*.c (*): Update all calls to
> 	PyString_Decode (str, strlen (str), host_charset (), NULL)
> 	to use host_string_to_python_string (str) instead.

FWIW, looking at the alternative, I find the new one much better,
so that's a nice addition, IMO.
  
Pedro Alves Dec. 18, 2015, 6:48 p.m. UTC | #2
On 12/18/2015 06:24 PM, Joel Brobecker wrote:
>> There's a python_string_to_host_string function, but not its counterpart.
>> I couldn't find anything in the record arguing against its existence,
>> and there's enough of a use for it so I added it.
>>
>> Regression tested on amd64-linux.
>>
>> 2015-12-18  Doug Evans  <dje@google.com>
>>
>> 	* python/py-utils.c (host_string_to_python_string): New function.
>> 	* python/python-internal.h (host_string_to_python_string): Declare it.
>> 	* python/py-*.c (*): Update all calls to
>> 	PyString_Decode (str, strlen (str), host_charset (), NULL)
>> 	to use host_string_to_python_string (str) instead.
> 
> FWIW, looking at the alternative, I find the new one much better,
> so that's a nice addition, IMO.

Agreed.

Thanks,
Pedro Alves
  
Doug Evans March 30, 2016, 6:50 a.m. UTC | #3
On Fri, Dec 18, 2015 at 10:48 AM, Pedro Alves <palves@redhat.com> wrote:
> On 12/18/2015 06:24 PM, Joel Brobecker wrote:
>>> There's a python_string_to_host_string function, but not its counterpart.
>>> I couldn't find anything in the record arguing against its existence,
>>> and there's enough of a use for it so I added it.
>>>
>>> Regression tested on amd64-linux.
>>>
>>> 2015-12-18  Doug Evans  <dje@google.com>
>>>
>>>      * python/py-utils.c (host_string_to_python_string): New function.
>>>      * python/python-internal.h (host_string_to_python_string): Declare it.
>>>      * python/py-*.c (*): Update all calls to
>>>      PyString_Decode (str, strlen (str), host_charset (), NULL)
>>>      to use host_string_to_python_string (str) instead.
>>
>> FWIW, looking at the alternative, I find the new one much better,
>> so that's a nice addition, IMO.
>
> Agreed.

Reapplied, reran testsuite, and committed.
  

Patch

diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
index 9c0b0e4..f261e90 100644
--- a/gdb/python/py-breakpoint.c
+++ b/gdb/python/py-breakpoint.c
@@ -392,7 +392,7 @@  bppy_get_location (PyObject *self, void *closure)
    str = event_location_to_string (obj->bp->location);
    if (! str)
      str = "";
-  return PyString_Decode (str, strlen (str), host_charset (), NULL);
+  return host_string_to_python_string (str);
  }

  /* Python function to get the breakpoint expression.  */
@@ -414,7 +414,7 @@  bppy_get_expression (PyObject *self, void *closure)
    if (! str)
      str = "";

-  return PyString_Decode (str, strlen (str), host_charset (), NULL);
+  return host_string_to_python_string (str);
  }

  /* Python function to get the condition expression of a breakpoint.  */
@@ -430,7 +430,7 @@  bppy_get_condition (PyObject *self, void *closure)
    if (! str)
      Py_RETURN_NONE;

-  return PyString_Decode (str, strlen (str), host_charset (), NULL);
+  return host_string_to_python_string (str);
  }

  /* Returns 0 on success.  Returns -1 on error, with a python exception set.
@@ -515,7 +515,7 @@  bppy_get_commands (PyObject *self, void *closure)
    ui_out_redirect (current_uiout, NULL);
    cmdstr = ui_file_xstrdup (string_file, &length);
    make_cleanup (xfree, cmdstr);
-  result = PyString_Decode (cmdstr, strlen (cmdstr), host_charset (),  
NULL);
+  result = host_string_to_python_string (cmdstr);
    do_cleanups (chain);
    return result;
  }
diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c
index ed2fe74..bfde3cc 100644
--- a/gdb/python/py-objfile.c
+++ b/gdb/python/py-objfile.c
@@ -78,9 +78,7 @@  objfpy_get_filename (PyObject *self, void *closure)
    objfile_object *obj = (objfile_object *) self;

    if (obj->objfile)
-    return PyString_Decode (objfile_name (obj->objfile),
-			    strlen (objfile_name (obj->objfile)),
-			    host_charset (), NULL);
+    return host_string_to_python_string (objfile_name (obj->objfile));
    Py_RETURN_NONE;
  }

@@ -96,8 +94,7 @@  objfpy_get_username (PyObject *self, void *closure)
      {
        const char *username = obj->objfile->original_name;

-      return PyString_Decode (username, strlen (username),
-			      host_charset (), NULL);
+      return host_string_to_python_string (username);
      }

    Py_RETURN_NONE;
@@ -152,8 +149,7 @@  objfpy_get_build_id (PyObject *self, void *closure)
        char *hex_form = make_hex_string (build_id->data, build_id->size);
        PyObject *result;

-      result = PyString_Decode (hex_form, strlen (hex_form),
-				host_charset (), NULL);
+      result = host_string_to_python_string (hex_form);
        xfree (hex_form);
        return result;
      }
diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c
index cd48cbb..4eead1b 100644
--- a/gdb/python/py-progspace.c
+++ b/gdb/python/py-progspace.c
@@ -71,9 +71,7 @@  pspy_get_filename (PyObject *self, void *closure)
        struct objfile *objfile = obj->pspace->symfile_object_file;

        if (objfile)
-	return PyString_Decode (objfile_name (objfile),
-				strlen (objfile_name (objfile)),
-				host_charset (), NULL);
+	return host_string_to_python_string (objfile_name (objfile));
      }
    Py_RETURN_NONE;
  }
diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c
index 79bfeca..66201e8 100644
--- a/gdb/python/py-symtab.c
+++ b/gdb/python/py-symtab.c
@@ -108,8 +108,7 @@  stpy_get_filename (PyObject *self, void *closure)
    STPY_REQUIRE_VALID (self, symtab);
    filename = symtab_to_filename_for_display (symtab);

-  str_obj = PyString_Decode (filename, strlen (filename),
-			     host_charset (), NULL);
+  str_obj = host_string_to_python_string (filename);
    return str_obj;
  }

@@ -140,8 +139,7 @@  stpy_get_producer (PyObject *self, void *closure)
      {
        const char *producer = COMPUNIT_PRODUCER (cust);

-      return PyString_Decode (producer, strlen (producer),
-			      host_charset (), NULL);
+      return host_string_to_python_string (producer);
      }

    Py_RETURN_NONE;
@@ -157,7 +155,7 @@  stpy_fullname (PyObject *self, PyObject *args)

    fullname = symtab_to_fullname (symtab);

-  return PyString_Decode (fullname, strlen (fullname), host_charset (),  
NULL);
+  return host_string_to_python_string (fullname);
  }

  /* Implementation of gdb.Symtab.is_valid (self) -> Boolean.
diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c
index 9a4d1ed..b766e3b 100644
--- a/gdb/python/py-utils.c
+++ b/gdb/python/py-utils.c
@@ -221,6 +221,14 @@  python_string_to_host_string (PyObject *obj)
    return result;
  }

+/* Convert a host string to a python string.  */
+
+PyObject *
+host_string_to_python_string (const char *str)
+{
+  return PyString_Decode (str, strlen (str), host_charset (), NULL);
+}
+
  /* Return true if OBJ is a Python string or unicode object, false
     otherwise.  */

diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index ee949b7..a43d395 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -538,6 +538,7 @@  char *unicode_to_target_string (PyObject *unicode_str);
  char *python_string_to_target_string (PyObject *obj);
  PyObject *python_string_to_target_python_string (PyObject *obj);
  char *python_string_to_host_string (PyObject *obj);
+PyObject *host_string_to_python_string (const char *str);
  int gdbpy_is_string (PyObject *obj);
  char *gdbpy_obj_to_string (PyObject *obj);
  char *gdbpy_exception_to_string (PyObject *ptype, PyObject *pvalue);
diff --git a/gdb/python/python.c b/gdb/python/python.c
index 6cbe5f0..09c99cf 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -516,7 +516,7 @@  gdbpy_parameter_value (enum var_types type, void *var)

  	if (! str)
  	  str = "";
-	return PyString_Decode (str, strlen (str), host_charset (), NULL);
+	return host_string_to_python_string (str);
        }

      case var_boolean:
@@ -706,7 +706,7 @@  gdbpy_solib_name (PyObject *self, PyObject *args)

    soname = solib_name_from_address (current_program_space, pc);
    if (soname)
-    str_obj = PyString_Decode (soname, strlen (soname), host_charset (),  
NULL);
+    str_obj = host_string_to_python_string (soname);
    else
      {