diff options
| author | Stanislav Malyshev <stas@php.net> | 2003-07-27 13:20:31 +0000 |
|---|---|---|
| committer | Stanislav Malyshev <stas@php.net> | 2003-07-27 13:20:31 +0000 |
| commit | 9fa2d5231091889fce06a2e79b449484cfe2e8d6 (patch) | |
| tree | 0f642179e3d5c237db9710f7bf5a7e7ea4d9416d | |
| parent | 6bea4ca1b051e3a7e1a0bf3aa3080934d7c143b6 (diff) | |
| download | php-git-9fa2d5231091889fce06a2e79b449484cfe2e8d6.tar.gz | |
make clone and throw coexist peacefully
| -rw-r--r-- | Zend/zend_compile.c | 1 | ||||
| -rw-r--r-- | Zend/zend_execute.c | 9 | ||||
| -rw-r--r-- | Zend/zend_objects.c | 4 |
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 *)); } |
