Skip to content

Commit 8f466b3

Browse files
committed
Merge pull request aeron-io#227 from mmcilroy/master
var length data support for python
2 parents 1c1abd1 + 615c6c0 commit 8f466b3

File tree

1 file changed

+27
-33
lines changed

1 file changed

+27
-33
lines changed

main/java/uk/co/real_logic/sbe/generation/python/PythonGenerator.java

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import java.io.IOException;
2828
import java.io.Writer;
29+
import java.nio.ByteOrder;
2930
import java.util.ArrayList;
3031
import java.util.List;
3132

@@ -333,56 +334,49 @@ private CharSequence generateVarData(final List<Token> tokens)
333334
final String characterEncoding = tokens.get(i + 3).encoding().characterEncoding();
334335
final Token lengthToken = tokens.get(i + 2);
335336
final Integer sizeOfLengthField = Integer.valueOf(lengthToken.size());
336-
final String lengthCpp98Type = pythonTypeName(
337-
lengthToken.encoding().primitiveType(), lengthToken.encoding().byteOrder());
337+
final String lengthPythonType = pythonTypeName(lengthToken.encoding().primitiveType(), lengthToken.encoding().byteOrder());
338+
339+
String byteOrder = ( lengthToken.encoding().byteOrder() == ByteOrder.BIG_ENDIAN ) ? ">" : "<";
338340

339341
generateFieldMetaAttributeMethod(sb, token, BASE_INDENT);
340342

341343
generateVarDataDescriptors(
342-
sb, token, propertyName, characterEncoding, lengthToken, sizeOfLengthField, lengthCpp98Type);
343-
344-
/*
345-
* hmmm....
344+
sb, token, propertyName, characterEncoding, lengthToken, sizeOfLengthField, lengthPythonType);
346345

347346
sb.append(String.format(
348347
" def get%1$s(self):\n" +
349348
" sizeOfLengthField = %3$d\n" +
350-
" lengthPosition = position()\n" +
351-
" position(lengthPosition + sizeOfLengthField);\n" +
352-
353-
" dataLength = struct.unpack_from('%5$s', self.buffer_, lengthPosition())[0]\n" +
354-
" int bytesToCopy = (length < dataLength) ? length : dataLength;\n" +
355-
" sbe_uint64_t pos = position();\n" +
356-
" position(position() + (sbe_uint64_t)dataLength);\n" +
357-
" ::memcpy(dst, buffer_ + pos, bytesToCopy);\n" +
358-
" return bytesToCopy;\n" +
359-
" }\n\n",
349+
" lengthPosition = self.getPosition()\n" +
350+
" dataLength = struct.unpack_from('%5$s', self.buffer_, lengthPosition[0])[0]\n" +
351+
" self.setPosition(lengthPosition[0] + sizeOfLengthField)\n" +
352+
" pos = self.getPosition()\n" +
353+
" fmt = '" + byteOrder + "'+str(dataLength)+'c'\n" +
354+
" data = struct.unpack_from(fmt, self.buffer_, lengthPosition[0])\n" +
355+
" self.setPosition(pos[0] + dataLength)\n" +
356+
" return data\n\n",
360357
propertyName,
361358
generateArrayFieldNotPresentCondition(token.version(), BASE_INDENT),
362359
sizeOfLengthField,
363360
formatByteOrderEncoding(lengthToken.encoding().byteOrder(), lengthToken.encoding().primitiveType()),
364-
lengthCpp98Type
361+
lengthPythonType
365362
));
366363

367-
/*
368364
sb.append(String.format(
369-
" int set%1$s(const char *src, const int length)\n" +
370-
" {\n" +
371-
" sbe_uint64_t sizeOfLengthField = %2$d;\n" +
372-
" sbe_uint64_t lengthPosition = position();\n" +
373-
" *((%3$s *)(buffer_ + lengthPosition)) = %4$s((%3$s)length);\n" +
374-
" position(lengthPosition + sizeOfLengthField);\n" +
375-
" sbe_uint64_t pos = position();\n" +
376-
" position(position() + (sbe_uint64_t)length);\n" +
377-
" ::memcpy(buffer_ + pos, src, length);\n" +
378-
" return length;\n" +
379-
" }\n",
365+
" def set%1$s(self, buffer):\n" +
366+
" sizeOfLengthField = %2$d\n" +
367+
" lengthPosition = self.getPosition()\n" +
368+
" struct.pack_into('%3$s', self.buffer_, lengthPosition[0], len(buffer))\n" +
369+
" self.setPosition(lengthPosition[0] + sizeOfLengthField)\n" +
370+
" pos = self.getPosition()\n" +
371+
" fmt = '" + byteOrder + "c'\n" +
372+
" for i in range(0,len(buffer)):\n" +
373+
" struct.pack_into(fmt, self.buffer_, lengthPosition[0]+i, buffer[i])\n" +
374+
" self.setPosition(pos[0] + len(buffer))\n\n",
380375
propertyName,
381376
sizeOfLengthField,
382-
lengthCpp98Type,
377+
lengthPythonType,
383378
formatByteOrderEncoding(lengthToken.encoding().byteOrder(), lengthToken.encoding().primitiveType())
384379
));
385-
*/
386380
}
387381
}
388382

@@ -949,8 +943,8 @@ private CharSequence generateMessageFlyweightCode(final Token token)
949943
" self.buffer_ = buffer\n" +
950944
" self.offset_ = offset\n" +
951945
" self.bufferLength_ = bufferLength\n" +
952-
" self.actingBlockLength_ = sbeBlockLength()\n" +
953-
" self.actingVersion_ = sbeSchemaVersion()\n" +
946+
" self.actingBlockLength_ = self.sbeBlockLength()\n" +
947+
" self.actingVersion_ = self.sbeSchemaVersion()\n" +
954948
" self.setPosition(offset + self.actingBlockLength_)\n" +
955949
" return self\n\n" +
956950

0 commit comments

Comments
 (0)