From 1acacf46ccd386de8ee660335b4b1a8dffb2967d Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Fri, 1 Dec 2017 20:14:19 -0800 Subject: Fix memory leak when creating repeated field via array. --- php/ext/google/protobuf/type_check.c | 3 +-- php/tests/memory_leak_test.php | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/type_check.c b/php/ext/google/protobuf/type_check.c index f588774c..50e0f8c1 100644 --- a/php/ext/google/protobuf/type_check.c +++ b/php/ext/google/protobuf/type_check.c @@ -461,8 +461,7 @@ void check_repeated_field(const zend_class_entry* klass, PHP_PROTO_LONG type, CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory) TSRMLS_CC); } - Z_DELREF_P(CACHED_TO_ZVAL_PTR(repeated_field)); - RETURN_ZVAL(CACHED_TO_ZVAL_PTR(repeated_field), 1, 0); + RETURN_ZVAL(CACHED_TO_ZVAL_PTR(repeated_field), 1, 1); } else if (Z_TYPE_P(val) == IS_OBJECT) { if (!instanceof_function(Z_OBJCE_P(val), repeated_field_type TSRMLS_CC)) { diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index b76c8bff..fa272b56 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -105,6 +105,11 @@ $m = new TestMessage(); $m->mergeFromString(hex2bin('F80601')); assert('F80601', bin2hex($m->serializeToString())); +// Test create repeated field via array. +$str_arr = array(); +$m = new TestMessage(); +$m->setRepeatedString($str_arr); + # $from = new TestMessage(); # $to = new TestMessage(); # TestUtil::setTestMessage($from); -- cgit v1.2.3 From b140cb3145f697a025d7b81b53a190d1e89b17dc Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Mon, 4 Dec 2017 12:32:10 -0800 Subject: Fix memory leak when creating map field via array. --- php/ext/google/protobuf/type_check.c | 3 +-- php/tests/memory_leak_test.php | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/type_check.c b/php/ext/google/protobuf/type_check.c index 50e0f8c1..37171426 100644 --- a/php/ext/google/protobuf/type_check.c +++ b/php/ext/google/protobuf/type_check.c @@ -534,8 +534,7 @@ void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type, CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value) TSRMLS_CC); } - Z_DELREF_P(CACHED_TO_ZVAL_PTR(map_field)); - RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 0); + RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 1); } else if (Z_TYPE_P(val) == IS_OBJECT) { if (!instanceof_function(Z_OBJCE_P(val), map_field_type TSRMLS_CC)) { zend_error(E_USER_ERROR, "Given value is not an instance of %s.", diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index fa272b56..772b466f 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -110,6 +110,11 @@ $str_arr = array(); $m = new TestMessage(); $m->setRepeatedString($str_arr); +// Test create map field via array. +$str_arr = array(); +$m = new TestMessage(); +$m->setMapStringString($str_arr); + # $from = new TestMessage(); # $to = new TestMessage(); # TestUtil::setTestMessage($from); -- cgit v1.2.3 From de44982a747519602409fcf7b0cceaf123bf1420 Mon Sep 17 00:00:00 2001 From: Paul Yang Date: Thu, 30 Nov 2017 12:21:00 -0800 Subject: Remove duplicate typedef. (#3975) --- php/ext/google/protobuf/protobuf.h | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h index 18343772..e2a67220 100644 --- a/php/ext/google/protobuf/protobuf.h +++ b/php/ext/google/protobuf/protobuf.h @@ -608,48 +608,36 @@ typedef struct Api Api; typedef struct BoolValue BoolValue; typedef struct BytesValue BytesValue; typedef struct Descriptor Descriptor; -typedef struct Descriptor Descriptor; typedef struct DescriptorPool DescriptorPool; typedef struct DoubleValue DoubleValue; typedef struct Duration Duration; -typedef struct Enum Enum; typedef struct EnumDescriptor EnumDescriptor; -typedef struct EnumDescriptor EnumDescriptor; -typedef struct EnumValue EnumValue; -typedef struct EnumValueDescriptor EnumValueDescriptor; +typedef struct Enum Enum; typedef struct EnumValueDescriptor EnumValueDescriptor; -typedef struct Field Field; -typedef struct FieldDescriptor FieldDescriptor; -typedef struct FieldDescriptor FieldDescriptor; -typedef struct FieldMask FieldMask; +typedef struct EnumValue EnumValue; typedef struct Field_Cardinality Field_Cardinality; +typedef struct FieldDescriptor FieldDescriptor; +typedef struct Field Field; typedef struct Field_Kind Field_Kind; +typedef struct FieldMask FieldMask; typedef struct FloatValue FloatValue; typedef struct GPBEmpty GPBEmpty; typedef struct Int32Value Int32Value; typedef struct Int64Value Int64Value; typedef struct InternalDescriptorPool InternalDescriptorPool; typedef struct ListValue ListValue; -typedef struct Map Map; -typedef struct Map Map; -typedef struct MapIter MapIter; typedef struct MapIter MapIter; +typedef struct Map Map; typedef struct MessageField MessageField; -typedef struct MessageField MessageField; -typedef struct MessageHeader MessageHeader; typedef struct MessageHeader MessageHeader; typedef struct MessageLayout MessageLayout; -typedef struct MessageLayout MessageLayout; typedef struct Method Method; typedef struct Mixin Mixin; typedef struct NullValue NullValue; typedef struct Oneof Oneof; -typedef struct Oneof Oneof; typedef struct Option Option; -typedef struct RepeatedField RepeatedField; -typedef struct RepeatedField RepeatedField; -typedef struct RepeatedFieldIter RepeatedFieldIter; typedef struct RepeatedFieldIter RepeatedFieldIter; +typedef struct RepeatedField RepeatedField; typedef struct SourceContext SourceContext; typedef struct StringValue StringValue; typedef struct Struct Struct; -- cgit v1.2.3 From e0d3aa057b89540cf83de6639a86d1ddb7199315 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Fri, 1 Dec 2017 20:14:19 -0800 Subject: Fix memory leak when creating repeated field via array. --- php/ext/google/protobuf/type_check.c | 3 +-- php/tests/memory_leak_test.php | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/type_check.c b/php/ext/google/protobuf/type_check.c index f588774c..50e0f8c1 100644 --- a/php/ext/google/protobuf/type_check.c +++ b/php/ext/google/protobuf/type_check.c @@ -461,8 +461,7 @@ void check_repeated_field(const zend_class_entry* klass, PHP_PROTO_LONG type, CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory) TSRMLS_CC); } - Z_DELREF_P(CACHED_TO_ZVAL_PTR(repeated_field)); - RETURN_ZVAL(CACHED_TO_ZVAL_PTR(repeated_field), 1, 0); + RETURN_ZVAL(CACHED_TO_ZVAL_PTR(repeated_field), 1, 1); } else if (Z_TYPE_P(val) == IS_OBJECT) { if (!instanceof_function(Z_OBJCE_P(val), repeated_field_type TSRMLS_CC)) { diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index b76c8bff..fa272b56 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -105,6 +105,11 @@ $m = new TestMessage(); $m->mergeFromString(hex2bin('F80601')); assert('F80601', bin2hex($m->serializeToString())); +// Test create repeated field via array. +$str_arr = array(); +$m = new TestMessage(); +$m->setRepeatedString($str_arr); + # $from = new TestMessage(); # $to = new TestMessage(); # TestUtil::setTestMessage($from); -- cgit v1.2.3 From 7d3437152ad420d4382b883f0a52a86526166ef5 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Mon, 4 Dec 2017 12:32:10 -0800 Subject: Fix memory leak when creating map field via array. --- php/ext/google/protobuf/type_check.c | 3 +-- php/tests/memory_leak_test.php | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/type_check.c b/php/ext/google/protobuf/type_check.c index 50e0f8c1..37171426 100644 --- a/php/ext/google/protobuf/type_check.c +++ b/php/ext/google/protobuf/type_check.c @@ -534,8 +534,7 @@ void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type, CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value) TSRMLS_CC); } - Z_DELREF_P(CACHED_TO_ZVAL_PTR(map_field)); - RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 0); + RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 1); } else if (Z_TYPE_P(val) == IS_OBJECT) { if (!instanceof_function(Z_OBJCE_P(val), map_field_type TSRMLS_CC)) { zend_error(E_USER_ERROR, "Given value is not an instance of %s.", diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index fa272b56..772b466f 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -110,6 +110,11 @@ $str_arr = array(); $m = new TestMessage(); $m->setRepeatedString($str_arr); +// Test create map field via array. +$str_arr = array(); +$m = new TestMessage(); +$m->setMapStringString($str_arr); + # $from = new TestMessage(); # $to = new TestMessage(); # TestUtil::setTestMessage($from); -- cgit v1.2.3 From 3b7a5f451546888ad96aaa143ef86fea904a03ec Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Tue, 5 Dec 2017 16:44:19 -0800 Subject: Fix several more memory leak --- php/ext/google/protobuf/def.c | 1 + php/ext/google/protobuf/message.c | 8 ++++---- php/ext/google/protobuf/type_check.c | 1 + php/tests/memory_leak_test.php | 23 +++++++++++++++++++++-- 4 files changed, 27 insertions(+), 6 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c index 13f7cdd6..55291e23 100644 --- a/php/ext/google/protobuf/def.c +++ b/php/ext/google/protobuf/def.c @@ -249,6 +249,7 @@ PHP_METHOD(Descriptor, getField) { MAKE_STD_ZVAL(field_hashtable_value); ZVAL_OBJ(field_hashtable_value, field_descriptor_type->create_object( field_descriptor_type TSRMLS_CC)); + Z_DELREF_P(field_hashtable_value); #else field_hashtable_value = field_descriptor_type->create_object(field_descriptor_type TSRMLS_CC); diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index 3fce2c17..b11c7215 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -374,7 +374,7 @@ PHP_METHOD(Message, whichOneof) { LOWER_FIELD) \ PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \ zval member; \ - PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \ + PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \ PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \ zval* value = message_get_property_internal(getThis(), &member TSRMLS_CC); \ PHP_PROTO_FAKE_SCOPE_END; \ @@ -387,7 +387,7 @@ PHP_METHOD(Message, whichOneof) { return; \ } \ zval member; \ - PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \ + PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \ message_set_property_internal(getThis(), &member, value TSRMLS_CC); \ PHP_PROTO_RETVAL_ZVAL(getThis()); \ } @@ -396,7 +396,7 @@ PHP_METHOD(Message, whichOneof) { LOWER_FIELD) \ PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \ zval member; \ - PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \ + PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \ PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \ message_get_oneof_property_internal(getThis(), &member, \ return_value TSRMLS_CC); \ @@ -409,7 +409,7 @@ PHP_METHOD(Message, whichOneof) { return; \ } \ zval member; \ - PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \ + PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \ message_set_property_internal(getThis(), &member, value TSRMLS_CC); \ PHP_PROTO_RETVAL_ZVAL(getThis()); \ } diff --git a/php/ext/google/protobuf/type_check.c b/php/ext/google/protobuf/type_check.c index 37171426..85f5051e 100644 --- a/php/ext/google/protobuf/type_check.c +++ b/php/ext/google/protobuf/type_check.c @@ -532,6 +532,7 @@ void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type, map_field_handlers->write_dimension( CACHED_TO_ZVAL_PTR(map_field), &key, CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value) TSRMLS_CC); + zval_dtor(&key); } RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 1); diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index 772b466f..29ca7787 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -106,15 +106,34 @@ $m->mergeFromString(hex2bin('F80601')); assert('F80601', bin2hex($m->serializeToString())); // Test create repeated field via array. -$str_arr = array(); +$str_arr = array("abc"); $m = new TestMessage(); $m->setRepeatedString($str_arr); // Test create map field via array. -$str_arr = array(); +$str_arr = array("abc"=>"abc"); $m = new TestMessage(); $m->setMapStringString($str_arr); +// Test unset +$from = new TestMessage(); +TestUtil::setTestMessage($from); +unset($from); + +// Test wellknown +$from = new \Google\Protobuf\Timestamp(); +$from->setSeconds(1); +assert(1, $from->getSeconds()); + +$from = new \Google\Protobuf\Value(); +$from->setNumberValue(1); +assert(1, $from->getNumberValue()); + +// Test descriptor +$pool = \Google\Protobuf\DescriptorPool::getGeneratedPool(); +$desc = $pool->getDescriptorByClassName("\Foo\TestMessage"); +$field = $desc->getField(1); + # $from = new TestMessage(); # $to = new TestMessage(); # TestUtil::setTestMessage($from); -- cgit v1.2.3 From 212563d756d50a70272d42d7f8b6374ce5a86317 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Tue, 5 Dec 2017 18:29:51 -0800 Subject: Fix memory leak in php7 --- php/ext/google/protobuf/def.c | 1 + php/ext/google/protobuf/message.c | 12 ++++++++---- php/tests/memory_leak_test.php | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c index 55291e23..8140fe47 100644 --- a/php/ext/google/protobuf/def.c +++ b/php/ext/google/protobuf/def.c @@ -253,6 +253,7 @@ PHP_METHOD(Descriptor, getField) { #else field_hashtable_value = field_descriptor_type->create_object(field_descriptor_type TSRMLS_CC); + --GC_REFCOUNT(field_hashtable_value); #endif FieldDescriptor *field_php = UNBOX_HASHTABLE_VALUE(FieldDescriptor, field_hashtable_value); diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index b11c7215..cf75d979 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -374,10 +374,11 @@ PHP_METHOD(Message, whichOneof) { LOWER_FIELD) \ PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \ zval member; \ - PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \ + PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \ PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \ zval* value = message_get_property_internal(getThis(), &member TSRMLS_CC); \ PHP_PROTO_FAKE_SCOPE_END; \ + zval_dtor(&member); \ PHP_PROTO_RETVAL_ZVAL(value); \ } \ PHP_METHOD(UPPER_CLASS, set##UPPER_FIELD) { \ @@ -387,8 +388,9 @@ PHP_METHOD(Message, whichOneof) { return; \ } \ zval member; \ - PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \ + PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \ message_set_property_internal(getThis(), &member, value TSRMLS_CC); \ + zval_dtor(&member); \ PHP_PROTO_RETVAL_ZVAL(getThis()); \ } @@ -396,11 +398,12 @@ PHP_METHOD(Message, whichOneof) { LOWER_FIELD) \ PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \ zval member; \ - PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \ + PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \ PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \ message_get_oneof_property_internal(getThis(), &member, \ return_value TSRMLS_CC); \ PHP_PROTO_FAKE_SCOPE_END; \ + zval_dtor(&member); \ } \ PHP_METHOD(UPPER_CLASS, set##UPPER_FIELD) { \ zval* value = NULL; \ @@ -409,8 +412,9 @@ PHP_METHOD(Message, whichOneof) { return; \ } \ zval member; \ - PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \ + PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \ message_set_property_internal(getThis(), &member, value TSRMLS_CC); \ + zval_dtor(&member); \ PHP_PROTO_RETVAL_ZVAL(getThis()); \ } diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index 29ca7787..8ea84f68 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -50,7 +50,8 @@ $to->mergeFromString($data); TestUtil::assertTestMessage($to); -$from->setRecursive($from); +// TODO(teboring): This causes following tests fail in php7. +# $from->setRecursive($from); $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class); $arr[] = new TestMessage; -- cgit v1.2.3 From ba60b854b6da0494e91b81edc7b91ef3ddf219c9 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Wed, 6 Dec 2017 10:46:57 -0800 Subject: Update php c extension version number to 3.5.0.1 --- php/ext/google/protobuf/package.xml | 6 +++--- php/ext/google/protobuf/protobuf.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/package.xml b/php/ext/google/protobuf/package.xml index 4a473801..07641b4e 100644 --- a/php/ext/google/protobuf/package.xml +++ b/php/ext/google/protobuf/package.xml @@ -10,11 +10,11 @@ protobuf-opensource@google.com yes - 2017-09-14 + 2017-12-06 - 3.4.1 - 3.4.1 + 3.5.0.1 + 3.5.0.1 stable diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h index e2a67220..8289eb2b 100644 --- a/php/ext/google/protobuf/protobuf.h +++ b/php/ext/google/protobuf/protobuf.h @@ -37,7 +37,7 @@ #include "upb.h" #define PHP_PROTOBUF_EXTNAME "protobuf" -#define PHP_PROTOBUF_VERSION "3.4.1" +#define PHP_PROTOBUF_VERSION "3.5.0.1" #define MAX_LENGTH_OF_INT64 20 #define SIZEOF_INT64 8 -- cgit v1.2.3 From 457f6a607ce167132b833c049b0eaf3a9c4b3f5f Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Wed, 6 Dec 2017 10:54:11 -0800 Subject: Add release log --- php/ext/google/protobuf/package.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'php') diff --git a/php/ext/google/protobuf/package.xml b/php/ext/google/protobuf/package.xml index 07641b4e..0107ebc2 100644 --- a/php/ext/google/protobuf/package.xml +++ b/php/ext/google/protobuf/package.xml @@ -165,6 +165,22 @@ GA release. 3-Clause BSD License +GA release. + + + + + 3.5.0.1 + 3.5.0.1 + + + stable + stable + + 2017-12-06 + + 3-Clause BSD License + GA release. -- cgit v1.2.3 From c370f88fb18eecc33650ec3ce06f7bdcc11d1596 Mon Sep 17 00:00:00 2001 From: Paul Yang Date: Thu, 7 Dec 2017 11:16:47 -0800 Subject: Recursively clear unknown fields in submessages. (#3982) * Recursively clear unknown fields in submessages. * Recursively discard unknown fields in submsg for c extension * Fix zts build * Add comment for tests * Add a TODO to add a util for encoding varint for better readability. * Add test for oneof message field. --- php/ext/google/protobuf/encode_decode.c | 95 +++++++++++++++++++++++++++- php/src/Google/Protobuf/Internal/Message.php | 28 ++++++++ php/tests/encode_decode_test.php | 40 +++++++++++- 3 files changed, 159 insertions(+), 4 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/encode_decode.c b/php/ext/google/protobuf/encode_decode.c index ae5a61f5..b98121bb 100644 --- a/php/ext/google/protobuf/encode_decode.c +++ b/php/ext/google/protobuf/encode_decode.c @@ -1402,7 +1402,6 @@ static void putarray(zval* array, const upb_fielddef* f, upb_sink* sink, RepeatedField* intern = UNBOX(RepeatedField, array); HashTable *ht = PHP_PROTO_HASH_OF(intern->array); size = zend_hash_num_elements(ht); - // size = zend_hash_num_elements(PHP_PROTO_HASH_OF(intern->array)); if (size == 0) return; upb_sink_startseq(sink, getsel(f, UPB_HANDLER_STARTSEQ), &subsink); @@ -1615,11 +1614,101 @@ PHP_METHOD(Message, mergeFromJsonString) { } } -PHP_METHOD(Message, discardUnknownFields) { - MessageHeader* msg = UNBOX(MessageHeader, getThis()); +// TODO(teboring): refactoring with putrawmsg +static void discard_unknown_fields(MessageHeader* msg) { + upb_msg_field_iter it; + stringsink* unknown = DEREF(message_data(msg), 0, stringsink*); if (unknown != NULL) { stringsink_uninit(unknown); DEREF(message_data(msg), 0, stringsink*) = NULL; } + + // Recursively discard unknown fields of submessages. + Descriptor* desc = msg->descriptor; + TSRMLS_FETCH(); + for (upb_msg_field_begin(&it, desc->msgdef); + !upb_msg_field_done(&it); + upb_msg_field_next(&it)) { + upb_fielddef* f = upb_msg_iter_field(&it); + uint32_t offset = desc->layout->fields[upb_fielddef_index(f)].offset; + bool containing_oneof = false; + + if (upb_fielddef_containingoneof(f)) { + uint32_t oneof_case_offset = + desc->layout->fields[upb_fielddef_index(f)].case_offset; + // For a oneof, check that this field is actually present -- skip all the + // below if not. + if (DEREF(message_data(msg), oneof_case_offset, uint32_t) != + upb_fielddef_number(f)) { + continue; + } + // Otherwise, fall through to the appropriate singular-field handler + // below. + containing_oneof = true; + } + + if (is_map_field(f)) { + MapIter map_it; + int len, size; + const upb_fielddef* value_field; + + value_field = map_field_value(f); + if (!upb_fielddef_issubmsg(value_field)) continue; + + zval* map_php = CACHED_PTR_TO_ZVAL_PTR( + DEREF(message_data(msg), offset, CACHED_VALUE*)); + if (map_php == NULL) continue; + + Map* intern = UNBOX(Map, map_php); + for (map_begin(map_php, &map_it TSRMLS_CC); + !map_done(&map_it); map_next(&map_it)) { + upb_value value = map_iter_value(&map_it, &len); + void* memory = raw_value(upb_value_memory(&value), value_field); +#if PHP_MAJOR_VERSION < 7 + MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory); +#else + MessageHeader *submsg = + (MessageHeader*)((char*)(Z_OBJ_P((zval*)memory)) - + XtOffsetOf(MessageHeader, std)); +#endif + discard_unknown_fields(submsg); + } + } else if (upb_fielddef_isseq(f)) { + if (!upb_fielddef_issubmsg(f)) continue; + + zval* array_php = CACHED_PTR_TO_ZVAL_PTR( + DEREF(message_data(msg), offset, CACHED_VALUE*)); + if (array_php == NULL) continue; + + int size, i; + RepeatedField* intern = UNBOX(RepeatedField, array_php); + HashTable *ht = PHP_PROTO_HASH_OF(intern->array); + size = zend_hash_num_elements(ht); + if (size == 0) continue; + + for (i = 0; i < size; i++) { + void* memory = repeated_field_index_native(intern, i TSRMLS_CC); +#if PHP_MAJOR_VERSION < 7 + MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory); +#else + MessageHeader *submsg = + (MessageHeader*)((char*)(Z_OBJ_P((zval*)memory)) - + XtOffsetOf(MessageHeader, std)); +#endif + discard_unknown_fields(submsg); + } + } else if (upb_fielddef_issubmsg(f)) { + zval* submsg_php = CACHED_PTR_TO_ZVAL_PTR( + DEREF(message_data(msg), offset, CACHED_VALUE*)); + if (Z_TYPE_P(submsg_php) == IS_NULL) continue; + MessageHeader* submsg = UNBOX(MessageHeader, submsg_php); + discard_unknown_fields(submsg); + } + } +} + +PHP_METHOD(Message, discardUnknownFields) { + MessageHeader* msg = UNBOX(MessageHeader, getThis()); + discard_unknown_fields(msg); } diff --git a/php/src/Google/Protobuf/Internal/Message.php b/php/src/Google/Protobuf/Internal/Message.php index 26d20575..93e81c01 100644 --- a/php/src/Google/Protobuf/Internal/Message.php +++ b/php/src/Google/Protobuf/Internal/Message.php @@ -583,6 +583,34 @@ class Message public function discardUnknownFields() { $this->unknown = ""; + foreach ($this->desc->getField() as $field) { + if ($field->getType() != GPBType::MESSAGE) { + continue; + } + if ($field->isMap()) { + $value_field = $field->getMessageType()->getFieldByNumber(2); + if ($value_field->getType() != GPBType::MESSAGE) { + continue; + } + $getter = $field->getGetter(); + $map = $this->$getter(); + foreach ($map as $key => $value) { + $value->discardUnknownFields(); + } + } else if ($field->getLabel() === GPBLabel::REPEATED) { + $getter = $field->getGetter(); + $arr = $this->$getter(); + foreach ($arr as $sub) { + $sub->discardUnknownFields(); + } + } else if ($field->getLabel() === GPBLabel::OPTIONAL) { + $getter = $field->getGetter(); + $sub = $this->$getter(); + if (!is_null($sub)) { + $sub->discardUnknownFields(); + } + } + } } /** diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php index 4512c871..74d5526d 100644 --- a/php/tests/encode_decode_test.php +++ b/php/tests/encode_decode_test.php @@ -443,36 +443,74 @@ class EncodeDecodeTest extends TestBase public function testUnknown() { + // Test preserve unknown for varint. $m = new TestMessage(); - $from = hex2bin('F80601'); + $from = hex2bin('F80601'); // TODO(teboring): Add a util to encode + // varint for better readability $m->mergeFromString($from); $to = $m->serializeToString(); $this->assertSame(bin2hex($from), bin2hex($to)); + // Test preserve unknown for 64-bit. $m = new TestMessage(); $from = hex2bin('F9060000000000000000'); $m->mergeFromString($from); $to = $m->serializeToString(); $this->assertSame(bin2hex($from), bin2hex($to)); + // Test preserve unknown for length delimited. $m = new TestMessage(); $from = hex2bin('FA0600'); $m->mergeFromString($from); $to = $m->serializeToString(); $this->assertSame(bin2hex($from), bin2hex($to)); + // Test preserve unknown for 32-bit. $m = new TestMessage(); $from = hex2bin('FD0600000000'); $m->mergeFromString($from); $to = $m->serializeToString(); $this->assertSame(bin2hex($from), bin2hex($to)); + // Test discard unknown in message. $m = new TestMessage(); $from = hex2bin('F80601'); $m->mergeFromString($from); $m->discardUnknownFields(); $to = $m->serializeToString(); $this->assertSame("", bin2hex($to)); + + // Test discard unknown for singular message field. + $m = new TestMessage(); + $from = hex2bin('8A0103F80601'); + $m->mergeFromString($from); + $m->discardUnknownFields(); + $to = $m->serializeToString(); + $this->assertSame("8a0100", bin2hex($to)); + + // Test discard unknown for repeated message field. + $m = new TestMessage(); + $from = hex2bin('FA0203F80601'); + $m->mergeFromString($from); + $m->discardUnknownFields(); + $to = $m->serializeToString(); + $this->assertSame("fa0200", bin2hex($to)); + + // Test discard unknown for map message value field. + $m = new TestMessage(); + $from = hex2bin("BA050708011203F80601"); + $m->mergeFromString($from); + $m->discardUnknownFields(); + $to = $m->serializeToString(); + $this->assertSame("ba050408011200", bin2hex($to)); + + // Test discard unknown for singular message field. + $m = new TestMessage(); + $from = hex2bin('9A0403F80601'); + $m->mergeFromString($from); + $m->discardUnknownFields(); + $to = $m->serializeToString(); + $this->assertSame("9a0400", bin2hex($to)); } public function testJsonEncode() -- cgit v1.2.3 From 3b13c3f02e476bb668a28fce3e86a1ec62f85562 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Mon, 11 Dec 2017 15:44:27 -0800 Subject: Add backslach to make class explict in global namespace --- php/src/Google/Protobuf/Internal/Message.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'php') diff --git a/php/src/Google/Protobuf/Internal/Message.php b/php/src/Google/Protobuf/Internal/Message.php index 93e81c01..b7f83c57 100644 --- a/php/src/Google/Protobuf/Internal/Message.php +++ b/php/src/Google/Protobuf/Internal/Message.php @@ -1111,7 +1111,7 @@ class Message } try { $this->mergeFromJsonArray($array); - } catch (Exception $e) { + } catch (\Exception $e) { throw new GPBDecodeException($e->getMessage()); } } -- cgit v1.2.3 From 9f6aceaa8ce8250d9e36225180c218035bd49fe9 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Tue, 12 Dec 2017 12:06:51 -0800 Subject: Add PROTOBUF_ENABLE_TIMESTAMP to let user decide whether timestamp util can be used at install time. --- php/ext/google/protobuf/message.c | 13 ++++++++++++- php/tests/test.sh | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index b14c1f0c..70080a3b 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -29,9 +29,12 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -#include #include +#ifdef PROTOBUF_ENABLE_TIMESTAMP +#include +#endif + #include "protobuf.h" #include "utf8.h" @@ -1121,6 +1124,7 @@ PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Seconds, "seconds") PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Nanos, "nanos") PHP_METHOD(Timestamp, fromDateTime) { +#ifdef PROTOBUF_ENABLE_TIMESTAMP zval* datetime; zval member; @@ -1149,9 +1153,13 @@ PHP_METHOD(Timestamp, fromDateTime) { storage = message_data(self); memory = slot_memory(self->descriptor->layout, storage, field); *(int32_t*)memory = 0; +#else + zend_error(E_USER_ERROR, "fromDateTime needs date extension."); +#endif } PHP_METHOD(Timestamp, toDateTime) { +#ifdef PROTOBUF_ENABLE_TIMESTAMP zval datetime; php_date_instantiate(php_date_get_date_ce(), &datetime TSRMLS_CC); php_date_obj* dateobj = UNBOX(php_date_obj, &datetime); @@ -1184,6 +1192,9 @@ PHP_METHOD(Timestamp, toDateTime) { zval* datetime_ptr = &datetime; PHP_PROTO_RETVAL_ZVAL(datetime_ptr); +#else + zend_error(E_USER_ERROR, "toDateTime needs date extension."); +#endif } // ----------------------------------------------------------------------------- diff --git a/php/tests/test.sh b/php/tests/test.sh index c35372d3..a308a1d2 100755 --- a/php/tests/test.sh +++ b/php/tests/test.sh @@ -5,7 +5,7 @@ pushd ../ext/google/protobuf/ make clean || true set -e # Add following in configure for debug: --enable-debug CFLAGS='-g -O0' -phpize && ./configure CFLAGS='-g -O0' && make +phpize && ./configure CFLAGS='-g -O0 -DPROTOBUF_ENABLE_TIMESTAMP' && make 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 descriptors_test.php ) -- cgit v1.2.3 From 88102eae8f86045307e9d46ad900f91158227f2b Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Tue, 12 Dec 2017 13:57:49 -0800 Subject: Replace private timelib_update_ts with public date_timestamp_get --- php/ext/google/protobuf/message.c | 24 +++++++++++++++++++----- php/tests/memory_leak_test.php | 12 ++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index 70080a3b..5b654a78 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -1133,12 +1133,24 @@ PHP_METHOD(Timestamp, fromDateTime) { return; } - php_date_obj* dateobj = UNBOX(php_date_obj, datetime); - if (!dateobj->time->sse_uptodate) { - timelib_update_ts(dateobj->time, NULL); + // Get timestamp from Datetime object. + zval* retval_ptr; + zval* function_name; + int64_t timestamp; + + MAKE_STD_ZVAL(retval_ptr); + MAKE_STD_ZVAL(function_name); + + ZVAL_STRING(function_name, "date_timestamp_get", 1); + + if (call_user_function(EG(function_table), NULL, + function_name, retval_ptr, 1, + &datetime TSRMLS_CC) == SUCCESS) { + protobuf_convert_to_int64(retval_ptr, ×tamp); } - int64_t timestamp = dateobj->time->sse; + zval_ptr_dtor(&retval_ptr); + zval_ptr_dtor(&function_name); // Set seconds MessageHeader* self = UNBOX(MessageHeader, getThis()); @@ -1146,13 +1158,15 @@ PHP_METHOD(Timestamp, fromDateTime) { upb_msgdef_ntofz(self->descriptor->msgdef, "seconds"); void* storage = message_data(self); void* memory = slot_memory(self->descriptor->layout, storage, field); - *(int64_t*)memory = dateobj->time->sse; + *(int64_t*)memory = timestamp; // Set nanos field = upb_msgdef_ntofz(self->descriptor->msgdef, "nanos"); storage = message_data(self); memory = slot_memory(self->descriptor->layout, storage, field); *(int32_t*)memory = 0; + + RETURN_NULL(); #else zend_error(E_USER_ERROR, "fromDateTime needs date extension."); #endif diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index 8ea84f68..ce268838 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -126,6 +126,18 @@ $from = new \Google\Protobuf\Timestamp(); $from->setSeconds(1); assert(1, $from->getSeconds()); +$timestamp = new \Google\Protobuf\Timestamp(); + +date_default_timezone_set('UTC'); +$from = new DateTime('2011-01-01T15:03:01.012345UTC'); +$timestamp->fromDateTime($from); +assert($from->format('U'), $timestamp->getSeconds()); +assert(0, $timestamp->getNanos()); + +$to = $timestamp->toDateTime(); +assert(\DateTime::class, get_class($to)); +assert($from->format('U'), $to->format('U')); + $from = new \Google\Protobuf\Value(); $from->setNumberValue(1); assert(1, $from->getNumberValue()); -- cgit v1.2.3 From fffe8d39f810d147c6db65f90ae4f71f4e0f0116 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Tue, 12 Dec 2017 17:47:04 -0800 Subject: Call php method via function name instead of calling directly. This changes the linking error if php extension is not statically linked to a runtime error. In this way, users who don't need Timestamp can still use protobuf even if date extension is not statically linked in php. --- php/ext/google/protobuf/message.c | 70 ++++++++++++++++++++++---------------- php/ext/google/protobuf/protobuf.h | 4 +++ php/tests/memory_leak_test.php | 8 ++--- php/tests/test.sh | 2 +- 4 files changed, 50 insertions(+), 34 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index 5b654a78..7d7d8651 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -31,10 +31,6 @@ #include #include -#ifdef PROTOBUF_ENABLE_TIMESTAMP -#include -#endif - #include "protobuf.h" #include "utf8.h" @@ -1124,7 +1120,6 @@ PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Seconds, "seconds") PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Nanos, "nanos") PHP_METHOD(Timestamp, fromDateTime) { -#ifdef PROTOBUF_ENABLE_TIMESTAMP zval* datetime; zval member; @@ -1134,23 +1129,27 @@ PHP_METHOD(Timestamp, fromDateTime) { } // Get timestamp from Datetime object. - zval* retval_ptr; - zval* function_name; + zval retval; + zval function_name; int64_t timestamp; - MAKE_STD_ZVAL(retval_ptr); - MAKE_STD_ZVAL(function_name); +#if PHP_MAJOR_VERSION < 7 + INIT_ZVAL(retval); + INIT_ZVAL(function_name); +#endif - ZVAL_STRING(function_name, "date_timestamp_get", 1); + PHP_PROTO_ZVAL_STRING(&function_name, "date_timestamp_get", 1); - if (call_user_function(EG(function_table), NULL, - function_name, retval_ptr, 1, - &datetime TSRMLS_CC) == SUCCESS) { - protobuf_convert_to_int64(retval_ptr, ×tamp); + if (call_user_function(EG(function_table), NULL, &function_name, &retval, 1, + ZVAL_PTR_TO_CACHED_PTR(datetime) TSRMLS_CC) == FAILURE) { + zend_error(E_ERROR, "Cannot get timestamp from DateTime."); + return; } - zval_ptr_dtor(&retval_ptr); - zval_ptr_dtor(&function_name); + protobuf_convert_to_int64(&retval, ×tamp); + + zval_dtor(&retval); + zval_dtor(&function_name); // Set seconds MessageHeader* self = UNBOX(MessageHeader, getThis()); @@ -1167,17 +1166,9 @@ PHP_METHOD(Timestamp, fromDateTime) { *(int32_t*)memory = 0; RETURN_NULL(); -#else - zend_error(E_USER_ERROR, "fromDateTime needs date extension."); -#endif } PHP_METHOD(Timestamp, toDateTime) { -#ifdef PROTOBUF_ENABLE_TIMESTAMP - zval datetime; - php_date_instantiate(php_date_get_date_ce(), &datetime TSRMLS_CC); - php_date_obj* dateobj = UNBOX(php_date_obj, &datetime); - // Get seconds MessageHeader* self = UNBOX(MessageHeader, getThis()); const upb_fielddef* field = @@ -1198,16 +1189,37 @@ PHP_METHOD(Timestamp, toDateTime) { strftime(formated_time, sizeof(formated_time), "%Y-%m-%dT%H:%M:%SUTC", utc_time); - if (!php_date_initialize(dateobj, formated_time, strlen(formated_time), NULL, - NULL, 0 TSRMLS_CC)) { - zval_dtor(&datetime); - RETURN_NULL(); + // Create Datetime object. + zval datetime; + zval formated_time_php; + zval function_name; + int64_t timestamp = 0; + +#if PHP_MAJOR_VERSION < 7 + INIT_ZVAL(function_name); + INIT_ZVAL(formated_time_php); +#endif + + PHP_PROTO_ZVAL_STRING(&function_name, "date_create", 1); + PHP_PROTO_ZVAL_STRING(&formated_time_php, formated_time, 1); + + CACHED_VALUE params[1] = {ZVAL_TO_CACHED_VALUE(formated_time_php)}; + + if (call_user_function(EG(function_table), NULL, + &function_name, &datetime, 1, + params TSRMLS_CC) == FAILURE) { + zend_error(E_ERROR, "Cannot create DateTime."); + return; } + zval_dtor(&formated_time_php); + zval_dtor(&function_name); + +#if PHP_MAJOR_VERSION < 7 zval* datetime_ptr = &datetime; PHP_PROTO_RETVAL_ZVAL(datetime_ptr); #else - zend_error(E_USER_ERROR, "toDateTime needs date extension."); + ZVAL_OBJ(return_value, Z_OBJ(datetime)); #endif } diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h index f299b415..6ab0f134 100644 --- a/php/ext/google/protobuf/protobuf.h +++ b/php/ext/google/protobuf/protobuf.h @@ -182,6 +182,8 @@ #define CACHED_TO_ZVAL_PTR(VALUE) (VALUE) #define CACHED_PTR_TO_ZVAL_PTR(VALUE) (*VALUE) #define ZVAL_PTR_TO_CACHED_PTR(VALUE) (&VALUE) +#define ZVAL_PTR_TO_CACHED_VALUE(VALUE) (VALUE) +#define ZVAL_TO_CACHED_VALUE(VALUE) (&VALUE) #define CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(zval_ptr, class_type) \ ZVAL_OBJ(zval_ptr, class_type->create_object(class_type TSRMLS_CC)); @@ -452,6 +454,8 @@ static inline int php_proto_zend_hash_get_current_data_ex(HashTable* ht, #define CACHED_TO_ZVAL_PTR(VALUE) (&VALUE) #define CACHED_PTR_TO_ZVAL_PTR(VALUE) (VALUE) #define ZVAL_PTR_TO_CACHED_PTR(VALUE) (VALUE) +#define ZVAL_PTR_TO_CACHED_VALUE(VALUE) (*VALUE) +#define ZVAL_TO_CACHED_VALUE(VALUE) (VALUE) #define CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(zval_ptr, class_type) \ ZVAL_OBJ(zval_ptr, class_type->create_object(class_type)); diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index ce268838..507635e7 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -131,12 +131,12 @@ $timestamp = new \Google\Protobuf\Timestamp(); date_default_timezone_set('UTC'); $from = new DateTime('2011-01-01T15:03:01.012345UTC'); $timestamp->fromDateTime($from); -assert($from->format('U'), $timestamp->getSeconds()); -assert(0, $timestamp->getNanos()); +assert($from->format('U') == $timestamp->getSeconds()); +assert(0 == $timestamp->getNanos()); $to = $timestamp->toDateTime(); -assert(\DateTime::class, get_class($to)); -assert($from->format('U'), $to->format('U')); +assert(\DateTime::class == get_class($to)); +assert($from->format('U') == $to->format('U')); $from = new \Google\Protobuf\Value(); $from->setNumberValue(1); diff --git a/php/tests/test.sh b/php/tests/test.sh index a308a1d2..c35372d3 100755 --- a/php/tests/test.sh +++ b/php/tests/test.sh @@ -5,7 +5,7 @@ pushd ../ext/google/protobuf/ make clean || true set -e # Add following in configure for debug: --enable-debug CFLAGS='-g -O0' -phpize && ./configure CFLAGS='-g -O0 -DPROTOBUF_ENABLE_TIMESTAMP' && make +phpize && ./configure CFLAGS='-g -O0' && make 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 descriptors_test.php ) -- cgit v1.2.3 From 1a549d9a902151e980bfa76093b3d82b7589e158 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Wed, 13 Dec 2017 17:09:55 -0800 Subject: Avoid using php_date_get_date_ce() in case date extension is not available. --- php/ext/google/protobuf/message.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index 7d7d8651..df5eb408 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -1123,8 +1123,21 @@ PHP_METHOD(Timestamp, fromDateTime) { zval* datetime; zval member; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime, - php_date_get_date_ce()) == FAILURE) { + if (zend_parse_parameters( + ZEND_NUM_ARGS() TSRMLS_CC, "z", &datetime) == FAILURE) { + return; + } + + zend_class_entry* ce = Z_OBJCE_P(datetime); + PHP_PROTO_CE_DECLARE datetime_ce; + if (php_proto_zend_lookup_class("\\Datetime", 9, &datetime_ce) == + FAILURE) { + zend_error(E_ERROR, "Make sure date extension is enabled."); + return; + } + + if (!instanceof_function(PHP_PROTO_CE_UNREF(datetime_ce), ce TSRMLS_CC)) { + zend_error(E_USER_ERROR, "Expect Datetime."); return; } -- cgit v1.2.3 From 39159c89f1e6924c1b12a6f12478b6de199894f4 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Thu, 14 Dec 2017 11:33:34 -0800 Subject: Accept DatetimeInterface in fromDatetime --- php/ext/google/protobuf/message.c | 17 ++++++----------- php/ext/google/protobuf/protobuf.c | 9 ++++++++- 2 files changed, 14 insertions(+), 12 deletions(-) (limited to 'php') diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index df5eb408..8b7d57ad 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -1123,21 +1123,16 @@ PHP_METHOD(Timestamp, fromDateTime) { zval* datetime; zval member; - if (zend_parse_parameters( - ZEND_NUM_ARGS() TSRMLS_CC, "z", &datetime) == FAILURE) { - return; - } - - zend_class_entry* ce = Z_OBJCE_P(datetime); - PHP_PROTO_CE_DECLARE datetime_ce; - if (php_proto_zend_lookup_class("\\Datetime", 9, &datetime_ce) == - FAILURE) { + PHP_PROTO_CE_DECLARE date_interface_ce; + if (php_proto_zend_lookup_class("\\DatetimeInterface", 18, + &date_interface_ce) == FAILURE) { zend_error(E_ERROR, "Make sure date extension is enabled."); return; } - if (!instanceof_function(PHP_PROTO_CE_UNREF(datetime_ce), ce TSRMLS_CC)) { - zend_error(E_USER_ERROR, "Expect Datetime."); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime, + date_interface_ce) == FAILURE) { + zend_error(E_USER_ERROR, "Expect DatetimeInterface."); return; } diff --git a/php/ext/google/protobuf/protobuf.c b/php/ext/google/protobuf/protobuf.c index 265d636e..daebb460 100644 --- a/php/ext/google/protobuf/protobuf.c +++ b/php/ext/google/protobuf/protobuf.c @@ -182,8 +182,15 @@ zend_function_entry protobuf_functions[] = { ZEND_FE_END }; +static const zend_module_dep protobuf_deps[] = { + ZEND_MOD_OPTIONAL("date") + ZEND_MOD_END +}; + zend_module_entry protobuf_module_entry = { - STANDARD_MODULE_HEADER, + STANDARD_MODULE_HEADER_EX, + NULL, + protobuf_deps, PHP_PROTOBUF_EXTNAME, // extension name protobuf_functions, // function list PHP_MINIT(protobuf), // process startup -- cgit v1.2.3 From 8d6f13e86d62b47570810371a6c0528cfb10b781 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Thu, 14 Dec 2017 13:24:00 -0800 Subject: Fix for php5.5 --- php/ext/google/protobuf/message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'php') diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index 8b7d57ad..24472682 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -1131,7 +1131,7 @@ PHP_METHOD(Timestamp, fromDateTime) { } if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime, - date_interface_ce) == FAILURE) { + PHP_PROTO_CE_UNREF(date_interface_ce)) == FAILURE) { zend_error(E_USER_ERROR, "Expect DatetimeInterface."); return; } -- cgit v1.2.3