@@ -191,6 +191,19 @@ ZEND_API zend_string* ZEND_FASTCALL zend_interned_string_find_permanent(zend_str
191
191
return zend_interned_string_ht_lookup (str , & interned_strings_permanent );
192
192
}
193
193
194
+ static zend_string * ZEND_FASTCALL zend_init_string_for_interning (zend_string * str , bool persistent ) {
195
+ uint32_t flags = 0 ;
196
+ if (ZSTR_IS_VALID_UTF8 (str )) {
197
+ flags = IS_STR_VALID_UTF8 ;
198
+ }
199
+ zend_ulong h = ZSTR_H (str );
200
+ zend_string_delref (str );
201
+ str = zend_string_init (ZSTR_VAL (str ), ZSTR_LEN (str ), persistent );
202
+ GC_ADD_FLAGS (str , flags );
203
+ ZSTR_H (str ) = h ;
204
+ return str ;
205
+ }
206
+
194
207
static zend_string * ZEND_FASTCALL zend_new_interned_string_permanent (zend_string * str )
195
208
{
196
209
zend_string * ret ;
@@ -208,10 +221,7 @@ static zend_string* ZEND_FASTCALL zend_new_interned_string_permanent(zend_string
208
221
209
222
ZEND_ASSERT (GC_FLAGS (str ) & GC_PERSISTENT );
210
223
if (GC_REFCOUNT (str ) > 1 ) {
211
- zend_ulong h = ZSTR_H (str );
212
- zend_string_delref (str );
213
- str = zend_string_init (ZSTR_VAL (str ), ZSTR_LEN (str ), 1 );
214
- ZSTR_H (str ) = h ;
224
+ str = zend_init_string_for_interning (str , true);
215
225
}
216
226
217
227
return zend_add_interned_string (str , & interned_strings_permanent , IS_STR_PERMANENT );
@@ -249,10 +259,7 @@ static zend_string* ZEND_FASTCALL zend_new_interned_string_request(zend_string *
249
259
}
250
260
#endif
251
261
if (GC_REFCOUNT (str ) > 1 ) {
252
- zend_ulong h = ZSTR_H (str );
253
- zend_string_delref (str );
254
- str = zend_string_init (ZSTR_VAL (str ), ZSTR_LEN (str ), 0 );
255
- ZSTR_H (str ) = h ;
262
+ str = zend_init_string_for_interning (str , false);
256
263
}
257
264
258
265
ret = zend_add_interned_string (str , & CG (interned_strings ), 0 );
0 commit comments