@@ -7264,24 +7264,28 @@ ZEND_VM_HANDLER(145, ZEND_DECLARE_CLASS_DELAYED, CONST, CONST)
7264
7264
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
7265
7265
}
7266
7266
7267
- ZEND_VM_HANDLER (146 , ZEND_DECLARE_ANON_CLASS , ANY , ANY )
7267
+ ZEND_VM_HANDLER (146 , ZEND_DECLARE_ANON_CLASS , ANY , ANY , CACHE_SLOT )
7268
7268
{
7269
7269
zval * zv ;
7270
7270
zend_class_entry * ce ;
7271
7271
USE_OPLINE
7272
7272
7273
- zv = zend_hash_find_ex (EG (class_table ), Z_STR_P (RT_CONSTANT (opline , opline -> op1 )), 1 );
7274
- ZEND_ASSERT (zv != NULL );
7275
- ce = Z_CE_P (zv );
7276
- Z_CE_P (EX_VAR (opline -> result .var )) = ce ;
7277
-
7278
- if (ce -> ce_flags & ZEND_ACC_LINKED ) {
7279
- ZEND_VM_NEXT_OPCODE ();
7280
- } else {
7281
- SAVE_OPLINE ();
7282
- zend_do_link_class (ce , (OP2_TYPE == IS_CONST ) ? Z_STR_P (RT_CONSTANT (opline , opline -> op2 )) : NULL );
7283
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
7273
+ ce = CACHED_PTR (opline -> extended_value );
7274
+ if (UNEXPECTED (ce == NULL )) {
7275
+ zv = zend_hash_find_ex (EG (class_table ), Z_STR_P (RT_CONSTANT (opline , opline -> op1 )), 1 );
7276
+ ZEND_ASSERT (zv != NULL );
7277
+ ce = Z_CE_P (zv );
7278
+ if (!(ce -> ce_flags & ZEND_ACC_LINKED )) {
7279
+ SAVE_OPLINE ();
7280
+ zend_do_link_class (ce , (OP2_TYPE == IS_CONST ) ? Z_STR_P (RT_CONSTANT (opline , opline -> op2 )) : NULL );
7281
+ if (UNEXPECTED (EG (exception ))) {
7282
+ HANDLE_EXCEPTION ();
7283
+ }
7284
+ }
7285
+ CACHE_PTR (opline -> extended_value , ce );
7284
7286
}
7287
+ Z_CE_P (EX_VAR (opline -> result .var )) = ce ;
7288
+ ZEND_VM_NEXT_OPCODE ();
7285
7289
}
7286
7290
7287
7291
ZEND_VM_HANDLER (141 , ZEND_DECLARE_FUNCTION , ANY , ANY )
@@ -7550,19 +7554,26 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST)
7550
7554
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
7551
7555
}
7552
7556
7553
- ZEND_VM_HANDLER (142 , ZEND_DECLARE_LAMBDA_FUNCTION , CONST , UNUSED )
7557
+ ZEND_VM_HANDLER (142 , ZEND_DECLARE_LAMBDA_FUNCTION , CONST , UNUSED , CACHE_SLOT )
7554
7558
{
7555
7559
USE_OPLINE
7560
+ zend_function * func ;
7556
7561
zval * zfunc ;
7557
7562
zval * object ;
7558
7563
zend_class_entry * called_scope ;
7559
7564
7560
- zfunc = zend_hash_find_ex (EG (function_table ), Z_STR_P (RT_CONSTANT (opline , opline -> op1 )), 1 );
7561
- ZEND_ASSERT (zfunc != NULL && Z_FUNC_P (zfunc )-> type == ZEND_USER_FUNCTION );
7565
+ func = CACHED_PTR (opline -> extended_value );
7566
+ if (UNEXPECTED (func == NULL )) {
7567
+ zfunc = zend_hash_find_ex (EG (function_table ), Z_STR_P (RT_CONSTANT (opline , opline -> op1 )), 1 );
7568
+ ZEND_ASSERT (zfunc != NULL );
7569
+ func = Z_FUNC_P (zfunc );
7570
+ ZEND_ASSERT (func -> type == ZEND_USER_FUNCTION );
7571
+ CACHE_PTR (opline -> extended_value , func );
7572
+ }
7562
7573
7563
7574
if (Z_TYPE (EX (This )) == IS_OBJECT ) {
7564
7575
called_scope = Z_OBJCE (EX (This ));
7565
- if (UNEXPECTED ((Z_FUNC_P ( zfunc ) -> common .fn_flags & ZEND_ACC_STATIC ) ||
7576
+ if (UNEXPECTED ((func -> common .fn_flags & ZEND_ACC_STATIC ) ||
7566
7577
(EX (func )-> common .fn_flags & ZEND_ACC_STATIC ))) {
7567
7578
object = NULL ;
7568
7579
} else {
@@ -7572,7 +7583,7 @@ ZEND_VM_HANDLER(142, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED)
7572
7583
called_scope = Z_CE (EX (This ));
7573
7584
object = NULL ;
7574
7585
}
7575
- zend_create_closure (EX_VAR (opline -> result .var ), Z_FUNC_P ( zfunc ) ,
7586
+ zend_create_closure (EX_VAR (opline -> result .var ), func ,
7576
7587
EX (func )-> op_array .scope , called_scope , object );
7577
7588
7578
7589
ZEND_VM_NEXT_OPCODE ();
0 commit comments