summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 0c1c72d6b0..cbaa53f4e1 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -132,7 +132,7 @@ ZEND_API const zend_internal_function zend_pass_function = {
};
#undef zval_ptr_dtor
-#define zval_ptr_dtor(zv) i_zval_ptr_dtor(zv ZEND_FILE_LINE_CC)
+#define zval_ptr_dtor(zv) i_zval_ptr_dtor(zv)
#define FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op, result) do { \
zval *__container_to_free = (free_op); \
@@ -187,7 +187,6 @@ ZEND_API void zend_vm_stack_init(void)
{
EG(vm_stack_page_size) = ZEND_VM_STACK_PAGE_SIZE;
EG(vm_stack) = zend_vm_stack_new_page(ZEND_VM_STACK_PAGE_SIZE, NULL);
- EG(vm_stack)->top++;
EG(vm_stack_top) = EG(vm_stack)->top;
EG(vm_stack_end) = EG(vm_stack)->end;
}
@@ -1145,8 +1144,9 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *
}
ZVAL_COPY_VALUE(z, value);
}
- binary_op(&res, Z_ISREF_P(z) ? Z_REFVAL_P(z) : z, value);
- Z_OBJ_HT_P(object)->write_dimension(object, property, &res);
+ if (binary_op(&res, Z_ISREF_P(z) ? Z_REFVAL_P(z) : z, value) == SUCCESS) {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, &res);
+ }
if (z == &rv) {
zval_ptr_dtor(&rv);
}
@@ -1539,8 +1539,9 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z
}
ZVAL_COPY_VALUE(z, value);
}
- binary_op(&res, z, value);
- Z_OBJ_HT(obj)->write_property(&obj, property, &res, cache_slot);
+ if (binary_op(&res, z, value) == SUCCESS) {
+ Z_OBJ_HT(obj)->write_property(&obj, property, &res, cache_slot);
+ }
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), &res);
}
@@ -2288,6 +2289,10 @@ static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DAT
}
}
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_clone_call(zend_function *clone, zend_class_entry *scope)
+{
+ zend_throw_error(NULL, "Call to %s %s::__clone() from context '%s'", zend_visibility_string(clone->common.fn_flags), ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
+}
#if ZEND_INTENSIVE_DEBUGGING
@@ -2576,6 +2581,7 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu
zend_attach_symbol_table(execute_data);
if (!op_array->run_time_cache) {
+ ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE);
op_array->run_time_cache = emalloc(op_array->cache_size);
memset(op_array->run_time_cache, 0, op_array->cache_size);
}
@@ -2613,6 +2619,7 @@ ZEND_API void zend_init_code_execute_data(zend_execute_data *execute_data, zend_
{
EX(prev_execute_data) = EG(current_execute_data);
if (!op_array->run_time_cache) {
+ ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE);
op_array->run_time_cache = emalloc(op_array->cache_size);
memset(op_array->run_time_cache, 0, op_array->cache_size);
}
@@ -3450,29 +3457,29 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant(
OPLINE = opline; \
ZEND_VM_CONTINUE()
# define ZEND_VM_SMART_BRANCH(_result, _check) do { \
- int __result; \
+ if ((_check) && UNEXPECTED(EG(exception))) { \
+ break; \
+ } \
if (EXPECTED((opline+1)->opcode == ZEND_JMPZ)) { \
- __result = (_result); \
+ if (_result) { \
+ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
+ } else { \
+ ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
+ } \
} else if (EXPECTED((opline+1)->opcode == ZEND_JMPNZ)) { \
- __result = !(_result); \
+ if (!(_result)) { \
+ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
+ } else { \
+ ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
+ } \
} else { \
break; \
} \
- if ((_check) && UNEXPECTED(EG(exception))) { \
- ZVAL_UNDEF(EX_VAR(opline->result.var)); \
- HANDLE_EXCEPTION(); \
- } \
- if (__result) { \
- ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
- } else { \
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
- } \
ZEND_VM_CONTINUE(); \
} while (0)
# define ZEND_VM_SMART_BRANCH_JMPZ(_result, _check) do { \
if ((_check) && UNEXPECTED(EG(exception))) { \
- ZVAL_UNDEF(EX_VAR(opline->result.var)); \
- HANDLE_EXCEPTION(); \
+ break; \
} \
if (_result) { \
ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
@@ -3483,8 +3490,7 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant(
} while (0)
# define ZEND_VM_SMART_BRANCH_JMPNZ(_result, _check) do { \
if ((_check) && UNEXPECTED(EG(exception))) { \
- ZVAL_UNDEF(EX_VAR(opline->result.var)); \
- HANDLE_EXCEPTION(); \
+ break; \
} \
if (!(_result)) { \
ZEND_VM_SET_NEXT_OPCODE(opline + 2); \