@@ -1943,26 +1943,24 @@ static zend_long php_extract_ref_prefix_if_exists(zend_array *arr, zend_array *s
19431943 }
19441944 php_prefix_varname (& final_name , prefix , ZSTR_VAL (var_name ), ZSTR_LEN (var_name ), true);
19451945 if (php_valid_var_name (Z_STR (final_name ))) {
1946- if (zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS ))) {
1947- zend_throw_error (NULL , "Cannot re-assign $this" );
1948- return -1 ;
1946+ /* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
1947+ ZEND_ASSERT (!zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS )));
1948+
1949+ if (Z_ISREF_P (entry )) {
1950+ Z_ADDREF_P (entry );
19491951 } else {
1950- if (Z_ISREF_P (entry )) {
1951- Z_ADDREF_P (entry );
1952- } else {
1953- ZVAL_MAKE_REF_EX (entry , 2 );
1954- }
1955- if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
1956- if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
1957- orig_var = Z_INDIRECT_P (orig_var );
1958- }
1959- zval_ptr_dtor (orig_var );
1960- ZVAL_REF (orig_var , Z_REF_P (entry ));
1961- } else {
1962- zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
1952+ ZVAL_MAKE_REF_EX (entry , 2 );
1953+ }
1954+ if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
1955+ if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
1956+ orig_var = Z_INDIRECT_P (orig_var );
19631957 }
1964- count ++ ;
1958+ zval_ptr_dtor (orig_var );
1959+ ZVAL_REF (orig_var , Z_REF_P (entry ));
1960+ } else {
1961+ zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
19651962 }
1963+ count ++ ;
19661964 }
19671965 zval_ptr_dtor_str (& final_name );
19681966 }
@@ -1997,26 +1995,24 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo
19971995 }
19981996 php_prefix_varname (& final_name , prefix , ZSTR_VAL (var_name ), ZSTR_LEN (var_name ), true);
19991997 if (php_valid_var_name (Z_STR (final_name ))) {
2000- if (zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS ))) {
2001- zend_throw_error (NULL , "Cannot re-assign $this" );
2002- return -1 ;
2003- } else {
2004- ZVAL_DEREF (entry );
2005- if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2006- if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2007- orig_var = Z_INDIRECT_P (orig_var );
2008- }
2009- ZEND_TRY_ASSIGN_COPY_EX (orig_var , entry , 0 );
2010- if (UNEXPECTED (EG (exception ))) {
2011- zend_string_release_ex (Z_STR (final_name ), 0 );
2012- return -1 ;
2013- }
2014- } else {
2015- Z_TRY_ADDREF_P (entry );
2016- zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
1998+ /* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
1999+ ZEND_ASSERT (!zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS )));
2000+
2001+ ZVAL_DEREF (entry );
2002+ if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2003+ if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2004+ orig_var = Z_INDIRECT_P (orig_var );
20172005 }
2018- count ++ ;
2006+ ZEND_TRY_ASSIGN_COPY_EX (orig_var , entry , 0 );
2007+ if (UNEXPECTED (EG (exception ))) {
2008+ zend_string_release_ex (Z_STR (final_name ), 0 );
2009+ return -1 ;
2010+ }
2011+ } else {
2012+ Z_TRY_ADDREF_P (entry );
2013+ zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
20192014 }
2015+ count ++ ;
20202016 }
20212017 zval_ptr_dtor_str (& final_name );
20222018 }
@@ -2060,26 +2056,24 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol
20602056prefix :
20612057 php_prefix_varname (& final_name , prefix , ZSTR_VAL (var_name ), ZSTR_LEN (var_name ), true);
20622058 if (php_valid_var_name (Z_STR (final_name ))) {
2063- if (zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS ))) {
2064- zend_throw_error (NULL , "Cannot re-assign $this" );
2065- return -1 ;
2059+ /* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
2060+ ZEND_ASSERT (!zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS )));
2061+
2062+ if (Z_ISREF_P (entry )) {
2063+ Z_ADDREF_P (entry );
20662064 } else {
2067- if (Z_ISREF_P (entry )) {
2068- Z_ADDREF_P (entry );
2069- } else {
2070- ZVAL_MAKE_REF_EX (entry , 2 );
2071- }
2072- if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2073- if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2074- orig_var = Z_INDIRECT_P (orig_var );
2075- }
2076- zval_ptr_dtor (orig_var );
2077- ZVAL_REF (orig_var , Z_REF_P (entry ));
2078- } else {
2079- zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
2065+ ZVAL_MAKE_REF_EX (entry , 2 );
2066+ }
2067+ if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2068+ if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2069+ orig_var = Z_INDIRECT_P (orig_var );
20802070 }
2081- count ++ ;
2071+ zval_ptr_dtor (orig_var );
2072+ ZVAL_REF (orig_var , Z_REF_P (entry ));
2073+ } else {
2074+ zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
20822075 }
2076+ count ++ ;
20832077 }
20842078 zval_ptr_dtor_str (& final_name );
20852079 } else {
@@ -2132,26 +2126,24 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab
21322126prefix :
21332127 php_prefix_varname (& final_name , prefix , ZSTR_VAL (var_name ), ZSTR_LEN (var_name ), true);
21342128 if (php_valid_var_name (Z_STR (final_name ))) {
2135- if (zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS ))) {
2136- zend_throw_error (NULL , "Cannot re-assign $this" );
2137- return -1 ;
2138- } else {
2139- ZVAL_DEREF (entry );
2140- if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2141- if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2142- orig_var = Z_INDIRECT_P (orig_var );
2143- }
2144- ZEND_TRY_ASSIGN_COPY_EX (orig_var , entry , 0 );
2145- if (UNEXPECTED (EG (exception ))) {
2146- zend_string_release_ex (Z_STR (final_name ), 0 );
2147- return -1 ;
2148- }
2149- } else {
2150- Z_TRY_ADDREF_P (entry );
2151- zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
2129+ /* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
2130+ ZEND_ASSERT (!zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS )));
2131+
2132+ ZVAL_DEREF (entry );
2133+ if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2134+ if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2135+ orig_var = Z_INDIRECT_P (orig_var );
21522136 }
2153- count ++ ;
2137+ ZEND_TRY_ASSIGN_COPY_EX (orig_var , entry , 0 );
2138+ if (UNEXPECTED (EG (exception ))) {
2139+ zend_string_release_ex (Z_STR (final_name ), 0 );
2140+ return -1 ;
2141+ }
2142+ } else {
2143+ Z_TRY_ADDREF_P (entry );
2144+ zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
21542145 }
2146+ count ++ ;
21552147 }
21562148 zval_ptr_dtor_str (& final_name );
21572149 } else {
@@ -2191,26 +2183,24 @@ static zend_long php_extract_ref_prefix_all(zend_array *arr, zend_array *symbol_
21912183 zend_string_release_ex (str , 0 );
21922184 }
21932185 if (php_valid_var_name (Z_STR (final_name ))) {
2194- if (zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS ))) {
2195- zend_throw_error (NULL , "Cannot re-assign $this" );
2196- return -1 ;
2186+ /* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
2187+ ZEND_ASSERT (!zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS )));
2188+
2189+ if (Z_ISREF_P (entry )) {
2190+ Z_ADDREF_P (entry );
21972191 } else {
2198- if (Z_ISREF_P (entry )) {
2199- Z_ADDREF_P (entry );
2200- } else {
2201- ZVAL_MAKE_REF_EX (entry , 2 );
2202- }
2203- if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2204- if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2205- orig_var = Z_INDIRECT_P (orig_var );
2206- }
2207- zval_ptr_dtor (orig_var );
2208- ZVAL_REF (orig_var , Z_REF_P (entry ));
2209- } else {
2210- zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
2192+ ZVAL_MAKE_REF_EX (entry , 2 );
2193+ }
2194+ if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2195+ if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2196+ orig_var = Z_INDIRECT_P (orig_var );
22112197 }
2212- count ++ ;
2198+ zval_ptr_dtor (orig_var );
2199+ ZVAL_REF (orig_var , Z_REF_P (entry ));
2200+ } else {
2201+ zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
22132202 }
2203+ count ++ ;
22142204 }
22152205 zval_ptr_dtor_str (& final_name );
22162206 } ZEND_HASH_FOREACH_END ();
@@ -2238,26 +2228,24 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl
22382228 zend_string_release_ex (str , 0 );
22392229 }
22402230 if (php_valid_var_name (Z_STR (final_name ))) {
2241- if (zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS ))) {
2242- zend_throw_error (NULL , "Cannot re-assign $this" );
2243- return -1 ;
2244- } else {
2245- ZVAL_DEREF (entry );
2246- if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2247- if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2248- orig_var = Z_INDIRECT_P (orig_var );
2249- }
2250- ZEND_TRY_ASSIGN_COPY_EX (orig_var , entry , 0 );
2251- if (UNEXPECTED (EG (exception ))) {
2252- zend_string_release_ex (Z_STR (final_name ), 0 );
2253- return -1 ;
2254- }
2255- } else {
2256- Z_TRY_ADDREF_P (entry );
2257- zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
2231+ /* Prefixed varname cannot be equal to "this" due to underscore between prefix and name */
2232+ ZEND_ASSERT (!zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS )));
2233+
2234+ ZVAL_DEREF (entry );
2235+ if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2236+ if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2237+ orig_var = Z_INDIRECT_P (orig_var );
22582238 }
2259- count ++ ;
2239+ ZEND_TRY_ASSIGN_COPY_EX (orig_var , entry , 0 );
2240+ if (UNEXPECTED (EG (exception ))) {
2241+ zend_string_release_ex (Z_STR (final_name ), 0 );
2242+ return -1 ;
2243+ }
2244+ } else {
2245+ Z_TRY_ADDREF_P (entry );
2246+ zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
22602247 }
2248+ count ++ ;
22612249 }
22622250 zval_ptr_dtor_str (& final_name );
22632251 } ZEND_HASH_FOREACH_END ();
@@ -2294,26 +2282,25 @@ static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *sym
22942282 continue ;
22952283 }
22962284 }
2297- if (zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS ))) {
2298- zend_throw_error (NULL , "Cannot re-assign $this" );
2299- return -1 ;
2285+
2286+ /* We previously checked if the var name is "this" to prefix it */
2287+ ZEND_ASSERT (!zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS )));
2288+ if (Z_ISREF_P (entry )) {
2289+ Z_ADDREF_P (entry );
23002290 } else {
2301- if (Z_ISREF_P (entry )) {
2302- Z_ADDREF_P (entry );
2303- } else {
2304- ZVAL_MAKE_REF_EX (entry , 2 );
2305- }
2306- if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2307- if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2308- orig_var = Z_INDIRECT_P (orig_var );
2309- }
2310- zval_ptr_dtor (orig_var );
2311- ZVAL_REF (orig_var , Z_REF_P (entry ));
2312- } else {
2313- zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
2291+ ZVAL_MAKE_REF_EX (entry , 2 );
2292+ }
2293+ if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2294+ if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2295+ orig_var = Z_INDIRECT_P (orig_var );
23142296 }
2315- count ++ ;
2297+ zval_ptr_dtor (orig_var );
2298+ ZVAL_REF (orig_var , Z_REF_P (entry ));
2299+ } else {
2300+ zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
23162301 }
2302+ count ++ ;
2303+
23172304 zval_ptr_dtor_str (& final_name );
23182305 } ZEND_HASH_FOREACH_END ();
23192306
@@ -2349,26 +2336,26 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_
23492336 continue ;
23502337 }
23512338 }
2352- if (zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS ))) {
2353- zend_throw_error (NULL , "Cannot re-assign $this" );
2354- return -1 ;
2355- } else {
2356- ZVAL_DEREF (entry );
2357- if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2358- if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2359- orig_var = Z_INDIRECT_P (orig_var );
2360- }
2361- ZEND_TRY_ASSIGN_COPY_EX (orig_var , entry , 0 );
2362- if (UNEXPECTED (EG (exception ))) {
2363- zend_string_release_ex (Z_STR (final_name ), 0 );
2364- return -1 ;
2365- }
2366- } else {
2367- Z_TRY_ADDREF_P (entry );
2368- zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
2339+
2340+ /* We previously checked if the var name is "this" to prefix it */
2341+ ZEND_ASSERT (!zend_string_equals (Z_STR (final_name ), ZSTR_KNOWN (ZEND_STR_THIS )));
2342+
2343+ ZVAL_DEREF (entry );
2344+ if ((orig_var = zend_hash_find (symbol_table , Z_STR (final_name ))) != NULL ) {
2345+ if (Z_TYPE_P (orig_var ) == IS_INDIRECT ) {
2346+ orig_var = Z_INDIRECT_P (orig_var );
23692347 }
2370- count ++ ;
2348+ ZEND_TRY_ASSIGN_COPY_EX (orig_var , entry , 0 );
2349+ if (UNEXPECTED (EG (exception ))) {
2350+ zend_string_release_ex (Z_STR (final_name ), 0 );
2351+ return -1 ;
2352+ }
2353+ } else {
2354+ Z_TRY_ADDREF_P (entry );
2355+ zend_hash_add_new (symbol_table , Z_STR (final_name ), entry );
23712356 }
2357+ count ++ ;
2358+
23722359 zval_ptr_dtor_str (& final_name );
23732360 } ZEND_HASH_FOREACH_END ();
23742361
0 commit comments