summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2014-04-16 22:33:22 +0800
committerXinchen Hui <laruence@gmail.com>2014-04-16 22:33:22 +0800
commitcf7e703813e065fec7a8a5caa7aff4b70d3455b8 (patch)
treee986229569b1107b3c43c56bc4afb30e9a6bf03d
parentce49e6b0f73d9d8b51bd85d40abb5008a496f700 (diff)
parent54c338acc1cff6d0375d3094af8a75c6d1c3a001 (diff)
downloadphp-git-cf7e703813e065fec7a8a5caa7aff4b70d3455b8.tar.gz
Merge branch 'refactoring2' of github.com:zendtech/php into refactoring2
-rw-r--r--Zend/zend_object_handlers.c53
-rw-r--r--Zend/zend_vm_def.h2
-rw-r--r--Zend/zend_vm_execute.h40
-rw-r--r--ext/opcache/zend_accelerator_util_funcs.c60
-rw-r--r--ext/reflection/php_reflection.c48
-rw-r--r--ext/spl/php_spl.c1
-rw-r--r--ext/spl/spl_array.c1
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(&params[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(&params[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(&params[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(&params[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);
}
/* }}} */