diff --git a/python/flatbuffers/builder.py b/python/flatbuffers/builder.py index e6d6882c4..a21f36161 100644 --- a/python/flatbuffers/builder.py +++ b/python/flatbuffers/builder.py @@ -421,6 +421,27 @@ class Builder(object): return self.EndVector(len(x)) + def CreateByteVector(self, x): + """CreateString writes a byte vector.""" + + self.assertNotNested() + ## @cond FLATBUFFERS_INTERNAL + self.nested = True + ## @endcond + + if not isinstance(x, compat.binary_types): + raise TypeError("non-byte vector passed to CreateByteVector") + + self.Prep(N.UOffsetTFlags.bytewidth, len(x)*N.Uint8Flags.bytewidth) + + l = UOffsetTFlags.py_type(len(x)) + ## @cond FLATBUFFERS_INTERNAL + self.head = UOffsetTFlags.py_type(self.Head() - l) + ## @endcond + self.Bytes[self.Head():self.Head()+l] = x + + return self.EndVector(len(x)) + ## @cond FLATBUFFERS_INTERNAL def assertNested(self): """ diff --git a/tests/py_test.py b/tests/py_test.py index 1302722be..aeef729af 100644 --- a/tests/py_test.py +++ b/tests/py_test.py @@ -459,6 +459,17 @@ class TestByteLayout(unittest.TestCase): self.assertBuilderEquals(b, [4, 0, 0, 0, 4, 5, 6, 7, 0, 0, 0, 0, 3, 0, 0, 0, 1, 2, 3, 0]) + def test_create_byte_vector(self): + b = flatbuffers.Builder(0) + b.CreateByteVector(b"") + # 0-byte pad: + self.assertBuilderEquals(b, [0, 0, 0, 0]) + + b = flatbuffers.Builder(0) + b.CreateByteVector(b"\x01\x02\x03") + # 1-byte pad: + self.assertBuilderEquals(b, [3, 0, 0, 0, 1, 2, 3, 0]) + def test_empty_vtable(self): b = flatbuffers.Builder(0) b.StartObject(0) @@ -1226,6 +1237,13 @@ class TestExceptions(unittest.TestCase): assertRaises(self, lambda: b.CreateString(s), flatbuffers.builder.IsNestedError) + def test_create_byte_vector_is_nested_error(self): + b = flatbuffers.Builder(0) + b.StartObject(0) + s = b'test1' + assertRaises(self, lambda: b.CreateByteVector(s), + flatbuffers.builder.IsNestedError) + def test_finished_bytes_error(self): b = flatbuffers.Builder(0) assertRaises(self, lambda: b.Output(),