diff options
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r-- | Zend/zend_execute.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 50af005c22..2d1bd5e3d0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -88,18 +88,17 @@ static 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 PZVAL_LOCK(z) if (Z_REFCOUNTED_P(z)) Z_ADDREF_P((z)) -#define SELECTIVE_PZVAL_LOCK(pzv, opline) if (RETURN_VALUE_USED(opline)) { PZVAL_LOCK(pzv); } - #define READY_TO_DESTROY(zv) \ (zv && Z_REFCOUNTED_P(zv) && Z_REFCOUNT_P(zv) == 1) -#define EXTRACT_ZVAL_PTR(zv) do { \ - zval *__zv = (zv); \ - if (Z_TYPE_P(__zv) == IS_INDIRECT) { \ - ZVAL_COPY(__zv, Z_INDIRECT_P(__zv)); \ - } \ - } while (0) +#define EXTRACT_ZVAL_PTR(zv, check_null) do { \ + zval *__zv = (zv); \ + if (Z_TYPE_P(__zv) == IS_INDIRECT) { \ + if (!(check_null) || Z_INDIRECT_P(__zv)) { \ + ZVAL_COPY(__zv, Z_INDIRECT_P(__zv)); \ + } \ + } \ +} while (0) #define FREE_OP(should_free) \ if (should_free) { \ @@ -1110,6 +1109,12 @@ fast_assign: } } else { if (EXPECTED(zobj->properties != NULL)) { + if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) { + if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) { + GC_REFCOUNT(zobj->properties)--; + } + zobj->properties = zend_array_dup(zobj->properties); + } property = zend_hash_find(zobj->properties, Z_STR_P(property_name)); if (property) { goto fast_assign; @@ -2563,11 +2568,21 @@ void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t # endif #endif -#define ZEND_VM_NEXT_OPCODE() \ +#define ZEND_VM_NEXT_OPCODE_EX(check_exception, skip) \ CHECK_SYMBOL_TABLES() \ - ZEND_VM_INC_OPCODE(); \ + if (check_exception) { \ + OPLINE = EX(opline) + (skip); \ + } else { \ + OPLINE = opline + (skip); \ + } \ ZEND_VM_CONTINUE() +#define ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION() \ + ZEND_VM_NEXT_OPCODE_EX(1, 1) + +#define ZEND_VM_NEXT_OPCODE() \ + ZEND_VM_NEXT_OPCODE_EX(0, 1) + #define ZEND_VM_SET_NEXT_OPCODE(new_op) \ CHECK_SYMBOL_TABLES() \ OPLINE = new_op |