]> granicus.if.org Git - php/commitdiff
Handle interned strings as non-refcounted scalars
authorDmitry Stogov <dmitry@zend.com>
Wed, 5 Mar 2014 09:55:56 +0000 (13:55 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 5 Mar 2014 09:55:56 +0000 (13:55 +0400)
17 files changed:
Zend/zend.h
Zend/zend_API.c
Zend/zend_builtin_functions.c
Zend/zend_compile.c
Zend/zend_execute.c
Zend/zend_execute.h
Zend/zend_execute_API.c
Zend/zend_language_scanner.c
Zend/zend_language_scanner.l
Zend/zend_object_handlers.c
Zend/zend_types.h
Zend/zend_variables.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/reflection/php_reflection.c
ext/standard/array.c
ext/standard/basic_functions.c

index 09db94d83660bc21ae64aee015cfa96c75d3cd68..e2aaf1a1034fc6039926c97788d3f521daf395c4 100644 (file)
@@ -356,13 +356,11 @@ static zend_always_inline zend_uint zval_set_refcount_p(zval* pz, zend_uint rc)
 
 static zend_always_inline zend_uint zval_addref_p(zval* pz) {
        ZEND_ASSERT(Z_REFCOUNTED_P(pz));
-//???  if (Z_TYPE_P(pz) == IS_STRING && IS_INTERNED(Z_STR_P(pz))) return 1;
        return ++Z_COUNTED_P(pz)->refcount;
 }
 
 static zend_always_inline zend_uint zval_delref_p(zval* pz) {
        ZEND_ASSERT(Z_REFCOUNTED_P(pz));
-//???  if (Z_TYPE_P(pz) == IS_STRING && IS_INTERNED(Z_STR_P(pz))) return 1;
        return --Z_COUNTED_P(pz)->refcount;
 }
 
@@ -745,7 +743,7 @@ END_EXTERN_C()
 
 #define COPY_PZVAL_TO_ZVAL(zv, pzv)                    \
        ZVAL_COPY_VALUE(&(zv), (pzv));                  \
-       if (IS_REFCOUNTED(Z_TYPE_P(pzv))) {             \
+       if (Z_REFCOUNTED_P(pzv)) {                              \
                if (Z_REFCOUNT_P(pzv)>1) {                      \
                        zval_copy_ctor(&(zv));                  \
                        Z_DELREF_P((pzv));                              \
@@ -771,7 +769,7 @@ END_EXTERN_C()
                zval *_varptr = (varptr);                                               \
                if (Z_ISREF_P(_varptr)) {                                               \
                        ZVAL_DUP(_varptr, Z_REFVAL_P(_varptr));         \
-               } else if (IS_REFCOUNTED(Z_TYPE_P(_varptr))) {  \
+               } else if (Z_REFCOUNTED_P(_varptr)) {                   \
                        Z_ADDREF_P(_varptr);                                            \
                }                                                                                               \
        } while (0)
index 7aacad1297adec558cca7ad90d8233aa77b412b8..3d116bf333fa350e8619a21b6f305fa0f0c2426b 100644 (file)
@@ -93,7 +93,9 @@ ZEND_API int _zend_get_parameters_array(int ht, int param_count, zval *argument_
 
        while (param_count-->0) {
                param_ptr = (p-arg_count);
-               if (!Z_ISREF_P(param_ptr) && Z_REFCOUNT_P(param_ptr) > 1) {
+               if (Z_REFCOUNTED_P(param_ptr) && 
+                   !Z_ISREF_P(param_ptr) &&                
+                   Z_REFCOUNT_P(param_ptr) > 1) {
                        zval new_tmp;
 
                        ZVAL_DUP(&new_tmp, param_ptr);
index aac29ce26017c3d2748484f2bf6f825428039b88..776f7903e463d62afe43ae0dd0f94c7a1248aad0 100644 (file)
@@ -468,7 +468,7 @@ ZEND_FUNCTION(func_get_args)
                arg = p-(arg_count-i);
                if (!Z_ISREF_P(arg)) {
                        element = arg;
-                       if (IS_REFCOUNTED(Z_TYPE_P(element))) Z_ADDREF_P(element);
+                       if (Z_REFCOUNTED_P(element)) Z_ADDREF_P(element);
                } else {
                        ZVAL_DUP(&tmp, Z_REFVAL_P(arg));
                        element = &tmp;
@@ -602,13 +602,13 @@ ZEND_FUNCTION(each)
        /* add value elements */
        if (Z_ISREF_P(entry)) {
                ZVAL_DUP(&tmp, Z_REFVAL_P(entry));
-               if (IS_REFCOUNTED(Z_TYPE(tmp))) Z_SET_REFCOUNT(tmp, 0);
+//???          if (Z_REFCOUNTED(tmp)) Z_SET_REFCOUNT(tmp, 0);
                entry = &tmp;
        }
        zend_hash_index_update(Z_ARRVAL_P(return_value), 1, entry);
-       if (IS_REFCOUNTED(Z_TYPE_P(entry))) Z_ADDREF_P(entry);
+       if (Z_REFCOUNTED_P(entry)) Z_ADDREF_P(entry);
        zend_hash_str_update(Z_ARRVAL_P(return_value), "value", sizeof("value")-1, entry);
-       if (IS_REFCOUNTED(Z_TYPE_P(entry))) Z_ADDREF_P(entry);
+       if (Z_REFCOUNTED_P(entry)) Z_ADDREF_P(entry);
 
        /* add the key elements */
        switch (zend_hash_get_current_key_ex(target_hash, &key, &num_key, 0, NULL)) {
@@ -620,7 +620,7 @@ ZEND_FUNCTION(each)
                        break;
        }
        zend_hash_str_update(Z_ARRVAL_P(return_value), "key", sizeof("key")-1, inserted_pointer);
-       if (IS_REFCOUNTED(Z_TYPE_P(inserted_pointer))) Z_ADDREF_P(inserted_pointer);
+       if (Z_REFCOUNTED_P(inserted_pointer)) Z_ADDREF_P(inserted_pointer);
        zend_hash_move_forward(target_hash);
 }
 /* }}} */
@@ -1003,7 +1003,7 @@ ZEND_FUNCTION(get_object_vars)
                        if (zend_check_property_access(zobj, key TSRMLS_CC) == SUCCESS) {
                                zend_unmangle_property_name_ex(key->val, key->len, &class_name, &prop_name, (int*) &prop_len);
                                /* Not separating references */
-                               if (IS_REFCOUNTED(Z_TYPE_P(value))) Z_ADDREF_P(value);
+                               if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
                                add_assoc_zval_ex(return_value, prop_name, prop_len, value);
                        }
                }
@@ -1980,7 +1980,7 @@ static void debug_backtrace_get_args(zval *curpos, zval *arg_array TSRMLS_DC)
 //???                  if (Z_TYPE_P(arg) != IS_OBJECT) {
 //???                          SEPARATE_ZVAL_TO_MAKE_IS_REF(arg);
 //???                  }
-                       if (IS_REFCOUNTED(Z_TYPE_P(arg))) Z_ADDREF_P(arg);
+                       if (Z_REFCOUNTED_P(arg)) Z_ADDREF_P(arg);
                        add_next_index_zval(arg_array, arg);
                } else {
                        add_next_index_null(arg_array);
index ca9ee341f417bcba60534933019c6f88a2872daf..2113fb94fd5de3089f0fd75ed6c75d6374f7161e 100644 (file)
@@ -3771,7 +3771,7 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
                }
                for (i = 0; i < parent_ce->default_properties_count; i++) {
                        ZVAL_COPY_VALUE(&ce->default_properties_table[i], &parent_ce->default_properties_table[i]);
-                       if (IS_REFCOUNTED(Z_TYPE(ce->default_properties_table[i]))) {
+                       if (Z_REFCOUNTED(ce->default_properties_table[i])) {
 #ifdef ZTS
                                if (parent_ce->type != ce->type) {
                                        zval *p;
index 955249acb4103c87594f88885d107ea55e205413..4c172013851ee5bb4d5821b6ab2df2d84913136c 100644 (file)
@@ -955,7 +955,7 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
 {
        zval garbage;
 
-       if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(variable_ptr)))) {
+       if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
                if (EXPECTED(!Z_ISREF_P(value))) {
                        ZVAL_COPY(variable_ptr, value);
                } else {
@@ -966,7 +966,7 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
                variable_ptr = Z_REFVAL_P(variable_ptr);
        }
 
-       if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(variable_ptr)))) {
+       if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
                if (EXPECTED(!Z_ISREF_P(value))) {
                        ZVAL_COPY(variable_ptr, value);
                } else {
@@ -977,7 +977,7 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
                Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
        } else if (EXPECTED(variable_ptr != value)) {
                if (Z_REFCOUNT_P(variable_ptr)==1) {
-//???                  if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(value)))) {
+//???                  if (EXPECTED(!Z_REFCOUNTED_P(value))) {
 //???                          _zval_dtor_func(variable_ptr ZEND_FILE_LINE_CC);
 //???                          ZVAL_COPY(variable_ptr, value);
 //???                  } else if (EXPECTED(!Z_ISREF_P(value))) {
@@ -1244,7 +1244,7 @@ convert_to_array:
                                        container = Z_INDIRECT_P(container);
                                }
                                ZVAL_STR_OFFSET(result, container, Z_LVAL_P(dim));
-                               Z_ADDREF_P(container);                          
+                               if (!IS_INTERNED(Z_STR_P(container))) STR_ADDREF(Z_STR_P(container));
                                return;
                        }
                        break;
index 68792811c7d834ec0c1c060f6c3a4c721dadffad..7a8755469af4c79ef72f2a4eca463318781b1f73 100644 (file)
@@ -73,7 +73,10 @@ ZEND_API int zend_verify_arg_error(int error_type, const zend_function *zf, zend
 static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC)
 {
 //??? IS_CONSTANT_TYPE_MASK used only for some rare cases
-       if (IS_REFCOUNTED(Z_TYPE_P(zval_ptr) & IS_CONSTANT_TYPE_MASK)) {
+       zend_uchar type = Z_TYPE_P(zval_ptr) & IS_CONSTANT_TYPE_MASK;
+
+       if (IS_REFCOUNTED(type) &&
+           (type != IS_STRING || !IS_INTERNED(Z_STR_P(zval_ptr)))) {
                if (!Z_DELREF_P(zval_ptr)) {
                        ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
                        GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);
@@ -92,7 +95,7 @@ static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC
 
 static zend_always_inline void i_zval_ptr_dtor_nogc(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC)
 {
-       if (IS_REFCOUNTED(Z_TYPE_P(zval_ptr))) {
+       if (Z_REFCOUNTED_P(zval_ptr)) {
                if (!Z_DELREF_P(zval_ptr)) {
                        ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
                        GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);
index c89240fd6ada4bfe0dde2562f0b65f15661863e6..3091b8541662f66eb3416b230ca21f1cd888c5e7 100644 (file)
@@ -428,7 +428,7 @@ ZEND_API void _zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) /* {{{ */
 
 ZEND_API void _zval_internal_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) /* {{{ */
 {
-       if (IS_REFCOUNTED(Z_TYPE_P(zval_ptr))) {
+       if (Z_REFCOUNTED_P(zval_ptr)) {
                Z_DELREF_P(zval_ptr);
                if (Z_REFCOUNT_P(zval_ptr) == 0) {
                        _zval_internal_dtor_for_ptr(zval_ptr ZEND_FILE_LINE_CC);
@@ -551,7 +551,7 @@ ZEND_API int zval_update_constant_ex(zval *p, void *arg, zend_class_entry *scope
                        ZVAL_COPY_VALUE(p, &const_value);
                }
 
-               if (IS_REFCOUNTED(Z_TYPE_P(p))) Z_SET_REFCOUNT_P(p, refcount);
+               if (Z_REFCOUNTED_P(p)) Z_SET_REFCOUNT_P(p, refcount);
 //???          Z_SET_ISREF_TO_P(p, is_ref);
        } else if (Z_TYPE_P(p) == IS_CONSTANT_ARRAY) {
                zval *element, new_val;
index 309d71fcc55cc23bd00460aafc2191c4fc4bfc87..bd7d6a36528d8a32e5cc82008fea21d8f61723be 100644 (file)
@@ -1097,7 +1097,7 @@ yyc_INITIAL:
 yy3:
                YYDEBUG(3, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1764 "Zend/zend_language_scanner.l"
+#line 1762 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -1174,7 +1174,7 @@ yy5:
 yy6:
                YYDEBUG(6, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1754 "Zend/zend_language_scanner.l"
+#line 1752 "Zend/zend_language_scanner.l"
                {
        if (CG(short_tags)) {
                ZVAL_STRINGL(zendlval, yytext, yyleng);
@@ -1191,7 +1191,7 @@ yy7:
                if ((yych = *YYCURSOR) == '=') goto yy43;
                YYDEBUG(8, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1733 "Zend/zend_language_scanner.l"
+#line 1731 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
 //???          ZVAL_STRINGL(zendlval, yytext, yyleng);
@@ -1388,7 +1388,7 @@ yy35:
                ++YYCURSOR;
                YYDEBUG(38, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1696 "Zend/zend_language_scanner.l"
+#line 1694 "Zend/zend_language_scanner.l"
                {
        YYCTYPE *bracket = (YYCTYPE*)zend_memrchr(yytext, '<', yyleng - (sizeof("script language=php>") - 1));
 
@@ -1431,7 +1431,7 @@ yy43:
                ++YYCURSOR;
                YYDEBUG(44, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1713 "Zend/zend_language_scanner.l"
+#line 1711 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
 //???          ZVAL_STRINGL(zendlval, yytext, yyleng);
@@ -1448,7 +1448,7 @@ yy45:
                ++YYCURSOR;
                YYDEBUG(46, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1725 "Zend/zend_language_scanner.l"
+#line 1723 "Zend/zend_language_scanner.l"
                {
 //???  ZVAL_STRINGL(zendlval, yytext, yyleng);
        ZVAL_STR(zendlval, STR_EMPTY_ALLOC()); /* tricky way to no copying - intentional */ 
@@ -1482,7 +1482,7 @@ yy50:
 yy51:
                YYDEBUG(51, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1745 "Zend/zend_language_scanner.l"
+#line 1743 "Zend/zend_language_scanner.l"
                {
 //???  ZVAL_STRINGL(zendlval, yytext, yyleng);
        ZVAL_STR(zendlval, STR_EMPTY_ALLOC()); /* tricky way, no copying intentional */
@@ -1561,7 +1561,7 @@ yyc_ST_BACKQUOTE:
 yy56:
                YYDEBUG(56, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2204 "Zend/zend_language_scanner.l"
+#line 2202 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -1613,7 +1613,7 @@ yy58:
                ++YYCURSOR;
                YYDEBUG(59, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2148 "Zend/zend_language_scanner.l"
+#line 2146 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        return '`';
@@ -1628,7 +1628,7 @@ yy61:
                ++YYCURSOR;
                YYDEBUG(62, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2135 "Zend/zend_language_scanner.l"
+#line 2133 "Zend/zend_language_scanner.l"
                {
        Z_LVAL_P(zendlval) = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
@@ -1651,7 +1651,7 @@ yy63:
 yy65:
                YYDEBUG(65, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1843 "Zend/zend_language_scanner.l"
+#line 1841 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        return T_VARIABLE;
@@ -1681,7 +1681,7 @@ yy70:
                ++YYCURSOR;
                YYDEBUG(71, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1836 "Zend/zend_language_scanner.l"
+#line 1834 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -1706,7 +1706,7 @@ yy73:
                ++YYCURSOR;
                YYDEBUG(74, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1827 "Zend/zend_language_scanner.l"
+#line 1825 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -1781,7 +1781,7 @@ yy77:
 yy78:
                YYDEBUG(78, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2154 "Zend/zend_language_scanner.l"
+#line 2152 "Zend/zend_language_scanner.l"
                {
        if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) {
                YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1;
@@ -1841,7 +1841,7 @@ yy80:
                ++YYCURSOR;
                YYDEBUG(81, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2143 "Zend/zend_language_scanner.l"
+#line 2141 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        return '"';
@@ -1856,7 +1856,7 @@ yy83:
                ++YYCURSOR;
                YYDEBUG(84, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2135 "Zend/zend_language_scanner.l"
+#line 2133 "Zend/zend_language_scanner.l"
                {
        Z_LVAL_P(zendlval) = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
@@ -1879,7 +1879,7 @@ yy85:
 yy87:
                YYDEBUG(87, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1843 "Zend/zend_language_scanner.l"
+#line 1841 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        return T_VARIABLE;
@@ -1909,7 +1909,7 @@ yy92:
                ++YYCURSOR;
                YYDEBUG(93, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1836 "Zend/zend_language_scanner.l"
+#line 1834 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -1934,7 +1934,7 @@ yy95:
                ++YYCURSOR;
                YYDEBUG(96, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1827 "Zend/zend_language_scanner.l"
+#line 1825 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -1952,7 +1952,7 @@ yyc_ST_END_HEREDOC:
        ++YYCURSOR;
        YYDEBUG(100, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 2121 "Zend/zend_language_scanner.l"
+#line 2119 "Zend/zend_language_scanner.l"
        {
        zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack));
 
@@ -2027,7 +2027,7 @@ yy103:
 yy104:
                YYDEBUG(104, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2246 "Zend/zend_language_scanner.l"
+#line 2244 "Zend/zend_language_scanner.l"
                {
        int newline = 0;
 
@@ -2115,7 +2115,7 @@ yy107:
                ++YYCURSOR;
                YYDEBUG(108, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2135 "Zend/zend_language_scanner.l"
+#line 2133 "Zend/zend_language_scanner.l"
                {
        Z_LVAL_P(zendlval) = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
@@ -2138,7 +2138,7 @@ yy109:
 yy111:
                YYDEBUG(111, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1843 "Zend/zend_language_scanner.l"
+#line 1841 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        return T_VARIABLE;
@@ -2168,7 +2168,7 @@ yy116:
                ++YYCURSOR;
                YYDEBUG(117, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1836 "Zend/zend_language_scanner.l"
+#line 1834 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -2193,7 +2193,7 @@ yy119:
                ++YYCURSOR;
                YYDEBUG(120, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1827 "Zend/zend_language_scanner.l"
+#line 1825 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -2383,7 +2383,7 @@ yy123:
 yy124:
                YYDEBUG(124, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1865 "Zend/zend_language_scanner.l"
+#line 1863 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        return T_STRING;
@@ -2984,7 +2984,7 @@ yy176:
 yy177:
                YYDEBUG(177, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1871 "Zend/zend_language_scanner.l"
+#line 1869 "Zend/zend_language_scanner.l"
                {
        while (YYCURSOR < YYLIMIT) {
                switch (*YYCURSOR++) {
@@ -3025,7 +3025,7 @@ yy178:
 yy179:
                YYDEBUG(179, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1958 "Zend/zend_language_scanner.l"
+#line 1956 "Zend/zend_language_scanner.l"
                {
        register char *s, *t;
        char *end;
@@ -3098,7 +3098,7 @@ yy180:
 yy181:
                YYDEBUG(181, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2025 "Zend/zend_language_scanner.l"
+#line 2023 "Zend/zend_language_scanner.l"
                {
        int bprefix = (yytext[0] != '"') ? 1 : 0;
 
@@ -3145,7 +3145,7 @@ yy182:
                ++YYCURSOR;
                YYDEBUG(183, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2115 "Zend/zend_language_scanner.l"
+#line 2113 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_BACKQUOTE);
        return '`';
@@ -3156,7 +3156,7 @@ yy184:
                ++YYCURSOR;
                YYDEBUG(185, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2377 "Zend/zend_language_scanner.l"
+#line 2375 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -3358,7 +3358,7 @@ yy206:
 yy207:
                YYDEBUG(207, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1938 "Zend/zend_language_scanner.l"
+#line 1936 "Zend/zend_language_scanner.l"
                {
 //???  ZVAL_STRINGL(zendlval, yytext, yyleng);
        ZVAL_STR(zendlval, STR_EMPTY_ALLOC()); /* tricky way to no copying - intentional */ 
@@ -3399,7 +3399,7 @@ yy210:
 yy212:
                YYDEBUG(212, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1843 "Zend/zend_language_scanner.l"
+#line 1841 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        return T_VARIABLE;
@@ -3494,7 +3494,7 @@ yy228:
 yy229:
                YYDEBUG(229, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1946 "Zend/zend_language_scanner.l"
+#line 1944 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                BEGIN(INITIAL);
@@ -3533,7 +3533,7 @@ yy234:
 yy235:
                YYDEBUG(235, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1905 "Zend/zend_language_scanner.l"
+#line 1903 "Zend/zend_language_scanner.l"
                {
        int doc_com;
 
@@ -3840,7 +3840,7 @@ yy275:
 yy276:
                YYDEBUG(276, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2067 "Zend/zend_language_scanner.l"
+#line 2065 "Zend/zend_language_scanner.l"
                {
        char *s;
        int bprefix = (yytext[0] != '<') ? 1 : 0;
@@ -4135,7 +4135,7 @@ yy313:
                }
                YYDEBUG(316, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1687 "Zend/zend_language_scanner.l"
+#line 1685 "Zend/zend_language_scanner.l"
                {
        if (Z_TYPE(CG(current_namespace)) != IS_UNDEF) {
                ZVAL_DUP(zendlval, &CG(current_namespace));
@@ -4164,7 +4164,7 @@ yy318:
                }
                YYDEBUG(321, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1662 "Zend/zend_language_scanner.l"
+#line 1660 "Zend/zend_language_scanner.l"
                {
        zend_string *filename = zend_get_compiled_filename(TSRMLS_C);
        zend_string *dirname;
@@ -4214,7 +4214,7 @@ yy324:
                }
                YYDEBUG(327, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1647 "Zend/zend_language_scanner.l"
+#line 1645 "Zend/zend_language_scanner.l"
                {
        ZVAL_LONG(zendlval, CG(zend_lineno));
        return T_LINE;
@@ -4254,7 +4254,7 @@ yy332:
                }
                YYDEBUG(335, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1616 "Zend/zend_language_scanner.l"
+#line 1614 "Zend/zend_language_scanner.l"
                {
        if (CG(active_class_entry)) {
                int len = 2;
@@ -4336,7 +4336,7 @@ yy343:
                }
                YYDEBUG(346, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1606 "Zend/zend_language_scanner.l"
+#line 1604 "Zend/zend_language_scanner.l"
                {
        zend_op_array *op_array = CG(active_op_array);
        if (op_array && op_array->function_name) {
@@ -4366,7 +4366,7 @@ yy348:
                }
                YYDEBUG(351, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1652 "Zend/zend_language_scanner.l"
+#line 1650 "Zend/zend_language_scanner.l"
                {
        zend_string *filename = zend_get_compiled_filename(TSRMLS_C);
 
@@ -4406,18 +4406,17 @@ yy355:
                }
                YYDEBUG(358, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1595 "Zend/zend_language_scanner.l"
+#line 1594 "Zend/zend_language_scanner.l"
                {
        zend_class_entry *ce = CG(active_class_entry);
        if (ce && ce->name && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) {
-               ZVAL_STR(zendlval, ce->name);
-               Z_ADDREF_P(zendlval);
+               ZVAL_STR(zendlval, STR_COPY(ce->name));
        } else {
                ZVAL_EMPTY_STRING(zendlval);
        }
        return T_TRAIT_C;
 }
-#line 4421 "Zend/zend_language_scanner.c"
+#line 4420 "Zend/zend_language_scanner.c"
 yy359:
                YYDEBUG(359, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4457,15 +4456,14 @@ yy362:
                Z_TYPE_P(zendlval) = IS_CONSTANT;
        } else {
                if (ce && ce->name) {
-                       ZVAL_STR(zendlval, ce->name);
-                       Z_ADDREF_P(zendlval);
+                       ZVAL_STR(zendlval, STR_COPY(ce->name));
                } else {
                        ZVAL_EMPTY_STRING(zendlval);
                }
        }
        return T_CLASS_C;
 }
-#line 4469 "Zend/zend_language_scanner.c"
+#line 4467 "Zend/zend_language_scanner.c"
 yy366:
                YYDEBUG(366, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4531,7 +4529,7 @@ yy377:
                {
        return T_HALT_COMPILER;
 }
-#line 4535 "Zend/zend_language_scanner.c"
+#line 4533 "Zend/zend_language_scanner.c"
 yy379:
                YYDEBUG(379, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4555,7 +4553,7 @@ yy381:
                {
        return T_USE;
 }
-#line 4559 "Zend/zend_language_scanner.c"
+#line 4557 "Zend/zend_language_scanner.c"
 yy383:
                YYDEBUG(383, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4578,7 +4576,7 @@ yy385:
                {
        return T_UNSET;
 }
-#line 4582 "Zend/zend_language_scanner.c"
+#line 4580 "Zend/zend_language_scanner.c"
 yy387:
                YYDEBUG(387, *YYCURSOR);
                ++YYCURSOR;
@@ -4754,7 +4752,7 @@ yy402:
                {
        return T_INT_CAST;
 }
-#line 4758 "Zend/zend_language_scanner.c"
+#line 4756 "Zend/zend_language_scanner.c"
 yy405:
                YYDEBUG(405, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4802,7 +4800,7 @@ yy410:
                {
        return T_DOUBLE_CAST;
 }
-#line 4806 "Zend/zend_language_scanner.c"
+#line 4804 "Zend/zend_language_scanner.c"
 yy414:
                YYDEBUG(414, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4876,7 +4874,7 @@ yy424:
                {
        return T_STRING_CAST;
 }
-#line 4880 "Zend/zend_language_scanner.c"
+#line 4878 "Zend/zend_language_scanner.c"
 yy428:
                YYDEBUG(428, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4913,7 +4911,7 @@ yy431:
                {
        return T_ARRAY_CAST;
 }
-#line 4917 "Zend/zend_language_scanner.c"
+#line 4915 "Zend/zend_language_scanner.c"
 yy435:
                YYDEBUG(435, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4955,7 +4953,7 @@ yy439:
                {
        return T_OBJECT_CAST;
 }
-#line 4959 "Zend/zend_language_scanner.c"
+#line 4957 "Zend/zend_language_scanner.c"
 yy443:
                YYDEBUG(443, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5000,7 +4998,7 @@ yy448:
                {
        return T_BOOL_CAST;
 }
-#line 5004 "Zend/zend_language_scanner.c"
+#line 5002 "Zend/zend_language_scanner.c"
 yy451:
                YYDEBUG(451, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5064,7 +5062,7 @@ yy459:
                {
        return T_UNSET_CAST;
 }
-#line 5068 "Zend/zend_language_scanner.c"
+#line 5066 "Zend/zend_language_scanner.c"
 yy463:
                YYDEBUG(463, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5082,7 +5080,7 @@ yy464:
                {
        return T_VAR;
 }
-#line 5086 "Zend/zend_language_scanner.c"
+#line 5084 "Zend/zend_language_scanner.c"
 yy466:
                YYDEBUG(466, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5106,7 +5104,7 @@ yy468:
                {
        return T_NEW;
 }
-#line 5110 "Zend/zend_language_scanner.c"
+#line 5108 "Zend/zend_language_scanner.c"
 yy470:
                YYDEBUG(470, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5149,7 +5147,7 @@ yy476:
                {
        return T_NAMESPACE;
 }
-#line 5153 "Zend/zend_language_scanner.c"
+#line 5151 "Zend/zend_language_scanner.c"
 yy478:
                YYDEBUG(478, *YYCURSOR);
                yyaccept = 3;
@@ -5175,7 +5173,7 @@ yy480:
                {
        return T_CONCAT_EQUAL;
 }
-#line 5179 "Zend/zend_language_scanner.c"
+#line 5177 "Zend/zend_language_scanner.c"
 yy482:
                YYDEBUG(482, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5188,7 +5186,7 @@ yy482:
                {
        return T_ELLIPSIS;
 }
-#line 5192 "Zend/zend_language_scanner.c"
+#line 5190 "Zend/zend_language_scanner.c"
 yy485:
                YYDEBUG(485, *YYCURSOR);
                ++YYCURSOR;
@@ -5198,7 +5196,7 @@ yy485:
                {
        return T_PAAMAYIM_NEKUDOTAYIM;
 }
-#line 5202 "Zend/zend_language_scanner.c"
+#line 5200 "Zend/zend_language_scanner.c"
 yy487:
                YYDEBUG(487, *YYCURSOR);
                ++YYCURSOR;
@@ -5224,7 +5222,7 @@ yy489:
                {
        return T_MINUS_EQUAL;
 }
-#line 5228 "Zend/zend_language_scanner.c"
+#line 5226 "Zend/zend_language_scanner.c"
 yy491:
                YYDEBUG(491, *YYCURSOR);
                ++YYCURSOR;
@@ -5234,7 +5232,7 @@ yy491:
                {
        return T_DEC;
 }
-#line 5238 "Zend/zend_language_scanner.c"
+#line 5236 "Zend/zend_language_scanner.c"
 yy493:
                YYDEBUG(493, *YYCURSOR);
                ++YYCURSOR;
@@ -5245,7 +5243,7 @@ yy493:
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
        return T_OBJECT_OPERATOR;
 }
-#line 5249 "Zend/zend_language_scanner.c"
+#line 5247 "Zend/zend_language_scanner.c"
 yy495:
                YYDEBUG(495, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5294,7 +5292,7 @@ yy500:
                {
        return T_PUBLIC;
 }
-#line 5298 "Zend/zend_language_scanner.c"
+#line 5296 "Zend/zend_language_scanner.c"
 yy502:
                YYDEBUG(502, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5353,7 +5351,7 @@ yy509:
                {
        return T_PROTECTED;
 }
-#line 5357 "Zend/zend_language_scanner.c"
+#line 5355 "Zend/zend_language_scanner.c"
 yy511:
                YYDEBUG(511, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5387,7 +5385,7 @@ yy515:
                {
        return T_PRIVATE;
 }
-#line 5391 "Zend/zend_language_scanner.c"
+#line 5389 "Zend/zend_language_scanner.c"
 yy517:
                YYDEBUG(517, *YYCURSOR);
                ++YYCURSOR;
@@ -5400,7 +5398,7 @@ yy517:
                {
        return T_PRINT;
 }
-#line 5404 "Zend/zend_language_scanner.c"
+#line 5402 "Zend/zend_language_scanner.c"
 yy519:
                YYDEBUG(519, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5429,7 +5427,7 @@ yy522:
                {
        return T_GOTO;
 }
-#line 5433 "Zend/zend_language_scanner.c"
+#line 5431 "Zend/zend_language_scanner.c"
 yy524:
                YYDEBUG(524, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5457,7 +5455,7 @@ yy527:
                {
        return T_GLOBAL;
 }
-#line 5461 "Zend/zend_language_scanner.c"
+#line 5459 "Zend/zend_language_scanner.c"
 yy529:
                YYDEBUG(529, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5498,7 +5496,7 @@ yy535:
                {
        return T_BREAK;
 }
-#line 5502 "Zend/zend_language_scanner.c"
+#line 5500 "Zend/zend_language_scanner.c"
 yy537:
                YYDEBUG(537, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5542,7 +5540,7 @@ yy543:
                {
        return T_SWITCH;
 }
-#line 5546 "Zend/zend_language_scanner.c"
+#line 5544 "Zend/zend_language_scanner.c"
 yy545:
                YYDEBUG(545, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5570,7 +5568,7 @@ yy548:
                {
        return T_STATIC;
 }
-#line 5574 "Zend/zend_language_scanner.c"
+#line 5572 "Zend/zend_language_scanner.c"
 yy550:
                YYDEBUG(550, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5601,7 +5599,7 @@ yy553:
                {
        return T_AS;
 }
-#line 5605 "Zend/zend_language_scanner.c"
+#line 5603 "Zend/zend_language_scanner.c"
 yy555:
                YYDEBUG(555, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5624,7 +5622,7 @@ yy557:
                {
        return T_ARRAY;
 }
-#line 5628 "Zend/zend_language_scanner.c"
+#line 5626 "Zend/zend_language_scanner.c"
 yy559:
                YYDEBUG(559, *YYCURSOR);
                ++YYCURSOR;
@@ -5637,7 +5635,7 @@ yy559:
                {
        return T_LOGICAL_AND;
 }
-#line 5641 "Zend/zend_language_scanner.c"
+#line 5639 "Zend/zend_language_scanner.c"
 yy561:
                YYDEBUG(561, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5675,7 +5673,7 @@ yy566:
                {
        return T_ABSTRACT;
 }
-#line 5679 "Zend/zend_language_scanner.c"
+#line 5677 "Zend/zend_language_scanner.c"
 yy568:
                YYDEBUG(568, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5703,7 +5701,7 @@ yy571:
                {
        return T_WHILE;
 }
-#line 5707 "Zend/zend_language_scanner.c"
+#line 5705 "Zend/zend_language_scanner.c"
 yy573:
                YYDEBUG(573, *YYCURSOR);
                ++YYCURSOR;
@@ -5716,7 +5714,7 @@ yy573:
                {
        return T_IF;
 }
-#line 5720 "Zend/zend_language_scanner.c"
+#line 5718 "Zend/zend_language_scanner.c"
 yy575:
                YYDEBUG(575, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5772,7 +5770,7 @@ yy580:
                {
        return T_ISSET;
 }
-#line 5776 "Zend/zend_language_scanner.c"
+#line 5774 "Zend/zend_language_scanner.c"
 yy582:
                YYDEBUG(582, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5830,7 +5828,7 @@ yy589:
                {
        return T_INCLUDE;
 }
-#line 5834 "Zend/zend_language_scanner.c"
+#line 5832 "Zend/zend_language_scanner.c"
 yy590:
                YYDEBUG(590, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5863,7 +5861,7 @@ yy594:
                {
        return T_INCLUDE_ONCE;
 }
-#line 5867 "Zend/zend_language_scanner.c"
+#line 5865 "Zend/zend_language_scanner.c"
 yy596:
                YYDEBUG(596, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5901,7 +5899,7 @@ yy601:
                {
        return T_INTERFACE;
 }
-#line 5905 "Zend/zend_language_scanner.c"
+#line 5903 "Zend/zend_language_scanner.c"
 yy603:
                YYDEBUG(603, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5955,7 +5953,7 @@ yy609:
                {
         return T_INSTEADOF;
 }
-#line 5959 "Zend/zend_language_scanner.c"
+#line 5957 "Zend/zend_language_scanner.c"
 yy611:
                YYDEBUG(611, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5988,7 +5986,7 @@ yy615:
                {
        return T_INSTANCEOF;
 }
-#line 5992 "Zend/zend_language_scanner.c"
+#line 5990 "Zend/zend_language_scanner.c"
 yy617:
                YYDEBUG(617, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6036,7 +6034,7 @@ yy624:
                {
        return T_IMPLEMENTS;
 }
-#line 6040 "Zend/zend_language_scanner.c"
+#line 6038 "Zend/zend_language_scanner.c"
 yy626:
                YYDEBUG(626, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6068,7 +6066,7 @@ yy627:
                {
        return T_TRY;
 }
-#line 6072 "Zend/zend_language_scanner.c"
+#line 6070 "Zend/zend_language_scanner.c"
 yy630:
                YYDEBUG(630, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6091,7 +6089,7 @@ yy632:
                {
        return T_TRAIT;
 }
-#line 6095 "Zend/zend_language_scanner.c"
+#line 6093 "Zend/zend_language_scanner.c"
 yy634:
                YYDEBUG(634, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6114,7 +6112,7 @@ yy636:
                {
        return T_THROW;
 }
-#line 6118 "Zend/zend_language_scanner.c"
+#line 6116 "Zend/zend_language_scanner.c"
 yy638:
                YYDEBUG(638, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6142,7 +6140,7 @@ yy641:
                {
        return T_YIELD;
 }
-#line 6146 "Zend/zend_language_scanner.c"
+#line 6144 "Zend/zend_language_scanner.c"
 yy643:
                YYDEBUG(643, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6207,7 +6205,7 @@ yy650:
                {
        return T_REQUIRE;
 }
-#line 6211 "Zend/zend_language_scanner.c"
+#line 6209 "Zend/zend_language_scanner.c"
 yy651:
                YYDEBUG(651, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6240,7 +6238,7 @@ yy655:
                {
        return T_REQUIRE_ONCE;
 }
-#line 6244 "Zend/zend_language_scanner.c"
+#line 6242 "Zend/zend_language_scanner.c"
 yy657:
                YYDEBUG(657, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6263,7 +6261,7 @@ yy659:
                {
        return T_RETURN;
 }
-#line 6267 "Zend/zend_language_scanner.c"
+#line 6265 "Zend/zend_language_scanner.c"
 yy661:
                YYDEBUG(661, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6357,7 +6355,7 @@ yy670:
                {
        return T_CONTINUE;
 }
-#line 6361 "Zend/zend_language_scanner.c"
+#line 6359 "Zend/zend_language_scanner.c"
 yy672:
                YYDEBUG(672, *YYCURSOR);
                ++YYCURSOR;
@@ -6370,7 +6368,7 @@ yy672:
                {
        return T_CONST;
 }
-#line 6374 "Zend/zend_language_scanner.c"
+#line 6372 "Zend/zend_language_scanner.c"
 yy674:
                YYDEBUG(674, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6399,7 +6397,7 @@ yy677:
                {
        return T_CLONE;
 }
-#line 6403 "Zend/zend_language_scanner.c"
+#line 6401 "Zend/zend_language_scanner.c"
 yy679:
                YYDEBUG(679, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6417,7 +6415,7 @@ yy680:
                {
        return T_CLASS;
 }
-#line 6421 "Zend/zend_language_scanner.c"
+#line 6419 "Zend/zend_language_scanner.c"
 yy682:
                YYDEBUG(682, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6467,7 +6465,7 @@ yy689:
                {
  return T_CALLABLE;
 }
-#line 6471 "Zend/zend_language_scanner.c"
+#line 6469 "Zend/zend_language_scanner.c"
 yy691:
                YYDEBUG(691, *YYCURSOR);
                ++YYCURSOR;
@@ -6480,7 +6478,7 @@ yy691:
                {
        return T_CASE;
 }
-#line 6484 "Zend/zend_language_scanner.c"
+#line 6482 "Zend/zend_language_scanner.c"
 yy693:
                YYDEBUG(693, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6498,7 +6496,7 @@ yy694:
                {
        return T_CATCH;
 }
-#line 6502 "Zend/zend_language_scanner.c"
+#line 6500 "Zend/zend_language_scanner.c"
 yy696:
                YYDEBUG(696, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6553,7 +6551,7 @@ yy704:
                {
        return T_FUNCTION;
 }
-#line 6557 "Zend/zend_language_scanner.c"
+#line 6555 "Zend/zend_language_scanner.c"
 yy706:
                YYDEBUG(706, *YYCURSOR);
                ++YYCURSOR;
@@ -6581,7 +6579,7 @@ yy707:
                {
        return T_FOR;
 }
-#line 6585 "Zend/zend_language_scanner.c"
+#line 6583 "Zend/zend_language_scanner.c"
 yy708:
                YYDEBUG(708, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6609,7 +6607,7 @@ yy711:
                {
        return T_FOREACH;
 }
-#line 6613 "Zend/zend_language_scanner.c"
+#line 6611 "Zend/zend_language_scanner.c"
 yy713:
                YYDEBUG(713, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6647,7 +6645,7 @@ yy716:
                {
        return T_FINAL;
 }
-#line 6651 "Zend/zend_language_scanner.c"
+#line 6649 "Zend/zend_language_scanner.c"
 yy717:
                YYDEBUG(717, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6665,7 +6663,7 @@ yy718:
                {
        return T_FINALLY;
 }
-#line 6669 "Zend/zend_language_scanner.c"
+#line 6667 "Zend/zend_language_scanner.c"
 yy720:
                YYDEBUG(720, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6700,7 +6698,7 @@ yy722:
                {
        return T_DO;
 }
-#line 6704 "Zend/zend_language_scanner.c"
+#line 6702 "Zend/zend_language_scanner.c"
 yy724:
                YYDEBUG(724, *YYCURSOR);
                ++YYCURSOR;
@@ -6713,7 +6711,7 @@ yy724:
                {
        return T_EXIT;
 }
-#line 6717 "Zend/zend_language_scanner.c"
+#line 6715 "Zend/zend_language_scanner.c"
 yy726:
                YYDEBUG(726, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6752,7 +6750,7 @@ yy731:
                {
        return T_DEFAULT;
 }
-#line 6756 "Zend/zend_language_scanner.c"
+#line 6754 "Zend/zend_language_scanner.c"
 yy733:
                YYDEBUG(733, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6780,7 +6778,7 @@ yy736:
                {
        return T_DECLARE;
 }
-#line 6784 "Zend/zend_language_scanner.c"
+#line 6782 "Zend/zend_language_scanner.c"
 yy738:
                YYDEBUG(738, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6864,7 +6862,7 @@ yy749:
                {
        return T_EXTENDS;
 }
-#line 6868 "Zend/zend_language_scanner.c"
+#line 6866 "Zend/zend_language_scanner.c"
 yy751:
                YYDEBUG(751, *YYCURSOR);
                ++YYCURSOR;
@@ -6877,7 +6875,7 @@ yy751:
                {
        return T_EXIT;
 }
-#line 6881 "Zend/zend_language_scanner.c"
+#line 6879 "Zend/zend_language_scanner.c"
 yy753:
                YYDEBUG(753, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6895,7 +6893,7 @@ yy754:
                {
        return T_EVAL;
 }
-#line 6899 "Zend/zend_language_scanner.c"
+#line 6897 "Zend/zend_language_scanner.c"
 yy756:
                YYDEBUG(756, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6969,7 +6967,7 @@ yy765:
                {
        return T_ENDWHILE;
 }
-#line 6973 "Zend/zend_language_scanner.c"
+#line 6971 "Zend/zend_language_scanner.c"
 yy767:
                YYDEBUG(767, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7002,7 +7000,7 @@ yy771:
                {
        return T_ENDSWITCH;
 }
-#line 7006 "Zend/zend_language_scanner.c"
+#line 7004 "Zend/zend_language_scanner.c"
 yy773:
                YYDEBUG(773, *YYCURSOR);
                ++YYCURSOR;
@@ -7015,7 +7013,7 @@ yy773:
                {
        return T_ENDIF;
 }
-#line 7019 "Zend/zend_language_scanner.c"
+#line 7017 "Zend/zend_language_scanner.c"
 yy775:
                YYDEBUG(775, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7048,7 +7046,7 @@ yy777:
                {
        return T_ENDFOR;
 }
-#line 7052 "Zend/zend_language_scanner.c"
+#line 7050 "Zend/zend_language_scanner.c"
 yy778:
                YYDEBUG(778, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7076,7 +7074,7 @@ yy781:
                {
        return T_ENDFOREACH;
 }
-#line 7080 "Zend/zend_language_scanner.c"
+#line 7078 "Zend/zend_language_scanner.c"
 yy783:
                YYDEBUG(783, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7114,7 +7112,7 @@ yy788:
                {
        return T_ENDDECLARE;
 }
-#line 7118 "Zend/zend_language_scanner.c"
+#line 7116 "Zend/zend_language_scanner.c"
 yy790:
                YYDEBUG(790, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7137,7 +7135,7 @@ yy792:
                {
        return T_EMPTY;
 }
-#line 7141 "Zend/zend_language_scanner.c"
+#line 7139 "Zend/zend_language_scanner.c"
 yy794:
                YYDEBUG(794, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7170,7 +7168,7 @@ yy796:
                {
        return T_ELSE;
 }
-#line 7174 "Zend/zend_language_scanner.c"
+#line 7172 "Zend/zend_language_scanner.c"
 yy797:
                YYDEBUG(797, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7188,7 +7186,7 @@ yy798:
                {
        return T_ELSEIF;
 }
-#line 7192 "Zend/zend_language_scanner.c"
+#line 7190 "Zend/zend_language_scanner.c"
 yy800:
                YYDEBUG(800, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7206,7 +7204,7 @@ yy801:
                {
        return T_ECHO;
 }
-#line 7210 "Zend/zend_language_scanner.c"
+#line 7208 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_LOOKING_FOR_PROPERTY:
@@ -7286,7 +7284,7 @@ yy806:
        HANDLE_NEWLINES(yytext, yyleng);
        return T_WHITESPACE;
 }
-#line 7290 "Zend/zend_language_scanner.c"
+#line 7288 "Zend/zend_language_scanner.c"
 yy807:
                YYDEBUG(807, *YYCURSOR);
                ++YYCURSOR;
@@ -7300,7 +7298,7 @@ yy808:
        yy_pop_state(TSRMLS_C);
        goto restart;
 }
-#line 7304 "Zend/zend_language_scanner.c"
+#line 7302 "Zend/zend_language_scanner.c"
 yy809:
                YYDEBUG(809, *YYCURSOR);
                ++YYCURSOR;
@@ -7315,7 +7313,7 @@ yy810:
        zend_copy_value(zendlval, yytext, yyleng);
        return T_STRING;
 }
-#line 7319 "Zend/zend_language_scanner.c"
+#line 7317 "Zend/zend_language_scanner.c"
 yy811:
                YYDEBUG(811, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7340,7 +7338,7 @@ yy814:
                {
        return T_OBJECT_OPERATOR;
 }
-#line 7344 "Zend/zend_language_scanner.c"
+#line 7342 "Zend/zend_language_scanner.c"
 yy816:
                YYDEBUG(816, *YYCURSOR);
                ++YYCURSOR;
@@ -7432,7 +7430,7 @@ yy821:
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        goto restart;
 }
-#line 7436 "Zend/zend_language_scanner.c"
+#line 7434 "Zend/zend_language_scanner.c"
 yy822:
                YYDEBUG(822, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7465,7 +7463,7 @@ yy826:
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return T_STRING_VARNAME;
 }
-#line 7469 "Zend/zend_language_scanner.c"
+#line 7467 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_NOWDOC:
@@ -7476,7 +7474,7 @@ yyc_ST_NOWDOC:
        ++YYCURSOR;
        YYDEBUG(831, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 2320 "Zend/zend_language_scanner.l"
+#line 2318 "Zend/zend_language_scanner.l"
        {
        int newline = 0;
 
@@ -7532,7 +7530,7 @@ nowdoc_scan_done:
        HANDLE_NEWLINES(yytext, yyleng - newline);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 7536 "Zend/zend_language_scanner.c"
+#line 7534 "Zend/zend_language_scanner.c"
 /* *********************************** */
 yyc_ST_VAR_OFFSET:
        {
@@ -7648,7 +7646,7 @@ yy835:
        }
        return T_NUM_STRING;
 }
-#line 7652 "Zend/zend_language_scanner.c"
+#line 7650 "Zend/zend_language_scanner.c"
 yy836:
                YYDEBUG(836, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7668,23 +7666,23 @@ yy837:
 yy838:
                YYDEBUG(838, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1853 "Zend/zend_language_scanner.l"
+#line 1851 "Zend/zend_language_scanner.l"
                {
        /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */
        return yytext[0];
 }
-#line 7677 "Zend/zend_language_scanner.c"
+#line 7675 "Zend/zend_language_scanner.c"
 yy839:
                YYDEBUG(839, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(840, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1848 "Zend/zend_language_scanner.l"
+#line 1846 "Zend/zend_language_scanner.l"
                {
        yy_pop_state(TSRMLS_C);
        return ']';
 }
-#line 7688 "Zend/zend_language_scanner.c"
+#line 7686 "Zend/zend_language_scanner.c"
 yy841:
                YYDEBUG(841, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7694,14 +7692,14 @@ yy842:
                ++YYCURSOR;
                YYDEBUG(843, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1858 "Zend/zend_language_scanner.l"
+#line 1856 "Zend/zend_language_scanner.l"
                {
        /* Invalid rule to return a more explicit parse error with proper line number */
        yyless(0);
        yy_pop_state(TSRMLS_C);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 7705 "Zend/zend_language_scanner.c"
+#line 7703 "Zend/zend_language_scanner.c"
 yy844:
                YYDEBUG(844, *YYCURSOR);
                ++YYCURSOR;
@@ -7710,18 +7708,18 @@ yy844:
 yy845:
                YYDEBUG(845, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1865 "Zend/zend_language_scanner.l"
+#line 1863 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        return T_STRING;
 }
-#line 7719 "Zend/zend_language_scanner.c"
+#line 7717 "Zend/zend_language_scanner.c"
 yy846:
                YYDEBUG(846, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(847, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2377 "Zend/zend_language_scanner.l"
+#line 2375 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -7730,7 +7728,7 @@ yy846:
        zend_error(E_COMPILE_WARNING,"Unexpected character in input:  '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
        goto restart;
 }
-#line 7734 "Zend/zend_language_scanner.c"
+#line 7732 "Zend/zend_language_scanner.c"
 yy848:
                YYDEBUG(848, *YYCURSOR);
                ++YYCURSOR;
@@ -7766,12 +7764,12 @@ yy850:
 yy852:
                YYDEBUG(852, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1843 "Zend/zend_language_scanner.l"
+#line 1841 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        return T_VARIABLE;
 }
-#line 7775 "Zend/zend_language_scanner.c"
+#line 7773 "Zend/zend_language_scanner.c"
 yy853:
                YYDEBUG(853, *YYCURSOR);
                ++YYCURSOR;
@@ -7816,7 +7814,7 @@ yy860:
        ZVAL_STRINGL(zendlval, yytext, yyleng);
        return T_NUM_STRING;
 }
-#line 7820 "Zend/zend_language_scanner.c"
+#line 7818 "Zend/zend_language_scanner.c"
 yy861:
                YYDEBUG(861, *YYCURSOR);
                ++YYCURSOR;
@@ -7839,6 +7837,6 @@ yy863:
                goto yy860;
        }
 }
-#line 2386 "Zend/zend_language_scanner.l"
+#line 2384 "Zend/zend_language_scanner.l"
 
 }
index 725307d15624402facc04742ba749ad57b3036c1..7d99efe1c0c3d1400137ce15e68d56a817e3af69 100644 (file)
@@ -1583,8 +1583,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
                Z_TYPE_P(zendlval) = IS_CONSTANT;
        } else {
                if (ce && ce->name) {
-                       ZVAL_STR(zendlval, ce->name);
-                       Z_ADDREF_P(zendlval);
+                       ZVAL_STR(zendlval, STR_COPY(ce->name));
                } else {
                        ZVAL_EMPTY_STRING(zendlval);
                }
@@ -1595,8 +1594,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
 <ST_IN_SCRIPTING>"__TRAIT__" {
        zend_class_entry *ce = CG(active_class_entry);
        if (ce && ce->name && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) {
-               ZVAL_STR(zendlval, ce->name);
-               Z_ADDREF_P(zendlval);
+               ZVAL_STR(zendlval, STR_COPY(ce->name));
        } else {
                ZVAL_EMPTY_STRING(zendlval);
        }
index 2205ab2f1e3e079ead3d42e289511a78457bf945..1893e734551e41ab78505a68d180f474c4937f1e 100644 (file)
@@ -597,7 +597,7 @@ found:
                                                ZVAL_COPY_VALUE(&garbage, variable_ptr);
 
                                                /* if we assign referenced variable, we should separate it */
-                                               if (IS_REFCOUNTED(Z_TYPE_P(value))) {
+                                               if (Z_REFCOUNTED_P(value)) {
                                                        Z_ADDREF_P(value);
                                                        if (Z_ISREF_P(value)) {
                                                                SEPARATE_ZVAL(value);
@@ -637,7 +637,7 @@ found:
                }
        } else if (EXPECTED(property_info != NULL)) {
                /* if we assign referenced variable, we should separate it */
-               if (IS_REFCOUNTED(Z_TYPE_P(value))) {
+               if (Z_REFCOUNTED_P(value)) {
                        if (Z_ISREF_P(value)) {
                                ZVAL_DUP(value, Z_REFVAL_P(value));
                        } else {
@@ -1494,7 +1494,7 @@ found:
                                                zend_std_call_getter(object, member, &rv TSRMLS_CC);
                                                (*guard) &= ~IN_GET;
                                                if (Z_TYPE(rv) != IS_UNDEF) {
-                                                       Z_ADDREF(rv);
+                                                       if (Z_REFCOUNTED(rv)) Z_ADDREF(rv);
                                                        result = i_zend_is_true(&rv TSRMLS_CC);
                                                        zval_ptr_dtor(&rv);
                                                } else {
index 836d103e27a120263ff65a721a8e8a69e3571641..0f68a7ee450e872e6e3eb50dea676c9a6277b006 100644 (file)
@@ -244,7 +244,9 @@ struct _zend_ast_ref {
 #define Z_OBJ_INC_APPLY_COUNT_P(zv) Z_OBJ_INC_APPLY_COUNT(*(zv))
 #define Z_OBJ_DEC_APPLY_COUNT_P(zv) Z_OBJ_DEC_APPLY_COUNT(*(zv))
 
-#define Z_REFCOUNTED(zval)                     IS_REFCOUNTED(Z_TYPE(zval))
+#define Z_REFCOUNTED(zval)                     (IS_REFCOUNTED(Z_TYPE(zval)) && \
+                                                                        (Z_TYPE(zval) != IS_STRING || \
+                                                                         !IS_INTERNED(Z_STR(zval))))
 #define Z_REFCOUNTED_P(zval_p)         Z_REFCOUNTED(*(zval_p))
 
 #define Z_ISREF(zval)                          (Z_TYPE(zval) == IS_REFERENCE)
index 5292cf9f0c60df02ac3bab81e625462753c36751..7fd42b2eaf8dc0f512bd89c8e134b72489cb4bbe 100644 (file)
@@ -316,7 +316,7 @@ ZEND_API int zval_copy_static_var(zval *p TSRMLS_DC, int num_args, va_list args,
                                SEPARATE_ZVAL_TO_MAKE_IS_REF(p);
 /*
                                if (!Z_ISREF_P(p)) {
-                                       if (IS_REFCOUNTED(Z_TYPE_P(p)) && Z_REFCOUNT_P(p) > 1) {
+                                       if (Z_REFCOUNTED_P(p) && Z_REFCOUNT_P(p) > 1) {
                                                Z_DELREF_P(p);
                                                ZVAL_NEW_REF(p, p);
                                                zval_copy_ctor(Z_REFVAL_P(p));
index 85670884c83c5f593a48063bb7d1e3952ad60515..85fe91c9615d808446393e181dd4f1463cf1c464 100644 (file)
@@ -1098,7 +1098,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST|
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -2835,7 +2835,7 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
                } else {
                        ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
                        if (OP1_TYPE == IS_CV) {
-                               if (IS_REFCOUNTED(Z_TYPE_P(retval_ptr))) Z_ADDREF_P(retval_ptr);
+                               if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
                        }
                }
        }
@@ -3048,7 +3048,7 @@ ZEND_VM_HELPER(zend_send_by_var_helper, VAR|CV, ANY)
 //???                  varptr = Z_REFVAL_P(varptr);
 //???          }
        } else if (OP1_TYPE == IS_CV) {
-               if (IS_REFCOUNTED(Z_TYPE_P(varptr))) Z_ADDREF_P(varptr);
+               if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
        }
        zend_vm_stack_push(varptr TSRMLS_CC);
 
@@ -3344,7 +3344,7 @@ ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY)
 
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, param, opline->extended_value TSRMLS_CC);
                var_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
-               if (IS_REFCOUNTED(Z_TYPE_P(var_ptr))) Z_DELREF_P(var_ptr);
+               if (Z_REFCOUNTED_P(var_ptr)) Z_DELREF_P(var_ptr);
                ZVAL_COPY(var_ptr, param);
        }
 
@@ -4006,7 +4006,7 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (OP2_TYPE != IS_UNUSED) {
@@ -4091,7 +4091,7 @@ ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
                                                break;
                                        case IS_STRING:
                                                if (OP2_TYPE == IS_CV || OP2_TYPE == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (OP2_TYPE != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, ZEND_VM_C_GOTO(num_index_dim));
@@ -4684,7 +4684,7 @@ ZEND_VM_C_LABEL(num_index_prop):
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -5384,7 +5384,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
 
                                value = GET_OP1_ZVAL_PTR(BP_VAR_R);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!IS_OP1_TMP_FREE()) {
index 16cb547a7c81aa63712be89b0ff7297de52bb45b..5a549edb7e8c5562809aacd30f783e8f5c84cc90 100644 (file)
@@ -867,7 +867,7 @@ static int ZEND_FASTCALL  ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, param, opline->extended_value TSRMLS_CC);
                var_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
-               if (IS_REFCOUNTED(Z_TYPE_P(var_ptr))) Z_DELREF_P(var_ptr);
+               if (Z_REFCOUNTED_P(var_ptr)) Z_DELREF_P(var_ptr);
                ZVAL_COPY(var_ptr, param);
        }
 
@@ -2579,7 +2579,7 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
                } else {
                        ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
                        if (IS_CONST == IS_CV) {
-                               if (IS_REFCOUNTED(Z_TYPE_P(retval_ptr))) Z_ADDREF_P(retval_ptr);
+                               if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
                        }
                }
        }
@@ -3627,7 +3627,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -4062,7 +4062,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HA
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_CONST != IS_UNUSED) {
@@ -4268,7 +4268,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE
 
                                value = opline->op1.zv;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -4915,7 +4915,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
 
                                value = opline->op1.zv;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -5401,7 +5401,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type,
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -5722,7 +5722,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAND
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_VAR != IS_UNUSED) {
@@ -5895,7 +5895,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
 
                                value = opline->op1.zv;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -6106,7 +6106,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -6395,7 +6395,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_H
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_UNUSED != IS_UNUSED) {
@@ -6586,7 +6586,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
 
                                value = opline->op1.zv;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -7291,7 +7291,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
 
                                value = opline->op1.zv;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -7649,7 +7649,7 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                } else {
                        ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
                        if (IS_TMP_VAR == IS_CV) {
-                               if (IS_REFCOUNTED(Z_TYPE_P(retval_ptr))) Z_ADDREF_P(retval_ptr);
+                               if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
                        }
                }
        }
@@ -8748,7 +8748,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type,
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -9091,7 +9091,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAND
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_CONST != IS_UNUSED) {
@@ -9264,7 +9264,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
 
                                value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!1) {
@@ -9921,7 +9921,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
 
                                value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!1) {
@@ -10407,7 +10407,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -10738,7 +10738,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLE
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_VAR != IS_UNUSED) {
@@ -10911,7 +10911,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
 
                                value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!1) {
@@ -11122,7 +11122,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type,
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -11300,7 +11300,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HAN
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_UNUSED != IS_UNUSED) {
@@ -11473,7 +11473,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
 
                                value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!1) {
@@ -12127,7 +12127,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                                value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!1) {
@@ -12677,7 +12677,7 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                } else {
                        ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
                        if (IS_VAR == IS_CV) {
-                               if (IS_REFCOUNTED(Z_TYPE_P(retval_ptr))) Z_ADDREF_P(retval_ptr);
+                               if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
                        }
                }
        }
@@ -12789,7 +12789,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_AR
 //???                  varptr = Z_REFVAL_P(varptr);
 //???          }
        } else if (IS_VAR == IS_CV) {
-               if (IS_REFCOUNTED(Z_TYPE_P(varptr))) Z_ADDREF_P(varptr);
+               if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
        }
        zend_vm_stack_push(varptr TSRMLS_CC);
 
@@ -14437,7 +14437,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -15490,7 +15490,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_CONST != IS_UNUSED) {
@@ -15575,7 +15575,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
                                                break;
                                        case IS_STRING:
                                                if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_CONST != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -15870,7 +15870,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -15950,7 +15950,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
 
                                value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -17692,7 +17692,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLE
                                                break;
                                        case IS_STRING:
                                                if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_TMP_VAR != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -17893,7 +17893,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -17973,7 +17973,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
 
                                value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -18906,7 +18906,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -19923,7 +19923,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_VAR != IS_UNUSED) {
@@ -20008,7 +20008,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
                                                break;
                                        case IS_STRING:
                                                if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_VAR != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -20303,7 +20303,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -20383,7 +20383,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
 
                                value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -20844,7 +20844,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -21305,7 +21305,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_UNUSED != IS_UNUSED) {
@@ -21496,7 +21496,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
 
                                value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -23286,7 +23286,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER
                                                break;
                                        case IS_STRING:
                                                if (IS_CV == IS_CV || IS_CV == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_CV != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -23487,7 +23487,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -23567,7 +23567,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                                value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -24742,7 +24742,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_H
                                                break;
                                        case IS_STRING:
                                                if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_CONST != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -24941,7 +24941,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -25019,7 +25019,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
 
                                value = NULL;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -26028,7 +26028,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HAN
                                                break;
                                        case IS_STRING:
                                                if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_TMP_VAR != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -26227,7 +26227,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -26305,7 +26305,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
 
                                value = NULL;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -27314,7 +27314,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN
                                                break;
                                        case IS_STRING:
                                                if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_VAR != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -27513,7 +27513,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -27591,7 +27591,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
 
                                value = NULL;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -27992,7 +27992,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND
 
                                value = NULL;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -28998,7 +28998,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HAND
                                                break;
                                        case IS_STRING:
                                                if (IS_CV == IS_CV || IS_CV == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_CV != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -29197,7 +29197,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -29275,7 +29275,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
 
                                value = NULL;
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -29806,7 +29806,7 @@ static int ZEND_FASTCALL  ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                } else {
                        ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
                        if (IS_CV == IS_CV) {
-                               if (IS_REFCOUNTED(Z_TYPE_P(retval_ptr))) Z_ADDREF_P(retval_ptr);
+                               if (Z_REFCOUNTED_P(retval_ptr)) Z_ADDREF_P(retval_ptr);
                        }
                }
        }
@@ -29917,7 +29917,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARG
 //???                  varptr = Z_REFVAL_P(varptr);
 //???          }
        } else if (IS_CV == IS_CV) {
-               if (IS_REFCOUNTED(Z_TYPE_P(varptr))) Z_ADDREF_P(varptr);
+               if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
        }
        zend_vm_stack_push(varptr TSRMLS_CC);
 
@@ -31424,7 +31424,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -32266,7 +32266,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_CONST != IS_UNUSED) {
@@ -32351,7 +32351,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL
                                                break;
                                        case IS_STRING:
                                                if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_CONST != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -32644,7 +32644,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -32722,7 +32722,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
 
                                value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -34343,7 +34343,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER
                                                break;
                                        case IS_STRING:
                                                if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_TMP_VAR != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -34542,7 +34542,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -34620,7 +34620,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                                value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -35550,7 +35550,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -36448,7 +36448,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_VAR != IS_UNUSED) {
@@ -36533,7 +36533,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
                                                break;
                                        case IS_STRING:
                                                if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_VAR != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -36826,7 +36826,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -36904,7 +36904,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
                                value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -37362,7 +37362,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type,
        }
 
        if (EXPECTED(retval != NULL)) {
-               if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+               if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
                switch (type) {
                        case BP_VAR_R:
                        case BP_VAR_IS:
@@ -37710,7 +37710,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAND
                convert_to_string(&tmp);
                varname = &tmp;
        } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
-               Z_ADDREF_P(varname);
+               if (Z_REFCOUNTED_P(varname)) Z_ADDREF_P(varname);
        }
 
        if (IS_UNUSED != IS_UNUSED) {
@@ -37883,7 +37883,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
 
                                value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
@@ -39551,7 +39551,7 @@ static int ZEND_FASTCALL  ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_
                                                break;
                                        case IS_STRING:
                                                if (IS_CV == IS_CV || IS_CV == IS_VAR) {
-                                                       Z_ADDREF_P(offset);
+                                                       if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
                                                }
                                                if (IS_CV != IS_CONST) {
                                                        ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
@@ -39750,7 +39750,7 @@ num_index_prop:
                zval tmp;
 
                if (Z_TYPE_P(offset) != IS_LONG) {
-                       if (!Z_REFCOUNTED_P(offset) /* simple scalar types */
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
                                        || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
                                                && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
                                ZVAL_DUP(&tmp, offset);
@@ -39828,7 +39828,7 @@ static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
 
                                value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
                                ZVAL_COPY_VALUE(&generator->value, value);
-                               Z_SET_REFCOUNT(generator->value, 1);
+                               if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
 
                                /* Temporary variables don't need ctor copying */
                                if (!0) {
index c236f0d7653a8629841b7550497e95e0e8a4cb74..20d644d80445d348568ba2e19cdba8da4c1c5ca2 100644 (file)
@@ -45,7 +45,7 @@
                zval member; \
                ZVAL_STRINGL(&member, name, sizeof(name)-1); \
                zend_std_write_property(object, &member, value, NULL TSRMLS_CC); \
-               Z_DELREF_P(value); \
+               if (Z_REFCOUNTED_P(value)) Z_DELREF_P(value); \
                zval_ptr_dtor(&member); \
        } while (0)
 
index 0535e5784973d5e238b269edb2ce53586c567fe6..9664736f76eb2b5ad6a561d0a226ee77592b9af1 100644 (file)
@@ -1849,7 +1849,7 @@ PHPAPI HashTable* php_splice(HashTable *in_hash, int offset, int length, zval *l
                /* ..for each one, create a new zval, copy entry into it and copy it into the output hash */
                for (i = 0; i < list_count; i++) {
                        entry = &list[i];
-                       if (IS_REFCOUNTED(Z_TYPE_P(entry))) Z_ADDREF_P(entry);
+                       if (Z_REFCOUNTED_P(entry)) Z_ADDREF_P(entry);
                        zend_hash_next_index_insert(out_hash, entry);
                }
        }
@@ -1859,7 +1859,7 @@ PHPAPI HashTable* php_splice(HashTable *in_hash, int offset, int length, zval *l
                p = in_hash->arData + idx;
                if (Z_TYPE(p->val) == IS_UNDEF) continue;
                entry = &p->val;
-               if (IS_REFCOUNTED(Z_TYPE_P(entry))) Z_ADDREF_P(entry);
+               if (Z_REFCOUNTED_P(entry)) Z_ADDREF_P(entry);
                if (p->key == NULL) {
                        zend_hash_next_index_insert(out_hash, entry);
                } else {
index 078ea9098f22ecc1f37ea80cf25b7297ad2f4f20..46ea0f52c02bb662d02f314dd52dbf4d9f04d709 100644 (file)
@@ -5135,7 +5135,7 @@ PHP_FUNCTION(register_shutdown_function)
                }
 
                for (i = 0; i < shutdown_function_entry.arg_count; i++) {
-                       Z_ADDREF(shutdown_function_entry.arguments[i]);
+                       if (Z_REFCOUNTED(shutdown_function_entry.arguments[i])) Z_ADDREF(shutdown_function_entry.arguments[i]);
                }
                zend_hash_next_index_insert_mem(BG(user_shutdown_function_names), &shutdown_function_entry, sizeof(php_shutdown_function_entry));
        }