diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-03-05 13:55:56 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-03-05 13:55:56 +0400 |
commit | 37337373287544f39d696c2fb357a56e99e6cecc (patch) | |
tree | de36b9e92ed66ada6c24179a3bd68695f603f00f | |
parent | dc889b69ef8947a87a93a59a24013d972b313158 (diff) | |
download | php-git-37337373287544f39d696c2fb357a56e99e6cecc.tar.gz |
Handle interned strings as non-refcounted scalars
-rw-r--r-- | Zend/zend.h | 6 | ||||
-rw-r--r-- | Zend/zend_API.c | 4 | ||||
-rw-r--r-- | Zend/zend_builtin_functions.c | 14 | ||||
-rw-r--r-- | Zend/zend_compile.c | 2 | ||||
-rw-r--r-- | Zend/zend_execute.c | 8 | ||||
-rw-r--r-- | Zend/zend_execute.h | 7 | ||||
-rw-r--r-- | Zend/zend_execute_API.c | 4 | ||||
-rw-r--r-- | Zend/zend_language_scanner.c | 296 | ||||
-rw-r--r-- | Zend/zend_language_scanner.l | 6 | ||||
-rw-r--r-- | Zend/zend_object_handlers.c | 6 | ||||
-rw-r--r-- | Zend/zend_types.h | 4 | ||||
-rw-r--r-- | Zend/zend_variables.c | 2 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 16 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 160 | ||||
-rw-r--r-- | ext/reflection/php_reflection.c | 2 | ||||
-rw-r--r-- | ext/standard/array.c | 4 | ||||
-rw-r--r-- | ext/standard/basic_functions.c | 2 |
17 files changed, 272 insertions, 271 deletions
diff --git a/Zend/zend.h b/Zend/zend.h index 09db94d836..e2aaf1a103 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -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) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 7aacad1297..3d116bf333 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -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); diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index aac29ce260..776f7903e4 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -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); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index ca9ee341f4..2113fb94fd 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 955249acb4..4c17201385 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 68792811c7..7a8755469a 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -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); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index c89240fd6a..3091b85416 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -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; diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 309d71fcc5..bd7d6a3652 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -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" } diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 725307d156..7d99efe1c0 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -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); } diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 2205ab2f1e..1893e73455 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -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 { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 836d103e27..0f68a7ee45 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -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) diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 5292cf9f0c..7fd42b2eaf 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -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)); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 85670884c8..85fe91c961 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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()) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 16cb547a7c..5a549edb7e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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) { diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index c236f0d765..20d644d804 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -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) diff --git a/ext/standard/array.c b/ext/standard/array.c index 0535e57849..9664736f76 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -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 { diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 078ea9098f..46ea0f52c0 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -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)); } |