Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
python: change types for RBufferOut/FBuffer with Python 3 (RHBZ#1661871)
So far RBufferOut return values, and FBuffer struct fields are 'str' on
all the versions of Python.  Python 3 distinguishes between 'str'
(unicode strings), and 'bytes', with 'str' no more able to hold
arbitrary data.

For this reason, switch the return value of RBufferOut functions, and
FBuffer struct fields to bytes on Python 3: while this is a potentially
incompatibile change, this is the only way to handle safely sequences
of arbitrary bytes.
  • Loading branch information
ptoscano committed Jan 22, 2019
1 parent 85235ae commit 0ee02e0
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions generator/python.ml
Expand Up @@ -195,8 +195,13 @@ and generate_python_structs () =
pr " goto err;\n";
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
| name, FBuffer ->
pr "#if PY_MAJOR_VERSION >= 3\n";
pr " value = PyBytes_FromStringAndSize (%s->%s, %s->%s_len);\n"
typ name typ name;
pr "#else\n";
pr " value = guestfs_int_py_fromstringsize (%s->%s, %s->%s_len);\n"
typ name typ name;
pr "#endif\n";
pr " if (value == NULL)\n";
pr " goto err;\n";
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
Expand Down Expand Up @@ -511,7 +516,11 @@ and generate_python_actions actions () =
pr " guestfs_int_free_string_list (r);\n";
pr " if (py_r == NULL) goto out;\n";
| RBufferOut _ ->
pr "#if PY_MAJOR_VERSION >= 3\n";
pr " py_r = PyBytes_FromStringAndSize (r, size);\n";
pr "#else\n";
pr " py_r = guestfs_int_py_fromstringsize (r, size);\n";
pr "#endif\n";
pr " free (r);\n";
pr " if (py_r == NULL) goto out;\n";
);
Expand Down

0 comments on commit 0ee02e0

Please sign in to comment.