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.c37
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