@@ -3960,7 +3960,69 @@ static zend_always_inline zend_result _zend_update_type_info(
3960
3960
/* Forbidden opcodes */
3961
3961
ZEND_UNREACHABLE ();
3962
3962
break ;
3963
+ case ZEND_FETCH_CLASS_NAME :
3964
+ UPDATE_SSA_TYPE (MAY_BE_STRING |MAY_BE_RCN , ssa_op -> result_def );
3965
+ break ;
3966
+ case ZEND_ISSET_ISEMPTY_THIS :
3967
+ UPDATE_SSA_TYPE (MAY_BE_BOOL , ssa_op -> result_def );
3968
+ break ;
3969
+ case ZEND_DECLARE_LAMBDA_FUNCTION :
3970
+ UPDATE_SSA_TYPE (MAY_BE_OBJECT |MAY_BE_RC1 , ssa_op -> result_def );
3971
+ UPDATE_SSA_OBJ_TYPE (zend_ce_closure , /* is_instanceof */ false, ssa_op -> result_def );
3972
+ break ;
3973
+ case ZEND_PRE_DEC_STATIC_PROP :
3974
+ case ZEND_PRE_INC_STATIC_PROP :
3975
+ case ZEND_POST_DEC_STATIC_PROP :
3976
+ case ZEND_POST_INC_STATIC_PROP : {
3977
+ if (ssa_op -> result_def >= 0 ) {
3978
+ const zend_property_info * prop_info = zend_fetch_static_prop_info (script , op_array , ssa , opline );
3979
+ zend_class_entry * prop_ce ;
3980
+ tmp = zend_fetch_prop_type (script , prop_info , & prop_ce );
3981
+ /* Internal objects may result in essentially anything. */
3982
+ if (tmp & MAY_BE_OBJECT ) {
3983
+ goto unknown_opcode ;
3984
+ }
3985
+ tmp &= MAY_BE_LONG |MAY_BE_DOUBLE |MAY_BE_STRING |MAY_BE_BOOL |MAY_BE_NULL ;
3986
+ if (tmp & MAY_BE_STRING ) {
3987
+ tmp |= MAY_BE_RC1 | MAY_BE_RCN ;
3988
+ }
3989
+ UPDATE_SSA_TYPE (tmp , ssa_op -> result_def );
3990
+ }
3991
+ break ;
3992
+ }
3993
+ case ZEND_SPACESHIP :
3994
+ UPDATE_SSA_TYPE (MAY_BE_LONG , ssa_op -> result_def );
3995
+ break ;
3996
+ case ZEND_SEPARATE :
3997
+ UPDATE_SSA_TYPE (t1 , ssa_op -> result_def );
3998
+ COPY_SSA_OBJ_TYPE (ssa_op -> op1_use , ssa_op -> result_def );
3999
+ break ;
4000
+ case ZEND_FETCH_GLOBALS :
4001
+ UPDATE_SSA_TYPE (MAY_BE_ARRAY |MAY_BE_ARRAY_KEY_ANY |MAY_BE_ARRAY_OF_ANY |MAY_BE_ARRAY_OF_REF |MAY_BE_RC1 |MAY_BE_RCN , ssa_op -> result_def );
4002
+ break ;
3963
4003
default :
4004
+ #ifdef ZEND_DEBUG_TYPE_INFERENCE
4005
+ if (ssa_op -> result_def >= 0 ) {
4006
+ switch (opline -> opcode ) {
4007
+ case ZEND_FETCH_R :
4008
+ case ZEND_FETCH_W :
4009
+ case ZEND_FETCH_RW :
4010
+ case ZEND_FETCH_IS :
4011
+ case ZEND_FETCH_UNSET :
4012
+ case ZEND_YIELD_FROM :
4013
+ break ;
4014
+ default :
4015
+ fprintf (stderr , "Missing result type inference for opcode %s, line %d\n" , zend_get_opcode_name (opline -> opcode ), opline -> lineno );
4016
+ break ;
4017
+ }
4018
+ }
4019
+ if (ssa_op -> op1_def >= 0 ) {
4020
+ fprintf (stderr , "Missing op1 type inference for opcode %s, line %d\n" , zend_get_opcode_name (opline -> opcode ), opline -> lineno );
4021
+ }
4022
+ if (ssa_op -> op2_def >= 0 ) {
4023
+ fprintf (stderr , "Missing op2 type inference for opcode %s, line %d\n" , zend_get_opcode_name (opline -> opcode ), opline -> lineno );
4024
+ }
4025
+ #endif
3964
4026
unknown_opcode :
3965
4027
if (ssa_op -> op1_def >= 0 ) {
3966
4028
tmp = MAY_BE_ANY | MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF ;
0 commit comments