]> granicus.if.org Git - php/commitdiff
Separate zend_fetch_static_property_address() into an inline function
authorDmitry Stogov <dmitry@zend.com>
Tue, 17 Jan 2017 08:11:12 +0000 (11:11 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 17 Jan 2017 08:11:12 +0000 (11:11 +0300)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 417f3a092f36140eeec6e2913fd8415e85749933..68f5b3ce6cab6447371427b7643b869d5913b0b7 100644 (file)
@@ -1927,6 +1927,91 @@ use_read_property:
        }
 }
 
+static zend_always_inline zval* zend_fetch_static_property_address(zend_execute_data *execute_data, zval *varname, zend_uchar varname_type, znode_op op2, zend_uchar op2_type)
+{
+       zval *retval;
+       zend_string *name;
+       zend_class_entry *ce;
+
+       if (varname_type == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               zend_string_addref(name);
+       } else {
+               if (varname_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
+                       zval_undefined_cv(EX(opline)->op1.var, execute_data);
+               }
+               name = zval_get_string(varname);
+       }
+
+       if (op2_type == IS_CONST) {
+               if (varname_type == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(varname))) != NULL)) {
+                       retval = CACHED_PTR(Z_CACHE_SLOT_P(varname) + sizeof(void*));
+
+                       /* check if static properties were destoyed */
+                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
+                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
+                               return NULL;
+                       }
+
+                       return retval;
+               } else {
+                       zval *class_name = EX_CONSTANT(op2);
+
+                       if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name))) == NULL)) {
+                               ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (varname_type != IS_CONST) {
+                                               zend_string_release(name);
+                                       }
+                                       return NULL;
+                               }
+                               CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
+                       }
+               }
+       } else {
+               if (op2_type == IS_UNUSED) {
+                       ce = zend_fetch_class(NULL, op2.num);
+                       if (UNEXPECTED(ce == NULL)) {
+                               if (varname_type != IS_CONST) {
+                                       zend_string_release(name);
+                               }
+                               return NULL;
+                       }
+               } else {
+                       ce = Z_CE_P(EX_VAR(op2.var));
+               }
+               if (varname_type == IS_CONST &&
+                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(varname), ce)) != NULL) {
+
+                       /* check if static properties were destoyed */
+                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
+                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
+                               return NULL;
+                       }
+
+                       return retval;
+               }
+       }
+
+       retval = zend_std_get_static_property(ce, name, 0);
+
+       if (varname_type != IS_CONST) {
+               zend_string_release(name);
+       }
+
+       if (UNEXPECTED(retval == NULL)) {
+               return NULL;
+       }
+
+       if (varname_type == IS_CONST) {
+               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(varname), ce, retval);
+       }
+
+       return retval;
+}
+
 #if ZEND_INTENSIVE_DEBUGGING
 
 #define CHECK_SYMBOL_TABLES()                                                                                                  \
index 563022b8d7ec2f7abcbd133cbd3f68547b6f53e0..cbc5804c99c62219fe7ca5ecea6c1fbdf5548b4a 100644 (file)
@@ -1538,100 +1538,21 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
        zend_free_op free_op1;
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
 
