Fix memory leak in php7

pull/4102/head
Bo Yang 7 years ago
parent 3b7a5f4515
commit 212563d756
  1. 1
      php/ext/google/protobuf/def.c
  2. 12
      php/ext/google/protobuf/message.c
  3. 3
      php/tests/memory_leak_test.php

@ -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);

@ -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()); \
}

@ -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;

Loading…
Cancel
Save