@@ -2331,23 +2331,43 @@ ZEND_VM_C_LABEL(assign_object):
2331
2331
zval tmp ;
2332
2332
2333
2333
if (UNEXPECTED (prop_info != NULL )) {
2334
- ZVAL_COPY_VALUE (& tmp , value );
2334
+ zend_reference * ref = NULL ;
2335
+ if ((OP_DATA_TYPE & (IS_CV |IS_VAR )) && UNEXPECTED (Z_ISREF_P (value ))) {
2336
+ ref = Z_REF_P (value );
2337
+ value = Z_REFVAL_P (value );
2338
+ }
2339
+ if (((OP_DATA_TYPE & (IS_CONST |IS_CV )) || (ref && GC_REFCOUNT (ref ) > 1 ))) {
2340
+ ZVAL_COPY (& tmp , value );
2341
+ } else {
2342
+ ZVAL_COPY_VALUE (& tmp , value );
2343
+ }
2335
2344
if (UNEXPECTED (!i_zend_verify_property_type (prop_info , & tmp , EX_USES_STRICT_TYPES ()))) {
2336
2345
zend_verify_property_type_error (prop_info , value );
2337
- FREE_OP_DATA ();
2346
+ zval_ptr_dtor (value );
2347
+ if ((OP_DATA_TYPE & IS_VAR ) && ref && GC_DELREF (ref ) == 0 ) {
2348
+ efree (ref );
2349
+ }
2338
2350
FREE_OP2 ();
2339
2351
FREE_OP1_VAR_PTR ();
2352
+ UNDEF_RESULT ();
2340
2353
HANDLE_EXCEPTION ();
2341
2354
}
2355
+
2342
2356
/* will remain valid, thus no need to check prop_info in future here */
2343
2357
if (OP_DATA_TYPE == IS_CONST && Z_TYPE (tmp ) == Z_TYPE_P (value )) {
2344
2358
CACHE_PTR_EX (cache_slot + 2 , NULL );
2345
2359
}
2360
+
2346
2361
value = & tmp ;
2347
- }
2362
+ if ((OP_DATA_TYPE & IS_VAR ) && UNEXPECTED (ref ) && GC_DELREF (ref ) == 0 ) {
2363
+ efree (ref );
2364
+ }
2348
2365
2366
+ value = zend_assign_to_variable (property_val , value , IS_TMP_VAR , EX_USES_STRICT_TYPES ());
2367
+ } else {
2349
2368
ZEND_VM_C_LABEL (fast_assign_obj ):
2350
- value = zend_assign_to_variable (property_val , value , OP_DATA_TYPE , EX_USES_STRICT_TYPES ());
2369
+ value = zend_assign_to_variable (property_val , value , OP_DATA_TYPE , EX_USES_STRICT_TYPES ());
2370
+ }
2351
2371
if (UNEXPECTED (RETURN_VALUE_USED (opline ))) {
2352
2372
ZVAL_COPY (EX_VAR (opline -> result .var ), value );
2353
2373
}
@@ -2427,11 +2447,8 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
2427
2447
USE_OPLINE
2428
2448
zend_free_op free_op_data ;
2429
2449
zval * prop , * value ;
2430
- zend_reference * ref = NULL ;
2431
2450
zend_property_info * prop_info ;
2432
- #if !defined(ZEND_VM_SPEC ) || !(OP_DATA_TYPE & IS_TMP_VAR )
2433
2451
zval tmp ;
2434
- #endif
2435
2452
2436
2453
SAVE_OPLINE ();
2437
2454
@@ -2444,22 +2461,17 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
2444
2461
value = GET_OP_DATA_ZVAL_PTR (BP_VAR_R );
2445
2462
2446
2463
if (UNEXPECTED (prop_info -> type )) {
2447
- #if defined(ZEND_VM_SPEC ) && (OP_DATA_TYPE & IS_TMP_VAR )
2448
- if (UNEXPECTED (!i_zend_verify_property_type (prop_info , value , EX_USES_STRICT_TYPES ()))) {
2449
- #else
2450
- #if !defined(ZEND_VM_SPEC ) || (OP_DATA_TYPE & (IS_CV | IS_VAR ))
2451
- if (Z_ISREF_P (value )) {
2464
+ zend_reference * ref = NULL ;
2465
+ if ((OP_DATA_TYPE & (IS_CV |IS_VAR )) && UNEXPECTED (Z_ISREF_P (value ))) {
2452
2466
ref = Z_REF_P (value );
2453
2467
value = Z_REFVAL_P (value );
2454
2468
}
2455
- #endif
2456
- if (((OP_DATA_TYPE & (IS_CONST | IS_CV )) || (ref && GC_REFCOUNT (ref ) > 1 ))) {
2469
+ if (((OP_DATA_TYPE & (IS_CONST |IS_CV )) || (ref && GC_REFCOUNT (ref ) > 1 ))) {
2457
2470
ZVAL_COPY (& tmp , value );
2458
2471
} else {
2459
2472
ZVAL_COPY_VALUE (& tmp , value );
2460
2473
}
2461
2474
if (UNEXPECTED (!i_zend_verify_property_type (prop_info , & tmp , EX_USES_STRICT_TYPES ()))) {
2462
- #endif
2463
2475
zend_verify_property_type_error (prop_info , value );
2464
2476
zval_ptr_dtor (value );
2465
2477
if ((OP_DATA_TYPE & IS_VAR ) && ref && GC_DELREF (ref ) == 0 ) {
@@ -2468,13 +2480,11 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
2468
2480
UNDEF_RESULT ();
2469
2481
HANDLE_EXCEPTION ();
2470
2482
}
2471
- #if !defined(ZEND_VM_SPEC ) || !(OP_DATA_TYPE & IS_TMP_VAR )
2472
- value = & tmp ;
2473
2483
2484
+ value = & tmp ;
2474
2485
if ((OP_DATA_TYPE & IS_VAR ) && UNEXPECTED (ref ) && GC_DELREF (ref ) == 0 ) {
2475
2486
efree (ref );
2476
2487
}
2477
- #endif
2478
2488
2479
2489
value = zend_assign_to_variable (prop , value , IS_TMP_VAR , EX_USES_STRICT_TYPES ());
2480
2490
} else {
0 commit comments