-       if (OP1_TYPE == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (OP2_TYPE == IS_CONST) {
-               if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-                               FREE_OP1();
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       ZEND_VM_C_GOTO(fetch_static_prop_return);
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (OP1_TYPE != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-                               FREE_OP1();
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (OP2_TYPE == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (OP1_TYPE != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-                               FREE_OP1();
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if (OP1_TYPE == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
-                               
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-                               FREE_OP1();
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
+       retval = zend_fetch_static_property_address(execute_data, varname, OP1_TYPE, opline->op2, OP2_TYPE);
 
-                       ZEND_VM_C_GOTO(fetch_static_prop_return);
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if (OP1_TYPE != IS_CONST) {
-                       zend_string_release(name);
-               }
                FREE_OP1();
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if (OP1_TYPE == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
 
        FREE_OP1();
 
-       if (OP1_TYPE != IS_CONST) {
-               zend_string_release(name);
-       }
-
-ZEND_VM_C_LABEL(fetch_static_prop_return):
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {
index 8f28209d5395212817397dcc1aeb7160c8367ec3..fac8f6e475e4a8b681feb5c4ae96962564a5eb2f 100644 (file)
@@ -4872,98 +4872,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
 
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (IS_CONST == IS_CONST) {
-               if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
+       retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_CONST);
 
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (IS_CONST == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if (IS_CONST == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if (IS_CONST != IS_CONST) {
-                       zend_string_release(name);
-               }
 
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if (IS_CONST == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
-
-       if (IS_CONST != IS_CONST) {
-               zend_string_release(name);
-       }
 
-fetch_static_prop_return:
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {
@@ -6746,98 +6667,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
 
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (IS_VAR == IS_CONST) {
-               if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
+       retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_VAR);
 
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (IS_VAR == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if (IS_CONST == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if (IS_CONST != IS_CONST) {
-                       zend_string_release(name);
-               }
 
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if (IS_CONST == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
-
-       if (IS_CONST != IS_CONST) {
-               zend_string_release(name);
-       }
 
-fetch_static_prop_return:
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {
@@ -7328,98 +7170,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
 
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (IS_UNUSED == IS_CONST) {
-               if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
+       retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_UNUSED);
 
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (IS_UNUSED == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if (IS_CONST == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if (IS_CONST != IS_CONST) {
-                       zend_string_release(name);
-               }
 
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if (IS_CONST == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
-
-       if (IS_CONST != IS_CONST) {
-               zend_string_release(name);
-       }
 
-fetch_static_prop_return:
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {
@@ -35831,98 +35594,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
 
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (IS_CONST == IS_CONST) {
-               if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
+       retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_CONST);
 
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (IS_CONST == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if (IS_CV == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if (IS_CV != IS_CONST) {
-                       zend_string_release(name);
-               }
 
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if (IS_CV == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
-
-       if (IS_CV != IS_CONST) {
-               zend_string_release(name);
-       }
 
-fetch_static_prop_return:
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {
@@ -38923,98 +38607,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
 
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (IS_VAR == IS_CONST) {
-               if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (IS_VAR == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if (IS_CV == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
+       retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_VAR);
 
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if (IS_CV != IS_CONST) {
-                       zend_string_release(name);
-               }
 
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if (IS_CV == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
 
-       if (IS_CV != IS_CONST) {
-               zend_string_release(name);
-       }
-
-fetch_static_prop_return:
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {
@@ -39837,98 +39442,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
 
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (IS_UNUSED == IS_CONST) {
-               if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (IS_UNUSED == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST) {
-                                       zend_string_release(name);
-                               }
+       retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_UNUSED);
 
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if (IS_CV == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if (IS_CV != IS_CONST) {
-                       zend_string_release(name);
-               }
 
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if (IS_CV == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
 
-       if (IS_CV != IS_CONST) {
-               zend_string_release(name);
-       }
-
-fetch_static_prop_return:
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {
@@ -49387,100 +48913,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
        zend_free_op free_op1;
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (IS_CONST == IS_CONST) {
-               if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
+       retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_CONST);
 
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (IS_CONST == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                       zend_string_release(name);
-               }
                zval_ptr_dtor_nogc(free_op1);
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
 
        zval_ptr_dtor_nogc(free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-               zend_string_release(name);
-       }
-
-fetch_static_prop_return:
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {
@@ -50346,100 +49793,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
        zend_free_op free_op1;
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (IS_VAR == IS_CONST) {
-               if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (IS_VAR == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
+       retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_VAR);
 
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                       zend_string_release(name);
-               }
                zval_ptr_dtor_nogc(free_op1);
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
 
        zval_ptr_dtor_nogc(free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-               zend_string_release(name);
-       }
-
-fetch_static_prop_return:
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {
@@ -50844,100 +50212,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_
        zend_free_op free_op1;
        zval *varname;
        zval *retval;
-       zend_string *name;
-       zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-               name = Z_STR_P(varname);
-       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
-               name = Z_STR_P(varname);
-               zend_string_addref(name);
-       } else {
-               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
-                       GET_OP1_UNDEF_CV(varname, BP_VAR_R);
-               }
-               name = zval_get_string(varname);
-       }
-
-       if (IS_UNUSED == IS_CONST) {
-               if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
-                       retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
+       retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_UNUSED);
 
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
-                       ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
-               }
-       } else {
-               if (IS_UNUSED == IS_UNUSED) {
-                       ce = zend_fetch_class(NULL, opline->op2.num);
-                       if (UNEXPECTED(ce == NULL)) {
-                               ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                                       zend_string_release(name);
-                               }
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-               } else {
-                       ce = Z_CE_P(EX_VAR(opline->op2.var));
-               }
-               if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
-                   (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
-
-                       /* check if static properties were destoyed */
-                       if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                               zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
-                               zval_ptr_dtor_nogc(free_op1);
-                               ZVAL_UNDEF(EX_VAR(opline->result.var));
-                               HANDLE_EXCEPTION();
-                       }
-
-                       goto fetch_static_prop_return;
-               }
-       }
-       retval = zend_std_get_static_property(ce, name, 0);
        if (UNEXPECTED(retval == NULL)) {
                ZEND_ASSERT(EG(exception));
-               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                       zend_string_release(name);
-               }
                zval_ptr_dtor_nogc(free_op1);
                ZVAL_UNDEF(EX_VAR(opline->result.var));
                HANDLE_EXCEPTION();
        }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) {
-               CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
-       }
 
        zval_ptr_dtor_nogc(free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-               zend_string_release(name);
-       }
-
-fetch_static_prop_return:
        if (type == BP_VAR_R || type == BP_VAR_IS) {
                ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
        } else {