]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.1'
authorNikita Popov <nikita.ppv@gmail.com>
Sun, 9 Apr 2017 13:35:56 +0000 (15:35 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Sun, 9 Apr 2017 13:51:38 +0000 (15:51 +0200)
1  2 
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 451185969c91cc239221f5daf78e19196207efd1,6ffe4f4d70ec90b25f0b098e5ca30e9136aab574..daaefdf7a30d7b6856c8a963d8b9bd75d1a186d9
@@@ -1919,91 -2008,6 +1919,95 @@@ 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)
++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, int 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));
++                              if (type != BP_VAR_IS) {
++                                      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));
++                              if (type != BP_VAR_IS) {
++                                      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);
++      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
 +
 +      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 48c8139da8003889ec7cc79a005e1f8d35e31c6b,9a633780b1aa11d8986efc9fb456d52b3b30ebff..d80f1e6b56ec83ad7e60f6b4f4f83754116d847d
@@@ -1542,13 -1674,91 +1542,17 @@@ ZEND_VM_HELPER(zend_fetch_static_prop_h
        SAVE_OPLINE();
        varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, OP1_TYPE, opline->op2, OP2_TYPE);
 -      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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -                                      FREE_OP1();
 -                                      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();
 -                              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();
 -                              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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -                                      FREE_OP1();
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
--
 -                      ZEND_VM_C_GOTO(fetch_static_prop_return);
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
++      retval = zend_fetch_static_property_address(execute_data, varname, OP1_TYPE, opline->op2, OP2_TYPE, type);
++      
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
-               FREE_OP1();
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if (OP1_TYPE != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
+                       FREE_OP1();
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if (OP1_TYPE == IS_CONST) {
 -              CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
        }
  
        FREE_OP1();
index 75d7bd8dcb33e21bf27b8128c68a1f3ee9d71790,bb4f50a431d1fc28db79feb85521b3ea3ea891a7..bc369ae9b0778f58db2b0c9f5e66e3cda7752003
@@@ -4876,15 -4851,98 +4876,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        SAVE_OPLINE();
        varname = EX_CONSTANT(opline->op1);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_CONST);
 -      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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      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);
 -                              }
 -
 -                              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);
 -                              }
 -
 -                              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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      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, type);
  
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
 -
 -                      goto fetch_static_prop_return;
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if (IS_CONST != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
  
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if (IS_CONST == IS_CONST) {
 -              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 {
@@@ -6671,15 -6715,98 +6675,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        SAVE_OPLINE();
        varname = EX_CONSTANT(opline->op1);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_VAR);
 -      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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      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);
 -                              }
 -
 -                              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);
 -                              }
 -
 -                              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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      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, type);
  
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
 -
 -                      goto fetch_static_prop_return;
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if (IS_CONST != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
  
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if (IS_CONST == IS_CONST) {
 -              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 {
@@@ -7174,15 -7298,98 +7182,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        SAVE_OPLINE();
        varname = EX_CONSTANT(opline->op1);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_UNUSED);
 -      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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      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);
 -                              }
 -
 -                              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);
 -                              }
++      retval = zend_fetch_static_property_address(execute_data, varname, IS_CONST, opline->op2, IS_UNUSED, type);
  
 -                              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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
 -
 -                      goto fetch_static_prop_return;
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if (IS_CONST != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
  
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if (IS_CONST == IS_CONST) {
 -              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 {
@@@ -35598,15 -37957,98 +35610,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_CONST);
 -      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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      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);
 -                              }
 -
 -                              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);
 -                              }
 -
 -                              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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
++      retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_CONST, type);
  
 -                      goto fetch_static_prop_return;
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if (IS_CV != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
  
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if (IS_CV == IS_CONST) {
 -              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 {
@@@ -38611,15 -41031,98 +38627,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_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*));
++      retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_VAR, type);
  
 -                      /* check if static properties were destoyed */
 -                      if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      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);
 -                              }
 -
 -                              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);
 -                              }
 -
 -                              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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
 -
 -                      goto fetch_static_prop_return;
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if (IS_CV != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
  
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if (IS_CV == IS_CONST) {
 -              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 {
@@@ -39446,15 -42090,98 +39466,19 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, IS_CV, opline->op2, IS_UNUSED);
 -      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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      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);
 -                              }
 -
 -                              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);
 -                              }
 -
 -                              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_UNUSED, type);
  
 -                      /* check if static properties were destoyed */
 -                      if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
 -
 -                      goto fetch_static_prop_return;
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if (IS_CV != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
  
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if (IS_CV == IS_CONST) {
 -              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 {
@@@ -48917,13 -52460,91 +48941,17 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_CONST);
 -      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*));
 -
 -                      /* check if static properties were destoyed */
 -                      if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -                                      zval_ptr_dtor_nogc(free_op1);
 -                                      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);
 -                              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);
 -                              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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -                                      zval_ptr_dtor_nogc(free_op1);
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
++      retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_CONST, type);
  
 -                      goto fetch_static_prop_return;
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
-               zval_ptr_dtor_nogc(free_op1);
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
+                       zval_ptr_dtor_nogc(free_op1);
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 -              CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
        }
  
        zval_ptr_dtor_nogc(free_op1);
@@@ -49797,13 -53420,91 +49825,17 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_VAR);
 -      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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -                                      zval_ptr_dtor_nogc(free_op1);
 -                                      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);
 -                              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);
 -                              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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -                                      zval_ptr_dtor_nogc(free_op1);
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
++      retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_VAR, type);
  
 -                      goto fetch_static_prop_return;
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
-               zval_ptr_dtor_nogc(free_op1);
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
+                       zval_ptr_dtor_nogc(free_op1);
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 -              CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
        }
  
        zval_ptr_dtor_nogc(free_op1);
@@@ -50216,13 -53919,91 +50248,17 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
  
-       retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_UNUSED);
 -      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*));
 -
 -                      /* check if static properties were destoyed */
 -                      if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -                                      zval_ptr_dtor_nogc(free_op1);
 -                                      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);
 -                              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);
 -                              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)) {
 -                              if (type == BP_VAR_IS) {
 -                                      retval = &EG(uninitialized_zval);
 -                              } else {
 -                                      zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
 -                                      zval_ptr_dtor_nogc(free_op1);
 -                                      HANDLE_EXCEPTION();
 -                              }
 -                      }
++      retval = zend_fetch_static_property_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), opline->op2, IS_UNUSED, type);
  
 -                      goto fetch_static_prop_return;
 -              }
 -      }
 -      retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
        if (UNEXPECTED(retval == NULL)) {
-               ZEND_ASSERT(EG(exception));
-               zval_ptr_dtor_nogc(free_op1);
-               ZVAL_UNDEF(EX_VAR(opline->result.var));
-               HANDLE_EXCEPTION();
 -              if (type == BP_VAR_IS) {
 -                      retval = &EG(uninitialized_zval);
 -              } else {
 -                      ZEND_ASSERT(EG(exception));
 -                      if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 -                              zend_string_release(name);
 -                      }
++              if (EG(exception)) {
+                       zval_ptr_dtor_nogc(free_op1);
++                      ZVAL_UNDEF(EX_VAR(opline->result.var));
+                       HANDLE_EXCEPTION();
++              } else {
++                      ZEND_ASSERT(type == BP_VAR_IS);
++                      retval = &EG(uninitialized_zval);
+               }
 -      } else if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 -              CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
        }
  
        zval_ptr_dtor_nogc(free_op1);