From ecf58eed2e1dce73fd33585eb4527fef5ec1f221 Mon Sep 17 00:00:00 2001 From: Andreas Krennmair Date: Fri, 7 Aug 2020 15:58:57 +0200 Subject: [PATCH] Add PyBytes_FromStringAndSize that explicitly uses Go string length so that strings with NUL bytes in them can also be processed. --- bytes.go | 8 ++++++++ bytes_test.go | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/bytes.go b/bytes.go index 1ed45d2..e7a4a0d 100644 --- a/bytes.go +++ b/bytes.go @@ -35,6 +35,14 @@ func PyBytes_FromString(str string) *PyObject { return togo(C.PyBytes_FromString(cstr)) } +//PyBytes_FromStringAndSize : https://docs.python.org/3/c-api/bytes.html#c.PyBytes_FromStringAndSize +func PyBytes_FromStringAndSize(str string) *PyObject { + cstr := C.CString(str) + defer C.free(unsafe.Pointer(cstr)) + + return togo(C.PyBytes_FromStringAndSize(cstr, C.Py_ssize_t(len(str)))) +} + //PyBytes_FromObject : https://docs.python.org/3/c-api/bytes.html#c.PyBytes_FromObject func PyBytes_FromObject(o *PyObject) *PyObject { return togo(C.PyBytes_FromObject(toc(o))) diff --git a/bytes_test.go b/bytes_test.go index fc4ec93..042dce1 100644 --- a/bytes_test.go +++ b/bytes_test.go @@ -35,6 +35,17 @@ func TestBytesFromAsString(t *testing.T) { assert.Equal(t, s1, PyBytes_AsString(bytes1)) } +func TestBytesFromStringAndSize(t *testing.T) { + Py_Initialize() + + s1 := "aaaaaaaa\x00bbbb" + + bytes1 := PyBytes_FromStringAndSize(s1) + defer bytes1.DecRef() + + assert.Equal(t, s1, PyBytes_AsString(bytes1)) +} + func TestBytesSize(t *testing.T) { Py_Initialize()