]> granicus.if.org Git - php/commitdiff
Break dependency between IS_TYPE_REFCOUNTED and ZEND_CALL_FREE_EXTRA_ARGS
authorDmitry Stogov <dmitry@zend.com>
Fri, 2 Feb 2018 14:38:07 +0000 (17:38 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 2 Feb 2018 14:38:07 +0000 (17:38 +0300)
Zend/zend_compile.h
Zend/zend_execute.c
Zend/zend_types.h

index d787a92a7f7373296623fe11c205cb779a6517e4..e26d6c7cc4d2e6c919ab980f008d5d47a18f1b57 100644 (file)
@@ -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)
index 146f620c10ff1bcba8ce795618a1eef1a5d842df..7714ecf852a22c7d32dfaa1357017a7cce853919 100644 (file)
@@ -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)
index a284eb2293379859768c0759aba0ebe2f61db30f..4aa2fa0d1a3181457eb1997ae12345a7081679d7 100644 (file)
@@ -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