@@ -1241,26 +1241,32 @@ static void ZEND_FASTCALL zend_jit_verify_return_slow(zval *arg, const zend_op_a
1241
1241
}
1242
1242
}
1243
1243
1244
- static void ZEND_FASTCALL zend_jit_fetch_obj_r_slow (zend_object * zobj , zval * offset , zval * result , uint32_t cache_slot )
1244
+ static void ZEND_FASTCALL zend_jit_fetch_obj_r_slow (zend_object * zobj )
1245
1245
{
1246
1246
zval * retval ;
1247
1247
zend_execute_data * execute_data = EG (current_execute_data );
1248
- zend_string * name , * tmp_name ;
1248
+ const zend_op * opline = EX (opline );
1249
+ zend_string * name = Z_STR_P (RT_CONSTANT (opline , opline -> op2 ));
1250
+ zval * result = EX_VAR (opline -> result .var );
1251
+ void * * cache_slot = CACHE_ADDR (opline -> extended_value & ~ZEND_FETCH_OBJ_FLAGS );
1249
1252
1250
- name = zval_get_tmp_string (offset , & tmp_name );
1251
- retval = zobj -> handlers -> read_property (zobj , name , BP_VAR_R , CACHE_ADDR (cache_slot ), result );
1252
- zend_tmp_string_release (tmp_name );
1253
+ retval = zobj -> handlers -> read_property (zobj , name , BP_VAR_R , cache_slot , result );
1253
1254
if (retval != result ) {
1254
1255
ZVAL_COPY_DEREF (result , retval );
1255
1256
} else if (UNEXPECTED (Z_ISREF_P (retval ))) {
1256
1257
zend_unwrap_reference (retval );
1257
1258
}
1258
1259
}
1259
1260
1260
- static void ZEND_FASTCALL zend_jit_fetch_obj_r_dynamic (zend_object * zobj , intptr_t prop_offset , zval * offset , zval * result , uint32_t cache_slot )
1261
+ static void ZEND_FASTCALL zend_jit_fetch_obj_r_dynamic (zend_object * zobj , intptr_t prop_offset )
1261
1262
{
1262
1263
if (zobj -> properties ) {
1263
1264
zval * retval ;
1265
+ zend_execute_data * execute_data = EG (current_execute_data );
1266
+ const zend_op * opline = EX (opline );
1267
+ zend_string * name = Z_STR_P (RT_CONSTANT (opline , opline -> op2 ));
1268
+ zval * result = EX_VAR (opline -> result .var );
1269
+ void * * cache_slot = CACHE_ADDR (opline -> extended_value & ~ZEND_FETCH_OBJ_FLAGS );
1264
1270
1265
1271
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET (prop_offset )) {
1266
1272
intptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET (prop_offset );
@@ -1269,50 +1275,56 @@ static void ZEND_FASTCALL zend_jit_fetch_obj_r_dynamic(zend_object *zobj, intptr
1269
1275
Bucket * p = (Bucket * )((char * )zobj -> properties -> arData + idx );
1270
1276
1271
1277
if (EXPECTED (Z_TYPE (p -> val ) != IS_UNDEF ) &&
1272
- (EXPECTED (p -> key == Z_STR_P ( offset ) ) ||
1273
- (EXPECTED (p -> h == ZSTR_H (Z_STR_P ( offset ) )) &&
1278
+ (EXPECTED (p -> key == name ) ||
1279
+ (EXPECTED (p -> h == ZSTR_H (name )) &&
1274
1280
EXPECTED (p -> key != NULL ) &&
1275
- EXPECTED (ZSTR_LEN (p -> key ) == Z_STRLEN_P ( offset )) &&
1276
- EXPECTED (memcmp (ZSTR_VAL (p -> key ), Z_STRVAL_P ( offset ), Z_STRLEN_P ( offset )) == 0 )))) {
1281
+ EXPECTED (ZSTR_LEN (p -> key ) == ZSTR_LEN ( name )) &&
1282
+ EXPECTED (memcmp (ZSTR_VAL (p -> key ), ZSTR_VAL ( name ), ZSTR_LEN ( name )) == 0 )))) {
1277
1283
ZVAL_COPY_DEREF (result , & p -> val );
1278
1284
return ;
1279
1285
}
1280
1286
}
1281
- CACHE_PTR_EX (( void * * )(( char * ) EG ( current_execute_data ) -> run_time_cache + cache_slot ) + 1 , (void * )ZEND_DYNAMIC_PROPERTY_OFFSET );
1287
+ CACHE_PTR_EX (cache_slot + 1 , (void * )ZEND_DYNAMIC_PROPERTY_OFFSET );
1282
1288
}
1283
1289
1284
- retval = zend_hash_find (zobj -> properties , Z_STR_P ( offset ) );
1290
+ retval = zend_hash_find_ex (zobj -> properties , name , 1 );
1285
1291
1286
1292
if (EXPECTED (retval )) {
1287
1293
intptr_t idx = (char * )retval - (char * )zobj -> properties -> arData ;
1288
- CACHE_PTR_EX (( void * * )(( char * ) EG ( current_execute_data ) -> run_time_cache + cache_slot ) + 1 , (void * )ZEND_ENCODE_DYN_PROP_OFFSET (idx ));
1294
+ CACHE_PTR_EX (cache_slot + 1 , (void * )ZEND_ENCODE_DYN_PROP_OFFSET (idx ));
1289
1295
ZVAL_COPY_DEREF (result , retval );
1290
1296
return ;
1291
1297
}
1292
1298
}
1293
- zend_jit_fetch_obj_r_slow (zobj , offset , result , cache_slot );
1299
+ zend_jit_fetch_obj_r_slow (zobj );
1294
1300
}
1295
1301
1296
- static void ZEND_FASTCALL zend_jit_fetch_obj_is_slow (zend_object * zobj , zval * offset , zval * result , uint32_t cache_slot )
1302
+ static void ZEND_FASTCALL zend_jit_fetch_obj_is_slow (zend_object * zobj )
1297
1303
{
1298
1304
zval * retval ;
1299
1305
zend_execute_data * execute_data = EG (current_execute_data );
1300
- zend_string * name , * tmp_name ;
1306
+ const zend_op * opline = EX (opline );
1307
+ zend_string * name = Z_STR_P (RT_CONSTANT (opline , opline -> op2 ));
1308
+ zval * result = EX_VAR (opline -> result .var );
1309
+ void * * cache_slot = CACHE_ADDR (opline -> extended_value & ~ZEND_FETCH_OBJ_FLAGS );
1301
1310
1302
- name = zval_get_tmp_string (offset , & tmp_name );
1303
- retval = zobj -> handlers -> read_property (zobj , name , BP_VAR_IS , CACHE_ADDR (cache_slot ), result );
1304
- zend_tmp_string_release (tmp_name );
1311
+ retval = zobj -> handlers -> read_property (zobj , name , BP_VAR_IS , cache_slot , result );
1305
1312
if (retval != result ) {
1306
1313
ZVAL_COPY_DEREF (result , retval );
1307
1314
} else if (UNEXPECTED (Z_ISREF_P (retval ))) {
1308
1315
zend_unwrap_reference (retval );
1309
1316
}
1310
1317
}
1311
1318
1312
- static void ZEND_FASTCALL zend_jit_fetch_obj_is_dynamic (zend_object * zobj , intptr_t prop_offset , zval * offset , zval * result , uint32_t cache_slot )
1319
+ static void ZEND_FASTCALL zend_jit_fetch_obj_is_dynamic (zend_object * zobj , intptr_t prop_offset )
1313
1320
{
1314
1321
if (zobj -> properties ) {
1315
1322
zval * retval ;
1323
+ zend_execute_data * execute_data = EG (current_execute_data );
1324
+ const zend_op * opline = EX (opline );
1325
+ zend_string * name = Z_STR_P (RT_CONSTANT (opline , opline -> op2 ));
1326
+ zval * result = EX_VAR (opline -> result .var );
1327
+ void * * cache_slot = CACHE_ADDR (opline -> extended_value & ~ZEND_FETCH_OBJ_FLAGS );
1316
1328
1317
1329
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET (prop_offset )) {
1318
1330
intptr_t idx = ZEND_DECODE_DYN_PROP_OFFSET (prop_offset );
@@ -1321,28 +1333,28 @@ static void ZEND_FASTCALL zend_jit_fetch_obj_is_dynamic(zend_object *zobj, intpt
1321
1333
Bucket * p = (Bucket * )((char * )zobj -> properties -> arData + idx );
1322
1334
1323
1335
if (EXPECTED (Z_TYPE (p -> val ) != IS_UNDEF ) &&
1324
- (EXPECTED (p -> key == Z_STR_P ( offset ) ) ||
1325
- (EXPECTED (p -> h == ZSTR_H (Z_STR_P ( offset ) )) &&
1336
+ (EXPECTED (p -> key == name ) ||
1337
+ (EXPECTED (p -> h == ZSTR_H (name )) &&
1326
1338
EXPECTED (p -> key != NULL ) &&
1327
- EXPECTED (ZSTR_LEN (p -> key ) == Z_STRLEN_P ( offset )) &&
1328
- EXPECTED (memcmp (ZSTR_VAL (p -> key ), Z_STRVAL_P ( offset ), Z_STRLEN_P ( offset )) == 0 )))) {
1339
+ EXPECTED (ZSTR_LEN (p -> key ) == ZSTR_LEN ( name )) &&
1340
+ EXPECTED (memcmp (ZSTR_VAL (p -> key ), ZSTR_VAL ( name ), ZSTR_LEN ( name )) == 0 )))) {
1329
1341
ZVAL_COPY_DEREF (result , & p -> val );
1330
1342
return ;
1331
1343
}
1332
1344
}
1333
- CACHE_PTR_EX (( void * * )(( char * ) EG ( current_execute_data ) -> run_time_cache + cache_slot ) + 1 , (void * )ZEND_DYNAMIC_PROPERTY_OFFSET );
1345
+ CACHE_PTR_EX (cache_slot + 1 , (void * )ZEND_DYNAMIC_PROPERTY_OFFSET );
1334
1346
}
1335
1347
1336
- retval = zend_hash_find (zobj -> properties , Z_STR_P ( offset ) );
1348
+ retval = zend_hash_find_ex (zobj -> properties , name , 1 );
1337
1349
1338
1350
if (EXPECTED (retval )) {
1339
1351
intptr_t idx = (char * )retval - (char * )zobj -> properties -> arData ;
1340
- CACHE_PTR_EX (( void * * )(( char * ) EG ( current_execute_data ) -> run_time_cache + cache_slot ) + 1 , (void * )ZEND_ENCODE_DYN_PROP_OFFSET (idx ));
1352
+ CACHE_PTR_EX (cache_slot + 1 , (void * )ZEND_ENCODE_DYN_PROP_OFFSET (idx ));
1341
1353
ZVAL_COPY (result , retval );
1342
1354
return ;
1343
1355
}
1344
1356
}
1345
- zend_jit_fetch_obj_is_slow (zobj , offset , result , cache_slot );
1357
+ zend_jit_fetch_obj_is_slow (zobj );
1346
1358
}
1347
1359
1348
1360
static zend_always_inline zend_bool promotes_to_array (zval * val ) {
@@ -1437,26 +1449,27 @@ static zend_never_inline zend_bool zend_handle_fetch_obj_flags(
1437
1449
return 1 ;
1438
1450
}
1439
1451
1440
- static void ZEND_FASTCALL zend_jit_fetch_obj_w_slow (zend_object * zobj , zval * offset , zval * result , uint32_t cache_slot )
1452
+ static void ZEND_FASTCALL zend_jit_fetch_obj_w_slow (zend_object * zobj )
1441
1453
{
1442
1454
zval * retval ;
1443
1455
zend_execute_data * execute_data = EG (current_execute_data );
1444
- const zend_op * opline = execute_data -> opline ;
1445
- zend_string * name , * tmp_name ;
1456
+ const zend_op * opline = EX (opline );
1457
+ zend_string * name = Z_STR_P (RT_CONSTANT (opline , opline -> op2 ));
1458
+ zval * result = EX_VAR (opline -> result .var );
1459
+ void * * cache_slot = CACHE_ADDR (opline -> extended_value & ~ZEND_FETCH_OBJ_FLAGS );
1446
1460
1447
- name = zval_get_tmp_string (offset , & tmp_name );
1448
- retval = zobj -> handlers -> get_property_ptr_ptr (zobj , name , BP_VAR_W , CACHE_ADDR (cache_slot ));
1461
+ retval = zobj -> handlers -> get_property_ptr_ptr (zobj , name , BP_VAR_W , cache_slot );
1449
1462
if (NULL == retval ) {
1450
- retval = zobj -> handlers -> read_property (zobj , name , BP_VAR_W , CACHE_ADDR ( cache_slot ) , result );
1463
+ retval = zobj -> handlers -> read_property (zobj , name , BP_VAR_W , cache_slot , result );
1451
1464
if (retval == result ) {
1452
1465
if (UNEXPECTED (Z_ISREF_P (retval ) && Z_REFCOUNT_P (retval ) == 1 )) {
1453
1466
ZVAL_UNREF (retval );
1454
1467
}
1455
- goto end ;
1468
+ return ;
1456
1469
}
1457
1470
} else if (UNEXPECTED (Z_ISERROR_P (retval ))) {
1458
1471
ZVAL_ERROR (result );
1459
- goto end ;
1472
+ return ;
1460
1473
}
1461
1474
1462
1475
ZVAL_INDIRECT (result , retval );
@@ -1469,23 +1482,20 @@ static void ZEND_FASTCALL zend_jit_fetch_obj_w_slow(zend_object *zobj, zval *off
1469
1482
zend_property_info * prop_info = NULL ;
1470
1483
1471
1484
if (opline -> op2_type == IS_CONST ) {
1472
- prop_info = CACHED_PTR_EX (CACHE_ADDR ( cache_slot ) + 2 );
1485
+ prop_info = CACHED_PTR_EX (cache_slot + 2 );
1473
1486
if (!prop_info ) {
1474
1487
break ;
1475
1488
}
1476
1489
}
1477
1490
if (UNEXPECTED (!zend_handle_fetch_obj_flags (result , retval , zobj , prop_info , flags ))) {
1478
- goto end ;
1491
+ return ;
1479
1492
}
1480
1493
}
1481
1494
} while (0 );
1482
1495
1483
1496
if (UNEXPECTED (Z_TYPE_P (retval ) == IS_UNDEF )) {
1484
1497
ZVAL_NULL (retval );
1485
1498
}
1486
-
1487
- end :
1488
- zend_tmp_string_release (tmp_name );
1489
1499
}
1490
1500
1491
1501
static void ZEND_FASTCALL zend_jit_check_array_promotion (zval * val , zend_property_info * prop )
0 commit comments