@@ -2113,7 +2113,7 @@ ZEND_VM_HANDLER(56, ZEND_ADD_VAR, TMP|UNUSED, TMPVAR|CV)
2113
2113
ZEND_VM_NEXT_OPCODE ();
2114
2114
}
2115
2115
2116
- ZEND_VM_HANDLER (109 , ZEND_FETCH_CLASS , ANY , CONST |TMP | VAR |UNUSED |CV )
2116
+ ZEND_VM_HANDLER (109 , ZEND_FETCH_CLASS , ANY , CONST |TMPVAR |UNUSED |CV )
2117
2117
{
2118
2118
USE_OPLINE
2119
2119
@@ -2127,8 +2127,9 @@ ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMP|VAR|UNUSED|CV)
2127
2127
ZEND_VM_NEXT_OPCODE ();
2128
2128
} else {
2129
2129
zend_free_op free_op2 ;
2130
- zval * class_name = GET_OP2_ZVAL_PTR_DEREF (BP_VAR_R );
2130
+ zval * class_name = GET_OP2_ZVAL_PTR (BP_VAR_R );
2131
2131
2132
+ ZEND_VM_C_LABEL (try_class_name ):
2132
2133
if (OP2_TYPE == IS_CONST ) {
2133
2134
if (CACHED_PTR (Z_CACHE_SLOT_P (class_name ))) {
2134
2135
Z_CE_P (EX_VAR (opline -> result .var )) = CACHED_PTR (Z_CACHE_SLOT_P (class_name ));
@@ -2140,6 +2141,9 @@ ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMP|VAR|UNUSED|CV)
2140
2141
Z_CE_P (EX_VAR (opline -> result .var )) = Z_OBJCE_P (class_name );
2141
2142
} else if (Z_TYPE_P (class_name ) == IS_STRING ) {
2142
2143
Z_CE_P (EX_VAR (opline -> result .var )) = zend_fetch_class (Z_STR_P (class_name ), opline -> extended_value TSRMLS_CC );
2144
+ } else if ((OP2_TYPE & (IS_VAR |IS_CV )) && Z_TYPE_P (class_name ) == IS_REFERENCE ) {
2145
+ class_name = Z_REFVAL_P (class_name );
2146
+ ZEND_VM_C_GOTO (try_class_name );
2143
2147
} else {
2144
2148
if (UNEXPECTED (EG (exception ) != NULL )) {
2145
2149
HANDLE_EXCEPTION ();
@@ -2386,7 +2390,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
2386
2390
ZEND_VM_NEXT_OPCODE ();
2387
2391
}
2388
2392
2389
- ZEND_VM_HANDLER (59 , ZEND_INIT_FCALL_BY_NAME , ANY , CONST |TMP | VAR |CV )
2393
+ ZEND_VM_HANDLER (59 , ZEND_INIT_FCALL_BY_NAME , ANY , CONST |TMPVAR |CV )
2390
2394
{
2391
2395
USE_OPLINE
2392
2396
zend_function * fbc ;
@@ -2416,9 +2420,10 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
2416
2420
zend_object * object ;
2417
2421
2418
2422
SAVE_OPLINE ();
2419
- function_name = GET_OP2_ZVAL_PTR_DEREF (BP_VAR_R );
2423
+ function_name = GET_OP2_ZVAL_PTR (BP_VAR_R );
2420
2424
2421
- if (EXPECTED (Z_TYPE_P (function_name ) == IS_STRING )) {
2425
+ ZEND_VM_C_LABEL (try_function_name ):
2426
+ if (OP2_TYPE != IS_CONST && EXPECTED (Z_TYPE_P (function_name ) == IS_STRING )) {
2422
2427
if (Z_STRVAL_P (function_name )[0 ] == '\\' ) {
2423
2428
lcname = zend_string_alloc (Z_STRLEN_P (function_name ) - 1 , 0 );
2424
2429
zend_str_tolower_copy (lcname -> val , Z_STRVAL_P (function_name ) + 1 , Z_STRLEN_P (function_name ) - 1 );
@@ -2514,6 +2519,9 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
2514
2519
}
2515
2520
}
2516
2521
FREE_OP2 ();
2522
+ } else if ((OP2_TYPE & (IS_VAR |IS_CV )) && Z_TYPE_P (function_name ) == IS_REFERENCE ) {
2523
+ function_name = Z_REFVAL_P (function_name );
2524
+ ZEND_VM_C_GOTO (try_function_name );
2517
2525
} else {
2518
2526
if (UNEXPECTED (EG (exception ) != NULL )) {
2519
2527
HANDLE_EXCEPTION ();
@@ -4482,7 +4490,9 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
4482
4490
}
4483
4491
} else {
4484
4492
array_ptr = array_ref = GET_OP1_ZVAL_PTR (BP_VAR_R );
4485
- ZVAL_DEREF (array_ptr );
4493
+ if (OP1_TYPE & (IS_VAR |IS_CV )) {
4494
+ ZVAL_DEREF (array_ptr );
4495
+ }
4486
4496
if (OP1_TYPE == IS_TMP_VAR ) {
4487
4497
ZVAL_COPY_VALUE (& tmp , array_ptr );
4488
4498
if (Z_OPT_IMMUTABLE_P (& tmp )) {
@@ -5358,16 +5368,17 @@ ZEND_VM_HANDLER(105, ZEND_TICKS, ANY, ANY)
5358
5368
ZEND_VM_NEXT_OPCODE ();
5359
5369
}
5360
5370
5361
- ZEND_VM_HANDLER (138 , ZEND_INSTANCEOF , TMP | VAR |CV , CONST |VAR )
5371
+ ZEND_VM_HANDLER (138 , ZEND_INSTANCEOF , TMPVAR |CV , CONST |VAR )
5362
5372
{
5363
5373
USE_OPLINE
5364
5374
zend_free_op free_op1 ;
5365
5375
zval * expr ;
5366
5376
zend_bool result ;
5367
5377
5368
5378
SAVE_OPLINE ();
5369
- expr = GET_OP1_ZVAL_PTR_DEREF (BP_VAR_R );
5379
+ expr = GET_OP1_ZVAL_PTR (BP_VAR_R );
5370
5380
5381
+ ZEND_VM_C_LABEL (try_instanceof ):
5371
5382
if (Z_TYPE_P (expr ) == IS_OBJECT ) {
5372
5383
zend_class_entry * ce ;
5373
5384
@@ -5388,6 +5399,9 @@ ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMP|VAR|CV, CONST|VAR)
5388
5399
ce = Z_CE_P (EX_VAR (opline -> op2 .var ));
5389
5400
}
5390
5401
result = instanceof_function (Z_OBJCE_P (expr ), ce TSRMLS_CC );
5402
+ } else if ((OP1_TYPE & (IS_VAR |IS_CV )) && Z_TYPE_P (expr ) == IS_REFERENCE ) {
5403
+ expr = Z_REFVAL_P (expr );
5404
+ ZEND_VM_C_GOTO (try_instanceof );
5391
5405
} else {
5392
5406
result = 0 ;
5393
5407
}
@@ -5974,18 +5988,22 @@ ZEND_VM_C_LABEL(check_indirect):
5974
5988
ZEND_VM_NEXT_OPCODE ();
5975
5989
}
5976
5990
5977
- ZEND_VM_HANDLER (121 , ZEND_STRLEN , CONST |TMP | VAR |CV , ANY )
5991
+ ZEND_VM_HANDLER (121 , ZEND_STRLEN , CONST |TMPVAR |CV , ANY )
5978
5992
{
5979
5993
USE_OPLINE
5980
5994
zval * value ;
5981
5995
zend_free_op free_op1 ;
5982
5996
5983
5997
SAVE_OPLINE ();
5984
- value = GET_OP1_ZVAL_PTR_DEREF (BP_VAR_R );
5998
+ value = GET_OP1_ZVAL_PTR (BP_VAR_R );
5999
+ ZEND_VM_C_LABEL (try_strlen ):
5985
6000
if (EXPECTED (Z_TYPE_P (value ) == IS_STRING )) {
5986
6001
ZVAL_LONG (EX_VAR (opline -> result .var ), Z_STRLEN_P (value ));
5987
6002
} else {
5988
- if (Z_TYPE_P (value ) < IS_TRUE ) {
6003
+ if ((OP1_TYPE & (IS_VAR |IS_CV )) && Z_TYPE_P (value ) == IS_REFERENCE ) {
6004
+ value = Z_REFVAL_P (value );
6005
+ ZEND_VM_C_GOTO (try_strlen );
6006
+ } else if (Z_TYPE_P (value ) < IS_TRUE ) {
5989
6007
ZVAL_LONG (EX_VAR (opline -> result .var ), 0 );
5990
6008
} else if (Z_TYPE_P (value ) == IS_TRUE ) {
5991
6009
ZVAL_LONG (EX_VAR (opline -> result .var ), 1 );
0 commit comments