Skip to content

Commit 8ecae34

Browse files
authored
Merge pull request protocolbuffers#3255 from TeBoring/3.3.x-3
Cherry-pick bug fixes for php
2 parents bf04c83 + 3b1a875 commit 8ecae34

File tree

10 files changed

+28
-7
lines changed

10 files changed

+28
-7
lines changed

php/ext/google/protobuf/def.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030

3131
#include "protobuf.h"
3232

33-
const char* const kReservedNames[] = {"Empty"};
34-
const int kReservedNamesSize = 1;
33+
const char* const kReservedNames[] = {"Empty", "ECHO", "ARRAY"};
34+
const int kReservedNamesSize = 3;
3535

3636
// Forward declare.
3737
static void descriptor_init_c_instance(Descriptor* intern TSRMLS_DC);

php/ext/google/protobuf/encode_decode.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1167,6 +1167,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc,
11671167
upb_msg_field_next(&i)) {
11681168
upb_fielddef* f = upb_msg_iter_field(&i);
11691169
uint32_t offset = desc->layout->fields[upb_fielddef_index(f)].offset;
1170+
bool containing_oneof = false;
11701171

11711172
if (upb_fielddef_containingoneof(f)) {
11721173
uint32_t oneof_case_offset =
@@ -1179,6 +1180,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc,
11791180
}
11801181
// Otherwise, fall through to the appropriate singular-field handler
11811182
// below.
1183+
containing_oneof = true;
11821184
}
11831185

11841186
if (is_map_field(f)) {
@@ -1209,7 +1211,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc,
12091211
#define T(upbtypeconst, upbtype, ctype, default_value) \
12101212
case upbtypeconst: { \
12111213
ctype value = DEREF(message_data(msg), offset, ctype); \
1212-
if (value != default_value) { \
1214+
if (containing_oneof || value != default_value) { \
12131215
upb_sink_put##upbtype(sink, sel, value); \
12141216
} \
12151217
} break;

php/ext/google/protobuf/message.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030

3131
#include <php.h>
3232
#include <stdlib.h>
33-
#include <ext/json/php_json.h>
3433

3534
#include "protobuf.h"
3635

php/src/Google/Protobuf/Internal/Message.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,13 @@ public function serializeToString()
739739
*/
740740
private function existField($field)
741741
{
742+
$oneof_index = $field->getOneofIndex();
743+
if ($oneof_index !== -1) {
744+
$oneof = $this->desc->getOneofDecl()[$oneof_index];
745+
$oneof_name = $oneof->getName();
746+
return $this->$oneof_name->getNumber() === $field->getNumber();
747+
}
748+
742749
$getter = $field->getGetter();
743750
$value = $this->$getter();
744751
return $value !== $this->defaultValue($field);

php/src/Google/Protobuf/descriptor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ function getClassNamePrefix(
236236
return $prefix;
237237
}
238238

239-
$reserved_words = array("Empty");
239+
$reserved_words = array("Empty", "ECHO", "ARRAY");
240240
foreach ($reserved_words as $reserved_word) {
241241
if ($classname === $reserved_word) {
242242
if ($file_proto->getPackage() === "google.protobuf") {

php/tests/encode_decode_test.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ public function testEncodeDecodeOneof()
8888
$n = new TestMessage();
8989
$n->mergeFromString($data);
9090
$this->assertSame(1, $n->getOneofMessage()->getA());
91+
92+
// Encode default value
93+
$m->setOneofEnum(TestEnum::ZERO);
94+
$data = $m->serializeToString();
95+
$n = new TestMessage();
96+
$n->mergeFromString($data);
97+
$this->assertSame("oneof_enum", $n->getMyOneof());
9198
}
9299

93100
public function testPackedEncode()

php/tests/generated_class_test.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,5 +876,6 @@ public function testPrefixForReservedWords()
876876
$m = new \Foo\TestMessage_Empty();
877877
$m = new \Foo\PBEmpty();
878878
$m = new \PrefixEmpty();
879+
$m = new \Foo\PBARRAY();
879880
}
880881
}

php/tests/memory_leak_test.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
require_once('generated/PrefixEmpty.php');
99
require_once('generated/PrefixTestPrefix.php');
1010
require_once('generated/Bar/TestInclude.php');
11+
require_once('generated/Foo/PBARRAY.php');
1112
require_once('generated/Foo/PBEmpty.php');
1213
require_once('generated/Foo/TestEnum.php');
1314
require_once('generated/Foo/TestIncludePrefixMessage.php');

php/tests/proto/test.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ message Empty {
127127
int32 a = 1;
128128
}
129129

130+
message ARRAY {
131+
int32 a = 1;
132+
}
133+
130134
message TestPackedMessage {
131135
repeated int32 repeated_int32 = 90 [packed = true];
132136
repeated int64 repeated_int64 = 91 [packed = true];

src/google/protobuf/compiler/php/php_generator.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ const std::string kDescriptorMetadataFile =
4949
"GPBMetadata/Google/Protobuf/Internal/Descriptor.php";
5050
const std::string kDescriptorDirName = "Google/Protobuf/Internal";
5151
const std::string kDescriptorPackageName = "Google\\Protobuf\\Internal";
52-
const char* const kReservedNames[] = {"Empty", "ECHO"};
53-
const int kReservedNamesSize = 2;
52+
const char* const kReservedNames[] = {"ARRAY", "Empty", "ECHO"};
53+
const int kReservedNamesSize = 3;
5454

5555
namespace google {
5656
namespace protobuf {

0 commit comments

Comments
 (0)