summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2003-07-27 13:20:31 +0000
committerStanislav Malyshev <stas@php.net>2003-07-27 13:20:31 +0000
commit9fa2d5231091889fce06a2e79b449484cfe2e8d6 (patch)
tree0f642179e3d5c237db9710f7bf5a7e7ea4d9416d
parent6bea4ca1b051e3a7e1a0bf3aa3080934d7c143b6 (diff)
downloadphp-git-9fa2d5231091889fce06a2e79b449484cfe2e8d6.tar.gz
make clone and throw coexist peacefully
-rw-r--r--Zend/zend_compile.c1
-rw-r--r--Zend/zend_execute.c9
-rw-r--r--Zend/zend_objects.c4
3 files changed, 13 insertions, 1 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 8d1aa3d945..364586d73b 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -1460,6 +1460,7 @@ static void throw_list_applier(long *opline_num, long *catch_opline)
case ZEND_DO_FCALL:
case ZEND_DO_FCALL_BY_NAME:
case ZEND_THROW:
+ case ZEND_CLONE:
opline->op2.u.opline_num = *catch_opline;
break;
default:
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 9baab66271..762c097ddf 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -3085,6 +3085,15 @@ int zend_clone_handler(ZEND_OPCODE_HANDLER_ARGS)
EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr;
ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr);
EX_T(EX(opline)->result.u.var).var.ptr->value.obj = clone_call(obj TSRMLS_CC);
+ if (EG(exception)) {
+ FREE_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr);
+ if (EX(opline)->op2.u.opline_num == -1) {
+ RETURN_FROM_EXECUTE_LOOP(execute_data);
+ } else {
+ EX(opline) = &op_array->opcodes[EX(opline)->op2.u.opline_num];
+ return 0; /* CHECK_ME */
+ }
+ }
EX_T(EX(opline)->result.u.var).var.ptr->type = IS_OBJECT;
EX_T(EX(opline)->result.u.var).var.ptr->refcount=1;
EX_T(EX(opline)->result.u.var).var.ptr->is_ref=1;
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index 19d567b95f..7749baf7db 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -143,7 +143,9 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object_va
zend_hash_destroy(&symbol_table);
zval_ptr_dtor(&new_obj);
zval_ptr_dtor(&clone_func_name);
- zval_ptr_dtor(&retval_ptr);
+ if(retval_ptr) {
+ zval_ptr_dtor(&retval_ptr);
+ }
} else {
zend_hash_copy(new_object->properties, old_object->properties, (copy_ctor_func_t) zval_add_ref, (void *) NULL /* Not used anymore */, sizeof(zval *));
}