diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c index 13f7cdd664..8140fe4751 100644 --- a/php/ext/google/protobuf/def.c +++ b/php/ext/google/protobuf/def.c @@ -249,9 +249,11 @@ 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); + --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 6db010c519..b14c1f0c5a 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -379,6 +379,7 @@ PHP_METHOD(Message, whichOneof) { 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) { \ @@ -390,6 +391,7 @@ PHP_METHOD(Message, whichOneof) { zval member; \ 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()); \ } @@ -402,6 +404,7 @@ PHP_METHOD(Message, whichOneof) { 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; \ @@ -412,6 +415,7 @@ PHP_METHOD(Message, whichOneof) { zval member; \ 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/ext/google/protobuf/package.xml b/php/ext/google/protobuf/package.xml index 53aa4c7ff7..626eb46b1b 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-11-15 + 2017-12-11 - 3.5.0 - 3.5.0 + 3.5.1 + 3.5.1 stable @@ -181,6 +181,38 @@ 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. + + + + + 3.5.1 + 3.5.1 + + + stable + stable + + 2017-12-11 + + 3-Clause BSD License + GA release. diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h index bd475144b0..f299b4150d 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.5.0" +#define PHP_PROTOBUF_VERSION "3.5.1" #define MAX_LENGTH_OF_INT64 20 #define SIZEOF_INT64 8 diff --git a/php/ext/google/protobuf/type_check.c b/php/ext/google/protobuf/type_check.c index 37171426e6..85f5051eda 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 772b466f00..8ea84f689a 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; @@ -106,15 +107,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);