summaryrefslogtreecommitdiff
path: root/ext/reflection/php_reflection.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-02-25 17:03:48 +0400
committerDmitry Stogov <dmitry@zend.com>2014-02-25 17:03:48 +0400
commitc077742b2a5c6d2a640ce64e76b0edc95ed5c74c (patch)
tree867ae0173af17f48c4a4209f0103a733eb0feb80 /ext/reflection/php_reflection.c
parent068ea84a840ca7273e6b6dc19d794bb0216aaab7 (diff)
downloadphp-git-c077742b2a5c6d2a640ce64e76b0edc95ed5c74c.tar.gz
Fixed reflection object destruction
Diffstat (limited to 'ext/reflection/php_reflection.c')
-rw-r--r--ext/reflection/php_reflection.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index e566711c1a..5219053ec3 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -204,6 +204,7 @@ typedef enum {
/* Struct for reflection objects */
typedef struct {
zend_object zo;
+ zval dummy; /* holder for the second property */
void *ptr;
reflection_type_t ref_type;
zval obj;
@@ -310,7 +311,7 @@ static void reflection_free_objects_storage(zend_object *object TSRMLS_DC) /* {{
}
intern->ptr = NULL;
zval_ptr_dtor(&intern->obj);
-//??? zend_objects_free_object_storage(object TSRMLS_CC);
+ zend_object_free(object TSRMLS_CC);
}
/* }}} */
@@ -1222,7 +1223,7 @@ static void reflection_parameter_factory(zend_function *fptr, zval *closure_obje
zval name;
if (closure_object) {
- Z_ADDREF_P(closure_object);
+ if (Z_REFCOUNTED_P(closure_object)) Z_ADDREF_P(closure_object);
}
if (arg_info->name) {
ZVAL_STRINGL(&name, arg_info->name, arg_info->name_len);
@@ -1616,7 +1617,11 @@ ZEND_METHOD(reflection_function, __construct)
reflection_update_property(object, "name", &name);
intern->ptr = fptr;
intern->ref_type = REF_TYPE_FUNCTION;
- ZVAL_COPY_VALUE(&intern->obj, closure);
+ if (closure) {
+ ZVAL_COPY_VALUE(&intern->obj, closure);
+ } else {
+ ZVAL_UNDEF(&intern->obj);
+ }
intern->ce = NULL;
}
/* }}} */