Protobuf: fixed bugs in getVarint32Size/getVarint64Size. Fixed bug in serialization of packed fields
This commit is contained in:
@@ -26,20 +26,11 @@ clean:
|
|||||||
rm -rf $(BINDIR)
|
rm -rf $(BINDIR)
|
||||||
|
|
||||||
generate:
|
generate:
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/addressbook.proto
|
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/nested-msg.proto
|
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/connect.proto
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/connect.proto
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/error.proto
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/direction.proto
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/location.proto
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/location.proto
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/nested-msg.proto
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/route_done.proto
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/routeDone.proto
|
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/route.proto
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/route.proto
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/cross-branch-access.proto
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/rc_session.proto
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/base.proto
|
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/extended.proto
|
|
||||||
|
|
||||||
debug:
|
.PHONY: clean all generate
|
||||||
gdb --args ./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/src ./test/addressbook.proto
|
|
||||||
gdb --args ./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/src ./test/nested-msg.proto
|
|
||||||
|
|
||||||
.PHONY: clean all generate debug
|
|
||||||
|
|||||||
Binary file not shown.
+1
-1
@@ -292,7 +292,7 @@ void FieldGenerator::generateSerializationForPrimitives(io::Printer * printer, b
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (noTag) {
|
if (noTag) {
|
||||||
printer->Print(vars, "output.write$suffix$NoTag ()\n");
|
printer->Print(vars, "output.write$suffix$NoTag ($fieldName$)\n");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
printer->Print(vars, "output.write$suffix$ ($fieldNumber$, $fieldName$)\n");
|
printer->Print(vars, "output.write$suffix$ ($fieldNumber$, $fieldName$)\n");
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ option java_package = "proto.car";
|
|||||||
option java_outer_classname = "Connect";
|
option java_outer_classname = "Connect";
|
||||||
|
|
||||||
message ConnectionRequest {
|
message ConnectionRequest {
|
||||||
int32 ip = 1;
|
repeated int32 ip = 1;
|
||||||
int32 port = 2;
|
int32 port = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,71 +99,6 @@ class CodedInputStream(buffer: ByteArray) {
|
|||||||
return readZigZag64NoTag()
|
return readZigZag64NoTag()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readFixed32(expectedFieldNumber: Int): Int {
|
|
||||||
val tag = readTag(expectedFieldNumber, WireType.FIX_32)
|
|
||||||
return readFixed32NoInt()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readFixed32NoInt(): Int {
|
|
||||||
return readLittleEndianInt()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readSFixed32(expectedFieldNumber: Int): Int {
|
|
||||||
val tag = readTag(expectedFieldNumber, WireType.FIX_32)
|
|
||||||
return readSFixed32NoTag()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readSFixed32NoTag(): Int {
|
|
||||||
return readLittleEndianInt()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readFixed64(expectedFieldNumber: Int): Long {
|
|
||||||
val tag = readTag(expectedFieldNumber, WireType.FIX_64)
|
|
||||||
return readFixed64NoTag()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readFixed64NoTag(): Long {
|
|
||||||
return readLittleEndianLong()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readSFixed64(expectedFieldNumber: Int): Long {
|
|
||||||
val tag = readTag(expectedFieldNumber, WireType.FIX_64)
|
|
||||||
return readSFixed64NoTag()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readSFixed64NoTag(): Long {
|
|
||||||
return readLittleEndianLong()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readDouble(expectedFieldNumber: Int): Double {
|
|
||||||
val tag = readTag(expectedFieldNumber, WireType.FIX_64)
|
|
||||||
return readDoubleNoTag()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readDoubleNoTag(): Double {
|
|
||||||
return readLittleEndianDouble()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readFloat(expectedFieldNumber: Int): Float {
|
|
||||||
val tag = readTag(expectedFieldNumber, WireType.FIX_32)
|
|
||||||
return readFloatNoTag()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readFloatNoTag(): Float {
|
|
||||||
return readLittleEndianFloat()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readString(expectedFieldNumber: Int): String {
|
|
||||||
val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED)
|
|
||||||
return readStringNoTag()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readStringNoTag(): String {
|
|
||||||
val length = readInt32NoTag()
|
|
||||||
val value = String(readRawBytes(length))
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readBytes(expectedFieldNumber: Int): ByteArray {
|
fun readBytes(expectedFieldNumber: Int): ByteArray {
|
||||||
val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED)
|
val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED)
|
||||||
return readBytesNoTag()
|
return readBytesNoTag()
|
||||||
@@ -200,34 +135,12 @@ class CodedInputStream(buffer: ByteArray) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readLittleEndianDouble(): Double {
|
|
||||||
val byteBuffer = ByteBuffer.wrap(readRawBytes(8))
|
|
||||||
byteBuffer.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
return byteBuffer.getDouble(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readLittleEndianFloat(): Float {
|
|
||||||
val byteBuffer = ByteBuffer.wrap(readRawBytes(4))
|
|
||||||
byteBuffer.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
return byteBuffer.getFloat(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readLittleEndianInt(): Int {
|
|
||||||
val byteBuffer = ByteBuffer.wrap(readRawBytes(8))
|
|
||||||
byteBuffer.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
return byteBuffer.getInt(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readLittleEndianLong(): Long {
|
|
||||||
val byteBuffer = ByteBuffer.wrap(readRawBytes(4))
|
|
||||||
byteBuffer.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
return byteBuffer.getLong(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun readRawBytes(count: Int): ByteArray {
|
fun readRawBytes(count: Int): ByteArray {
|
||||||
val ba = ByteArray(count)
|
val ba = ByteArray(count)
|
||||||
for (i in 0..(count - 1)) {
|
var i = 0
|
||||||
|
while (i < count) {
|
||||||
ba[i] = inputStream.read().toByte()
|
ba[i] = inputStream.read().toByte()
|
||||||
|
i++
|
||||||
}
|
}
|
||||||
return ba
|
return ba
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,68 +87,6 @@ class CodedOutputStream(val buffer: ByteArray) {
|
|||||||
writeInt64NoTag((value shl 1) xor (value shr 63))
|
writeInt64NoTag((value shl 1) xor (value shr 63))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun writeFixed32(fieldNumber: Int, value: Int?) {
|
|
||||||
value ?: return
|
|
||||||
writeTag(fieldNumber, WireType.FIX_32)
|
|
||||||
writeFixed32NoTag(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeFixed32NoTag(value: Int) {
|
|
||||||
writeLittleEndian(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// See notes on unsigned integers implementation above
|
|
||||||
fun writeSFixed32(fieldNumber: Int, value: Int?) {
|
|
||||||
value ?: return
|
|
||||||
writeTag(fieldNumber, WireType.FIX_32)
|
|
||||||
writeSFixed32NoTag(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeSFixed32NoTag(value: Int) {
|
|
||||||
writeLittleEndian(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeFixed64(fieldNumber: Int, value: Long?) {
|
|
||||||
value ?: return
|
|
||||||
writeTag(fieldNumber, WireType.FIX_64)
|
|
||||||
writeFixed64NoTag(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeFixed64NoTag(value: Long) {
|
|
||||||
writeLittleEndian(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// See notes on unsigned integers implementation above
|
|
||||||
fun writeSFixed64(fieldNumber: Int, value: Long?) {
|
|
||||||
value ?: return
|
|
||||||
writeTag(fieldNumber, WireType.FIX_64)
|
|
||||||
writeSFixed64NoTag(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeSFixed64NoTag(value: Long) {
|
|
||||||
writeLittleEndian(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeDouble(fieldNumber: Int, value: Double?) {
|
|
||||||
value ?: return
|
|
||||||
writeTag(fieldNumber, WireType.FIX_64)
|
|
||||||
writeDoubleNoTag(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeDoubleNoTag(value: Double) {
|
|
||||||
writeLittleEndian(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeFloat(fieldNumber: Int, value: Float?) {
|
|
||||||
value ?: return
|
|
||||||
writeTag(fieldNumber, WireType.FIX_32)
|
|
||||||
writeFloatNoTag(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeFloatNoTag(value: Float) {
|
|
||||||
writeLittleEndian(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeString(fieldNumber: Int, value: String?) {
|
fun writeString(fieldNumber: Int, value: String?) {
|
||||||
value ?: return
|
value ?: return
|
||||||
writeTag(fieldNumber, WireType.LENGTH_DELIMITED)
|
writeTag(fieldNumber, WireType.LENGTH_DELIMITED)
|
||||||
@@ -179,39 +117,7 @@ class CodedOutputStream(val buffer: ByteArray) {
|
|||||||
* Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags.
|
* Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fun writeLittleEndian(value: Int?) {
|
fun writeInt32NoTag(value: Int?) {
|
||||||
value ?: return
|
|
||||||
val bb = ByteBuffer.allocate(4)
|
|
||||||
bb.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
bb.putInt(value)
|
|
||||||
output.write(bb.array())
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeLittleEndian(value: Long?) {
|
|
||||||
value ?: return
|
|
||||||
val bb = ByteBuffer.allocate(8)
|
|
||||||
bb.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
bb.putLong(value)
|
|
||||||
output.write(bb.array())
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeLittleEndian(value: Double?) {
|
|
||||||
value ?: return
|
|
||||||
val bb = ByteBuffer.allocate(8)
|
|
||||||
bb.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
bb.putDouble(value)
|
|
||||||
output.write(bb.array())
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeLittleEndian(value: Float?) {
|
|
||||||
value ?: return
|
|
||||||
val bb = ByteBuffer.allocate(4)
|
|
||||||
bb.order(ByteOrder.LITTLE_ENDIAN)
|
|
||||||
bb.putFloat(value)
|
|
||||||
output.write(bb.array())
|
|
||||||
}
|
|
||||||
|
|
||||||
fun writeInt32NoTag(value: Int?) {
|
|
||||||
value ?: return
|
value ?: return
|
||||||
var curValue: Int = value
|
var curValue: Int = value
|
||||||
|
|
||||||
@@ -233,7 +139,7 @@ class CodedOutputStream(val buffer: ByteArray) {
|
|||||||
|
|
||||||
res[resSize] = curByte.toByte()
|
res[resSize] = curByte.toByte()
|
||||||
resSize++
|
resSize++
|
||||||
} while(curValue != 0)
|
} while (curValue != 0)
|
||||||
output.write(res, 0, resSize)
|
output.write(res, 0, resSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,9 +10,11 @@ class KotlinOutputStream(val buffer: ByteArray) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun write (data: ByteArray, begin: Int, size: Int) {
|
fun write (data: ByteArray, begin: Int, size: Int) {
|
||||||
for (i in begin..(begin + size - 1)) {
|
var i = begin
|
||||||
|
while (i < begin + size) {
|
||||||
buffer[pos] = data[i]
|
buffer[pos] = data[i]
|
||||||
pos += 1
|
pos += 1
|
||||||
|
i++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ object WireFormat {
|
|||||||
var size = 0
|
var size = 0
|
||||||
while (curValue != 0) {
|
while (curValue != 0) {
|
||||||
size += 1
|
size += 1
|
||||||
curValue = value ushr VARINT_INFO_BITS_COUNT
|
curValue = curValue ushr VARINT_INFO_BITS_COUNT
|
||||||
}
|
}
|
||||||
return size
|
return size
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,7 @@ object WireFormat {
|
|||||||
var size = 0
|
var size = 0
|
||||||
while (curValue != 0L) {
|
while (curValue != 0L) {
|
||||||
size += 1
|
size += 1
|
||||||
curValue = value ushr VARINT_INFO_BITS_COUNT
|
curValue = curValue ushr VARINT_INFO_BITS_COUNT
|
||||||
}
|
}
|
||||||
return size
|
return size
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user