Skip to content

Commit dbe66fb

Browse files
committed
Improved access to static property. Now we cache pointers to zval instead of pointers to property_info.
1 parent 0445974 commit dbe66fb

File tree

4 files changed

+229
-41
lines changed

4 files changed

+229
-41
lines changed

Zend/zend_object_handlers.c

+21-19
Original file line numberDiff line numberDiff line change
@@ -1198,15 +1198,13 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
11981198
ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent, void **cache_slot) /* {{{ */
11991199
{
12001200
zend_property_info *property_info;
1201+
zval *ret;
12011202

1202-
if (UNEXPECTED(cache_slot == NULL) ||
1203-
(property_info = CACHED_POLYMORPHIC_PTR_EX(cache_slot, ce)) == NULL) {
1203+
if (cache_slot == NULL ||
1204+
(ret = CACHED_POLYMORPHIC_PTR_EX(cache_slot, ce)) == NULL) {
12041205

12051206
if (UNEXPECTED((property_info = zend_hash_find_ptr(&ce->properties_info, property_name)) == NULL)) {
1206-
if (!silent) {
1207-
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, property_name->val);
1208-
}
1209-
return NULL;
1207+
goto undeclared_property;
12101208
}
12111209

12121210
if (UNEXPECTED(!zend_verify_property_access(property_info, ce))) {
@@ -1217,28 +1215,32 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p
12171215
}
12181216

12191217
if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0)) {
1220-
if (!silent) {
1221-
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, property_name->val);
1222-
}
1223-
return NULL;
1218+
goto undeclared_property;
12241219
}
12251220

12261221
zend_update_class_constants(ce);
1222+
ret = CE_STATIC_MEMBERS(ce) + property_info->offset;
12271223

1228-
if (EXPECTED(cache_slot != NULL)) {
1229-
CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, property_info);
1224+
/* check if static properties were destoyed */
1225+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
1226+
goto undeclared_property;
12301227
}
1231-
}
12321228

1233-
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL) ||
1234-
UNEXPECTED(Z_TYPE(CE_STATIC_MEMBERS(ce)[property_info->offset]) == IS_UNDEF)) {
1235-
if (!silent) {
1236-
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, property_name->val);
1229+
if (EXPECTED(cache_slot != NULL)) {
1230+
CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, ret);
1231+
}
1232+
} else {
1233+
/* check if static properties were destoyed */
1234+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
1235+
undeclared_property:
1236+
if (!silent) {
1237+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, property_name->val);
1238+
}
1239+
ret = NULL;
12371240
}
1238-
return NULL;
12391241
}
12401242

1241-
return &CE_STATIC_MEMBERS(ce)[property_info->offset];
1243+
return ret;
12421244
}
12431245
/* }}} */
12441246

Zend/zend_opcode.c

+8-12
Original file line numberDiff line numberDiff line change
@@ -150,35 +150,31 @@ ZEND_API void zend_cleanup_user_class_data(zend_class_entry *ce)
150150
} ZEND_HASH_FOREACH_END();
151151
}
152152
if (ce->static_members_table) {
153+
zval *static_members = ce->static_members_table;
153154
int i;
154155

156+
ce->static_members_table = NULL;
155157
for (i = 0; i < ce->default_static_members_count; i++) {
156-
if (Z_TYPE(ce->static_members_table[i]) != IS_UNDEF) {
157-
zval tmp;
158-
159-
ZVAL_COPY_VALUE(&tmp, &ce->static_members_table[i]);
160-
ZVAL_UNDEF(&ce->static_members_table[i]);
161-
zval_ptr_dtor(&tmp);
162-
}
158+
zval_ptr_dtor(&static_members[i]);
163159
}
164-
ce->static_members_table = NULL;
165160
}
166161
}
167162

168163
ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce)
169164
{
170165
if (CE_STATIC_MEMBERS(ce)) {
166+
zval *static_members = CE_STATIC_MEMBERS(ce);
171167
int i;
172168

173-
for (i = 0; i < ce->default_static_members_count; i++) {
174-
zval_ptr_dtor(&CE_STATIC_MEMBERS(ce)[i]);
175-
}
176-
efree(CE_STATIC_MEMBERS(ce));
177169
#ifdef ZTS
178170
CG(static_members_table)[(zend_intptr_t)(ce->static_members_table)] = NULL;
179171
#else
180172
ce->static_members_table = NULL;
181173
#endif
174+
for (i = 0; i < ce->default_static_members_count; i++) {
175+
zval_ptr_dtor(&static_members[i]);
176+
}
177+
efree(static_members);
182178
}
183179
}
184180

Zend/zend_vm_def.h

+20-1
Original file line numberDiff line numberDiff line change
@@ -1112,7 +1112,26 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED|CONST|V
11121112
zend_class_entry *ce;
11131113

11141114
if (OP2_TYPE == IS_CONST) {
1115-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
1115+
if (OP1_TYPE == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
1116+
1117+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
1118+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
1119+
1120+
/* check if static properties were destoyed */
1121+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
1122+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
1123+
}
1124+
1125+
if (type == BP_VAR_R || type == BP_VAR_IS) {
1126+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
1127+
ZVAL_UNREF(retval);
1128+
}
1129+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
1130+
} else {
1131+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
1132+
}
1133+
ZEND_VM_NEXT_OPCODE();
1134+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
11161135
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
11171136
} else {
11181137
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);

Zend/zend_vm_execute.h

+180-9
Original file line numberDiff line numberDiff line change
@@ -3759,7 +3759,26 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type
37593759
zend_class_entry *ce;
37603760

37613761
if (IS_CONST == IS_CONST) {
3762-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
3762+
if (IS_CONST == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
3763+
3764+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
3765+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
3766+
3767+
/* check if static properties were destoyed */
3768+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
3769+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
3770+
}
3771+
3772+
if (type == BP_VAR_R || type == BP_VAR_IS) {
3773+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
3774+
ZVAL_UNREF(retval);
3775+
}
3776+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
3777+
} else {
3778+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
3779+
}
3780+
ZEND_VM_NEXT_OPCODE();
3781+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
37633782
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
37643783
} else {
37653784
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);
@@ -5252,7 +5271,26 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type,
52525271
zend_class_entry *ce;
52535272

52545273
if (IS_VAR == IS_CONST) {
5255-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
5274+
if (IS_CONST == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
5275+
5276+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
5277+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
5278+
5279+
/* check if static properties were destoyed */
5280+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
5281+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
5282+
}
5283+
5284+
if (type == BP_VAR_R || type == BP_VAR_IS) {
5285+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
5286+
ZVAL_UNREF(retval);
5287+
}
5288+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
5289+
} else {
5290+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
5291+
}
5292+
ZEND_VM_NEXT_OPCODE();
5293+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
52565294
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
52575295
} else {
52585296
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);
@@ -5677,7 +5715,26 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ
56775715
zend_class_entry *ce;
56785716

56795717
if (IS_UNUSED == IS_CONST) {
5680-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
5718+
if (IS_CONST == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
5719+
5720+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
5721+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
5722+
5723+
/* check if static properties were destoyed */
5724+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
5725+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
5726+
}
5727+
5728+
if (type == BP_VAR_R || type == BP_VAR_IS) {
5729+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
5730+
ZVAL_UNREF(retval);
5731+
}
5732+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
5733+
} else {
5734+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
5735+
}
5736+
ZEND_VM_NEXT_OPCODE();
5737+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
56815738
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
56825739
} else {
56835740
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);
@@ -25092,7 +25149,26 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z
2509225149
zend_class_entry *ce;
2509325150

2509425151
if (IS_CONST == IS_CONST) {
25095-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
25152+
if (IS_CV == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
25153+
25154+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
25155+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
25156+
25157+
/* check if static properties were destoyed */
25158+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
25159+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
25160+
}
25161+
25162+
if (type == BP_VAR_R || type == BP_VAR_IS) {
25163+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
25164+
ZVAL_UNREF(retval);
25165+
}
25166+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
25167+
} else {
25168+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
25169+
}
25170+
ZEND_VM_NEXT_OPCODE();
25171+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
2509625172
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
2509725173
} else {
2509825174
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);
@@ -26916,7 +26992,26 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN
2691626992
zend_class_entry *ce;
2691726993

2691826994
if (IS_VAR == IS_CONST) {
26919-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
26995+
if (IS_CV == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
26996+
26997+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
26998+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
26999+
27000+
/* check if static properties were destoyed */
27001+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
27002+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
27003+
}
27004+
27005+
if (type == BP_VAR_R || type == BP_VAR_IS) {
27006+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
27007+
ZVAL_UNREF(retval);
27008+
}
27009+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
27010+
} else {
27011+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
27012+
}
27013+
ZEND_VM_NEXT_OPCODE();
27014+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
2692027015
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
2692127016
} else {
2692227017
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);
@@ -27762,7 +27857,26 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type,
2776227857
zend_class_entry *ce;
2776327858

2776427859
if (IS_UNUSED == IS_CONST) {
27765-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
27860+
if (IS_CV == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
27861+
27862+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
27863+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
27864+
27865+
/* check if static properties were destoyed */
27866+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
27867+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
27868+
}
27869+
27870+
if (type == BP_VAR_R || type == BP_VAR_IS) {
27871+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
27872+
ZVAL_UNREF(retval);
27873+
}
27874+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
27875+
} else {
27876+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
27877+
}
27878+
ZEND_VM_NEXT_OPCODE();
27879+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
2776627880
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
2776727881
} else {
2776827882
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);
@@ -33125,7 +33239,26 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_CONST(int typ
3312533239
zend_class_entry *ce;
3312633240

3312733241
if (IS_CONST == IS_CONST) {
33128-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
33242+
if ((IS_TMP_VAR|IS_VAR) == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
33243+
33244+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
33245+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
33246+
33247+
/* check if static properties were destoyed */
33248+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
33249+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
33250+
}
33251+
33252+
if (type == BP_VAR_R || type == BP_VAR_IS) {
33253+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
33254+
ZVAL_UNREF(retval);
33255+
}
33256+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
33257+
} else {
33258+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
33259+
}
33260+
ZEND_VM_NEXT_OPCODE();
33261+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
3312933262
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
3313033263
} else {
3313133264
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);
@@ -33896,7 +34029,26 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_VAR(int type,
3389634029
zend_class_entry *ce;
3389734030

3389834031
if (IS_VAR == IS_CONST) {
33899-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
34032+
if ((IS_TMP_VAR|IS_VAR) == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
34033+
34034+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
34035+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
34036+
34037+
/* check if static properties were destoyed */
34038+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
34039+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
34040+
}
34041+
34042+
if (type == BP_VAR_R || type == BP_VAR_IS) {
34043+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
34044+
ZVAL_UNREF(retval);
34045+
}
34046+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
34047+
} else {
34048+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
34049+
}
34050+
ZEND_VM_NEXT_OPCODE();
34051+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
3390034052
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
3390134053
} else {
3390234054
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);
@@ -34234,7 +34386,26 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(int ty
3423434386
zend_class_entry *ce;
3423534387

3423634388
if (IS_UNUSED == IS_CONST) {
34237-
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
34389+
if ((IS_TMP_VAR|IS_VAR) == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) {
34390+
34391+
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
34392+
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1);
34393+
34394+
/* check if static properties were destoyed */
34395+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
34396+
zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
34397+
}
34398+
34399+
if (type == BP_VAR_R || type == BP_VAR_IS) {
34400+
if (/*type == BP_VAR_R &&*/ Z_ISREF_P(retval) && Z_REFCOUNT_P(retval) == 1) {
34401+
ZVAL_UNREF(retval);
34402+
}
34403+
ZVAL_COPY(EX_VAR(opline->result.var), retval);
34404+
} else {
34405+
ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
34406+
}
34407+
ZEND_VM_NEXT_OPCODE();
34408+
} else if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
3423834409
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
3423934410
} else {
3424034411
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, 0);

0 commit comments

Comments
 (0)