@@ -187,14 +187,14 @@ void zend_enum_add_interfaces(zend_class_entry *ce)
187
187
zend_result zend_enum_build_backed_enum_table (zend_class_entry * ce )
188
188
{
189
189
ZEND_ASSERT (ce -> ce_flags & ZEND_ACC_ENUM );
190
- ZEND_ASSERT (!(ce -> ce_flags & ZEND_ACC_IMMUTABLE ));
191
190
ZEND_ASSERT (ce -> type == ZEND_USER_CLASS );
192
191
193
192
uint32_t backing_type = ce -> enum_backing_type ;
194
193
ZEND_ASSERT (backing_type != IS_UNDEF );
195
194
196
- ce -> backed_enum_table = emalloc (sizeof (HashTable ));
197
- zend_hash_init (ce -> backed_enum_table , 0 , NULL , ZVAL_PTR_DTOR , 0 );
195
+ HashTable * backed_enum_table = emalloc (sizeof (HashTable ));
196
+ zend_hash_init (backed_enum_table , 0 , NULL , ZVAL_PTR_DTOR , 0 );
197
+ zend_class_set_backed_enum_table (ce , backed_enum_table );
198
198
199
199
zend_string * enum_class_name = ce -> name ;
200
200
@@ -219,35 +219,35 @@ zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce)
219
219
220
220
if (ce -> enum_backing_type == IS_LONG ) {
221
221
zend_long long_key = Z_LVAL_P (case_value );
222
- zval * existing_case_name = zend_hash_index_find (ce -> backed_enum_table , long_key );
222
+ zval * existing_case_name = zend_hash_index_find (backed_enum_table , long_key );
223
223
if (existing_case_name ) {
224
224
zend_throw_error (NULL , "Duplicate value in enum %s for cases %s and %s" ,
225
225
ZSTR_VAL (enum_class_name ),
226
226
Z_STRVAL_P (existing_case_name ),
227
227
ZSTR_VAL (name ));
228
228
goto failure ;
229
229
}
230
- zend_hash_index_add_new (ce -> backed_enum_table , long_key , case_name );
230
+ zend_hash_index_add_new (backed_enum_table , long_key , case_name );
231
231
} else {
232
232
ZEND_ASSERT (ce -> enum_backing_type == IS_STRING );
233
233
zend_string * string_key = Z_STR_P (case_value );
234
- zval * existing_case_name = zend_hash_find (ce -> backed_enum_table , string_key );
234
+ zval * existing_case_name = zend_hash_find (backed_enum_table , string_key );
235
235
if (existing_case_name != NULL ) {
236
236
zend_throw_error (NULL , "Duplicate value in enum %s for cases %s and %s" ,
237
237
ZSTR_VAL (enum_class_name ),
238
238
Z_STRVAL_P (existing_case_name ),
239
239
ZSTR_VAL (name ));
240
240
goto failure ;
241
241
}
242
- zend_hash_add_new (ce -> backed_enum_table , string_key , case_name );
242
+ zend_hash_add_new (backed_enum_table , string_key , case_name );
243
243
}
244
244
} ZEND_HASH_FOREACH_END ();
245
245
246
246
return SUCCESS ;
247
247
248
248
failure :
249
- zend_hash_release (ce -> backed_enum_table );
250
- ce -> backed_enum_table = NULL ;
249
+ zend_hash_release (backed_enum_table );
250
+ zend_class_set_backed_enum_table ( ce , NULL ) ;
251
251
return FAILURE ;
252
252
}
253
253
@@ -282,17 +282,19 @@ ZEND_API zend_result zend_enum_get_case_by_value(zend_object **result, zend_clas
282
282
return FAILURE ;
283
283
}
284
284
}
285
- if (!ce -> backed_enum_table ) {
285
+
286
+ HashTable * backed_enum_table = CE_BACKED_ENUM_TABLE (ce );
287
+ if (!backed_enum_table ) {
286
288
goto not_found ;
287
289
}
288
290
289
291
zval * case_name_zv ;
290
292
if (ce -> enum_backing_type == IS_LONG ) {
291
- case_name_zv = zend_hash_index_find (ce -> backed_enum_table , long_key );
293
+ case_name_zv = zend_hash_index_find (backed_enum_table , long_key );
292
294
} else {
293
295
ZEND_ASSERT (ce -> enum_backing_type == IS_STRING );
294
296
ZEND_ASSERT (string_key != NULL );
295
- case_name_zv = zend_hash_find (ce -> backed_enum_table , string_key );
297
+ case_name_zv = zend_hash_find (backed_enum_table , string_key );
296
298
}
297
299
298
300
if (case_name_zv == NULL ) {
@@ -496,8 +498,9 @@ ZEND_API zend_class_entry *zend_register_internal_enum(
496
498
ce -> ce_flags |= ZEND_ACC_ENUM ;
497
499
ce -> enum_backing_type = type ;
498
500
if (type != IS_UNDEF ) {
499
- ce -> backed_enum_table = pemalloc (sizeof (HashTable ), 1 );
500
- zend_hash_init (ce -> backed_enum_table , 0 , NULL , ZVAL_PTR_DTOR , 1 );
501
+ HashTable * backed_enum_table = pemalloc (sizeof (HashTable ), 1 );
502
+ zend_hash_init (backed_enum_table , 0 , NULL , ZVAL_PTR_DTOR , 1 );
503
+ zend_class_set_backed_enum_table (ce , backed_enum_table );
501
504
}
502
505
503
506
zend_enum_register_props (ce );
@@ -562,12 +565,14 @@ ZEND_API void zend_enum_add_case(zend_class_entry *ce, zend_string *case_name, z
562
565
zval_make_interned_string (value );
563
566
}
564
567
568
+ HashTable * backed_enum_table = CE_BACKED_ENUM_TABLE (ce );
569
+
565
570
zval case_name_zv ;
566
571
ZVAL_STR (& case_name_zv , case_name );
567
572
if (Z_TYPE_P (value ) == IS_LONG ) {
568
- zend_hash_index_add_new (ce -> backed_enum_table , Z_LVAL_P (value ), & case_name_zv );
573
+ zend_hash_index_add_new (backed_enum_table , Z_LVAL_P (value ), & case_name_zv );
569
574
} else {
570
- zend_hash_add_new (ce -> backed_enum_table , Z_STR_P (value ), & case_name_zv );
575
+ zend_hash_add_new (backed_enum_table , Z_STR_P (value ), & case_name_zv );
571
576
}
572
577
} else {
573
578
ZEND_ASSERT (ce -> enum_backing_type == IS_UNDEF );
0 commit comments