From 9a6100f9ddc38d25493395f6b61543d95e8c2a0a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 2 Feb 2018 17:38:07 +0300 Subject: [PATCH] Break dependency between IS_TYPE_REFCOUNTED and ZEND_CALL_FREE_EXTRA_ARGS --- Zend/zend_compile.h | 2 +- Zend/zend_execute.c | 9 +++++++-- Zend/zend_types.h | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index d787a92a7f..e26d6c7cc4 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -472,7 +472,7 @@ struct _zend_execute_data { #define ZEND_CALL_CODE (1 << 0) #define ZEND_CALL_NESTED (0 << 1) #define ZEND_CALL_TOP (1 << 1) -#define ZEND_CALL_FREE_EXTRA_ARGS (1 << 2) /* equal to IS_TYPE_REFCOUNTED */ +#define ZEND_CALL_FREE_EXTRA_ARGS (1 << 2) #define ZEND_CALL_CTOR (1 << 3) #define ZEND_CALL_HAS_SYMBOL_TABLE (1 << 4) #define ZEND_CALL_CLOSURE (1 << 5) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 146f620c10..7714ecf852 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2231,13 +2231,18 @@ static zend_never_inline void zend_copy_extra_args(EXECUTE_DATA_D) ZVAL_UNDEF(src); src--; } while (--count); + if (type_flags & (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)) { + ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_FREE_EXTRA_ARGS); + } } else { do { - type_flags |= Z_TYPE_INFO_P(src); + if (Z_REFCOUNTED_P(src)) { + ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_FREE_EXTRA_ARGS); + break; + } src--; } while (--count); } - ZEND_ADD_CALL_FLAG(execute_data, ((type_flags >> Z_TYPE_FLAGS_SHIFT) & IS_TYPE_REFCOUNTED)); } static zend_always_inline void zend_init_cvs(uint32_t first, uint32_t last EXECUTE_DATA_DC) diff --git a/Zend/zend_types.h b/Zend/zend_types.h index a284eb2293..4aa2fa0d1a 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -480,7 +480,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define GC_OBJECT (IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT)) /* zval.u1.v.type_flags */ -#define IS_TYPE_REFCOUNTED (1<<2) /* equal to ZEND_CALL_FREE_EXTRA_ARGS */ +#define IS_TYPE_REFCOUNTED (1<<0) /* extended types */ #define IS_INTERNED_STRING_EX IS_STRING -- 2.50.1