Commit 3afcded2 authored by Jisi Liu's avatar Jisi Liu Committed by GitHub

Merge pull request #3461 from TeBoring/3.4.x

Merge master into 3.4.x
parents 176713d6 8f4b8e43
...@@ -600,6 +600,12 @@ php_EXTRA_DIST= \ ...@@ -600,6 +600,12 @@ php_EXTRA_DIST= \
php/ext/google/protobuf/upb.c \ php/ext/google/protobuf/upb.c \
php/ext/google/protobuf/protobuf.c \ php/ext/google/protobuf/protobuf.c \
php/src/phpdoc.dist.xml \ php/src/phpdoc.dist.xml \
php/src/Google/Protobuf/Descriptor.php \
php/src/Google/Protobuf/DescriptorPool.php \
php/src/Google/Protobuf/EnumDescriptor.php \
php/src/Google/Protobuf/EnumValueDescriptor.php \
php/src/Google/Protobuf/FieldDescriptor.php \
php/src/Google/Protobuf/OneofDescriptor.php \
php/src/Google/Protobuf/Internal/CodedInputStream.php \ php/src/Google/Protobuf/Internal/CodedInputStream.php \
php/src/Google/Protobuf/Internal/CodedOutputStream.php \ php/src/Google/Protobuf/Internal/CodedOutputStream.php \
php/src/Google/Protobuf/Internal/DescriptorPool.php \ php/src/Google/Protobuf/Internal/DescriptorPool.php \
...@@ -612,7 +618,6 @@ php_EXTRA_DIST= \ ...@@ -612,7 +618,6 @@ php_EXTRA_DIST= \
php/src/Google/Protobuf/Internal/EnumDescriptorProto.php \ php/src/Google/Protobuf/Internal/EnumDescriptorProto.php \
php/src/Google/Protobuf/Internal/EnumOptions.php \ php/src/Google/Protobuf/Internal/EnumOptions.php \
php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php \ php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php \
php/src/Google/Protobuf/Internal/EnumValueDescriptor.php \
php/src/Google/Protobuf/Internal/EnumValueOptions.php \ php/src/Google/Protobuf/Internal/EnumValueOptions.php \
php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php \ php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php \
php/src/Google/Protobuf/Internal/FieldDescriptorProto.php \ php/src/Google/Protobuf/Internal/FieldDescriptorProto.php \
...@@ -628,6 +633,7 @@ php_EXTRA_DIST= \ ...@@ -628,6 +633,7 @@ php_EXTRA_DIST= \
php/src/Google/Protobuf/Internal/FileOptions.php \ php/src/Google/Protobuf/Internal/FileOptions.php \
php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php \ php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php \
php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php \ php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php \
php/src/Google/Protobuf/Internal/GetPublicDescriptorTrait.php \
php/src/Google/Protobuf/Internal/GPBDecodeException.php \ php/src/Google/Protobuf/Internal/GPBDecodeException.php \
php/src/Google/Protobuf/Internal/GPBJsonWire.php \ php/src/Google/Protobuf/Internal/GPBJsonWire.php \
php/src/Google/Protobuf/Internal/GPBLabel.php \ php/src/Google/Protobuf/Internal/GPBLabel.php \
...@@ -635,6 +641,7 @@ php_EXTRA_DIST= \ ...@@ -635,6 +641,7 @@ php_EXTRA_DIST= \
php/src/Google/Protobuf/Internal/GPBUtil.php \ php/src/Google/Protobuf/Internal/GPBUtil.php \
php/src/Google/Protobuf/Internal/GPBWireType.php \ php/src/Google/Protobuf/Internal/GPBWireType.php \
php/src/Google/Protobuf/Internal/GPBWire.php \ php/src/Google/Protobuf/Internal/GPBWire.php \
php/src/Google/Protobuf/Internal/HasPublicDescriptorTrait.php \
php/src/Google/Protobuf/Internal/MapEntry.php \ php/src/Google/Protobuf/Internal/MapEntry.php \
php/src/Google/Protobuf/Internal/MapFieldIter.php \ php/src/Google/Protobuf/Internal/MapFieldIter.php \
php/src/Google/Protobuf/Internal/MapField.php \ php/src/Google/Protobuf/Internal/MapField.php \
...@@ -661,6 +668,7 @@ php_EXTRA_DIST= \ ...@@ -661,6 +668,7 @@ php_EXTRA_DIST= \
php/tests/array_test.php \ php/tests/array_test.php \
php/tests/autoload.php \ php/tests/autoload.php \
php/tests/compatibility_test.sh \ php/tests/compatibility_test.sh \
php/tests/descriptors_test.php \
php/tests/encode_decode_test.php \ php/tests/encode_decode_test.php \
php/tests/gdb_test.sh \ php/tests/gdb_test.sh \
php/tests/generated_class_test.php \ php/tests/generated_class_test.php \
...@@ -669,6 +677,7 @@ php_EXTRA_DIST= \ ...@@ -669,6 +677,7 @@ php_EXTRA_DIST= \
php/tests/map_field_test.php \ php/tests/map_field_test.php \
php/tests/memory_leak_test.php \ php/tests/memory_leak_test.php \
php/tests/php_implementation_test.php \ php/tests/php_implementation_test.php \
php/tests/proto/test_descriptors.proto \
php/tests/proto/test_empty_php_namespace.proto \ php/tests/proto/test_empty_php_namespace.proto \
php/tests/proto/test_import_descriptor_proto.proto \ php/tests/proto/test_import_descriptor_proto.proto \
php/tests/proto/test_include.proto \ php/tests/proto/test_include.proto \
......
...@@ -16,8 +16,8 @@ ...@@ -16,8 +16,8 @@
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Google\\Protobuf\\Internal\\": "php/src/Google/Protobuf/Internal", "Google\\Protobuf\\": "php/src/Google/Protobuf",
"GPBMetadata\\Google\\Protobuf\\Internal\\": "php/src/GPBMetadata/Google/Protobuf/Internal" "GPBMetadata\\Google\\Protobuf\\": "php/src/GPBMetadata/Google/Protobuf"
} }
} }
} }
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
conformance_protoc_inputs = \ conformance_protoc_inputs = \
conformance.proto \ conformance.proto \
$(top_srcdir)/src/google/protobuf/test_messages_proto3.proto $(top_srcdir)/src/google/protobuf/test_messages_proto3.proto
# proto2 input files, should be separated with proto3, as we # proto2 input files, should be separated with proto3, as we
# can't generate proto2 files for ruby, php and objc # can't generate proto2 files for ruby, php and objc
conformance_proto2_protoc_inputs = \ conformance_proto2_protoc_inputs = \
$(top_srcdir)/src/google/protobuf/test_messages_proto2.proto $(top_srcdir)/src/google/protobuf/test_messages_proto2.proto
well_known_type_protoc_inputs = \ well_known_type_protoc_inputs = \
$(top_srcdir)/src/google/protobuf/any.proto \ $(top_srcdir)/src/google/protobuf/any.proto \
...@@ -86,6 +86,8 @@ other_language_protoc_outputs = \ ...@@ -86,6 +86,8 @@ other_language_protoc_outputs = \
google/protobuf/struct.pb.h \ google/protobuf/struct.pb.h \
google/protobuf/struct.rb \ google/protobuf/struct.rb \
google/protobuf/struct_pb2.py \ google/protobuf/struct_pb2.py \
google/protobuf/TestMessagesProto2.pbobjc.h \
google/protobuf/TestMessagesProto2.pbobjc.m \
google/protobuf/TestMessagesProto3.pbobjc.h \ google/protobuf/TestMessagesProto3.pbobjc.h \
google/protobuf/TestMessagesProto3.pbobjc.m \ google/protobuf/TestMessagesProto3.pbobjc.m \
google/protobuf/test_messages_proto3.pb.cc \ google/protobuf/test_messages_proto3.pb.cc \
...@@ -228,7 +230,7 @@ if OBJC_CONFORMANCE_TEST ...@@ -228,7 +230,7 @@ if OBJC_CONFORMANCE_TEST
bin_PROGRAMS += conformance-objc bin_PROGRAMS += conformance-objc
conformance_objc_SOURCES = conformance_objc.m ../objectivec/GPBProtocolBuffers.m conformance_objc_SOURCES = conformance_objc.m ../objectivec/GPBProtocolBuffers.m
nodist_conformance_objc_SOURCES = Conformance.pbobjc.m google/protobuf/TestMessagesProto3.pbobjc.m nodist_conformance_objc_SOURCES = Conformance.pbobjc.m google/protobuf/TestMessagesProto2.pbobjc.m google/protobuf/TestMessagesProto3.pbobjc.m
# On travis, the build fails without the isysroot because whatever system # On travis, the build fails without the isysroot because whatever system
# headers are being found don't include generics support for # headers are being found don't include generics support for
# NSArray/NSDictionary, the only guess is their image at one time had an odd # NSArray/NSDictionary, the only guess is their image at one time had an odd
...@@ -237,7 +239,7 @@ conformance_objc_CPPFLAGS = -I$(top_srcdir)/objectivec -isysroot `xcrun --sdk ma ...@@ -237,7 +239,7 @@ conformance_objc_CPPFLAGS = -I$(top_srcdir)/objectivec -isysroot `xcrun --sdk ma
conformance_objc_LDFLAGS = -framework Foundation conformance_objc_LDFLAGS = -framework Foundation
# Explicit dep beacuse BUILT_SOURCES are only done before a "make all/check" # Explicit dep beacuse BUILT_SOURCES are only done before a "make all/check"
# so a direct "make test_objc" could fail if parallel enough. # so a direct "make test_objc" could fail if parallel enough.
conformance_objc-conformance_objc.$(OBJEXT): Conformance.pbobjc.h google/protobuf/TestMessagesProto3.pbobjc.h conformance_objc-conformance_objc.$(OBJEXT): Conformance.pbobjc.h google/protobuf/TestMessagesProto2.pbobjc.h google/protobuf/TestMessagesProto3.pbobjc.h
endif endif
...@@ -253,7 +255,7 @@ if USE_EXTERNAL_PROTOC ...@@ -253,7 +255,7 @@ if USE_EXTERNAL_PROTOC
# Some implementations include pre-generated versions of well-known types. # Some implementations include pre-generated versions of well-known types.
protoc_middleman: $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf protoc_middleman: $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. --php_out=. --js_out=import_style=commonjs,binary:. $(conformance_protoc_inputs) $(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. --php_out=. --js_out=import_style=commonjs,binary:. $(conformance_protoc_inputs)
$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --python_out=. --js_out=import_style=commonjs,binary:. $(conformance_proto2_protoc_inputs) $(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --objc_out=. --python_out=. --js_out=import_style=commonjs,binary:. $(conformance_proto2_protoc_inputs)
$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --python_out=. --php_out=. --js_out=import_style=commonjs,binary:google-protobuf $(well_known_type_protoc_inputs) $(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --python_out=. --php_out=. --js_out=import_style=commonjs,binary:google-protobuf $(well_known_type_protoc_inputs)
## $(PROTOC) -I$(srcdir) -I$(top_srcdir) --java_out=lite:lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) ## $(PROTOC) -I$(srcdir) -I$(top_srcdir) --java_out=lite:lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
touch protoc_middleman touch protoc_middleman
...@@ -265,7 +267,7 @@ else ...@@ -265,7 +267,7 @@ else
# building out-of-tree. # building out-of-tree.
protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd --php_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd $(conformance_protoc_inputs) ) oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd --php_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd $(conformance_protoc_inputs) )
oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --python_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd $(conformance_proto2_protoc_inputs) ) oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --objc_out=. --python_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd $(conformance_proto2_protoc_inputs) )
oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --python_out=$$oldpwd --php_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd/google-protobuf $(well_known_type_protoc_inputs) ) oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --python_out=$$oldpwd --php_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd/google-protobuf $(well_known_type_protoc_inputs) )
## @mkdir -p lite ## @mkdir -p lite
## oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --java_out=lite:$$oldpwd/lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) ) ## oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --java_out=lite:$$oldpwd/lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) )
......
...@@ -78,7 +78,9 @@ message ConformanceRequest { ...@@ -78,7 +78,9 @@ message ConformanceRequest {
// Which format should the testee serialize its message to? // Which format should the testee serialize its message to?
WireFormat requested_output_format = 3; WireFormat requested_output_format = 3;
// should be set to either "proto2" or "proto3" // The full name for the test message to use; for the moment, either:
// protobuf_test_messages.proto3.TestAllTypesProto3 or
// protobuf_test_messages.proto2.TestAllTypesProto2.
string message_type = 4; string message_type = 4;
} }
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import "Conformance.pbobjc.h" #import "Conformance.pbobjc.h"
#import "google/protobuf/TestMessagesProto2.pbobjc.h"
#import "google/protobuf/TestMessagesProto3.pbobjc.h" #import "google/protobuf/TestMessagesProto3.pbobjc.h"
static void Die(NSString *format, ...) __dead2; static void Die(NSString *format, ...) __dead2;
...@@ -63,7 +64,7 @@ static NSData *CheckedReadDataOfLength(NSFileHandle *handle, NSUInteger numBytes ...@@ -63,7 +64,7 @@ static NSData *CheckedReadDataOfLength(NSFileHandle *handle, NSUInteger numBytes
static ConformanceResponse *DoTest(ConformanceRequest *request) { static ConformanceResponse *DoTest(ConformanceRequest *request) {
ConformanceResponse *response = [ConformanceResponse message]; ConformanceResponse *response = [ConformanceResponse message];
TestAllTypesProto3 *testMessage = nil; GPBMessage *testMessage = nil;
switch (request.payloadOneOfCase) { switch (request.payloadOneOfCase) {
case ConformanceRequest_Payload_OneOfCase_GPBUnsetOneOfCase: case ConformanceRequest_Payload_OneOfCase_GPBUnsetOneOfCase:
...@@ -71,20 +72,19 @@ static ConformanceResponse *DoTest(ConformanceRequest *request) { ...@@ -71,20 +72,19 @@ static ConformanceResponse *DoTest(ConformanceRequest *request) {
break; break;
case ConformanceRequest_Payload_OneOfCase_ProtobufPayload: { case ConformanceRequest_Payload_OneOfCase_ProtobufPayload: {
if ([request.messageType isEqualToString:@"protobuf_test_messages.proto3.TestAllTypesProto3"]) { Class msgClass = nil;
NSError *error = nil; if ([request.messageType isEqual:@"protobuf_test_messages.proto3.TestAllTypesProto3"]) {
testMessage = [TestAllTypesProto3 parseFromData:request.protobufPayload msgClass = [Proto3TestAllTypesProto3 class];
error:&error]; } else if ([request.messageType isEqual:@"protobuf_test_messages.proto2.TestAllTypesProto2"]) {
if (!testMessage) { msgClass = [TestAllTypesProto2 class];
response.parseError =
[NSString stringWithFormat:@"Parse error: %@", error];
}
} else if ([request.messageType isEqualToString:@"protobuf_test_messages.proto2.TestAllTypesProto2"]) {
response.skipped = @"ObjC doesn't support proto2";
break;
} else { } else {
Die(@"Protobuf request doesn't have specific payload type"); Die(@"Protobuf request had an unknown message_type: %@", request.messageType);
break; }
NSError *error = nil;
testMessage = [msgClass parseFromData:request.protobufPayload error:&error];
if (!testMessage) {
response.parseError =
[NSString stringWithFormat:@"Parse error: %@", error];
} }
break; break;
} }
......
...@@ -142,7 +142,9 @@ namespace Conformance { ...@@ -142,7 +142,9 @@ namespace Conformance {
public const int MessageTypeFieldNumber = 4; public const int MessageTypeFieldNumber = 4;
private string messageType_ = ""; private string messageType_ = "";
/// <summary> /// <summary>
/// should be set to either "proto2" or "proto3" /// The full name for the test message to use; for the moment, either:
/// protobuf_test_messages.proto3.TestAllTypesProto3 or
/// protobuf_test_messages.proto2.TestAllTypesProto2.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string MessageType { public string MessageType {
......
...@@ -198,9 +198,9 @@ namespace ProtobufTestMessages.Proto3 { ...@@ -198,9 +198,9 @@ namespace ProtobufTestMessages.Proto3 {
"AjgBIjkKCk5lc3RlZEVudW0SBwoDRk9PEAASBwoDQkFSEAESBwoDQkFaEAIS", "AjgBIjkKCk5lc3RlZEVudW0SBwoDRk9PEAASBwoDQkFSEAESBwoDQkFaEAIS",
"EAoDTkVHEP///////////wFCDQoLb25lb2ZfZmllbGQiGwoORm9yZWlnbk1l", "EAoDTkVHEP///////////wFCDQoLb25lb2ZfZmllbGQiGwoORm9yZWlnbk1l",
"c3NhZ2USCQoBYxgBIAEoBSpACgtGb3JlaWduRW51bRIPCgtGT1JFSUdOX0ZP", "c3NhZ2USCQoBYxgBIAEoBSpACgtGb3JlaWduRW51bRIPCgtGT1JFSUdOX0ZP",
"TxAAEg8KC0ZPUkVJR05fQkFSEAESDwoLRk9SRUlHTl9CQVoQAkIvCihjb20u", "TxAAEg8KC0ZPUkVJR05fQkFSEAESDwoLRk9SRUlHTl9CQVoQAkI4Cihjb20u",
"Z29vZ2xlLnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8zSAH4AQFiBnBy", "Z29vZ2xlLnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8zSAH4AQGiAgZQ",
"b3RvMw==")); "cm90bzNiBnByb3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.FieldMaskReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor, }, new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.FieldMaskReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::ProtobufTestMessages.Proto3.ForeignEnum), }, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(new[] {typeof(global::ProtobufTestMessages.Proto3.ForeignEnum), }, new pbr::GeneratedClrTypeInfo[] {
......
...@@ -156,3 +156,4 @@ There are miscellaneous other things you may find useful as a Protocol Buffers d ...@@ -156,3 +156,4 @@ There are miscellaneous other things you may find useful as a Protocol Buffers d
* [Linter for .proto files](https://github.com/ckaznocha/protoc-gen-lint) * [Linter for .proto files](https://github.com/ckaznocha/protoc-gen-lint)
* [Protocol Buffers Dynamic Schema - create protobuf schemas programmatically (Java)] (https://github.com/os72/protobuf-dynamic) * [Protocol Buffers Dynamic Schema - create protobuf schemas programmatically (Java)] (https://github.com/os72/protobuf-dynamic)
* [Make protoc plugins in NodeJS](https://github.com/konsumer/node-protoc-plugin) * [Make protoc plugins in NodeJS](https://github.com/konsumer/node-protoc-plugin)
* [ProfaneDB - A Protocol Buffers database](https://profanedb.gitlab.io)
...@@ -51,7 +51,7 @@ list_people_gotest: list_people.go list_people_go ...@@ -51,7 +51,7 @@ list_people_gotest: list_people.go list_people_go
go test list_people.go list_people_test.go go test list_people.go list_people_test.go
javac_middleman: AddPerson.java ListPeople.java protoc_middleman javac_middleman: AddPerson.java ListPeople.java protoc_middleman
javac AddPerson.java ListPeople.java com/example/tutorial/AddressBookProtos.java javac -cp ../java/core/target/*.jar AddPerson.java ListPeople.java com/example/tutorial/AddressBookProtos.java
@touch javac_middleman @touch javac_middleman
add_person_java: javac_middleman add_person_java: javac_middleman
......
...@@ -28,6 +28,13 @@ These examples are part of the Protocol Buffers tutorial, located at: ...@@ -28,6 +28,13 @@ These examples are part of the Protocol Buffers tutorial, located at:
"-lpthread" from the linker commands (perhaps replacing it with something else). "-lpthread" from the linker commands (perhaps replacing it with something else).
We didn't do this automatically because we wanted to keep the example simple. We didn't do this automatically because we wanted to keep the example simple.
## Java ##
protobuf-java-*.jar can be generated by:
cd ../java
mvn package
and will be used by "make java"
## Go ## ## Go ##
The Go example requires a plugin to the protocol buffer compiler, so it is not The Go example requires a plugin to the protocol buffer compiler, so it is not
......
...@@ -182,7 +182,7 @@ RUN cd /tmp && \ ...@@ -182,7 +182,7 @@ RUN cd /tmp && \
rm -rf protobuf && \ rm -rf protobuf && \
git clone https://github.com/google/protobuf.git && \ git clone https://github.com/google/protobuf.git && \
cd protobuf && \ cd protobuf && \
git reset --hard 8d97b3d8b5a33650e822460b3b561802c969e86e && \ git reset --hard 49b44bff2b6257a119f9c6a342d6151c736586b8 && \
cd php && \ cd php && \
ln -sfn /usr/local/php-5.5/bin/php /usr/bin/php && \ ln -sfn /usr/local/php-5.5/bin/php /usr/bin/php && \
ln -sfn /usr/local/php-5.5/bin/php-config /usr/bin/php-config && \ ln -sfn /usr/local/php-5.5/bin/php-config /usr/bin/php-config && \
......
...@@ -98,7 +98,7 @@ RUN composer config -g -- secure-http false ...@@ -98,7 +98,7 @@ RUN composer config -g -- secure-http false
RUN cd /tmp && \ RUN cd /tmp && \
git clone https://github.com/google/protobuf.git && \ git clone https://github.com/google/protobuf.git && \
cd protobuf/php && \ cd protobuf/php && \
git reset --hard 8d97b3d8b5a33650e822460b3b561802c969e86e && \ git reset --hard 49b44bff2b6257a119f9c6a342d6151c736586b8 && \
ln -sfn /usr/local/php-5.5/bin/php /usr/bin/php && \ ln -sfn /usr/local/php-5.5/bin/php /usr/bin/php && \
ln -sfn /usr/local/php-5.5/bin/php-config /usr/bin/php-config && \ ln -sfn /usr/local/php-5.5/bin/php-config /usr/bin/php-config && \
ln -sfn /usr/local/php-5.5/bin/phpize /usr/bin/phpize && \ ln -sfn /usr/local/php-5.5/bin/phpize /usr/bin/phpize && \
......
...@@ -13,12 +13,8 @@ ...@@ -13,12 +13,8 @@
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Foo\\": "tests/generated/Foo", "Google\\Protobuf\\": "src/Google/Protobuf",
"Bar\\": "tests/generated/Bar", "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf",
"Google\\Protobuf\\": "tests/generated/Google/Protobuf",
"Google\\Protobuf\\Internal\\": "src/Google/Protobuf/Internal",
"GPBMetadata\\": "tests/generated/GPBMetadata",
"GPBMetadata\\Google\\Protobuf\\Internal\\": "src/GPBMetadata/Google/Protobuf/Internal",
"": "tests/generated" "": "tests/generated"
} }
} }
......
This diff is collapsed.
...@@ -716,7 +716,7 @@ static void *oneofbytes_handler(void *closure, ...@@ -716,7 +716,7 @@ static void *oneofbytes_handler(void *closure,
DEREF(message_data(msg), oneofdata->case_ofs, uint32_t) = DEREF(message_data(msg), oneofdata->case_ofs, uint32_t) =
oneofdata->oneof_case_num; oneofdata->oneof_case_num;
DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*) = DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*) =
&(msg->std.properties_table)[oneofdata->property_ofs]; OBJ_PROP(&msg->std, oneofdata->property_ofs);
return empty_php_string(DEREF( return empty_php_string(DEREF(
message_data(msg), oneofdata->ofs, CACHED_VALUE*)); message_data(msg), oneofdata->ofs, CACHED_VALUE*));
...@@ -747,7 +747,7 @@ static void* oneofsubmsg_handler(void* closure, const void* hd) { ...@@ -747,7 +747,7 @@ static void* oneofsubmsg_handler(void* closure, const void* hd) {
// Create new message. // Create new message.
DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*) = DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*) =
&(msg->std.properties_table)[oneofdata->property_ofs]; OBJ_PROP(&msg->std, oneofdata->property_ofs);
ZVAL_OBJ(CACHED_PTR_TO_ZVAL_PTR( ZVAL_OBJ(CACHED_PTR_TO_ZVAL_PTR(
DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*)), DEREF(message_data(msg), oneofdata->ofs, CACHED_VALUE*)),
subklass->create_object(subklass TSRMLS_CC)); subklass->create_object(subklass TSRMLS_CC));
......
...@@ -172,7 +172,7 @@ static zval* message_get_property(zval* object, zval* member, int type, ...@@ -172,7 +172,7 @@ static zval* message_get_property(zval* object, zval* member, int type,
zend_get_property_info(Z_OBJCE_P(object), member, true TSRMLS_CC); zend_get_property_info(Z_OBJCE_P(object), member, true TSRMLS_CC);
return layout_get( return layout_get(
self->descriptor->layout, message_data(self), field, self->descriptor->layout, message_data(self), field,
&Z_OBJ_P(object)->properties_table[property_info->offset] TSRMLS_CC); OBJ_PROP(Z_OBJ_P(object), property_info->offset) TSRMLS_CC);
#else #else
property_info = property_info =
zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(member), true); zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(member), true);
...@@ -222,7 +222,7 @@ void custom_data_init(const zend_class_entry* ce, ...@@ -222,7 +222,7 @@ void custom_data_init(const zend_class_entry* ce,
// case a collection happens during object creation in layout_init(). // case a collection happens during object creation in layout_init().
intern->descriptor = desc; intern->descriptor = desc;
layout_init(desc->layout, message_data(intern), layout_init(desc->layout, message_data(intern),
intern->std.properties_table PHP_PROTO_TSRMLS_CC); &intern->std PHP_PROTO_TSRMLS_CC);
} }
void build_class_from_descriptor( void build_class_from_descriptor(
...@@ -265,8 +265,7 @@ PHP_METHOD(Message, clear) { ...@@ -265,8 +265,7 @@ PHP_METHOD(Message, clear) {
zend_class_entry* ce = desc->klass; zend_class_entry* ce = desc->klass;
object_properties_init(&msg->std, ce); object_properties_init(&msg->std, ce);
layout_init(desc->layout, message_data(msg), layout_init(desc->layout, message_data(msg), &msg->std TSRMLS_CC);
msg->std.properties_table TSRMLS_CC);
} }
PHP_METHOD(Message, mergeFrom) { PHP_METHOD(Message, mergeFrom) {
...@@ -301,7 +300,8 @@ PHP_METHOD(Message, readOneof) { ...@@ -301,7 +300,8 @@ PHP_METHOD(Message, readOneof) {
int property_cache_index = int property_cache_index =
msg->descriptor->layout->fields[upb_fielddef_index(field)].cache_index; msg->descriptor->layout->fields[upb_fielddef_index(field)].cache_index;
zval* property_ptr = OBJ_PROP(Z_OBJ_P(getThis()), property_cache_index); zval* property_ptr = CACHED_PTR_TO_ZVAL_PTR(
OBJ_PROP(Z_OBJ_P(getThis()), property_cache_index));
// Unlike singular fields, oneof fields share cached property. So we cannot // Unlike singular fields, oneof fields share cached property. So we cannot
// let lay_get modify the cached property. Instead, we pass in the return // let lay_get modify the cached property. Instead, we pass in the return
......
...@@ -63,7 +63,6 @@ static void* get_from_table(const HashTable* t, const void* def) { ...@@ -63,7 +63,6 @@ static void* get_from_table(const HashTable* t, const void* def) {
void** value; void** value;
if (php_proto_zend_hash_index_find_mem(t, (zend_ulong)def, (void**)&value) == if (php_proto_zend_hash_index_find_mem(t, (zend_ulong)def, (void**)&value) ==
FAILURE) { FAILURE) {
zend_error(E_ERROR, "PHP object not found for given definition.\n");
return NULL; return NULL;
} }
return *value; return *value;
...@@ -166,6 +165,7 @@ static PHP_RINIT_FUNCTION(protobuf) { ...@@ -166,6 +165,7 @@ static PHP_RINIT_FUNCTION(protobuf) {
generated_pool = NULL; generated_pool = NULL;
generated_pool_php = NULL; generated_pool_php = NULL;
internal_generated_pool_php = NULL;
return 0; return 0;
} }
...@@ -182,21 +182,40 @@ static PHP_RSHUTDOWN_FUNCTION(protobuf) { ...@@ -182,21 +182,40 @@ static PHP_RSHUTDOWN_FUNCTION(protobuf) {
zval_dtor(generated_pool_php); zval_dtor(generated_pool_php);
FREE_ZVAL(generated_pool_php); FREE_ZVAL(generated_pool_php);
} }
if (internal_generated_pool_php != NULL) {
zval_dtor(internal_generated_pool_php);
FREE_ZVAL(internal_generated_pool_php);
}
#else
if (generated_pool_php != NULL) {
zval tmp;
ZVAL_OBJ(&tmp, generated_pool_php);
zval_dtor(&tmp);
}
if (internal_generated_pool_php != NULL) {
zval tmp;
ZVAL_OBJ(&tmp, internal_generated_pool_php);
zval_dtor(&tmp);
}
#endif #endif
return 0; return 0;
} }
static PHP_MINIT_FUNCTION(protobuf) { static PHP_MINIT_FUNCTION(protobuf) {
descriptor_pool_init(TSRMLS_C);
descriptor_init(TSRMLS_C);
enum_descriptor_init(TSRMLS_C);
enum_value_descriptor_init(TSRMLS_C);
field_descriptor_init(TSRMLS_C);
gpb_type_init(TSRMLS_C);
internal_descriptor_pool_init(TSRMLS_C);
map_field_init(TSRMLS_C); map_field_init(TSRMLS_C);
map_field_iter_init(TSRMLS_C); map_field_iter_init(TSRMLS_C);
message_init(TSRMLS_C);
oneof_descriptor_init(TSRMLS_C);
repeated_field_init(TSRMLS_C); repeated_field_init(TSRMLS_C);
repeated_field_iter_init(TSRMLS_C); repeated_field_iter_init(TSRMLS_C);
gpb_type_init(TSRMLS_C);
message_init(TSRMLS_C);
descriptor_pool_init(TSRMLS_C);
descriptor_init(TSRMLS_C);
enum_descriptor_init(TSRMLS_C);
util_init(TSRMLS_C); util_init(TSRMLS_C);
return 0; return 0;
......
...@@ -151,7 +151,7 @@ ...@@ -151,7 +151,7 @@
#define PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL EG(uninitialized_zval_ptr) #define PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL EG(uninitialized_zval_ptr)
#define OBJ_PROP(PROPERTIES, OFFSET) (PROPERTIES)->properties_table[OFFSET] #define OBJ_PROP(OBJECT, OFFSET) &((OBJECT)->properties_table[OFFSET])
#define php_proto_zval_ptr_dtor(zval_ptr) \ #define php_proto_zval_ptr_dtor(zval_ptr) \
zval_ptr_dtor(&(zval_ptr)) zval_ptr_dtor(&(zval_ptr))
...@@ -185,6 +185,7 @@ ...@@ -185,6 +185,7 @@
#define HASHTABLE_VALUE_DTOR ZVAL_PTR_DTOR #define HASHTABLE_VALUE_DTOR ZVAL_PTR_DTOR
#define PHP_PROTO_HASHTABLE_VALUE zval* #define PHP_PROTO_HASHTABLE_VALUE zval*
#define HASHTABLE_VALUE_CE(val) Z_OBJCE_P(val)
#define CREATE_HASHTABLE_VALUE(OBJ, WRAPPED_OBJ, OBJ_TYPE, OBJ_CLASS_ENTRY) \ #define CREATE_HASHTABLE_VALUE(OBJ, WRAPPED_OBJ, OBJ_TYPE, OBJ_CLASS_ENTRY) \
OBJ_TYPE* OBJ; \ OBJ_TYPE* OBJ; \
...@@ -369,6 +370,7 @@ static inline int php_proto_zend_hash_get_current_data_ex(HashTable* ht, ...@@ -369,6 +370,7 @@ static inline int php_proto_zend_hash_get_current_data_ex(HashTable* ht,
#define HASHTABLE_VALUE_DTOR php_proto_hashtable_descriptor_release #define HASHTABLE_VALUE_DTOR php_proto_hashtable_descriptor_release
#define PHP_PROTO_HASHTABLE_VALUE zend_object* #define PHP_PROTO_HASHTABLE_VALUE zend_object*
#define HASHTABLE_VALUE_CE(val) val->ce
#define CREATE_HASHTABLE_VALUE(OBJ, WRAPPED_OBJ, OBJ_TYPE, OBJ_CLASS_ENTRY) \ #define CREATE_HASHTABLE_VALUE(OBJ, WRAPPED_OBJ, OBJ_TYPE, OBJ_CLASS_ENTRY) \
OBJ_TYPE* OBJ; \ OBJ_TYPE* OBJ; \
...@@ -397,7 +399,9 @@ static inline int php_proto_zend_lookup_class( ...@@ -397,7 +399,9 @@ static inline int php_proto_zend_lookup_class(
struct DescriptorPool; struct DescriptorPool;
struct Descriptor; struct Descriptor;
struct EnumDescriptor; struct EnumDescriptor;
struct EnumValueDescriptor;
struct FieldDescriptor; struct FieldDescriptor;
struct InternalDescriptorPool;
struct MessageField; struct MessageField;
struct MessageHeader; struct MessageHeader;
struct MessageLayout; struct MessageLayout;
...@@ -410,7 +414,9 @@ struct Oneof; ...@@ -410,7 +414,9 @@ struct Oneof;
typedef struct DescriptorPool DescriptorPool; typedef struct DescriptorPool DescriptorPool;
typedef struct Descriptor Descriptor; typedef struct Descriptor Descriptor;
typedef struct EnumDescriptor EnumDescriptor; typedef struct EnumDescriptor EnumDescriptor;
typedef struct EnumValueDescriptor EnumValueDescriptor;
typedef struct FieldDescriptor FieldDescriptor; typedef struct FieldDescriptor FieldDescriptor;
typedef struct InternalDescriptorPool InternalDescriptorPool;
typedef struct MessageField MessageField; typedef struct MessageField MessageField;
typedef struct MessageHeader MessageHeader; typedef struct MessageHeader MessageHeader;
typedef struct MessageLayout MessageLayout; typedef struct MessageLayout MessageLayout;
...@@ -431,9 +437,12 @@ ZEND_END_MODULE_GLOBALS(protobuf) ...@@ -431,9 +437,12 @@ ZEND_END_MODULE_GLOBALS(protobuf)
void descriptor_init(TSRMLS_D); void descriptor_init(TSRMLS_D);
void enum_descriptor_init(TSRMLS_D); void enum_descriptor_init(TSRMLS_D);
void descriptor_pool_init(TSRMLS_D); void descriptor_pool_init(TSRMLS_D);
void internal_descriptor_pool_init(TSRMLS_D);
void field_descriptor_init(TSRMLS_D);
void gpb_type_init(TSRMLS_D); void gpb_type_init(TSRMLS_D);
void map_field_init(TSRMLS_D); void map_field_init(TSRMLS_D);
void map_field_iter_init(TSRMLS_D); void map_field_iter_init(TSRMLS_D);
void oneof_descriptor_init(TSRMLS_D);
void repeated_field_init(TSRMLS_D); void repeated_field_init(TSRMLS_D);
void repeated_field_iter_init(TSRMLS_D); void repeated_field_iter_init(TSRMLS_D);
void util_init(TSRMLS_D); void util_init(TSRMLS_D);
...@@ -458,22 +467,34 @@ extern zend_class_entry* repeated_field_type; ...@@ -458,22 +467,34 @@ extern zend_class_entry* repeated_field_type;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
PHP_PROTO_WRAP_OBJECT_START(DescriptorPool) PHP_PROTO_WRAP_OBJECT_START(DescriptorPool)
InternalDescriptorPool* intern;
PHP_PROTO_WRAP_OBJECT_END
PHP_METHOD(DescriptorPool, getGeneratedPool);
PHP_METHOD(DescriptorPool, getDescriptorByClassName);
PHP_METHOD(DescriptorPool, getEnumDescriptorByClassName);
PHP_PROTO_WRAP_OBJECT_START(InternalDescriptorPool)
upb_symtab* symtab; upb_symtab* symtab;
HashTable* pending_list; HashTable* pending_list;
PHP_PROTO_WRAP_OBJECT_END PHP_PROTO_WRAP_OBJECT_END
PHP_METHOD(DescriptorPool, getGeneratedPool); PHP_METHOD(InternalDescriptorPool, getGeneratedPool);
PHP_METHOD(DescriptorPool, internalAddGeneratedFile); PHP_METHOD(InternalDescriptorPool, internalAddGeneratedFile);
// wrapper of generated pool // wrapper of generated pool
#if PHP_MAJOR_VERSION < 7 #if PHP_MAJOR_VERSION < 7
extern zval* generated_pool_php; extern zval* generated_pool_php;
extern zval* internal_generated_pool_php;
void descriptor_pool_free(void* object TSRMLS_DC); void descriptor_pool_free(void* object TSRMLS_DC);
void internal_descriptor_pool_free(void* object TSRMLS_DC);
#else #else
extern zend_object *generated_pool_php; extern zend_object *generated_pool_php;
extern zend_object *internal_generated_pool_php;
void descriptor_pool_free(zend_object* object); void descriptor_pool_free(zend_object* object);
void internal_descriptor_pool_free(zend_object* object);
#endif #endif
extern DescriptorPool* generated_pool; // The actual generated pool extern InternalDescriptorPool* generated_pool; // The actual generated pool
PHP_PROTO_WRAP_OBJECT_START(Descriptor) PHP_PROTO_WRAP_OBJECT_START(Descriptor)
const upb_msgdef* msgdef; const upb_msgdef* msgdef;
...@@ -487,6 +508,13 @@ PHP_PROTO_WRAP_OBJECT_START(Descriptor) ...@@ -487,6 +508,13 @@ PHP_PROTO_WRAP_OBJECT_START(Descriptor)
const upb_handlers* json_serialize_handlers_preserve; const upb_handlers* json_serialize_handlers_preserve;
PHP_PROTO_WRAP_OBJECT_END PHP_PROTO_WRAP_OBJECT_END
PHP_METHOD(Descriptor, getClass);
PHP_METHOD(Descriptor, getFullName);
PHP_METHOD(Descriptor, getField);
PHP_METHOD(Descriptor, getFieldCount);
PHP_METHOD(Descriptor, getOneofDecl);
PHP_METHOD(Descriptor, getOneofDeclCount);
extern zend_class_entry* descriptor_type; extern zend_class_entry* descriptor_type;
void descriptor_name_set(Descriptor *desc, const char *name); void descriptor_name_set(Descriptor *desc, const char *name);
...@@ -495,14 +523,36 @@ PHP_PROTO_WRAP_OBJECT_START(FieldDescriptor) ...@@ -495,14 +523,36 @@ PHP_PROTO_WRAP_OBJECT_START(FieldDescriptor)
const upb_fielddef* fielddef; const upb_fielddef* fielddef;
PHP_PROTO_WRAP_OBJECT_END PHP_PROTO_WRAP_OBJECT_END
PHP_METHOD(FieldDescriptor, getName);
PHP_METHOD(FieldDescriptor, getNumber);
PHP_METHOD(FieldDescriptor, getLabel);
PHP_METHOD(FieldDescriptor, getType);
PHP_METHOD(FieldDescriptor, isMap);
PHP_METHOD(FieldDescriptor, getEnumType);
PHP_METHOD(FieldDescriptor, getMessageType);
extern zend_class_entry* field_descriptor_type;
PHP_PROTO_WRAP_OBJECT_START(EnumDescriptor) PHP_PROTO_WRAP_OBJECT_START(EnumDescriptor)
const upb_enumdef* enumdef; const upb_enumdef* enumdef;
zend_class_entry* klass; // begins as NULL zend_class_entry* klass; // begins as NULL
// VALUE module; // begins as nil
PHP_PROTO_WRAP_OBJECT_END PHP_PROTO_WRAP_OBJECT_END
PHP_METHOD(EnumDescriptor, getValue);
PHP_METHOD(EnumDescriptor, getValueCount);
extern zend_class_entry* enum_descriptor_type; extern zend_class_entry* enum_descriptor_type;
PHP_PROTO_WRAP_OBJECT_START(EnumValueDescriptor)
const char* name;
int32_t number;
PHP_PROTO_WRAP_OBJECT_END
PHP_METHOD(EnumValueDescriptor, getName);
PHP_METHOD(EnumValueDescriptor, getNumber);
extern zend_class_entry* enum_value_descriptor_type;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Message class creation. // Message class creation.
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -594,7 +644,7 @@ PHP_PROTO_WRAP_OBJECT_END ...@@ -594,7 +644,7 @@ PHP_PROTO_WRAP_OBJECT_END
MessageLayout* create_layout(const upb_msgdef* msgdef); MessageLayout* create_layout(const upb_msgdef* msgdef);
void layout_init(MessageLayout* layout, void* storage, void layout_init(MessageLayout* layout, void* storage,
CACHED_VALUE* properties_table PHP_PROTO_TSRMLS_DC); zend_object* object PHP_PROTO_TSRMLS_DC);
zval* layout_get(MessageLayout* layout, const void* storage, zval* layout_get(MessageLayout* layout, const void* storage,
const upb_fielddef* field, CACHED_VALUE* cache TSRMLS_DC); const upb_fielddef* field, CACHED_VALUE* cache TSRMLS_DC);
void layout_set(MessageLayout* layout, MessageHeader* header, void layout_set(MessageLayout* layout, MessageHeader* header,
...@@ -819,6 +869,12 @@ PHP_PROTO_WRAP_OBJECT_START(Oneof) ...@@ -819,6 +869,12 @@ PHP_PROTO_WRAP_OBJECT_START(Oneof)
char value[NATIVE_SLOT_MAX_SIZE]; char value[NATIVE_SLOT_MAX_SIZE];
PHP_PROTO_WRAP_OBJECT_END PHP_PROTO_WRAP_OBJECT_END
PHP_METHOD(Oneof, getName);
PHP_METHOD(Oneof, getField);
PHP_METHOD(Oneof, getFieldCount);
extern zend_class_entry* oneof_descriptor_type;
// Oneof case slot value to indicate that no oneof case is set. The value `0` is // Oneof case slot value to indicate that no oneof case is set. The value `0` is
// safe because field numbers are used as case identifiers, and no field can // safe because field numbers are used as case identifiers, and no field can
// have a number of 0. // have a number of 0.
......
...@@ -275,9 +275,6 @@ void native_slot_init(upb_fieldtype_t type, void* memory, CACHED_VALUE* cache) { ...@@ -275,9 +275,6 @@ void native_slot_init(upb_fieldtype_t type, void* memory, CACHED_VALUE* cache) {
break; break;
case UPB_TYPE_STRING: case UPB_TYPE_STRING:
case UPB_TYPE_BYTES: case UPB_TYPE_BYTES:
DEREF(memory, CACHED_VALUE*) = cache;
ZVAL_EMPTY_STRING(CACHED_PTR_TO_ZVAL_PTR(cache));
break;
case UPB_TYPE_MESSAGE: case UPB_TYPE_MESSAGE:
DEREF(memory, CACHED_VALUE*) = cache; DEREF(memory, CACHED_VALUE*) = cache;
break; break;
...@@ -586,6 +583,8 @@ MessageLayout* create_layout(const upb_msgdef* msgdef) { ...@@ -586,6 +583,8 @@ MessageLayout* create_layout(const upb_msgdef* msgdef) {
upb_msg_oneof_iter oit; upb_msg_oneof_iter oit;
size_t off = 0; size_t off = 0;
int i = 0; int i = 0;
TSRMLS_FETCH();
Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(msgdef));
layout->fields = ALLOC_N(MessageField, nfields); layout->fields = ALLOC_N(MessageField, nfields);
...@@ -612,7 +611,37 @@ MessageLayout* create_layout(const upb_msgdef* msgdef) { ...@@ -612,7 +611,37 @@ MessageLayout* create_layout(const upb_msgdef* msgdef) {
layout->fields[upb_fielddef_index(field)].offset = off; layout->fields[upb_fielddef_index(field)].offset = off;
layout->fields[upb_fielddef_index(field)].case_offset = layout->fields[upb_fielddef_index(field)].case_offset =
MESSAGE_FIELD_NO_CASE; MESSAGE_FIELD_NO_CASE;
layout->fields[upb_fielddef_index(field)].cache_index = i++;
const char* fieldname = upb_fielddef_name(field);
#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
zend_class_entry* old_scope = EG(scope);
EG(scope) = desc->klass;
#else
zend_class_entry* old_scope = EG(fake_scope);
EG(fake_scope) = desc->klass;
#endif
#if PHP_MAJOR_VERSION < 7
zval member;
ZVAL_STRINGL(&member, fieldname, strlen(fieldname), 0);
zend_property_info* property_info =
zend_get_property_info(desc->klass, &member, true TSRMLS_CC);
#else
zend_string* member = zend_string_init(fieldname, strlen(fieldname), 1);
zend_property_info* property_info =
zend_get_property_info(desc->klass, member, true);
zend_string_release(member);
#endif
#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
EG(scope) = old_scope;
#else
EG(fake_scope) = old_scope;
#endif
layout->fields[upb_fielddef_index(field)].cache_index =
property_info->offset;
off += field_size; off += field_size;
} }
...@@ -640,11 +669,40 @@ MessageLayout* create_layout(const upb_msgdef* msgdef) { ...@@ -640,11 +669,40 @@ MessageLayout* create_layout(const upb_msgdef* msgdef) {
// Align the offset . // Align the offset .
off = align_up_to( off, field_size); off = align_up_to( off, field_size);
// Assign all fields in the oneof this same offset. // Assign all fields in the oneof this same offset.
const char* oneofname = upb_oneofdef_name(oneof);
for (upb_oneof_begin(&fit, oneof); !upb_oneof_done(&fit); for (upb_oneof_begin(&fit, oneof); !upb_oneof_done(&fit);
upb_oneof_next(&fit)) { upb_oneof_next(&fit)) {
const upb_fielddef* field = upb_oneof_iter_field(&fit); const upb_fielddef* field = upb_oneof_iter_field(&fit);
layout->fields[upb_fielddef_index(field)].offset = off; layout->fields[upb_fielddef_index(field)].offset = off;
layout->fields[upb_fielddef_index(field)].cache_index = i;
#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
zend_class_entry* old_scope = EG(scope);
EG(scope) = desc->klass;
#else
zend_class_entry* old_scope = EG(fake_scope);
EG(fake_scope) = desc->klass;
#endif
#if PHP_MAJOR_VERSION < 7
zval member;
ZVAL_STRINGL(&member, oneofname, strlen(oneofname), 0);
zend_property_info* property_info =
zend_get_property_info(desc->klass, &member, true TSRMLS_CC);
#else
zend_string* member = zend_string_init(oneofname, strlen(oneofname), 1);
zend_property_info* property_info =
zend_get_property_info(desc->klass, member, true);
zend_string_release(member);
#endif
#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
EG(scope) = old_scope;
#else
EG(fake_scope) = old_scope;
#endif
layout->fields[upb_fielddef_index(field)].cache_index =
property_info->offset;
} }
i++; i++;
off += field_size; off += field_size;
...@@ -683,7 +741,7 @@ void free_layout(MessageLayout* layout) { ...@@ -683,7 +741,7 @@ void free_layout(MessageLayout* layout) {
} }
void layout_init(MessageLayout* layout, void* storage, void layout_init(MessageLayout* layout, void* storage,
CACHED_VALUE* properties_table PHP_PROTO_TSRMLS_DC) { zend_object* object PHP_PROTO_TSRMLS_DC) {
int i; int i;
upb_msg_field_iter it; upb_msg_field_iter it;
for (upb_msg_field_begin(&it, layout->msgdef), i = 0; !upb_msg_field_done(&it); for (upb_msg_field_begin(&it, layout->msgdef), i = 0; !upb_msg_field_done(&it);
...@@ -692,22 +750,7 @@ void layout_init(MessageLayout* layout, void* storage, ...@@ -692,22 +750,7 @@ void layout_init(MessageLayout* layout, void* storage,
void* memory = slot_memory(layout, storage, field); void* memory = slot_memory(layout, storage, field);
uint32_t* oneof_case = slot_oneof_case(layout, storage, field); uint32_t* oneof_case = slot_oneof_case(layout, storage, field);
int cache_index = slot_property_cache(layout, storage, field); int cache_index = slot_property_cache(layout, storage, field);
CACHED_VALUE* property_ptr = &properties_table[cache_index]; CACHED_VALUE* property_ptr = OBJ_PROP(object, cache_index);
// Clean up initial value by generated code. In the generated code of
// previous versions, each php field is given an initial value. However, the
// order to initialize these fields may not be consistent with the order of
// upb fields.
if (Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR(property_ptr)) == IS_STRING) {
#if PHP_MAJOR_VERSION < 7
if (!IS_INTERNED(Z_STRVAL_PP(property_ptr))) {
FREE(Z_STRVAL_PP(property_ptr));
}
#else
zend_string_release(Z_STR_P(property_ptr));
#endif
}
ZVAL_NULL(CACHED_PTR_TO_ZVAL_PTR(property_ptr));
if (upb_fielddef_containingoneof(field)) { if (upb_fielddef_containingoneof(field)) {
memset(memory, 0, NATIVE_SLOT_MAX_SIZE); memset(memory, 0, NATIVE_SLOT_MAX_SIZE);
...@@ -797,7 +840,7 @@ void layout_set(MessageLayout* layout, MessageHeader* header, ...@@ -797,7 +840,7 @@ void layout_set(MessageLayout* layout, MessageHeader* header,
header->descriptor->layout->fields[upb_fielddef_index(field)] header->descriptor->layout->fields[upb_fielddef_index(field)]
.cache_index; .cache_index;
DEREF(memory, CACHED_VALUE*) = DEREF(memory, CACHED_VALUE*) =
&(header->std.properties_table)[property_cache_index]; OBJ_PROP(&header->std, property_cache_index);
memory = DEREF(memory, CACHED_VALUE*); memory = DEREF(memory, CACHED_VALUE*);
break; break;
} }
...@@ -964,7 +1007,7 @@ void layout_merge(MessageLayout* layout, MessageHeader* from, ...@@ -964,7 +1007,7 @@ void layout_merge(MessageLayout* layout, MessageHeader* from,
int property_cache_index = int property_cache_index =
layout->fields[upb_fielddef_index(field)].cache_index; layout->fields[upb_fielddef_index(field)].cache_index;
DEREF(to_memory, CACHED_VALUE*) = DEREF(to_memory, CACHED_VALUE*) =
&(to->std.properties_table)[property_cache_index]; OBJ_PROP(&to->std, property_cache_index);
break; break;
} }
default: default:
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<file>tests/generated_phpdoc_test.php</file> <file>tests/generated_phpdoc_test.php</file>
<file>tests/map_field_test.php</file> <file>tests/map_field_test.php</file>
<file>tests/well_known_test.php</file> <file>tests/well_known_test.php</file>
<file>tests/descriptors_test.php</file>
<file>tests/generated_service_test.php</file> <file>tests/generated_service_test.php</file>
</testsuite> </testsuite>
</testsuites> </testsuites>
......
<?php
// Protocol Buffers - Google's data interchange format
// Copyright 2017 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Google\Protobuf;
use Google\Protobuf\Internal\GetPublicDescriptorTrait;
class Descriptor
{
use GetPublicDescriptorTrait;
private $internal_desc;
/**
* @internal
*/
public function __construct($internal_desc)
{
$this->internal_desc = $internal_desc;
}
/**
* @return string Full protobuf message name
*/
public function getFullName()
{
return trim($this->internal_desc->getFullName(), ".");
}
/**
* @return string PHP class name
*/
public function getClass()
{
return $this->internal_desc->getClass();
}
/**
* @param int $index Must be >= 0 and < getFieldCount()
* @return FieldDescriptor
*/
public function getField($index)
{
return $this->getPublicDescriptor($this->internal_desc->getFieldByIndex($index));
}
/**
* @return int Number of fields in message
*/
public function getFieldCount()
{
return count($this->internal_desc->getField());
}
/**
* @param int $index Must be >= 0 and < getOneofDeclCount()
* @return OneofDescriptor
*/
public function getOneofDecl($index)
{
return $this->getPublicDescriptor($this->internal_desc->getOneofDecl()[$index]);
}
/**
* @return int Number of oneofs in message
*/
public function getOneofDeclCount()
{
return count($this->internal_desc->getOneofDecl());
}
}
<?php
// Protocol Buffers - Google's data interchange format
// Copyright 2017 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Google\Protobuf;
class DescriptorPool
{
private static $pool;
private $internal_pool;
/**
* @return DescriptorPool
*/
public static function getGeneratedPool()
{
if (!isset(self::$pool)) {
self::$pool = new DescriptorPool(\Google\Protobuf\Internal\DescriptorPool::getGeneratedPool());
}
return self::$pool;
}
private function __construct($internal_pool)
{
$this->internal_pool = $internal_pool;
}
/**
* @param string $className A fully qualified protobuf class name
* @return Descriptor
*/
public function getDescriptorByClassName($className)
{
$desc = $this->internal_pool->getDescriptorByClassName($className);
return is_null($desc) ? null : $desc->getPublicDescriptor();
}
/**
* @param string $className A fully qualified protobuf class name
* @return EnumDescriptor
*/
public function getEnumDescriptorByClassName($className)
{
$desc = $this->internal_pool->getEnumDescriptorByClassName($className);
return is_null($desc) ? null : $desc->getPublicDescriptor();
}
}
<?php
// Protocol Buffers - Google's data interchange format
// Copyright 2017 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Google\Protobuf;
class EnumDescriptor
{
private $internal_desc;
/**
* @internal
*/
public function __construct($internal_desc)
{
$this->internal_desc = $internal_desc;
}
/**
* @return string Full protobuf message name
*/
public function getFullName()
{
return $this->internal_desc->getFullName();
}
/**
* @return string PHP class name
*/
public function getClass()
{
return $this->internal_desc->getClass();
}
/**
* @param int $index Must be >= 0 and < getValueCount()
* @return EnumValueDescriptor
*/
public function getValue($index)
{
return $this->internal_desc->getValueDescriptorByIndex($index);
}
/**
* @return int Number of values in enum
*/
public function getValueCount()
{
return $this->internal_desc->getValueCount();
}
}
...@@ -30,28 +30,33 @@ ...@@ -30,28 +30,33 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Google\Protobuf\Internal; namespace Google\Protobuf;
class EnumValueDescriptor class EnumValueDescriptor
{ {
private $name; private $name;
private $number; private $number;
public function setName($name) /**
* @internal
*/
public function __construct($name, $number)
{ {
$this->name = $name; $this->name = $name;
$this->number = $number;
} }
/**
* @return string
*/
public function getName() public function getName()
{ {
return $this->name; return $this->name;
} }
public function setNumber($number) /**
{ * @return int
$this->number = $number; */
}
public function getNumber() public function getNumber()
{ {
return $this->number; return $this->number;
......
<?php
// Protocol Buffers - Google's data interchange format
// Copyright 2017 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Google\Protobuf;
use Google\Protobuf\Internal\GetPublicDescriptorTrait;
use Google\Protobuf\Internal\GPBType;
class FieldDescriptor
{
use GetPublicDescriptorTrait;
private $internal_desc;
/**
* @internal
*/
public function __construct($internal_desc)
{
$this->internal_desc = $internal_desc;
}
/**
* @return string Field name
*/
public function getName()
{
return $this->internal_desc->getName();
}
/**
* @return int Protobuf field number
*/
public function getNumber()
{
return $this->internal_desc->getNumber();
}
/**
* @return int
*/
public function getLabel()
{
return $this->internal_desc->getLabel();
}
/**
* @return int
*/
public function getType()
{
return $this->internal_desc->getType();
}
/**
* @return Descriptor Returns a descriptor for the field type if the field type is a message, otherwise throws \Exception
* @throws \Exception
*/
public function getMessageType()
{
if ($this->getType() == GPBType::MESSAGE) {
return $this->getPublicDescriptor($this->internal_desc->getMessageType());
} else {
throw new \Exception("Cannot get message type for non-message field '" . $this->getName() . "'");
}
}
/**
* @return EnumDescriptor Returns an enum descriptor if the field type is an enum, otherwise throws \Exception
* @throws \Exception
*/
public function getEnumType()
{
if ($this->getType() == GPBType::ENUM) {
return $this->getPublicDescriptor($this->internal_desc->getEnumType());
} else {
throw new \Exception("Cannot get enum type for non-enum field '" . $this->getName() . "'");
}
}
/**
* @return boolean
*/
public function isMap()
{
return $this->internal_desc->isMap();
}
}
...@@ -34,17 +34,24 @@ namespace Google\Protobuf\Internal; ...@@ -34,17 +34,24 @@ namespace Google\Protobuf\Internal;
class Descriptor class Descriptor
{ {
use HasPublicDescriptorTrait;
private $full_name; private $full_name;
private $field = []; private $field = [];
private $json_to_field = []; private $json_to_field = [];
private $name_to_field = []; private $name_to_field = [];
private $index_to_field = [];
private $nested_type = []; private $nested_type = [];
private $enum_type = []; private $enum_type = [];
private $klass; private $klass;
private $options; private $options;
private $oneof_decl = []; private $oneof_decl = [];
public function __construct()
{
$this->public_desc = new \Google\Protobuf\Descriptor($this);
}
public function addOneofDecl($oneof) public function addOneofDecl($oneof)
{ {
$this->oneof_decl[] = $oneof; $this->oneof_decl[] = $oneof;
...@@ -70,6 +77,7 @@ class Descriptor ...@@ -70,6 +77,7 @@ class Descriptor
$this->field[$field->getNumber()] = $field; $this->field[$field->getNumber()] = $field;
$this->json_to_field[$field->getJsonName()] = $field; $this->json_to_field[$field->getJsonName()] = $field;
$this->name_to_field[$field->getName()] = $field; $this->name_to_field[$field->getName()] = $field;
$this->index_to_field[] = $field;
} }
public function getField() public function getField()
...@@ -124,6 +132,15 @@ class Descriptor ...@@ -124,6 +132,15 @@ class Descriptor
} }
} }
public function getFieldByIndex($index)
{
if (count($this->index_to_field) <= $index) {
return NULL;
} else {
return $this->index_to_field[$index];
}
}
public function setClass($klass) public function setClass($klass)
{ {
$this->klass = $klass; $this->klass = $klass;
...@@ -179,9 +196,11 @@ class Descriptor ...@@ -179,9 +196,11 @@ class Descriptor
} }
// Handle oneof fields. // Handle oneof fields.
$index = 0;
foreach ($proto->getOneofDecl() as $oneof_proto) { foreach ($proto->getOneofDecl() as $oneof_proto) {
$desc->addOneofDecl( $desc->addOneofDecl(
OneofDescriptor::buildFromProto($oneof_proto, $desc)); OneofDescriptor::buildFromProto($oneof_proto, $desc, $index));
$index++;
} }
return $desc; return $desc;
......
...@@ -61,17 +61,17 @@ class DescriptorPool ...@@ -61,17 +61,17 @@ class DescriptorPool
$files->mergeFromString($data); $files->mergeFromString($data);
$file = FileDescriptor::buildFromProto($files->getFile()[0]); $file = FileDescriptor::buildFromProto($files->getFile()[0]);
foreach ($file->getMessageType() as &$desc) { foreach ($file->getMessageType() as $desc) {
$this->addDescriptor($desc); $this->addDescriptor($desc);
} }
unset($desc); unset($desc);
foreach ($file->getEnumType() as &$desc) { foreach ($file->getEnumType() as $desc) {
$this->addEnumDescriptor($desc); $this->addEnumDescriptor($desc);
} }
unset($desc); unset($desc);
foreach ($file->getMessageType() as &$desc) { foreach ($file->getMessageType() as $desc) {
$this->crossLink($desc); $this->crossLink($desc);
} }
unset($desc); unset($desc);
...@@ -129,9 +129,9 @@ class DescriptorPool ...@@ -129,9 +129,9 @@ class DescriptorPool
return $this->class_to_enum_desc[$klass]; return $this->class_to_enum_desc[$klass];
} }
private function crossLink(&$desc) private function crossLink(Descriptor $desc)
{ {
foreach ($desc->getField() as &$field) { foreach ($desc->getField() as $field) {
switch ($field->getType()) { switch ($field->getType()) {
case GPBType::MESSAGE: case GPBType::MESSAGE:
$proto = $field->getMessageType(); $proto = $field->getMessageType();
...@@ -149,7 +149,7 @@ class DescriptorPool ...@@ -149,7 +149,7 @@ class DescriptorPool
} }
unset($field); unset($field);
foreach ($desc->getNestedType() as &$nested_type) { foreach ($desc->getNestedType() as $nested_type) {
$this->crossLink($nested_type); $this->crossLink($nested_type);
} }
unset($nested_type); unset($nested_type);
...@@ -157,7 +157,7 @@ class DescriptorPool ...@@ -157,7 +157,7 @@ class DescriptorPool
public function finish() public function finish()
{ {
foreach ($this->class_to_desc as $klass => &$desc) { foreach ($this->class_to_desc as $klass => $desc) {
$this->crossLink($desc); $this->crossLink($desc);
} }
unset($desc); unset($desc);
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
namespace Google\Protobuf\Internal; namespace Google\Protobuf\Internal;
use Google\Protobuf\Internal\EnumDescriptor; use Google\Protobuf\Internal\EnumDescriptor;
use Google\Protobuf\Internal\EnumValueDescriptor; use Google\Protobuf\EnumValueDescriptor;
class EnumBuilderContext class EnumBuilderContext
{ {
...@@ -51,7 +51,7 @@ class EnumBuilderContext ...@@ -51,7 +51,7 @@ class EnumBuilderContext
public function value($name, $number) public function value($name, $number)
{ {
$value = new EnumValueDescriptor(); $value = new EnumValueDescriptor($name, $number);
$this->descriptor->addValue($number, $value); $this->descriptor->addValue($number, $value);
return $this; return $this;
} }
......
...@@ -2,13 +2,22 @@ ...@@ -2,13 +2,22 @@
namespace Google\Protobuf\Internal; namespace Google\Protobuf\Internal;
use Google\Protobuf\EnumValueDescriptor;
class EnumDescriptor class EnumDescriptor
{ {
use HasPublicDescriptorTrait;
private $klass; private $klass;
private $full_name; private $full_name;
private $value; private $value;
private $name_to_value; private $name_to_value;
private $value_descriptor = [];
public function __construct()
{
$this->public_desc = new \Google\Protobuf\EnumDescriptor($this);
}
public function setFullName($full_name) public function setFullName($full_name)
{ {
...@@ -24,6 +33,7 @@ class EnumDescriptor ...@@ -24,6 +33,7 @@ class EnumDescriptor
{ {
$this->value[$number] = $value; $this->value[$number] = $value;
$this->name_to_value[$value->getName()] = $value; $this->name_to_value[$value->getName()] = $value;
$this->value_descriptor[] = new EnumValueDescriptor($value->getName(), $number);
} }
public function getValueByNumber($number) public function getValueByNumber($number)
...@@ -36,6 +46,16 @@ class EnumDescriptor ...@@ -36,6 +46,16 @@ class EnumDescriptor
return $this->name_to_value[$name]; return $this->name_to_value[$name];
} }
public function getValueDescriptorByIndex($index)
{
return $this->value_descriptor[$index];
}
public function getValueCount()
{
return count($this->value);
}
public function setClass($klass) public function setClass($klass)
{ {
$this->klass = $klass; $this->klass = $klass;
......
...@@ -34,6 +34,7 @@ namespace Google\Protobuf\Internal; ...@@ -34,6 +34,7 @@ namespace Google\Protobuf\Internal;
class FieldDescriptor class FieldDescriptor
{ {
use HasPublicDescriptorTrait;
private $name; private $name;
private $json_name; private $json_name;
...@@ -48,6 +49,11 @@ class FieldDescriptor ...@@ -48,6 +49,11 @@ class FieldDescriptor
private $is_map; private $is_map;
private $oneof_index = -1; private $oneof_index = -1;
public function __construct()
{
$this->public_desc = new \Google\Protobuf\FieldDescriptor($this);
}
public function setOneofIndex($index) public function setOneofIndex($index)
{ {
$this->oneof_index = $index; $this->oneof_index = $index;
......
...@@ -38,7 +38,7 @@ use Google\Protobuf\Internal\MapField; ...@@ -38,7 +38,7 @@ use Google\Protobuf\Internal\MapField;
class GPBUtil class GPBUtil
{ {
public function divideInt64ToInt32($value, &$high, &$low, $trim = false) public static function divideInt64ToInt32($value, &$high, &$low, $trim = false)
{ {
$isNeg = (bccomp($value, 0) < 0); $isNeg = (bccomp($value, 0) < 0);
if ($isNeg) { if ($isNeg) {
......
<?php
// Protocol Buffers - Google's data interchange format
// Copyright 2017 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Google\Protobuf\Internal;
trait GetPublicDescriptorTrait
{
private function getPublicDescriptor($desc)
{
return is_null($desc) ? null : $desc->getPublicDescriptor();
}
}
<?php
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Google\Protobuf\Internal;
trait HasPublicDescriptorTrait
{
private $public_desc;
public function getPublicDescriptor()
{
return $this->public_desc;
}
}
...@@ -39,7 +39,7 @@ class MapEntry extends Message ...@@ -39,7 +39,7 @@ class MapEntry extends Message
public $key; public $key;
public $value; public $value;
public function setKey(&$key) { public function setKey($key) {
$this->key = $key; $this->key = $key;
} }
...@@ -47,7 +47,7 @@ class MapEntry extends Message ...@@ -47,7 +47,7 @@ class MapEntry extends Message
return $this->key; return $this->key;
} }
public function setValue(&$value) { public function setValue($value) {
$this->value = $value; $this->value = $value;
} }
......
...@@ -841,7 +841,6 @@ class Message ...@@ -841,7 +841,6 @@ class Message
if (is_null($value)) { if (is_null($value)) {
continue; continue;
} }
$getter = $field->getGetter();
$key_field = $field->getMessageType()->getFieldByNumber(1); $key_field = $field->getMessageType()->getFieldByNumber(1);
$value_field = $field->getMessageType()->getFieldByNumber(2); $value_field = $field->getMessageType()->getFieldByNumber(2);
foreach ($value as $tmp_key => $tmp_value) { foreach ($value as $tmp_key => $tmp_value) {
...@@ -858,13 +857,12 @@ class Message ...@@ -858,13 +857,12 @@ class Message
$this->convertJsonValueToProtoValue( $this->convertJsonValueToProtoValue(
$tmp_value, $tmp_value,
$value_field); $value_field);
$this->$getter()[$proto_key] = $proto_value; self::kvUpdateHelper($field, $proto_key, $proto_value);
} }
} else if ($field->isRepeated()) { } else if ($field->isRepeated()) {
if (is_null($value)) { if (is_null($value)) {
continue; continue;
} }
$getter = $field->getGetter();
foreach ($value as $tmp) { foreach ($value as $tmp) {
if (is_null($tmp)) { if (is_null($tmp)) {
throw new \Exception( throw new \Exception(
...@@ -872,7 +870,7 @@ class Message ...@@ -872,7 +870,7 @@ class Message
} }
$proto_value = $proto_value =
$this->convertJsonValueToProtoValue($tmp, $field); $this->convertJsonValueToProtoValue($tmp, $field);
$this->$getter()[] = $proto_value; self::appendHelper($field, $proto_value);
} }
} else { } else {
$setter = $field->getSetter(); $setter = $field->getSetter();
......
...@@ -34,10 +34,16 @@ namespace Google\Protobuf\Internal; ...@@ -34,10 +34,16 @@ namespace Google\Protobuf\Internal;
class OneofDescriptor class OneofDescriptor
{ {
use HasPublicDescriptorTrait;
private $name; private $name;
private $fields; private $fields;
public function __construct()
{
$this->public_desc = new \Google\Protobuf\OneofDescriptor($this);
}
public function setName($name) public function setName($name)
{ {
$this->name = $name; $this->name = $name;
...@@ -48,7 +54,7 @@ class OneofDescriptor ...@@ -48,7 +54,7 @@ class OneofDescriptor
return $this->name; return $this->name;
} }
public function addField(&$field) public function addField(FieldDescriptor $field)
{ {
$this->fields[] = $field; $this->fields[] = $field;
} }
...@@ -58,10 +64,15 @@ class OneofDescriptor ...@@ -58,10 +64,15 @@ class OneofDescriptor
return $this->fields; return $this->fields;
} }
public static function buildFromProto($oneof_proto) public static function buildFromProto($oneof_proto, $desc, $index)
{ {
$oneof = new OneofDescriptor(); $oneof = new OneofDescriptor();
$oneof->setName($oneof_proto->getName()); $oneof->setName($oneof_proto->getName());
foreach ($desc->getField() as $field) {
if ($field->getOneofIndex() == $index) {
$oneof->addField($field);
}
}
return $oneof; return $oneof;
} }
} }
<?php
// Protocol Buffers - Google's data interchange format
// Copyright 2017 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Google\Protobuf;
use Google\Protobuf\Internal\GetPublicDescriptorTrait;
class OneofDescriptor
{
use GetPublicDescriptorTrait;
private $internal_desc;
/**
* @internal
*/
public function __construct($internal_desc)
{
$this->internal_desc = $internal_desc;
}
/**
* @return string The name of the oneof
*/
public function getName()
{
return $this->internal_desc->getName();
}
/**
* @param int $index Must be >= 0 and < getFieldCount()
* @return FieldDescriptor
*/
public function getField($index)
{
return $this->getPublicDescriptor($this->internal_desc->getFields()[$index]);
}
/**
* @return int Number of fields in the oneof
*/
public function getFieldCount()
{
return count($this->internal_desc->getFields());
}
}
<?php
require_once('generated/Descriptors/TestDescriptorsEnum.php');
require_once('generated/Descriptors/TestDescriptorsMessage.php');
require_once('test_base.php');
require_once('test_util.php');
use Google\Protobuf\DescriptorPool;
use Google\Protobuf\Internal\RepeatedField;
use Google\Protobuf\Internal\MapField;
use Descriptors\TestDescriptorsEnum;
use Descriptors\TestDescriptorsMessage;
use Descriptors\TestDescriptorsMessage_Sub;
class DescriptorsTest extends TestBase
{
// Redefine these here for compatibility with c extension
const GPBLABEL_OPTIONAL = 1;
const GPBLABEL_REQUIRED = 2;
const GPBLABEL_REPEATED = 3;
const GPBTYPE_DOUBLE = 1;
const GPBTYPE_FLOAT = 2;
const GPBTYPE_INT64 = 3;
const GPBTYPE_UINT64 = 4;
const GPBTYPE_INT32 = 5;
const GPBTYPE_FIXED64 = 6;
const GPBTYPE_FIXED32 = 7;
const GPBTYPE_BOOL = 8;
const GPBTYPE_STRING = 9;
const GPBTYPE_GROUP = 10;
const GPBTYPE_MESSAGE = 11;
const GPBTYPE_BYTES = 12;
const GPBTYPE_UINT32 = 13;
const GPBTYPE_ENUM = 14;
const GPBTYPE_SFIXED32 = 15;
const GPBTYPE_SFIXED64 = 16;
const GPBTYPE_SINT32 = 17;
const GPBTYPE_SINT64 = 18;
#########################################################
# Test descriptor pool.
#########################################################
public function testDescriptorPool()
{
$pool = DescriptorPool::getGeneratedPool();
$desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
$this->assertInstanceOf('\Google\Protobuf\Descriptor', $desc);
$enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));
$this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $enumDesc);
}
public function testDescriptorPoolIncorrectArgs()
{
$pool = DescriptorPool::getGeneratedPool();
$desc = $pool->getDescriptorByClassName('NotAClass');
$this->assertNull($desc);
$desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsEnum()));
$this->assertNull($desc);
$enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsMessage()));
$this->assertNull($enumDesc);
}
#########################################################
# Test descriptor.
#########################################################
public function testDescriptor()
{
$pool = DescriptorPool::getGeneratedPool();
$class = get_class(new TestDescriptorsMessage());
$this->assertSame('Descriptors\TestDescriptorsMessage', $class);
$desc = $pool->getDescriptorByClassName($class);
$this->assertSame('descriptors.TestDescriptorsMessage', $desc->getFullName());
$this->assertSame($class, $desc->getClass());
$this->assertInstanceOf('\Google\Protobuf\FieldDescriptor', $desc->getField(0));
$this->assertSame(7, $desc->getFieldCount());
$this->assertInstanceOf('\Google\Protobuf\OneofDescriptor', $desc->getOneofDecl(0));
$this->assertSame(1, $desc->getOneofDeclCount());
}
#########################################################
# Test enum descriptor.
#########################################################
public function testEnumDescriptor()
{
// WARNINIG - we need to do this so that TestDescriptorsEnum is registered!!?
new TestDescriptorsMessage();
$pool = DescriptorPool::getGeneratedPool();
$enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));
// Build map of enum values
$enumDescMap = [];
for ($i = 0; $i < $enumDesc->getValueCount(); $i++) {
$enumValueDesc = $enumDesc->getValue($i);
$this->assertInstanceOf('\Google\Protobuf\EnumValueDescriptor', $enumValueDesc);
$enumDescMap[$enumValueDesc->getNumber()] = $enumValueDesc->getName();
}
$this->assertSame('ZERO', $enumDescMap[0]);
$this->assertSame('ONE', $enumDescMap[1]);
$this->assertSame(2, $enumDesc->getValueCount());
}
#########################################################
# Test field descriptor.
#########################################################
public function testFieldDescriptor()
{
$pool = DescriptorPool::getGeneratedPool();
$desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
$fieldDescMap = $this->buildFieldMap($desc);
// Optional int field
$fieldDesc = $fieldDescMap[1];
$this->assertSame('optional_int32', $fieldDesc->getName());
$this->assertSame(1, $fieldDesc->getNumber());
$this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
$this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
$this->assertFalse($fieldDesc->isMap());
// Optional enum field
$fieldDesc = $fieldDescMap[16];
$this->assertSame('optional_enum', $fieldDesc->getName());
$this->assertSame(16, $fieldDesc->getNumber());
$this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
$this->assertSame(self::GPBTYPE_ENUM, $fieldDesc->getType());
$this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $fieldDesc->getEnumType());
$this->assertFalse($fieldDesc->isMap());
// Optional message field
$fieldDesc = $fieldDescMap[17];
$this->assertSame('optional_message', $fieldDesc->getName());
$this->assertSame(17, $fieldDesc->getNumber());
$this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
$this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
$this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
$this->assertFalse($fieldDesc->isMap());
// Repeated int field
$fieldDesc = $fieldDescMap[31];
$this->assertSame('repeated_int32', $fieldDesc->getName());
$this->assertSame(31, $fieldDesc->getNumber());
$this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
$this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
$this->assertFalse($fieldDesc->isMap());
// Repeated message field
$fieldDesc = $fieldDescMap[47];
$this->assertSame('repeated_message', $fieldDesc->getName());
$this->assertSame(47, $fieldDesc->getNumber());
$this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
$this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
$this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
$this->assertFalse($fieldDesc->isMap());
// Oneof int field
// Tested further in testOneofDescriptor()
$fieldDesc = $fieldDescMap[51];
$this->assertSame('oneof_int32', $fieldDesc->getName());
$this->assertSame(51, $fieldDesc->getNumber());
$this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
$this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
$this->assertFalse($fieldDesc->isMap());
// Map int-enum field
$fieldDesc = $fieldDescMap[71];
$this->assertSame('map_int32_enum', $fieldDesc->getName());
$this->assertSame(71, $fieldDesc->getNumber());
$this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
$this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
$this->assertTrue($fieldDesc->isMap());
$mapDesc = $fieldDesc->getMessageType();
$this->assertSame('descriptors.TestDescriptorsMessage.MapInt32EnumEntry', $mapDesc->getFullName());
$this->assertSame(self::GPBTYPE_INT32, $mapDesc->getField(0)->getType());
$this->assertSame(self::GPBTYPE_ENUM, $mapDesc->getField(1)->getType());
}
/**
* @expectedException \Exception
*/
public function testFieldDescriptorEnumException()
{
$pool = DescriptorPool::getGeneratedPool();
$desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
$fieldDesc = $desc->getField(0);
$fieldDesc->getEnumType();
}
/**
* @expectedException \Exception
*/
public function testFieldDescriptorMessageException()
{
$pool = DescriptorPool::getGeneratedPool();
$desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
$fieldDesc = $desc->getField(0);
$fieldDesc->getMessageType();
}
#########################################################
# Test oneof descriptor.
#########################################################
public function testOneofDescriptor()
{
$pool = DescriptorPool::getGeneratedPool();
$desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
$fieldDescMap = $this->buildFieldMap($desc);
$fieldDesc = $fieldDescMap[51];
$oneofDesc = $desc->getOneofDecl(0);
$this->assertSame('my_oneof', $oneofDesc->getName());
$fieldDescFromOneof = $oneofDesc->getField(0);
$this->assertSame($fieldDesc, $fieldDescFromOneof);
$this->assertSame(1, $oneofDesc->getFieldCount());
}
private function buildFieldMap($desc)
{
$fieldDescMap = [];
for ($i = 0; $i < $desc->getFieldCount(); $i++) {
$fieldDesc = $desc->getField($i);
$fieldDescMap[$fieldDesc->getNumber()] = $fieldDesc;
}
return $fieldDescMap;
}
}
...@@ -13,6 +13,7 @@ use Foo\TestIncludeNamespaceMessage; ...@@ -13,6 +13,7 @@ use Foo\TestIncludeNamespaceMessage;
use Foo\TestIncludePrefixMessage; use Foo\TestIncludePrefixMessage;
use Foo\TestMessage; use Foo\TestMessage;
use Foo\TestMessage_Sub; use Foo\TestMessage_Sub;
use Foo\TestReverseFieldOrder;
use Php\Test\TestNamespace; use Php\Test\TestNamespace;
class GeneratedClassTest extends TestBase class GeneratedClassTest extends TestBase
...@@ -702,4 +703,16 @@ class GeneratedClassTest extends TestBase ...@@ -702,4 +703,16 @@ class GeneratedClassTest extends TestBase
$this->assertSame(1, $m->getOptionalInt32()); $this->assertSame(1, $m->getOptionalInt32());
$this->assertSame(2, $m->getOptionalUInt32()); $this->assertSame(2, $m->getOptionalUInt32());
} }
#########################################################
# Test Reverse Field Order.
#########################################################
public function testReverseFieldOrder()
{
$m = new TestReverseFieldOrder();
$m->setB("abc");
$this->assertSame("abc", $m->getB());
$this->assertNotSame("abc", $m->getA());
}
} }
...@@ -21,6 +21,7 @@ require_once('generated/Foo/TestMessage_Sub.php'); ...@@ -21,6 +21,7 @@ require_once('generated/Foo/TestMessage_Sub.php');
require_once('generated/Foo/TestPackedMessage.php'); require_once('generated/Foo/TestPackedMessage.php');
require_once('generated/Foo/TestPhpDoc.php'); require_once('generated/Foo/TestPhpDoc.php');
require_once('generated/Foo/TestRandomFieldOrder.php'); require_once('generated/Foo/TestRandomFieldOrder.php');
require_once('generated/Foo/TestReverseFieldOrder.php');
require_once('generated/Foo/TestUnpackedMessage.php'); require_once('generated/Foo/TestUnpackedMessage.php');
require_once('generated/GPBMetadata/Proto/Test.php'); require_once('generated/GPBMetadata/Proto/Test.php');
require_once('generated/GPBMetadata/Proto/TestEmptyPhpNamespace.php'); require_once('generated/GPBMetadata/Proto/TestEmptyPhpNamespace.php');
......
...@@ -187,3 +187,8 @@ message TestRandomFieldOrder { ...@@ -187,3 +187,8 @@ message TestRandomFieldOrder {
int64 tag13 = 150; int64 tag13 = 150;
string tag14 = 160; string tag14 = 160;
} }
message TestReverseFieldOrder {
repeated int32 a = 2;
string b = 1;
}
syntax = "proto3";
package descriptors;
message TestDescriptorsMessage {
int32 optional_int32 = 1;
TestDescriptorsEnum optional_enum = 16;
Sub optional_message = 17;
// Repeated
repeated int32 repeated_int32 = 31;
repeated Sub repeated_message = 47;
oneof my_oneof {
int32 oneof_int32 = 51;
}
map<int32, EnumSub> map_int32_enum = 71;
message Sub {
int32 a = 1;
repeated int32 b = 2;
}
enum EnumSub {
ZERO = 0;
ONE = 1;
}
}
enum TestDescriptorsEnum {
ZERO = 0;
ONE = 1;
}
...@@ -8,7 +8,7 @@ set -e ...@@ -8,7 +8,7 @@ set -e
phpize && ./configure CFLAGS='-g -O0' && make phpize && ./configure CFLAGS='-g -O0' && make
popd popd
tests=( array_test.php encode_decode_test.php generated_class_test.php generated_phpdoc_test.php map_field_test.php well_known_test.php generated_service_test.php ) tests=( array_test.php encode_decode_test.php generated_class_test.php generated_phpdoc_test.php map_field_test.php well_known_test.php generated_service_test.php descriptors_test.php )
for t in "${tests[@]}" for t in "${tests[@]}"
do do
......
...@@ -197,6 +197,7 @@ string ModuleAlias(const string& filename) { ...@@ -197,6 +197,7 @@ string ModuleAlias(const string& filename) {
string basename = StripProto(filename); string basename = StripProto(filename);
StripString(&basename, "-", '$'); StripString(&basename, "-", '$');
StripString(&basename, "/", '_'); StripString(&basename, "/", '_');
StripString(&basename, ".", '_');
return basename + "_pb"; return basename + "_pb";
} }
......
...@@ -39,6 +39,7 @@ syntax = "proto3"; ...@@ -39,6 +39,7 @@ syntax = "proto3";
package protobuf_test_messages.proto3; package protobuf_test_messages.proto3;
option java_package = "com.google.protobuf_test_messages.proto3"; option java_package = "com.google.protobuf_test_messages.proto3";
option objc_class_prefix = "Proto3";
// This is the default, but we specify it here explicitly. // This is the default, but we specify it here explicitly.
option optimize_for = SPEED; option optimize_for = SPEED;
......
...@@ -347,7 +347,16 @@ generate_php_test_proto() { ...@@ -347,7 +347,16 @@ generate_php_test_proto() {
# Generate test file # Generate test file
rm -rf generated rm -rf generated
mkdir generated mkdir generated
../../src/protoc --php_out=generated proto/test.proto proto/test_include.proto proto/test_no_namespace.proto proto/test_prefix.proto proto/test_php_namespace.proto proto/test_empty_php_namespace.proto proto/test_service.proto proto/test_service_namespace.proto ../../src/protoc --php_out=generated \
proto/test.proto \
proto/test_include.proto \
proto/test_no_namespace.proto \
proto/test_prefix.proto \
proto/test_php_namespace.proto \
proto/test_empty_php_namespace.proto \
proto/test_service.proto \
proto/test_service_namespace.proto \
proto/test_descriptors.proto
pushd ../../src pushd ../../src
./protoc --php_out=../php/tests/generated google/protobuf/empty.proto ./protoc --php_out=../php/tests/generated google/protobuf/empty.proto
./protoc --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto ./protoc --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment