@@ -792,20 +792,36 @@ void zend_optimizer_shift_jump(zend_op_array *op_array, zend_op *opline, uint32_
792
792
}
793
793
}
794
794
795
- static bool zend_optimizer_ignore_class (zend_class_entry * ce , zend_string * filename )
795
+ static bool zend_optimizer_ignore_class (zval * ce_zv , zend_string * filename )
796
796
{
797
+ zend_class_entry * ce = Z_PTR_P (ce_zv );
798
+
799
+ if (ce -> ce_flags & ZEND_ACC_PRELOADED ) {
800
+ Bucket * ce_bucket = (Bucket * )((uintptr_t )ce_zv - XtOffsetOf (Bucket , val ));
801
+ size_t offset = ce_bucket - EG (class_table )-> arData ;
802
+ if (offset < EG (persistent_classes_count )) {
803
+ return false;
804
+ }
805
+ }
797
806
return ce -> type == ZEND_USER_CLASS
798
- && !(ce -> ce_flags & ZEND_ACC_PRELOADED )
799
807
&& (!ce -> info .user .filename || ce -> info .user .filename != filename );
800
808
}
801
809
802
- static bool zend_optimizer_ignore_function (zend_function * fbc , zend_string * filename )
810
+ static bool zend_optimizer_ignore_function (zval * fbc_zv , zend_string * filename )
803
811
{
812
+ zend_function * fbc = Z_PTR_P (fbc_zv );
813
+
804
814
if (fbc -> type == ZEND_INTERNAL_FUNCTION ) {
805
815
return false;
806
816
} else if (fbc -> type == ZEND_USER_FUNCTION ) {
807
- return !(fbc -> op_array .fn_flags & ZEND_ACC_PRELOADED )
808
- && (!fbc -> op_array .filename && fbc -> op_array .filename != filename );
817
+ if (fbc -> op_array .fn_flags & ZEND_ACC_PRELOADED ) {
818
+ Bucket * fbc_bucket = (Bucket * )((uintptr_t )fbc_zv - XtOffsetOf (Bucket , val ));
819
+ size_t offset = fbc_bucket - EG (function_table )-> arData ;
820
+ if (offset < EG (persistent_functions_count )) {
821
+ return false;
822
+ }
823
+ }
824
+ return !fbc -> op_array .filename || fbc -> op_array .filename != filename ;
809
825
} else {
810
826
ZEND_ASSERT (fbc -> type == ZEND_EVAL_CODE );
811
827
return true;
@@ -819,9 +835,9 @@ zend_class_entry *zend_optimizer_get_class_entry(
819
835
return ce ;
820
836
}
821
837
822
- ce = zend_hash_find_ptr (CG (class_table ), lcname );
823
- if (ce && !zend_optimizer_ignore_class (ce , op_array ? op_array -> filename : NULL )) {
824
- return ce ;
838
+ zval * ce_zv = zend_hash_find (CG (class_table ), lcname );
839
+ if (ce_zv && !zend_optimizer_ignore_class (ce_zv , op_array ? op_array -> filename : NULL )) {
840
+ return Z_PTR_P ( ce_zv ) ;
825
841
}
826
842
827
843
if (op_array && op_array -> scope && zend_string_equals_ci (op_array -> scope -> name , lcname )) {
@@ -862,9 +878,9 @@ const zend_class_constant *zend_fetch_class_const_info(
862
878
if (script ) {
863
879
ce = zend_optimizer_get_class_entry (script , op_array , Z_STR_P (op1 + 1 ));
864
880
} else {
865
- zend_class_entry * tmp = zend_hash_find_ptr (EG (class_table ), Z_STR_P (op1 + 1 ));
866
- if (tmp != NULL && !zend_optimizer_ignore_class (tmp , op_array -> filename )) {
867
- ce = tmp ;
881
+ zval * ce_zv = zend_hash_find (EG (class_table ), Z_STR_P (op1 + 1 ));
882
+ if (ce_zv && !zend_optimizer_ignore_class (ce_zv , op_array -> filename )) {
883
+ ce = Z_PTR_P ( ce_zv ) ;
868
884
}
869
885
}
870
886
}
@@ -909,11 +925,12 @@ zend_function *zend_optimizer_get_called_func(
909
925
{
910
926
zend_string * function_name = Z_STR_P (CRT_CONSTANT (opline -> op2 ));
911
927
zend_function * func ;
928
+ zval * func_zv ;
912
929
if (script && (func = zend_hash_find_ptr (& script -> function_table , function_name )) != NULL ) {
913
930
return func ;
914
- } else if ((func = zend_hash_find_ptr (EG (function_table ), function_name )) != NULL ) {
915
- if (!zend_optimizer_ignore_function (func , op_array -> filename )) {
916
- return func ;
931
+ } else if ((func_zv = zend_hash_find (EG (function_table ), function_name )) != NULL ) {
932
+ if (!zend_optimizer_ignore_function (func_zv , op_array -> filename )) {
933
+ return Z_PTR_P ( func_zv ) ;
917
934
}
918
935
}
919
936
break ;
@@ -923,11 +940,12 @@ zend_function *zend_optimizer_get_called_func(
923
940
if (opline -> op2_type == IS_CONST && Z_TYPE_P (CRT_CONSTANT (opline -> op2 )) == IS_STRING ) {
924
941
zval * function_name = CRT_CONSTANT (opline -> op2 ) + 1 ;
925
942
zend_function * func ;
943
+ zval * func_zv ;
926
944
if (script && (func = zend_hash_find_ptr (& script -> function_table , Z_STR_P (function_name )))) {
927
945
return func ;
928
- } else if ((func = zend_hash_find_ptr (EG (function_table ), Z_STR_P (function_name ))) != NULL ) {
929
- if (!zend_optimizer_ignore_function (func , op_array -> filename )) {
930
- return func ;
946
+ } else if ((func_zv = zend_hash_find (EG (function_table ), Z_STR_P (function_name ))) != NULL ) {
947
+ if (!zend_optimizer_ignore_function (func_zv , op_array -> filename )) {
948
+ return Z_PTR_P ( func_zv ) ;
931
949
}
932
950
}
933
951
}
0 commit comments