From 82e9c67b37474b38ca8eb366ce738c0e12b678a9 Mon Sep 17 00:00:00 2001 From: Freek Post Date: Sun, 21 Aug 2016 15:31:57 +0200 Subject: [PATCH 1/3] Default packed. --- .../Message/ReadFieldStatementGenerator.php | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Generator/Message/ReadFieldStatementGenerator.php b/src/Generator/Message/ReadFieldStatementGenerator.php index 3dfc151..d094213 100644 --- a/src/Generator/Message/ReadFieldStatementGenerator.php +++ b/src/Generator/Message/ReadFieldStatementGenerator.php @@ -64,7 +64,7 @@ public function generateFieldReadStatement(Entity $entity, FieldDescriptorProto $rule = $field->getLabel(); $tag = $field->getNumber(); $options = $field->getOptions(); - $isPack = $options ? $options->getPacked() : false; + $isPack = $options ? $options->getPacked() : $this->isDefaultPacked($rule, $type); $variable = $this->targetVar ?: '$this->' . $name; $breakSttm = $this->getBreakStatement($variable); @@ -208,6 +208,31 @@ protected function generateReadScalarStatement($type) throw new InvalidArgumentException('Unknown field type : ' . $type); } + /** + * check if field is packed by default + * + * @param Rule $rule + * @param Type $type + * + * @return bool + */ + protected function isDefaultPacked(Rule $rule, Type $type) + { + return $rule === Label::LABEL_REPEATED() && in_array($type, [ + Type::TYPE_FIXED32(), + Type::TYPE_FIXED64(), + Type::TYPE_INT32(), + Type::TYPE_INT64(), + Type::TYPE_SFIXED32(), + Type::TYPE_SFIXED64(), + Type::TYPE_UINT32(), + Type::TYPE_UINT64(), + Type::TYPE_FLOAT(), + Type::TYPE_DOUBLE(), + Type::TYPE_ENUM(), + ]); + } + /** * @param string $variable * From 6a56d5b063a8109511886a8d9fe17c26cf07e341 Mon Sep 17 00:00:00 2001 From: Freek Post Date: Sun, 21 Aug 2016 15:36:13 +0200 Subject: [PATCH 2/3] Fixed typehint --- src/Generator/Message/ReadFieldStatementGenerator.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Generator/Message/ReadFieldStatementGenerator.php b/src/Generator/Message/ReadFieldStatementGenerator.php index d094213..108274c 100644 --- a/src/Generator/Message/ReadFieldStatementGenerator.php +++ b/src/Generator/Message/ReadFieldStatementGenerator.php @@ -211,14 +211,14 @@ protected function generateReadScalarStatement($type) /** * check if field is packed by default * - * @param Rule $rule - * @param Type $type + * @param Label $label + * @param Type $type * * @return bool */ - protected function isDefaultPacked(Rule $rule, Type $type) + protected function isDefaultPacked(Label $label, Type $type) { - return $rule === Label::LABEL_REPEATED() && in_array($type, [ + return $label === Label::LABEL_REPEATED() && in_array($type, [ Type::TYPE_FIXED32(), Type::TYPE_FIXED64(), Type::TYPE_INT32(), From fea131adaf9a9b6a409917050202ee0bb0c8b101 Mon Sep 17 00:00:00 2001 From: Freek Post Date: Sun, 21 Aug 2016 15:59:10 +0200 Subject: [PATCH 3/3] Updated testcase. --- .../ReadFieldStatementGeneratorTest.php | 38 ++++++++++++++++++- .../Message/ReadFromGeneratorTest.php | 7 +++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/tests/Generator/Message/ReadFieldStatementGeneratorTest.php b/tests/Generator/Message/ReadFieldStatementGeneratorTest.php index 35cbf26..305a14f 100644 --- a/tests/Generator/Message/ReadFieldStatementGeneratorTest.php +++ b/tests/Generator/Message/ReadFieldStatementGeneratorTest.php @@ -138,13 +138,16 @@ public function testGenerateReadEnumRepeatedStatement() $actual = $this->invokeMethod($generator, 'generateFieldReadStatement', [$entity, $field]); $expected = <<<'CODE' -\Protobuf\WireFormat::assertWireType($wire, 14); +$innerSize = $reader->readVarint($stream); +$innerLimit = $stream->tell() + $innerSize; if ($this->status === null) { $this->status = new \Protobuf\EnumCollection(); } -$this->status->add(\ProtobufCompilerTest\Protos\Type::valueOf($reader->readVarint($stream))); +while ($stream->tell() < $innerLimit) { + $this->status->add(\ProtobufCompilerTest\Protos\Type::valueOf($reader->readVarint($stream))); +} continue; CODE; @@ -372,4 +375,35 @@ public function testGenerateReadScalarStatementException() $this->invokeMethod($generator, 'generateReadScalarStatement', [-123]); } + + public function testIsDefaultPacked() + { + $context = $this->createMessagesContext([]); + $generator = new ReadFieldStatementGenerator($context); + + $this->assertTrue( + $this->invokeMethod($generator, 'isDefaultPacked', + [ + FieldDescriptorProto\Label::LABEL_REPEATED(), + FieldDescriptorProto\Type::TYPE_UINT32() + ] + ) + ); + $this->assertFalse( + $this->invokeMethod($generator, 'isDefaultPacked', + [ + FieldDescriptorProto\Label::LABEL_OPTIONAL(), + FieldDescriptorProto\Type::TYPE_STRING() + ] + ) + ); + $this->assertFalse( + $this->invokeMethod($generator, 'isDefaultPacked', + [ + FieldDescriptorProto\Label::LABEL_REPEATED(), + FieldDescriptorProto\Type::TYPE_STRING() + ] + ) + ); + } } diff --git a/tests/Generator/Message/ReadFromGeneratorTest.php b/tests/Generator/Message/ReadFromGeneratorTest.php index 3c15a61..af0c36f 100644 --- a/tests/Generator/Message/ReadFromGeneratorTest.php +++ b/tests/Generator/Message/ReadFromGeneratorTest.php @@ -60,13 +60,16 @@ public function testGenerateBody() } if ($tag === 1) { - \Protobuf\WireFormat::assertWireType($wire, 5); + $innerSize = $reader->readVarint($stream); + $innerLimit = $stream->tell() + $innerSize; if ($this->lines === null) { $this->lines = new \Protobuf\ScalarCollection(); } - $this->lines->add($reader->readVarint($stream)); + while ($stream->tell() < $innerLimit) { + $this->lines->add($reader->readVarint($stream)); + } continue; }