@@ -5866,22 +5866,24 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
58665866
58675867 do {
58685868 if (OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST ) {
5869- if (EXPECTED (CACHED_PTR (opline -> extended_value + sizeof (void * )))) {
5870- value = CACHED_PTR (opline -> extended_value + sizeof (void * ));
5869+ void * value_cache = CACHED_PTR ((opline -> extended_value & ~ZEND_FETCH_CLASS_CONSTANT_IS ) + sizeof (void * ));
5870+ if (EXPECTED (value_cache )) {
5871+ value = value_cache ;
58715872 break ;
58725873 }
58735874 }
58745875 if (OP1_TYPE == IS_CONST ) {
5875- if (EXPECTED (CACHED_PTR (opline -> extended_value ))) {
5876- ce = CACHED_PTR (opline -> extended_value );
5876+ void * class_cache = CACHED_PTR (opline -> extended_value & ~ZEND_FETCH_CLASS_CONSTANT_IS );
5877+ if (EXPECTED (class_cache )) {
5878+ ce = class_cache ;
58775879 } else {
58785880 ce = zend_fetch_class_by_name (Z_STR_P (RT_CONSTANT (opline , opline -> op1 )), Z_STR_P (RT_CONSTANT (opline , opline -> op1 ) + 1 ), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION );
58795881 if (UNEXPECTED (ce == NULL )) {
58805882 ZVAL_UNDEF (EX_VAR (opline -> result .var ));
58815883 FREE_OP2 ();
58825884 HANDLE_EXCEPTION ();
58835885 }
5884- CACHE_PTR (opline -> extended_value , ce );
5886+ CACHE_PTR (opline -> extended_value & ~ ZEND_FETCH_CLASS_CONSTANT_IS , ce );
58855887 }
58865888 } else if (OP1_TYPE == IS_UNUSED ) {
58875889 ce = zend_fetch_class (NULL , opline -> op1 .num );
@@ -5893,11 +5895,13 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
58935895 } else {
58945896 ce = Z_CE_P (EX_VAR (opline -> op1 .var ));
58955897 }
5896- if (EXPECTED (OP2_TYPE == IS_CONST
5897- && CACHED_PTR (opline -> extended_value ) == ce )
5898- && CACHED_PTR (opline -> extended_value + sizeof (void * )) != NULL ) {
5899- value = CACHED_PTR (opline -> extended_value + sizeof (void * ));
5900- break ;
5898+ if (OP2_TYPE == IS_CONST ) {
5899+ void * class_cache = CACHED_PTR (opline -> extended_value & ~ZEND_FETCH_CLASS_CONSTANT_IS );
5900+ void * value_cache = CACHED_PTR ((opline -> extended_value & ~ZEND_FETCH_CLASS_CONSTANT_IS ) + sizeof (void * ));
5901+ if (EXPECTED (class_cache == ce && value_cache != NULL )) {
5902+ value = value_cache ;
5903+ break ;
5904+ }
59015905 }
59025906
59035907 constant_zv = GET_OP2_ZVAL_PTR_DEREF (BP_VAR_R );
@@ -5953,14 +5957,18 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
59535957 }
59545958 }
59555959 if (OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST ) {
5956- CACHE_POLYMORPHIC_PTR (opline -> extended_value , ce , value );
5960+ CACHE_POLYMORPHIC_PTR (opline -> extended_value & ~ ZEND_FETCH_CLASS_CONSTANT_IS , ce , value );
59575961 }
59585962 } else {
5959- zend_throw_error (NULL , "Undefined constant %s::%s" ,
5960- ZSTR_VAL (ce -> name ), ZSTR_VAL (constant_name ));
5961- ZVAL_UNDEF (EX_VAR (opline -> result .var ));
5962- FREE_OP2 ();
5963- HANDLE_EXCEPTION ();
5963+ if (EXPECTED (!(opline -> extended_value & ZEND_FETCH_CLASS_CONSTANT_IS ))) {
5964+ zend_throw_error (NULL , "Undefined constant %s::%s" ,
5965+ ZSTR_VAL (ce -> name ), ZSTR_VAL (constant_name ));
5966+ ZVAL_UNDEF (EX_VAR (opline -> result .var ));
5967+ FREE_OP2 ();
5968+ HANDLE_EXCEPTION ();
5969+ } else {
5970+ value = & EG (uninitialized_zval );
5971+ }
59645972 }
59655973 } while (0 );
59665974
0 commit comments