@@ -3960,7 +3960,68 @@ 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_FETCH_GLOBALS :
3997
+ 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 );
3998
+ break ;
3963
3999
default :
4000
+ #ifdef ZEND_DEBUG_TYPE_INFERENCE
4001
+ if (ssa_op -> result_def >= 0 ) {
4002
+ switch (opline -> opcode ) {
4003
+ case ZEND_FETCH_R :
4004
+ case ZEND_FETCH_W :
4005
+ case ZEND_FETCH_RW :
4006
+ case ZEND_FETCH_IS :
4007
+ case ZEND_FETCH_UNSET :
4008
+ case ZEND_YIELD_FROM :
4009
+ /* Currently unimplemented due to some assumptions in JIT. See:
4010
+ * https://github.com/php/php-src/pull/13304#issuecomment-1926668141 */
4011
+ case ZEND_SEPARATE :
4012
+ break ;
4013
+ default :
4014
+ fprintf (stderr , "Missing result type inference for opcode %s, line %d\n" , zend_get_opcode_name (opline -> opcode ), opline -> lineno );
4015
+ break ;
4016
+ }
4017
+ }
4018
+ if (ssa_op -> op1_def >= 0 ) {
4019
+ fprintf (stderr , "Missing op1 type inference for opcode %s, line %d\n" , zend_get_opcode_name (opline -> opcode ), opline -> lineno );
4020
+ }
4021
+ if (ssa_op -> op2_def >= 0 ) {
4022
+ fprintf (stderr , "Missing op2 type inference for opcode %s, line %d\n" , zend_get_opcode_name (opline -> opcode ), opline -> lineno );
4023
+ }
4024
+ #endif
3964
4025
unknown_opcode :
3965
4026
if (ssa_op -> op1_def >= 0 ) {
3966
4027
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