@@ -2346,129 +2346,126 @@ ZEND_VM_HANDLER(155, ZEND_FETCH_LIST_W, VAR, CONST|TMPVAR|CV)
2346
2346
ZEND_VM_HANDLER (24 , ZEND_ASSIGN_OBJ , VAR |UNUSED |THIS |CV , CONST |TMPVAR |CV , CACHE_SLOT , SPEC (OP_DATA = CONST |TMP |VAR |CV ))
2347
2347
{
2348
2348
USE_OPLINE
2349
- zval * object , * property , * value , tmp ;
2349
+ zval * object , * value , tmp ;
2350
2350
zend_object * zobj ;
2351
2351
zend_string * name , * tmp_name ;
2352
2352
2353
2353
SAVE_OPLINE ();
2354
2354
object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF (BP_VAR_W );
2355
- property = GET_OP2_ZVAL_PTR (BP_VAR_R );
2356
2355
value = GET_OP_DATA_ZVAL_PTR (BP_VAR_R );
2357
2356
2358
2357
if (OP1_TYPE != IS_UNUSED && UNEXPECTED (Z_TYPE_P (object ) != IS_OBJECT )) {
2359
2358
if (Z_ISREF_P (object ) && Z_TYPE_P (Z_REFVAL_P (object )) == IS_OBJECT ) {
2360
2359
object = Z_REFVAL_P (object );
2361
2360
ZEND_VM_C_GOTO (assign_object );
2362
2361
}
2363
- zend_throw_non_object_error (object , property OPLINE_CC EXECUTE_DATA_CC );
2362
+ zend_throw_non_object_error (object , GET_OP2_ZVAL_PTR ( BP_VAR_R ) OPLINE_CC EXECUTE_DATA_CC );
2364
2363
value = & EG (uninitialized_zval );
2365
2364
ZEND_VM_C_GOTO (free_and_exit_assign_obj );
2366
2365
}
2367
2366
2368
2367
ZEND_VM_C_LABEL (assign_object ):
2369
2368
zobj = Z_OBJ_P (object );
2370
- if (OP2_TYPE == IS_CONST &&
2371
- EXPECTED (zobj -> ce == CACHED_PTR (opline -> extended_value ))) {
2372
- void * * cache_slot = CACHE_ADDR (opline -> extended_value );
2373
- uintptr_t prop_offset = (uintptr_t )CACHED_PTR_EX (cache_slot + 1 );
2374
- zend_object * zobj = Z_OBJ_P (object );
2375
- zval * property_val ;
2376
-
2377
- if (EXPECTED (IS_VALID_PROPERTY_OFFSET (prop_offset ))) {
2378
- property_val = OBJ_PROP (zobj , prop_offset );
2379
- if (Z_TYPE_P (property_val ) != IS_UNDEF ) {
2380
- zend_property_info * prop_info = (zend_property_info * ) CACHED_PTR_EX (cache_slot + 2 );
2381
-
2382
- if (UNEXPECTED (prop_info != NULL )) {
2383
- zend_uchar orig_type = IS_UNDEF ;
2384
-
2385
- if (OP_DATA_TYPE == IS_CONST ) {
2386
- orig_type = Z_TYPE_P (value );
2387
- }
2369
+ if (OP2_TYPE == IS_CONST ) {
2370
+ if ( EXPECTED (zobj -> ce == CACHED_PTR (opline -> extended_value ))) {
2371
+ void * * cache_slot = CACHE_ADDR (opline -> extended_value );
2372
+ uintptr_t prop_offset = (uintptr_t )CACHED_PTR_EX (cache_slot + 1 );
2373
+ zend_object * zobj = Z_OBJ_P (object );
2374
+ zval * property_val ;
2375
+
2376
+ if (EXPECTED (IS_VALID_PROPERTY_OFFSET (prop_offset ))) {
2377
+ property_val = OBJ_PROP (zobj , prop_offset );
2378
+ if (Z_TYPE_P (property_val ) != IS_UNDEF ) {
2379
+ zend_property_info * prop_info = (zend_property_info * ) CACHED_PTR_EX (cache_slot + 2 );
2380
+
2381
+ if (UNEXPECTED (prop_info != NULL )) {
2382
+ zend_uchar orig_type = IS_UNDEF ;
2383
+
2384
+ if (OP_DATA_TYPE == IS_CONST ) {
2385
+ orig_type = Z_TYPE_P (value );
2386
+ }
2388
2387
2389
- value = zend_assign_to_typed_prop (prop_info , property_val , value EXECUTE_DATA_CC );
2388
+ value = zend_assign_to_typed_prop (prop_info , property_val , value EXECUTE_DATA_CC );
2390
2389
2391
- /* will remain valid, thus no need to check prop_info in future here */
2392
- if (OP_DATA_TYPE == IS_CONST && Z_TYPE_P (value ) == orig_type ) {
2393
- CACHE_PTR_EX (cache_slot + 2 , NULL );
2394
- }
2395
- ZEND_VM_C_GOTO (free_and_exit_assign_obj );
2396
- } else {
2390
+ /* will remain valid, thus no need to check prop_info in future here */
2391
+ if (OP_DATA_TYPE == IS_CONST && Z_TYPE_P (value ) == orig_type ) {
2392
+ CACHE_PTR_EX (cache_slot + 2 , NULL );
2393
+ }
2394
+ ZEND_VM_C_GOTO (free_and_exit_assign_obj );
2395
+ } else {
2397
2396
ZEND_VM_C_LABEL (fast_assign_obj ):
2398
- value = zend_assign_to_variable (property_val , value , OP_DATA_TYPE , EX_USES_STRICT_TYPES ());
2399
- if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
2400
- ZVAL_COPY (EX_VAR (opline -> result .var ), value );
2397
+ value = zend_assign_to_variable (property_val , value , OP_DATA_TYPE , EX_USES_STRICT_TYPES ());
2398
+ if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
2399
+ ZVAL_COPY (EX_VAR (opline -> result .var ), value );
2400
+ }
2401
+ ZEND_VM_C_GOTO (exit_assign_obj );
2401
2402
}
2402
- ZEND_VM_C_GOTO (exit_assign_obj );
2403
2403
}
2404
- }
2405
- } else {
2406
- if (EXPECTED (zobj -> properties != NULL )) {
2407
- if (UNEXPECTED (GC_REFCOUNT (zobj -> properties ) > 1 )) {
2408
- if (EXPECTED (!(GC_FLAGS (zobj -> properties ) & IS_ARRAY_IMMUTABLE ))) {
2409
- GC_DELREF (zobj -> properties );
2404
+ } else {
2405
+ name = Z_STR_P (GET_OP2_ZVAL_PTR (BP_VAR_R ));
2406
+ if (EXPECTED (zobj -> properties != NULL )) {
2407
+ if (UNEXPECTED (GC_REFCOUNT (zobj -> properties ) > 1 )) {
2408
+ if (EXPECTED (!(GC_FLAGS (zobj -> properties ) & IS_ARRAY_IMMUTABLE ))) {
2409
+ GC_DELREF (zobj -> properties );
2410
+ }
2411
+ zobj -> properties = zend_array_dup (zobj -> properties );
2412
+ }
2413
+ property_val = zend_hash_find_ex (zobj -> properties , name , 1 );
2414
+ if (property_val ) {
2415
+ ZEND_VM_C_GOTO (fast_assign_obj );
2410
2416
}
2411
- zobj -> properties = zend_array_dup (zobj -> properties );
2412
- }
2413
- property_val = zend_hash_find_ex (zobj -> properties , Z_STR_P (property ), 1 );
2414
- if (property_val ) {
2415
- ZEND_VM_C_GOTO (fast_assign_obj );
2416
2417
}
2417
- }
2418
-
2419
- if (!zobj -> ce -> __set ) {
2420
2418
2421
- if (EXPECTED (zobj -> properties == NULL )) {
2422
- rebuild_object_properties (zobj );
2423
- }
2424
- if (OP_DATA_TYPE == IS_CONST ) {
2425
- if (UNEXPECTED (Z_OPT_REFCOUNTED_P (value ))) {
2426
- Z_ADDREF_P (value );
2419
+ if (!zobj -> ce -> __set ) {
2420
+ if (EXPECTED (zobj -> properties == NULL )) {
2421
+ rebuild_object_properties (zobj );
2427
2422
}
2428
- } else if (OP_DATA_TYPE != IS_TMP_VAR ) {
2429
- if (Z_ISREF_P (value )) {
2430
- if (OP_DATA_TYPE == IS_VAR ) {
2431
- zend_reference * ref = Z_REF_P (value );
2432
- if (GC_DELREF (ref ) == 0 ) {
2433
- ZVAL_COPY_VALUE (& tmp , Z_REFVAL_P (value ));
2434
- efree_size (ref , sizeof (zend_reference ));
2435
- value = & tmp ;
2423
+ if (OP_DATA_TYPE == IS_CONST ) {
2424
+ if (UNEXPECTED (Z_OPT_REFCOUNTED_P (value ))) {
2425
+ Z_ADDREF_P (value );
2426
+ }
2427
+ } else if (OP_DATA_TYPE != IS_TMP_VAR ) {
2428
+ if (Z_ISREF_P (value )) {
2429
+ if (OP_DATA_TYPE == IS_VAR ) {
2430
+ zend_reference * ref = Z_REF_P (value );
2431
+ if (GC_DELREF (ref ) == 0 ) {
2432
+ ZVAL_COPY_VALUE (& tmp , Z_REFVAL_P (value ));
2433
+ efree_size (ref , sizeof (zend_reference ));
2434
+ value = & tmp ;
2435
+ } else {
2436
+ value = Z_REFVAL_P (value );
2437
+ Z_TRY_ADDREF_P (value );
2438
+ }
2436
2439
} else {
2437
2440
value = Z_REFVAL_P (value );
2438
2441
Z_TRY_ADDREF_P (value );
2439
2442
}
2440
- } else {
2441
- value = Z_REFVAL_P (value );
2443
+ } else if (OP_DATA_TYPE == IS_CV ) {
2442
2444
Z_TRY_ADDREF_P (value );
2443
2445
}
2444
- } else if (OP_DATA_TYPE == IS_CV ) {
2445
- Z_TRY_ADDREF_P (value );
2446
+ }
2447
+ zend_hash_add_new (zobj -> properties , name , value );
2448
+ if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
2449
+ ZVAL_COPY (EX_VAR (opline -> result .var ), value );
2446
2450
}
2451
+ ZEND_VM_C_GOTO (exit_assign_obj );
2447
2452
}
2448
- zend_hash_add_new (zobj -> properties , Z_STR_P (property ), value );
2449
- if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
2450
- ZVAL_COPY (EX_VAR (opline -> result .var ), value );
2451
- }
2452
- ZEND_VM_C_GOTO (exit_assign_obj );
2453
2453
}
2454
2454
}
2455
- }
2456
-
2457
- if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR ) {
2458
- ZVAL_DEREF (value );
2459
- }
2460
-
2461
- if (OP2_TYPE == IS_CONST ) {
2462
- name = Z_STR_P (property );
2455
+ name = Z_STR_P (GET_OP2_ZVAL_PTR (BP_VAR_R ));
2463
2456
} else {
2464
- name = zval_try_get_tmp_string (property , & tmp_name );
2457
+ name = zval_try_get_tmp_string (GET_OP2_ZVAL_PTR ( BP_VAR_R ) , & tmp_name );
2465
2458
if (UNEXPECTED (!name )) {
2466
2459
FREE_OP_DATA ();
2467
2460
UNDEF_RESULT ();
2468
2461
ZEND_VM_C_GOTO (exit_assign_obj );
2469
2462
}
2470
2463
}
2471
2464
2465
+ if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR ) {
2466
+ ZVAL_DEREF (value );
2467
+ }
2468
+
2472
2469
value = zobj -> handlers -> write_property (zobj , name , value , (OP2_TYPE == IS_CONST ) ? CACHE_ADDR (opline -> extended_value ) : NULL );
2473
2470
2474
2471
if (OP2_TYPE != IS_CONST ) {
0 commit comments