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