@@ -692,6 +692,69 @@ static bool zend_may_be_dynamic_property(zend_class_entry *ce, zend_string *memb
692
692
return 0 ;
693
693
}
694
694
695
+ static bool zend_jit_class_may_be_modified (const zend_class_entry * ce , const zend_op_array * called_from )
696
+ {
697
+ uint32_t i ;
698
+
699
+ if (ce -> type == ZEND_INTERNAL_CLASS ) {
700
+ #ifdef _WIN32
701
+ /* ASLR */
702
+ return 1 ;
703
+ #else
704
+ return 0 ;
705
+ #endif
706
+ } else if (ce -> type == ZEND_USER_CLASS ) {
707
+ if (ce -> ce_flags & ZEND_ACC_PRELOADED ) {
708
+ return 0 ;
709
+ }
710
+ if (ce -> info .user .filename == called_from -> filename ) {
711
+ if (ce -> parent && zend_jit_class_may_be_modified (ce -> parent , called_from )) {
712
+ return 1 ;
713
+ }
714
+ if (ce -> num_interfaces ) {
715
+ for (i = 0 ; i < ce -> num_interfaces ; i ++ ) {
716
+ if (zend_jit_class_may_be_modified (ce -> interfaces [i ], called_from )) {
717
+ return 1 ;
718
+ }
719
+ }
720
+ }
721
+ if (ce -> num_traits ) {
722
+ for (i = 0 ; i < ce -> num_traits ; i ++ ) {
723
+ zend_class_entry * trait = zend_fetch_class_by_name (ce -> trait_names [i ].name ,
724
+ ce -> trait_names [i ].lc_name , ZEND_FETCH_CLASS_TRAIT );
725
+ if (zend_jit_class_may_be_modified (trait , called_from )) {
726
+ return 1 ;
727
+ }
728
+ }
729
+ }
730
+ return 0 ;
731
+ }
732
+ }
733
+ return 1 ;
734
+ }
735
+
736
+ static bool zend_jit_may_be_modified (const zend_function * func , const zend_op_array * called_from )
737
+ {
738
+ if (func -> type == ZEND_INTERNAL_FUNCTION ) {
739
+ #ifdef _WIN32
740
+ /* ASLR */
741
+ return 1 ;
742
+ #else
743
+ return 0 ;
744
+ #endif
745
+ } else if (func -> type == ZEND_USER_FUNCTION ) {
746
+ if (func -> common .fn_flags & ZEND_ACC_PRELOADED ) {
747
+ return 0 ;
748
+ }
749
+ if (func -> op_array .filename == called_from -> filename
750
+ && (!func -> op_array .scope
751
+ || !zend_jit_class_may_be_modified (func -> op_array .scope , called_from ))) {
752
+ return 0 ;
753
+ }
754
+ }
755
+ return 1 ;
756
+ }
757
+
695
758
#define OP_RANGE (ssa_op , opN ) \
696
759
(((opline->opN##_type & (IS_TMP_VAR|IS_VAR|IS_CV)) && \
697
760
ssa->var_info && \
0 commit comments