diff options
author | Xinchen Hui <laruence@gmail.com> | 2014-04-16 22:33:22 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2014-04-16 22:33:22 +0800 |
commit | cf7e703813e065fec7a8a5caa7aff4b70d3455b8 (patch) | |
tree | e986229569b1107b3c43c56bc4afb30e9a6bf03d | |
parent | ce49e6b0f73d9d8b51bd85d40abb5008a496f700 (diff) | |
parent | 54c338acc1cff6d0375d3094af8a75c6d1c3a001 (diff) | |
download | php-git-cf7e703813e065fec7a8a5caa7aff4b70d3455b8.tar.gz |
Merge branch 'refactoring2' of github.com:zendtech/php into refactoring2
-rw-r--r-- | Zend/zend_object_handlers.c | 53 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 2 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 40 | ||||
-rw-r--r-- | ext/opcache/zend_accelerator_util_funcs.c | 60 | ||||
-rw-r--r-- | ext/reflection/php_reflection.c | 48 | ||||
-rw-r--r-- | ext/spl/php_spl.c | 1 | ||||
-rw-r--r-- | ext/spl/spl_array.c | 1 |
7 files changed, 110 insertions, 95 deletions
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 43b7524f2f..862ba99bdc 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -464,13 +464,12 @@ zval *zend_std_read_property(zval *object, zval *member, int type, const zend_li if (zobj->ce->__get) { long *guard = zend_get_property_guard(zobj, property_info, member); if (!((*guard) & IN_GET)) { + zval tmp_object; + /* have getter - try with it! */ - Z_ADDREF_P(object); - if (Z_ISREF_P(object)) { - SEPARATE_ZVAL(object); - } + ZVAL_COPY(&tmp_object, object); *guard |= IN_GET; /* prevent circular getting */ - zend_std_call_getter(object, member, rv TSRMLS_CC); + zend_std_call_getter(&tmp_object, member, rv TSRMLS_CC); *guard &= ~IN_GET; if (Z_TYPE_P(rv) != IS_UNDEF) { @@ -485,11 +484,11 @@ zval *zend_std_read_property(zval *object, zval *member, int type, const zend_li } else { retval = &EG(uninitialized_zval); } - if (EXPECTED(retval != object)) { - zval_ptr_dtor(object); - } else { - Z_DELREF_P(object); - } +//??? if (EXPECTED(retval != object)) { + zval_ptr_dtor(&tmp_object); +//??? } else { +//??? Z_DELREF_P(object); +//??? } } else { if (Z_STRVAL_P(member)[0] == '\0') { if (Z_STRLEN_P(member) == 0) { @@ -590,16 +589,15 @@ found: long *guard = zend_get_property_guard(zobj, property_info, member); if (!((*guard) & IN_SET)) { - Z_ADDREF_P(object); - if (Z_ISREF_P(object)) { - SEPARATE_ZVAL(object); - } + zval tmp_object; + + ZVAL_COPY(&tmp_object, object); (*guard) |= IN_SET; /* prevent circular setting */ - if (zend_std_call_setter(object, member, value TSRMLS_CC) != SUCCESS) { + if (zend_std_call_setter(&tmp_object, member, value TSRMLS_CC) != SUCCESS) { /* for now, just ignore it - __set should take care of warnings, etc. */ } (*guard) &= ~IN_SET; - zval_ptr_dtor(object); + zval_ptr_dtor(&tmp_object); } else if (EXPECTED(property_info != NULL)) { goto write_std_property; } else { @@ -830,15 +828,14 @@ static void zend_std_unset_property(zval *object, zval *member, const zend_liter if (zobj->ce->__unset) { long *guard = zend_get_property_guard(zobj, property_info, member); if (!((*guard) & IN_UNSET)) { + zval tmp_object; + /* have unseter - try with it! */ - Z_ADDREF_P(object); - if (Z_ISREF_P(object)) { - SEPARATE_ZVAL(object); - } + ZVAL_COPY(&tmp_object, object); (*guard) |= IN_UNSET; /* prevent circular unsetting */ - zend_std_call_unsetter(object, member TSRMLS_CC); + zend_std_call_unsetter(&tmp_object, member TSRMLS_CC); (*guard) &= ~IN_UNSET; - zval_ptr_dtor(object); + zval_ptr_dtor(&tmp_object); } else { if (Z_STRVAL_P(member)[0] == '\0') { if (Z_STRLEN_P(member) == 0) { @@ -1443,15 +1440,13 @@ found: if (!((*guard) & IN_ISSET)) { zval rv; + zval tmp_object; /* have issetter - try with it! */ - Z_ADDREF_P(object); - if (Z_ISREF_P(object)) { - SEPARATE_ZVAL(object); - } + ZVAL_COPY(&tmp_object, object); (*guard) |= IN_ISSET; /* prevent circular getting */ ZVAL_UNDEF(&rv); - zend_std_call_issetter(object, member, &rv TSRMLS_CC); + zend_std_call_issetter(&tmp_object, member, &rv TSRMLS_CC); if (Z_TYPE(rv) != IS_UNDEF) { result = zend_is_true(&rv TSRMLS_CC); zval_ptr_dtor(&rv); @@ -1459,7 +1454,7 @@ found: if (EXPECTED(!EG(exception)) && zobj->ce->__get && !((*guard) & IN_GET)) { (*guard) |= IN_GET; ZVAL_UNDEF(&rv); - zend_std_call_getter(object, member, &rv TSRMLS_CC); + zend_std_call_getter(&tmp_object, member, &rv TSRMLS_CC); (*guard) &= ~IN_GET; if (Z_TYPE(rv) != IS_UNDEF) { result = i_zend_is_true(&rv TSRMLS_CC); @@ -1473,7 +1468,7 @@ found: } } (*guard) &= ~IN_ISSET; - zval_ptr_dtor(object); + zval_ptr_dtor(&tmp_object); } } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index fa606eb0ea..d214459603 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5326,7 +5326,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); FREE_OP2_IF_VAR(); } else { - if (OP1_TYPE == IS_CV) { + if (OP2_TYPE == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index fa5f6a074e..adc978ecda 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4923,7 +4923,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_CONST == IS_CV) { + if (IS_TMP_VAR == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -5864,7 +5864,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); zval_ptr_dtor_nogc(free_op2.var); } else { - if (IS_CONST == IS_CV) { + if (IS_VAR == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -6514,7 +6514,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_CONST == IS_CV) { + if (IS_UNUSED == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -7210,7 +7210,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_CONST == IS_CV) { + if (IS_CV == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -9127,7 +9127,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_TMP_VAR == IS_CV) { + if (IS_CONST == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -10712,7 +10712,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); zval_ptr_dtor_nogc(free_op2.var); } else { - if (IS_TMP_VAR == IS_CV) { + if (IS_VAR == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -11230,7 +11230,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_TMP_VAR == IS_CV) { + if (IS_UNUSED == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -11871,7 +11871,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_TMP_VAR == IS_CV) { + if (IS_CV == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -15557,7 +15557,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_VAR == IS_CV) { + if (IS_CONST == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -17466,7 +17466,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_VAR == IS_CV) { + if (IS_TMP_VAR == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -20883,7 +20883,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_VAR == IS_CV) { + if (IS_UNUSED == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -22845,7 +22845,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_VAR == IS_CV) { + if (IS_CV == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -24237,7 +24237,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_UNUSED == IS_CV) { + if (IS_CONST == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -25466,7 +25466,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_UNUSED == IS_CV) { + if (IS_TMP_VAR == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -26695,7 +26695,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); zval_ptr_dtor_nogc(free_op2.var); } else { - if (IS_UNUSED == IS_CV) { + if (IS_VAR == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -28412,7 +28412,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_UNUSED == IS_CV) { + if (IS_CV == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -31711,7 +31711,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_CV == IS_CV) { + if (IS_CONST == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -33503,7 +33503,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_CV == IS_CV) { + if (IS_TMP_VAR == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -35655,7 +35655,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); zval_ptr_dtor_nogc(free_op2.var); } else { - if (IS_CV == IS_CV) { + if (IS_VAR == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); @@ -36668,7 +36668,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ ZVAL_DUP(&generator->key, Z_REFVAL_P(key)); } else { - if (IS_CV == IS_CV) { + if (IS_UNUSED == IS_CV) { if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key); } ZVAL_COPY_VALUE(&generator->key, key); diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index 0d1a1907cd..08051b47ee 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -241,6 +241,24 @@ static void zend_destroy_property_info(zval *zv) efree(property_info); } +static inline zend_string *zend_clone_str(zend_string *str TSRMLS_DC) +{ + zend_string *ret; + + if (IS_INTERNED(str)) { + ret = str; + } else if (STR_REFCOUNT(str) <= 1 || (ret = accel_xlat_get(str)) == NULL) { + ret = STR_DUP(str, 0); + GC_FLAGS(ret) = GC_FLAGS(str); + if (STR_REFCOUNT(str) > 1) { + accel_xlat_set(str, ret); + } + } else { + STR_ADDREF(ret); + } + return ret; +} + static inline void zend_clone_zval(zval *src, int bind TSRMLS_DC) { void *ptr; @@ -252,19 +270,7 @@ static inline void zend_clone_zval(zval *src, int bind TSRMLS_DC) #endif case IS_STRING: case IS_CONSTANT: - if (!IS_INTERNED(Z_STR_P(src))) { - if (bind && Z_REFCOUNT_P(src) > 1 && (ptr = accel_xlat_get(Z_STR_P(src))) != NULL) { - Z_STR_P(src) = ptr; - } else { - zend_string *old = Z_STR_P(src); - - Z_STR_P(src) = STR_DUP(old, 0); - Z_STR_P(src)->gc = old->gc; - if (bind && Z_REFCOUNT_P(src) > 1) { - accel_xlat_set(old, Z_STR_P(src)); - } - } - } + Z_STR_P(src) = zend_clone_str(Z_STR_P(src) TSRMLS_CC); break; case IS_ARRAY: case IS_CONSTANT_ARRAY: @@ -402,7 +408,7 @@ static void zend_hash_clone_zval(HashTable *ht, HashTable *source, int bind) if (!p->key) { q->key = NULL; } else { - q->key = STR_DUP(p->key, 0); + q->key = zend_clone_str(p->key TSRMLS_CC); GC_FLAGS(q->key) = GC_FLAGS(p->key); } @@ -474,7 +480,7 @@ static void zend_hash_clone_methods(HashTable *ht, HashTable *source, zend_class if (!p->key) { q->key = NULL; } else { - q->key = STR_DUP(p->key, 0); + q->key = zend_clone_str(p->key TSRMLS_CC); } /* Copy data */ @@ -572,7 +578,7 @@ static void zend_hash_clone_prop_info(HashTable *ht, HashTable *source, zend_cla if (!p->key) { q->key = NULL; } else { - q->key = STR_DUP(p->key, 0); + q->key = zend_clone_str(p->key TSRMLS_CC); } /* Copy data */ @@ -581,7 +587,7 @@ static void zend_hash_clone_prop_info(HashTable *ht, HashTable *source, zend_cla *prop_info = *(zend_property_info*)Z_PTR(p->val); /* Copy constructor */ - prop_info->name = STR_DUP(prop_info->name, 0); + prop_info->name = zend_clone_str(prop_info->name TSRMLS_CC); if (prop_info->doc_comment) { if (ZCG(accel_directives).load_comments) { prop_info->doc_comment = STR_DUP(prop_info->doc_comment, 0); @@ -685,7 +691,7 @@ static void zend_class_copy_ctor(zend_class_entry **pce) /* constants table */ zend_hash_clone_zval(&ce->constants_table, &old_ce->constants_table, 1); - ce->name = STR_DUP(ce->name, 0); + ce->name = zend_clone_str(ce->name TSRMLS_CC); /* interfaces aren't really implemented, so we create a new table */ if (ce->num_interfaces) { @@ -748,17 +754,17 @@ static void zend_class_copy_ctor(zend_class_entry **pce) if (trait_aliases[i]->trait_method) { if (trait_aliases[i]->trait_method->method_name) { trait_aliases[i]->trait_method->method_name = - STR_DUP(trait_aliases[i]->trait_method->method_name, 0); + zend_clone_str(trait_aliases[i]->trait_method->method_name TSRMLS_CC); } if (trait_aliases[i]->trait_method->class_name) { trait_aliases[i]->trait_method->class_name = - STR_DUP(trait_aliases[i]->trait_method->class_name, 0); + zend_clone_str(trait_aliases[i]->trait_method->class_name TSRMLS_CC); } } if (trait_aliases[i]->alias) { trait_aliases[i]->alias = - STR_DUP(trait_aliases[i]->alias, 0); + zend_clone_str(trait_aliases[i]->alias TSRMLS_CC); } i++; } @@ -782,9 +788,9 @@ static void zend_class_copy_ctor(zend_class_entry **pce) memcpy(trait_precedences[i]->trait_method, ce->trait_precedences[i]->trait_method, sizeof(zend_trait_method_reference)); trait_precedences[i]->trait_method->method_name = - STR_DUP(trait_precedences[i]->trait_method->method_name, 0); + zend_clone_str(trait_precedences[i]->trait_method->method_name TSRMLS_CC); trait_precedences[i]->trait_method->class_name = - STR_DUP(trait_precedences[i]->trait_method->class_name, 0); + zend_clone_str(trait_precedences[i]->trait_method->class_name TSRMLS_CC); if (trait_precedences[i]->exclude_from_classes) { zend_string **exclude_from_classes; @@ -797,7 +803,7 @@ static void zend_class_copy_ctor(zend_class_entry **pce) j = 0; while (trait_precedences[i]->exclude_from_classes[j].class_name) { exclude_from_classes[j] = - STR_DUP(trait_precedences[i]->exclude_from_classes[j].class_name, 0); + zend_clone_str(trait_precedences[i]->exclude_from_classes[j].class_name TSRMLS_CC); j++; } exclude_from_classes[j] = NULL; @@ -957,11 +963,11 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script, *op_array = persistent_script->main_op_array; if (from_shared_memory) { + zend_hash_init(&ZCG(bind_hash), 10, NULL, NULL, 0); + /* Copy all the necessary stuff from shared memory to regular memory, and protect the shared script */ if (zend_hash_num_elements(&persistent_script->class_table) > 0) { - zend_hash_init(&ZCG(bind_hash), 10, NULL, NULL, 0); zend_accel_class_hash_copy(CG(class_table), &persistent_script->class_table, (unique_copy_ctor_func_t) zend_class_copy_ctor TSRMLS_CC); - zend_hash_destroy(&ZCG(bind_hash)); } /* we must first to copy all classes and then prepare functions, since functions may try to bind classes - which depend on pre-bind class entries existent in the class table */ @@ -984,6 +990,8 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script, STR_RELEASE(name); } + zend_hash_destroy(&ZCG(bind_hash)); + #if ZEND_EXTENSION_API_NO < PHP_5_3_X_API_NO if ((int)persistent_script->early_binding != -1) { zend_do_delayed_early_binding(op_array, persistent_script->early_binding TSRMLS_CC); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 0b8027dd85..9aea15c882 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1932,7 +1932,7 @@ ZEND_METHOD(reflection_function, invoke) static int _zval_array_to_c_array(zval *arg, zval **params TSRMLS_DC) /* {{{ */ { - ZVAL_COPY_VALUE((*params), arg); + ZVAL_COPY((*params), arg); (*params)++; return ZEND_HASH_APPLY_KEEP; } /* }}} */ @@ -1944,7 +1944,7 @@ ZEND_METHOD(reflection_function, invokeArgs) zval retval; zval *params; int result; - int argc; + int i, argc; zend_fcall_info fci; zend_fcall_info_cache fcc; reflection_object *intern; @@ -1982,6 +1982,9 @@ ZEND_METHOD(reflection_function, invokeArgs) result = zend_call_function(&fci, &fcc TSRMLS_CC); + for (i = 0; i < argc; i++) { + zval_ptr_dtor(¶ms[i]); + } efree(params); if (result == FAILURE) { @@ -2913,7 +2916,7 @@ ZEND_METHOD(reflection_method, invokeArgs) zval *object; reflection_object *intern; zend_function *mptr; - int argc; + int i, argc; int result; zend_fcall_info fci; zend_fcall_info_cache fcc; @@ -3005,6 +3008,9 @@ ZEND_METHOD(reflection_method, invokeArgs) result = zend_call_function(&fci, &fcc TSRMLS_CC); + for (i = 0; i < argc; i++) { + zval_ptr_dtor(¶ms[i]); + } efree(params); if (result == FAILURE) { @@ -4192,7 +4198,7 @@ ZEND_METHOD(reflection_class, newInstance) /* Run the constructor if there is one */ if (constructor) { zval *params = NULL; - int num_args = 0; + int ret, i, num_args = 0; zend_fcall_info fci; zend_fcall_info_cache fcc; @@ -4207,6 +4213,10 @@ ZEND_METHOD(reflection_class, newInstance) RETURN_FALSE; } + for (i = 0; i < num_args; i++) { + if (Z_REFCOUNTED(params[i])) Z_ADDREF(params[i]); + } + fci.size = sizeof(fci); fci.function_table = EG(function_table); ZVAL_UNDEF(&fci.function_name); @@ -4223,17 +4233,16 @@ ZEND_METHOD(reflection_class, newInstance) fcc.called_scope = Z_OBJCE_P(return_value); fcc.object = Z_OBJ_P(return_value); - if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) { - if (!ZVAL_IS_UNDEF(&retval)) { - zval_ptr_dtor(&retval); - } + ret = zend_call_function(&fci, &fcc TSRMLS_CC); + zval_ptr_dtor(&retval); + for (i = 0; i < num_args; i++) { + zval_ptr_dtor(¶ms[i]); + } + if (ret == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invocation of %s's constructor failed", ce->name->val); zval_dtor(return_value); RETURN_NULL(); } - if (!ZVAL_IS_UNDEF(&retval)) { - zval_ptr_dtor(&retval); - } } else if (ZEND_NUM_ARGS()) { zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Class %s does not have a constructor, so you cannot pass any constructor arguments", ce->name->val); } @@ -4265,7 +4274,7 @@ ZEND_METHOD(reflection_class, newInstanceArgs) zval retval; reflection_object *intern; zend_class_entry *ce, *old_scope; - int argc = 0; + int ret, i, argc = 0; HashTable *args; zend_function *constructor; @@ -4322,19 +4331,20 @@ ZEND_METHOD(reflection_class, newInstanceArgs) fcc.called_scope = Z_OBJCE_P(return_value); fcc.object = Z_OBJ_P(return_value); - if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) { - if (params) { - efree(params); + ret = zend_call_function(&fci, &fcc TSRMLS_CC); + zval_ptr_dtor(&retval); + if (params) { + for (i = 0; i < argc; i++) { + zval_ptr_dtor(¶ms[i]); } + efree(params); + } + if (ret == FAILURE) { zval_ptr_dtor(&retval); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invocation of %s's constructor failed", ce->name->val); zval_dtor(return_value); RETURN_NULL(); } - zval_ptr_dtor(&retval); - if (params) { - efree(params); - } } else if (argc) { zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Class %s does not have a constructor, so you cannot pass any constructor arguments", ce->name->val); } diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c index 763996ad2a..30ecf67824 100644 --- a/ext/spl/php_spl.c +++ b/ext/spl/php_spl.c @@ -385,6 +385,7 @@ PHP_FUNCTION(spl_autoload_extensions) if (SPL_G(autoload_extensions) == NULL) { RETURN_STRINGL(SPL_DEFAULT_FILE_EXTENSIONS, sizeof(SPL_DEFAULT_FILE_EXTENSIONS) - 1); } else { + STR_ADDREF(SPL_G(autoload_extensions)); RETURN_STR(SPL_G(autoload_extensions)); } } /* }}} */ diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 79e53c0aa0..3d744af3a8 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -1243,6 +1243,7 @@ SPL_METHOD(Array, getIteratorClass) return; } + STR_ADDREF(intern->ce_get_iterator->name); RETURN_STR(intern->ce_get_iterator->name); } /* }}} */ |