Skip to content

Commit e2a9fa3

Browse files
committed
[#374] Remove pre-write actions in Python
1 parent ac9e6f4 commit e2a9fa3

38 files changed

+86
-71
lines changed

compiler/extensions/python/freemarker/Bitmask.py.ftl

+1-4
Original file line numberDiff line numberDiff line change
@@ -236,18 +236,15 @@ class ${name}:
236236
</#if>
237237
return bitposition + self.bitsizeof_packed(context_node, bitposition)
238238

239-
def write(self, writer: zserio.BitStreamWriter, *, zserio_call_initialize_offsets: bool = True) -> None:
239+
def write(self, writer: zserio.BitStreamWriter) -> None:
240240
<#if withCodeComments>
241241
"""
242242
Serializes this bitmask object to the bit stream.
243243

244244
:param writer: Bit stream writer where to serialize this bitmask object.
245-
:param zserio_call_initialize_offsets: True to call automatically initialize_offsets method before
246-
writing, otherwise False.
247245
"""
248246

249247
</#if>
250-
del zserio_call_initialize_offsets
251248
writer.write_${runtimeFunction.suffix}(self._value<#rt>
252249
<#lt><#if runtimeFunction.arg??>, ${runtimeFunction.arg}</#if>)
253250

compiler/extensions/python/freemarker/Choice.py.ftl

+1-12
Original file line numberDiff line numberDiff line change
@@ -549,30 +549,19 @@ ${I}pass
549549
${I}pass
550550
</#if>
551551
</#macro>
552-
def write(self, zserio_writer: zserio.BitStreamWriter, *,
553-
zserio_call_initialize_offsets: bool = True) -> None:
552+
def write(self, zserio_writer: zserio.BitStreamWriter) -> None:
554553
<#if withCodeComments>
555554
"""
556555
Serializes this Zserio object to the bit stream.
557556

558557
:param zserio_writer: Bit stream writer where to serialize this Zserio object.
559-
:param zserio_call_initialize_offsets: True to call automatically initialize_offsets method before
560-
writing, otherwise False.
561558
"""
562559

563560
</#if>
564561
<#if fieldList?has_content>
565-
<#if hasFieldWithOffset>
566-
if zserio_call_initialize_offsets:
567-
self.initialize_offsets(zserio_writer.bitposition)
568-
<#else>
569-
del zserio_call_initialize_offsets
570-
</#if>
571-
572562
<@choice_if "choice_write_member", "choice_no_match"/>
573563
<#else>
574564
del zserio_writer
575-
del zserio_call_initialize_offsets
576565
</#if>
577566

578567
def write_packed(self, zserio_context_node: zserio.array.PackingContextNode,

compiler/extensions/python/freemarker/CompoundField.inc.ftl

+1-1
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ ${I}zserio_writer.write_${field.runtimeFunction.suffix}(self.<@field_member_name
279279
<#elseif field.array??>
280280
${I}self.<@field_member_name field/>.write<@array_field_packed_suffix field, packed/>(zserio_writer)
281281
<#else>
282-
${I}self.<@field_member_name field/>.write(zserio_writer<#if field.compound??>, zserio_call_initialize_offsets=False</#if>)
282+
${I}self.<@field_member_name field/>.write(zserio_writer)
283283
</#if>
284284
</#if>
285285
</#macro>

compiler/extensions/python/freemarker/Enumeration.py.ftl

+1-4
Original file line numberDiff line numberDiff line change
@@ -178,18 +178,15 @@ class ${name}(enum.Enum):
178178
</#if>
179179
return bitposition + self.bitsizeof_packed(context_node, bitposition)
180180

181-
def write(self, writer: zserio.BitStreamWriter, *, zserio_call_initialize_offsets: bool = True) -> None:
181+
def write(self, writer: zserio.BitStreamWriter) -> None:
182182
<#if withCodeComments>
183183
"""
184184
Serializes this enumeration object to the bit stream.
185185

186186
:param writer: Bit stream writer where to serialize this enumeration object.
187-
:param zserio_call_initialize_offsets: True to call automatically initialize_offsets method before
188-
writing, otherwise False.
189187
"""
190188

191189
</#if>
192-
del zserio_call_initialize_offsets
193190
writer.write_${runtimeFunction.suffix}(self.value<#rt>
194191
<#lt><#if runtimeFunction.arg??>, ${runtimeFunction.arg}</#if>)
195192

compiler/extensions/python/freemarker/Pubsub.py.ftl

+1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class ${name}:
113113

114114
def _publish(self, topic: str, message: typing.Any, context: typing.Any) -> None:
115115
writer = zserio.BitStreamWriter()
116+
message.initialize_offsets(writer.bitposition)
116117
message.write(writer)
117118
self._pubsub.publish(topic, writer.byte_array, context)
118119
</#if>

compiler/extensions/python/freemarker/SqlTable.py.ftl

+1
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ class ${name}:
365365
${field.snakeCaseName}_ = row_in_list[${field?index}]
366366
if isinstance(${field.snakeCaseName}_, ${field.typeInfo.typeFullName}):
367367
writer = zserio.BitStreamWriter()
368+
${field.snakeCaseName}_.initialize_offsets(writer.bitposition)
368369
${field.snakeCaseName}_.write(writer)
369370
row_in_list[${field?index}] = writer.byte_array
370371

compiler/extensions/python/freemarker/Structure.py.ftl

+1-12
Original file line numberDiff line numberDiff line change
@@ -515,26 +515,16 @@ ${I}<#rt>
515515
<#break>
516516
</#if>
517517
</#list>
518-
def write(self, zserio_writer: zserio.BitStreamWriter, *,
519-
zserio_call_initialize_offsets: bool = True) -> None:
518+
def write(self, zserio_writer: zserio.BitStreamWriter) -> None:
520519
<#if withCodeComments>
521520
"""
522521
Serializes this Zserio object to the bit stream.
523522

524523
:param zserio_writer: Bit stream writer where to serialize this Zserio object.
525-
:param zserio_call_initialize_offsets: True to call automatically initialize_offsets method before
526-
writing, otherwise False.
527524
"""
528525

529526
</#if>
530527
<#if fieldList?has_content>
531-
<#if hasFieldWithOffset>
532-
if zserio_call_initialize_offsets:
533-
self.initialize_offsets(zserio_writer.bitposition)
534-
<#else>
535-
del zserio_call_initialize_offsets
536-
</#if>
537-
538528
<#list fieldList as field>
539529
<@compound_write_field field, name, 2/>
540530
<#if field?has_next && needsWriteNewLines>
@@ -543,7 +533,6 @@ ${I}<#rt>
543533
</#list>
544534
<#else>
545535
del zserio_writer
546-
del zserio_call_initialize_offsets
547536
</#if>
548537

549538
def write_packed(self, zserio_context_node: zserio.array.PackingContextNode,

compiler/extensions/python/freemarker/Union.py.ftl

+1-12
Original file line numberDiff line numberDiff line change
@@ -493,32 +493,21 @@ ${I}pass
493493
<#macro union_write_field field indent packed index>
494494
<@compound_write_field field, name, indent, packed, index/>
495495
</#macro>
496-
def write(self, zserio_writer: zserio.BitStreamWriter, *,
497-
zserio_call_initialize_offsets: bool = True) -> None:
496+
def write(self, zserio_writer: zserio.BitStreamWriter) -> None:
498497
<#if withCodeComments>
499498
"""
500499
Serializes this Zserio object to the bit stream.
501500

502501
:param zserio_writer: Bit stream writer where to serialize this Zserio object.
503-
:param zserio_call_initialize_offsets: True to call automatically initialize_offsets method before
504-
writing, otherwise False.
505502
"""
506503

507504
</#if>
508505
<#if fieldList?has_content>
509-
<#if hasFieldWithOffset>
510-
if zserio_call_initialize_offsets:
511-
self.initialize_offsets(zserio_writer.bitposition)
512-
<#else>
513-
del zserio_call_initialize_offsets
514-
</#if>
515-
516506
zserio_writer.write_varsize(self._choice_tag)
517507

518508
<@union_if "union_write_field", "union_no_match"/>
519509
<#else>
520510
del zserio_writer
521-
del zserio_call_initialize_offsets
522511
</#if>
523512

524513
def write_packed(self, zserio_context_node: zserio.array.PackingContextNode,

compiler/extensions/python/runtime/src/zserio/array.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1924,4 +1924,4 @@ def write(writer: BitStreamWriter, value: typing.Any) -> None:
19241924
:param value: Zserio object type to write.
19251925
"""
19261926

1927-
value.write(writer, zserio_call_initialize_offsets=False)
1927+
value.write(writer)

compiler/extensions/python/runtime/src/zserio/serialization.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ def serialize(obj: typing.Any) -> BitBuffer:
1212
"""
1313
Serializes generated object to the bit buffer.
1414
15+
Before serialization, the method calls on the given zserio object method initialize_offsets().
16+
1517
Because serialization to the bit buffer does not have to be byte aligned (divisible by 8), it's possible
1618
that not all bits of the last byte are used. In this case, only most significant bits of the corresponded
1719
size are used.
@@ -31,6 +33,7 @@ def serialize(obj: typing.Any) -> BitBuffer:
3133
"""
3234

3335
writer = BitStreamWriter()
36+
obj.initialize_offsets(writer.bitposition)
3437
obj.write(writer)
3538

3639
return BitBuffer(writer.byte_array, writer.bitposition)
@@ -63,6 +66,8 @@ def serialize_to_bytes(obj: typing.Any) -> bytes:
6366
"""
6467
Serializes generated object to the byte buffer.
6568
69+
Before serialization, the method calls on the given zserio object method initialize_offsets().
70+
6671
This is a convenient method for users which do not need exact number of bits to which the given object
6772
will be serialized.
6873
@@ -117,7 +122,9 @@ def deserialize_bytes(obj_class: typing.Type[typing.Any], buffer: bytes, *args)
117122

118123
def serialize_to_file(obj: typing.Any, filename: str) -> None:
119124
"""
120-
Serializes generated object to the byte buffer.
125+
Serializes generated object to the file.
126+
127+
Before serialization, the method calls on the given zserio object method initialize_offsets().
121128
122129
This is a convenient method for users to easily write given generated object to file.
123130
@@ -136,6 +143,7 @@ def serialize_to_file(obj: typing.Any, filename: str) -> None:
136143
"""
137144

138145
writer = BitStreamWriter()
146+
obj.initialize_offsets(writer.bitposition)
139147
obj.write(writer)
140148
writer.to_file(filename)
141149

compiler/extensions/python/runtime/src/zserio/service.py

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def byte_array(self) -> bytes:
3333

3434
if not self._is_byte_array_initialized:
3535
writer = BitStreamWriter()
36+
self._zserio_object.initialize_offsets(writer.bitposition)
3637
self._zserio_object.write(writer)
3738
self._byte_array = writer.byte_array
3839
self._is_byte_array_initialized = True

compiler/extensions/python/runtime/tests/test_serialization.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class DummyObject:
99
def __init__(self, parameter, value = 0):
1010
self._parameter = parameter
1111
self._value = value
12+
self._offsets_initialized = False
1213

1314
@classmethod
1415
def from_reader(cls, reader, parameter):
@@ -24,11 +25,17 @@ def get_value(self):
2425
def bitsizeof(_bitposition = 0):
2526
return 31 # to make an unaligned type
2627

28+
def initialize_offsets(self, bitposition: int) -> int:
29+
self._offsets_initialized = True
30+
return bitposition + DummyObject.bitsizeof(bitposition)
31+
2732
def read(self, reader):
2833
self._value = reader.read_bits(self.bitsizeof(0))
2934

3035
def write(self, writer):
31-
writer.write_bits(self._value, self.bitsizeof(0))
36+
# don't write anything if offsets are not initialized to force test failure
37+
if self._offsets_initialized:
38+
writer.write_bits(self._value, self.bitsizeof(0))
3239

3340
class SerializationTest(unittest.TestCase):
3441

compiler/extensions/python/runtime/tests/test_service.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ def test_service_data(self):
77
class ZserioObject:
88
def __init__(self, value):
99
self._value = value
10+
self._offsets_initialized = False
1011

1112
def __eq__(self, other):
1213
return self._value == other._value
@@ -15,8 +16,14 @@ def __eq__(self, other):
1516
def bitsizeof(_bitposition):
1617
return 31 # to make an unaligned type
1718

19+
def initialize_offsets(self, bitposition: int) -> int:
20+
self._offsets_initialized = True
21+
return bitposition + ZserioObject.bitsizeof(bitposition)
22+
1823
def write(self, writer):
19-
writer.write_bits(self._value, self.bitsizeof(0))
24+
# don't write anything if offsets are not initialized to force test failure
25+
if self._offsets_initialized:
26+
writer.write_bits(self._value, self.bitsizeof(0))
2027

2128
zserio_object = ZserioObject(0xABCD)
2229
service_data = ServiceData(zserio_object)

compiler/extensions/python/src/zserio/extension/python/CompoundTypeTemplateData.java

-8
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ public CompoundTypeTemplateData(TemplateDataContext context, CompoundType compou
2424
compoundParametersData = new CompoundParameterTemplateData(context, compoundType, this);
2525
compoundFunctionsData = new CompoundFunctionTemplateData(context, compoundType, this);
2626

27-
hasFieldWithOffset = compoundType.hasFieldWithOffset();
28-
2927
final List<Field> fieldTypeList = compoundType.getFields();
3028
fieldList = new ArrayList<CompoundFieldTemplateData>(fieldTypeList.size());
3129
for (Field fieldType : fieldTypeList)
@@ -51,11 +49,6 @@ public CompoundFunctionTemplateData getCompoundFunctionsData()
5149
return compoundFunctionsData;
5250
}
5351

54-
public boolean getHasFieldWithOffset()
55-
{
56-
return hasFieldWithOffset;
57-
}
58-
5952
public Iterable<CompoundFieldTemplateData> getFieldList()
6053
{
6154
return fieldList;
@@ -69,7 +62,6 @@ public TemplateInstantiationTemplateData getTemplateInstantiation()
6962
private final boolean withRangeCheckCode;
7063
private final CompoundParameterTemplateData compoundParametersData;
7164
private final CompoundFunctionTemplateData compoundFunctionsData;
72-
private final boolean hasFieldWithOffset;
7365
private final List<CompoundFieldTemplateData> fieldList;
7466
private final TemplateInstantiationTemplateData templateInstantiation;
7567
}

test/language/indexed_offsets/python/AutoIndexedOffsetArrayTest.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def testWrite(self):
6060
createWrongOffsets = True
6161
autoIndexedOffsetArray = self._createAutoIndexedOffsetArray(createWrongOffsets)
6262
writer = zserio.BitStreamWriter()
63+
autoIndexedOffsetArray.initialize_offsets(writer.bitposition)
6364
autoIndexedOffsetArray.write(writer)
6465
self._checkAutoIndexedOffsetArray(autoIndexedOffsetArray)
6566
reader = zserio.BitStreamReader(writer.byte_array, writer.bitposition)
@@ -73,6 +74,7 @@ def testWriteWithPosition(self):
7374
writer = zserio.BitStreamWriter()
7475
bitPosition = 8
7576
writer.write_bits(0, bitPosition)
77+
autoIndexedOffsetArray.initialize_offsets(writer.bitposition)
7678
autoIndexedOffsetArray.write(writer)
7779

7880
offsetShift = 1
@@ -83,7 +85,7 @@ def testWriteWrongOffsets(self):
8385
autoIndexedOffsetArray = self._createAutoIndexedOffsetArray(createWrongOffsets)
8486
writer = zserio.BitStreamWriter()
8587
with self.assertRaises(zserio.PythonRuntimeException):
86-
autoIndexedOffsetArray.write(writer, zserio_call_initialize_offsets=False)
88+
autoIndexedOffsetArray.write(writer)
8789

8890
@staticmethod
8991
def _writeAutoIndexedOffsetArrayToStream(writer, writeWrongOffsets):

test/language/indexed_offsets/python/Bit5IndexedOffsetArrayTest.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def testWrite(self):
6060
createWrongOffsets = True
6161
bit5IndexedOffsetArray = self._createBit5IndexedOffsetArray(createWrongOffsets)
6262
writer = zserio.BitStreamWriter()
63+
bit5IndexedOffsetArray.initialize_offsets(writer.bitposition)
6364
bit5IndexedOffsetArray.write(writer)
6465
self._checkBit5IndexedOffsetArray(bit5IndexedOffsetArray)
6566
reader = zserio.BitStreamReader(writer.byte_array, writer.bitposition)
@@ -73,6 +74,7 @@ def testWriteWithPosition(self):
7374
writer = zserio.BitStreamWriter()
7475
bitPosition = 8
7576
writer.write_bits(0, bitPosition)
77+
bit5IndexedOffsetArray.initialize_offsets(writer.bitposition)
7678
bit5IndexedOffsetArray.write(writer)
7779

7880
offsetShift = 1
@@ -83,7 +85,7 @@ def testWriteWrongOffsets(self):
8385
bit5IndexedOffsetArray = self._createBit5IndexedOffsetArray(createWrongOffsets)
8486
writer = zserio.BitStreamWriter()
8587
with self.assertRaises(zserio.PythonRuntimeException):
86-
bit5IndexedOffsetArray.write(writer, zserio_call_initialize_offsets=False)
88+
bit5IndexedOffsetArray.write(writer)
8789

8890
@staticmethod
8991
def _writeBit5IndexedOffsetArrayToStream(writer, writeWrongOffsets):

test/language/indexed_offsets/python/BoolIndexedOffsetArrayTest.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def testWrite(self):
6060
createWrongOffsets = True
6161
boolIndexedOffsetArray = self._createBoolIndexedOffsetArray(createWrongOffsets)
6262
writer = zserio.BitStreamWriter()
63+
boolIndexedOffsetArray.initialize_offsets(writer.bitposition)
6364
boolIndexedOffsetArray.write(writer)
6465
self._checkBoolIndexedOffsetArray(boolIndexedOffsetArray)
6566
reader = zserio.BitStreamReader(writer.byte_array, writer.bitposition)
@@ -73,6 +74,7 @@ def testWriteWithPosition(self):
7374
writer = zserio.BitStreamWriter()
7475
bitPosition = 8
7576
writer.write_bits(0, bitPosition)
77+
boolIndexedOffsetArray.initialize_offsets(writer.bitposition)
7678
boolIndexedOffsetArray.write(writer)
7779

7880
offsetShift = 1
@@ -83,7 +85,7 @@ def testWriteWrongOffsets(self):
8385
boolIndexedOffsetArray = self._createBoolIndexedOffsetArray(createWrongOffsets)
8486
writer = zserio.BitStreamWriter()
8587
with self.assertRaises(zserio.PythonRuntimeException):
86-
boolIndexedOffsetArray.write(writer, zserio_call_initialize_offsets=False)
88+
boolIndexedOffsetArray.write(writer)
8789

8890
@staticmethod
8991
def _writeBoolIndexedOffsetArrayToStream(writer, writeWrongOffsets):

0 commit comments

Comments
 (0)