diff options
Diffstat (limited to 'php')
-rw-r--r-- | php/README.md | 2 | ||||
-rw-r--r-- | php/ext/google/protobuf/package.xml | 24 | ||||
-rw-r--r-- | php/ext/google/protobuf/protobuf.h | 2 | ||||
-rw-r--r-- | php/src/Google/Protobuf/Internal/GPBUtil.php | 9 | ||||
-rw-r--r-- | php/src/Google/Protobuf/Internal/GPBWire.php | 85 | ||||
-rw-r--r-- | php/src/Google/Protobuf/Internal/InputStream.php | 9 | ||||
-rw-r--r-- | php/src/Google/Protobuf/Internal/Message.php | 20 | ||||
-rw-r--r-- | php/src/Google/Protobuf/descriptor.php | 4 | ||||
-rw-r--r-- | php/tests/encode_decode_test.php | 41 | ||||
-rw-r--r-- | php/tests/generated_class_test.php | 11 | ||||
-rw-r--r-- | php/tests/php_implementation_test.php | 52 | ||||
-rw-r--r-- | php/tests/proto/test.proto | 3 | ||||
-rw-r--r-- | php/tests/proto/test_no_namespace.proto | 7 |
13 files changed, 194 insertions, 75 deletions
diff --git a/php/README.md b/php/README.md index ec92d329..cebeb3e5 100644 --- a/php/README.md +++ b/php/README.md @@ -80,8 +80,6 @@ protoc --php_out=out_dir test.proto ## Usage -For general guide: - https://developers.google.com/protocol-buffers/phptutorial/ For generated code: https://developers.google.com/protocol-buffers/docs/reference/php-generated diff --git a/php/ext/google/protobuf/package.xml b/php/ext/google/protobuf/package.xml index 01aad411..3067bdbb 100644 --- a/php/ext/google/protobuf/package.xml +++ b/php/ext/google/protobuf/package.xml @@ -10,11 +10,11 @@ <email>protobuf-opensource@google.com</email> <active>yes</active> </lead> - <date>2016-09-23</date> + <date>2017-01-13</date> <time>16:06:07</time> <version> - <release>3.1.0a1</release> - <api>3.1.0a1</api> + <release>3.2.0a1</release> + <api>3.2.0a1</api> </version> <stability> <release>alpha</release> @@ -22,7 +22,7 @@ </stability> <license uri="http://www.opensource.org/licenses/bsd-license.php">New BSD License</license> <notes> -First alpha release. +Second alpha release. </notes> <contents> <dir baseinstalldir="/" name="/"> @@ -71,5 +71,21 @@ First alpha release. First alpha release </notes> </release> + <release> + <version> + <release>3.2.0a1</release> + <api>3.2.0a1</api> + </version> + <stability> + <release>alpha</release> + <api>alpha</api> + </stability> + <date>2017-01-13</date> + <time>16:06:07</time> + <license uri="http://www.opensource.org/licenses/bsd-license.php">New BSD License</license> + <notes> +Second alpha release. + </notes> + </release> </changelog> </package> diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h index bd01005b..df452d6f 100644 --- a/php/ext/google/protobuf/protobuf.h +++ b/php/ext/google/protobuf/protobuf.h @@ -37,7 +37,7 @@ #include "upb.h" #define PHP_PROTOBUF_EXTNAME "protobuf" -#define PHP_PROTOBUF_VERSION "3.1.0a1" +#define PHP_PROTOBUF_VERSION "3.2.0a1" #define MAX_LENGTH_OF_INT64 20 #define SIZEOF_INT64 8 diff --git a/php/src/Google/Protobuf/Internal/GPBUtil.php b/php/src/Google/Protobuf/Internal/GPBUtil.php index 30d7350f..ba1d2eb3 100644 --- a/php/src/Google/Protobuf/Internal/GPBUtil.php +++ b/php/src/Google/Protobuf/Internal/GPBUtil.php @@ -43,8 +43,15 @@ class GPBUtil if ($isNeg) { $value = bcsub(0, $value); } + $high = (int) bcdiv(bcadd($value, 1), 4294967296); - $low = (int) bcmod($value, 4294967296); + $low = bcmod($value, 4294967296); + if (bccomp($low, 2147483647) > 0) { + $low = (int) bcsub($low, 4294967296); + } else { + $low = (int) $low; + } + if ($isNeg) { $high = ~$high; $low = ~$low; diff --git a/php/src/Google/Protobuf/Internal/GPBWire.php b/php/src/Google/Protobuf/Internal/GPBWire.php index 7e2c124f..f75e0861 100644 --- a/php/src/Google/Protobuf/Internal/GPBWire.php +++ b/php/src/Google/Protobuf/Internal/GPBWire.php @@ -437,34 +437,65 @@ class GPBWire public static function varint64Size($value) { - if ($value < 0) { - return 10; - } - if ($value < (1 << 7)) { - return 1; - } - if ($value < (1 << 14)) { - return 2; - } - if ($value < (1 << 21)) { - return 3; - } - if ($value < (1 << 28)) { - return 4; - } - if ($value < (1 << 35)) { - return 5; - } - if ($value < (1 << 42)) { - return 6; - } - if ($value < (1 << 49)) { - return 7; - } - if ($value < (1 << 56)) { - return 8; + if (PHP_INT_SIZE == 4) { + if (bccomp($value, 0) < 0) { + return 10; + } + if (bccomp($value, 1 << 7) < 0) { + return 1; + } + if (bccomp($value, 1 << 14) < 0) { + return 2; + } + if (bccomp($value, 1 << 21) < 0) { + return 3; + } + if (bccomp($value, 1 << 28) < 0) { + return 4; + } + if (bccomp($value, '34359738368') < 0) { + return 5; + } + if (bccomp($value, '4398046511104') < 0) { + return 6; + } + if (bccomp($value, '562949953421312') < 0) { + return 7; + } + if (bccomp($value, '72057594037927936') < 0) { + return 8; + } + return 9; + } else { + if ($value < 0) { + return 10; + } + if ($value < (1 << 7)) { + return 1; + } + if ($value < (1 << 14)) { + return 2; + } + if ($value < (1 << 21)) { + return 3; + } + if ($value < (1 << 28)) { + return 4; + } + if ($value < (1 << 35)) { + return 5; + } + if ($value < (1 << 42)) { + return 6; + } + if ($value < (1 << 49)) { + return 7; + } + if ($value < (1 << 56)) { + return 8; + } + return 9; } - return 9; } public static function serializeFieldToStream( diff --git a/php/src/Google/Protobuf/Internal/InputStream.php b/php/src/Google/Protobuf/Internal/InputStream.php index c5a76d5d..bf052c2f 100644 --- a/php/src/Google/Protobuf/Internal/InputStream.php +++ b/php/src/Google/Protobuf/Internal/InputStream.php @@ -46,6 +46,9 @@ function combineInt32ToInt64($high, $low) } } $result = bcadd(bcmul($high, 4294967296), $low); + if ($low < 0) { + $result = bcadd($result, 4294967296); + } if ($isNeg) { $result = bcsub(0, $result); } @@ -179,9 +182,9 @@ class InputStream if ($bits >= 32) { $high |= (($b & 0x7F) << ($bits - 32)); } else if ($bits > 25){ - $high_bits = $bits - 25; - $low = ($low | (($b & 0x7F) << $bits)) & (int) 0xFFFFFFFF; - $high = $b & ((0x1 << $high_bits) -1); + // $bits is 28 in this case. + $low |= (($b & 0x7F) << 28); + $high = ($b & 0x7F) >> 4; } else { $low |= (($b & 0x7F) << $bits); } diff --git a/php/src/Google/Protobuf/Internal/Message.php b/php/src/Google/Protobuf/Internal/Message.php index 031c82a2..82b94ee4 100644 --- a/php/src/Google/Protobuf/Internal/Message.php +++ b/php/src/Google/Protobuf/Internal/Message.php @@ -186,17 +186,22 @@ class Message case GPBType::FLOAT: return 0.0; case GPBType::UINT32: - case GPBType::UINT64: case GPBType::INT32: - case GPBType::INT64: case GPBType::FIXED32: - case GPBType::FIXED64: case GPBType::SFIXED32: - case GPBType::SFIXED64: case GPBType::SINT32: - case GPBType::SINT64: case GPBType::ENUM: return 0; + case GPBType::INT64: + case GPBType::UINT64: + case GPBType::FIXED64: + case GPBType::SFIXED64: + case GPBType::SINT64: + if (PHP_INT_SIZE === 4) { + return '0'; + } else { + return 0; + } case GPBType::BOOL: return false; case GPBType::STRING: @@ -406,6 +411,11 @@ class Message $number = GPBWire::getTagFieldNumber($tag); $field = $this->desc->getFieldByNumber($number); + // Check whether we retrieved a known field + if ($field === NULL) { + continue; + } + if (!$this->parseFieldFromStream($tag, $input, $field)) { return false; } diff --git a/php/src/Google/Protobuf/descriptor.php b/php/src/Google/Protobuf/descriptor.php index ef6b9dcf..9e56ef27 100644 --- a/php/src/Google/Protobuf/descriptor.php +++ b/php/src/Google/Protobuf/descriptor.php @@ -155,7 +155,11 @@ class Descriptor public function getFieldByNumber($number) { + if (!isset($this->field[$number])) { + return NULL; + } else { return $this->field[$number]; + } } public function setClass($klass) diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php index af9c0415..992f1631 100644 --- a/php/tests/encode_decode_test.php +++ b/php/tests/encode_decode_test.php @@ -132,4 +132,45 @@ class EncodeDecodeTest extends TestBase $to->decode(TestUtil::getGoldenTestUnpackedMessage()); TestUtil::assertTestPackedMessage($to); } + + public function testDecodeInt64() + { + // Read 64 testing + $testVals = array( + '10' => '100a', + '100' => '1064', + '800' => '10a006', + '6400' => '108032', + '70400' => '1080a604', + '774400' => '1080a22f', + '9292800' => '108098b704', + '74342400' => '1080c0b923', + '743424000' => '108080bfe202', + '8177664000' => '108080b5bb1e', + '65421312000' => '108080a8dbf301', + '785055744000' => '108080e0c7ec16', + '9420668928000' => '10808080dd969202', + '103627358208000' => '10808080fff9c717', + '1139900940288000' => '10808080f5bd978302', + '13678811283456000' => '10808080fce699a618', + '109430490267648000' => '10808080e0b7ceb1c201', + '984874412408832000' => '10808080e0f5c1bed50d', + ); + + $msg = new TestMessage(); + foreach ($testVals as $original => $encoded) { + $msg->setOptionalInt64($original); + $data = $msg->encode(); + $this->assertSame($encoded, bin2hex($data)); + $msg->setOptionalInt64(0); + $msg->decode($data); + $this->assertEquals($original, $msg->getOptionalInt64()); + } + } + + public function testDecodeFieldNonExist() { + $data = hex2bin('c80501'); + $m = new TestMessage(); + $m->decode($data); + } } diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php index 3587092e..d347e8b4 100644 --- a/php/tests/generated_class_test.php +++ b/php/tests/generated_class_test.php @@ -1,6 +1,7 @@ <?php -require_once('generated/NoNameSpace.php'); +require_once('generated/NoNameSpaceEnum.php'); +require_once('generated/NoNameSpaceMessage.php'); require_once('test_util.php'); use Google\Protobuf\Internal\RepeatedField; @@ -607,10 +608,14 @@ class GeneratedClassTest extends PHPUnit_Framework_TestCase } ######################################################### - # Test oneof field. + # Test message/enum without namespace. ######################################################### public function testMessageWithoutNamespace() { - $m = new NoNameSpace(); + $m = new NoNameSpaceMessage(); + } + + public function testEnumWithoutNamespace() { + $m = new NoNameSpaceEnum(); } } diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php index 6b922a9b..ac7c13dc 100644 --- a/php/tests/php_implementation_test.php +++ b/php/tests/php_implementation_test.php @@ -368,33 +368,31 @@ class ImplementationTest extends TestBase $this->assertFalse($input->readVarint64($var)); // Read 64 testing - if (PHP_INT_SIZE > 4) { - $testVals = array( - '10' => '0a000000000000000000', - '100' => '64000000000000000000', - '800' => 'a0060000000000000000', - '6400' => '80320000000000000000', - '70400' => '80a60400000000000000', - '774400' => '80a22f00000000000000', - '9292800' => '8098b704000000000000', - '74342400' => '80c0b923000000000000', - '743424000' => '8080bfe2020000000000', - '8177664000' => '8080b5bb1e0000000000', - '65421312000' => '8080a8dbf30100000000', - '785055744000' => '8080e0c7ec1600000000', - '9420668928000' => '808080dd969202000000', - '103627358208000' => '808080fff9c717000000', - '1139900940288000' => '808080f5bd9783020000', - '13678811283456000' => '808080fce699a6180000', - '109430490267648000' => '808080e0b7ceb1c20100', - '984874412408832000' => '808080e0f5c1bed50d00', - ); - - foreach ($testVals as $original => $encoded) { - $input = new InputStream(hex2bin($encoded)); - $this->assertTrue($input->readVarint64($var)); - $this->assertSame($original, $var); - } + $testVals = array( + '10' => '0a000000000000000000', + '100' => '64000000000000000000', + '800' => 'a0060000000000000000', + '6400' => '80320000000000000000', + '70400' => '80a60400000000000000', + '774400' => '80a22f00000000000000', + '9292800' => '8098b704000000000000', + '74342400' => '80c0b923000000000000', + '743424000' => '8080bfe2020000000000', + '8177664000' => '8080b5bb1e0000000000', + '65421312000' => '8080a8dbf30100000000', + '785055744000' => '8080e0c7ec1600000000', + '9420668928000' => '808080dd969202000000', + '103627358208000' => '808080fff9c717000000', + '1139900940288000' => '808080f5bd9783020000', + '13678811283456000' => '808080fce699a6180000', + '109430490267648000' => '808080e0b7ceb1c20100', + '984874412408832000' => '808080e0f5c1bed50d00', + ); + + foreach ($testVals as $original => $encoded) { + $input = new InputStream(hex2bin($encoded)); + $this->assertTrue($input->readVarint64($var)); + $this->assertEquals($original, $var); } } diff --git a/php/tests/proto/test.proto b/php/tests/proto/test.proto index fc283a05..594aee4d 100644 --- a/php/tests/proto/test.proto +++ b/php/tests/proto/test.proto @@ -92,7 +92,8 @@ message TestMessage { int32 a = 1; } - // NestedMessage nested_message = 90; + // Reserved for non-existing field test. + // int32 non_exist = 89; } enum TestEnum { diff --git a/php/tests/proto/test_no_namespace.proto b/php/tests/proto/test_no_namespace.proto index 4331aeab..b8c4fdf2 100644 --- a/php/tests/proto/test_no_namespace.proto +++ b/php/tests/proto/test_no_namespace.proto @@ -1,5 +1,10 @@ syntax = "proto3"; -message NoNameSpace { +message NoNameSpaceMessage { int32 a = 1; } + +enum NoNameSpaceEnum { + VALUE_A = 0; + VALUE_B = 1; +} |