]> granicus.if.org Git - php/commitdiff
Convert fatal errors on improper access to static properties into EngineExceptions
authorDmitry Stogov <dmitry@zend.com>
Tue, 31 Mar 2015 13:35:27 +0000 (16:35 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 31 Mar 2015 13:35:27 +0000 (16:35 +0300)
Zend/tests/exception_013.phpt [new file with mode: 0644]
Zend/zend_object_handlers.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/soap/soap.c

diff --git a/Zend/tests/exception_013.phpt b/Zend/tests/exception_013.phpt
new file mode 100644 (file)
index 0000000..72e9377
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Exceptions on improper access to static class properties
+--FILE--
+<?php
+class C {
+       static private $p = 0;
+}
+
+try {
+       var_dump(C::$a);
+} catch (EngineException $e) {
+       echo "\nException: " . $e->getMessage() . " in " , $e->getFile() . " on line " . $e->getLine() . "\n";
+}
+
+try {
+       var_dump(C::$p);
+} catch (EngineException $e) {
+       echo "\nException: " . $e->getMessage() . " in " , $e->getFile() . " on line " . $e->getLine() . "\n";
+}
+
+try {
+       unset(C::$a);
+} catch (EngineException $e) {
+       echo "\nException: " . $e->getMessage() . " in " , $e->getFile() . " on line " . $e->getLine() . "\n";
+}
+
+var_dump(C::$a);
+?>
+--EXPECTF--
+Exception: Access to undeclared static property: C::$a in %sexception_013.php on line 7
+
+Exception: Cannot access private property C::$p in %sexception_013.php on line 13
+
+Exception: Attempt to unset static property C::$a in %sexception_013.php on line 19
+
+Fatal error: Access to undeclared static property: C::$a in %sexception_013.php on line 24
index a5c0bf0a033dd0f6d4709bd0e85f3813f0d50bf2..063c0a5da857cfe4ffed13440ed3c2aad15d33f0 100644 (file)
@@ -1286,7 +1286,7 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p
 
        if (UNEXPECTED(!zend_verify_property_access(property_info, ce))) {
                if (!silent) {
-                       zend_error_noreturn(E_ERROR, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), ce->name->val, property_name->val);
+                       zend_error(E_EXCEPTION | E_ERROR, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), ce->name->val, property_name->val);
                }
                return NULL;
        }
@@ -1302,7 +1302,7 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p
        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
 undeclared_property:
                if (!silent) {
-                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, property_name->val);
+                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, property_name->val);
                }
                ret = NULL;
        }
@@ -1313,7 +1313,7 @@ undeclared_property:
 
 ZEND_API zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name) /* {{{ */
 {
-       zend_error_noreturn(E_ERROR, "Attempt to unset static property %s::$%s", ce->name->val, property_name->val);
+       zend_error(E_EXCEPTION | E_ERROR, "Attempt to unset static property %s::$%s", ce->name->val, property_name->val);
        return 0;
 }
 /* }}} */
index 8c1f1b4a8f0e5feaddb9bc413ff46e97e684501d..338e4c9d125c6889f836bcea10d1291eaaa88cb2 100644 (file)
@@ -1465,7 +1465,9 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED|CONST|V
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       FREE_OP1();
+                                       HANDLE_EXCEPTION();
                                }
 
                                ZEND_VM_C_GOTO(fetch_var_return);
@@ -1490,13 +1492,19 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED|CONST|V
                                
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       FREE_OP1();
+                                       HANDLE_EXCEPTION();
                                }
 
                                ZEND_VM_C_GOTO(fetch_var_return);
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+                       FREE_OP1();
+                       HANDLE_EXCEPTION();
+               }
                if (OP1_TYPE == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -6098,7 +6106,9 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED|CONST|VAR)
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               FREE_OP1();
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        ZEND_VM_C_GOTO(is_var_return);
@@ -6119,7 +6129,9 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED|CONST|VAR)
                                
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               FREE_OP1();
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        ZEND_VM_C_GOTO(is_var_return);
index 31ee053ef455c3e847cf970010abfca3a69c28b3..98e27d850261e5d816ffcdac223b53e3088b4a4a 100644 (file)
@@ -4502,7 +4502,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
@@ -4527,13 +4529,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+
+                       HANDLE_EXCEPTION();
+               }
                if (IS_CONST == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -5556,7 +5564,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_C
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -5577,7 +5587,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_C
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -6187,7 +6199,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
@@ -6212,13 +6226,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+
+                       HANDLE_EXCEPTION();
+               }
                if (IS_CONST == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -6448,7 +6468,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_V
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -6469,7 +6491,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_V
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -6675,7 +6699,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
@@ -6700,13 +6726,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+
+                       HANDLE_EXCEPTION();
+               }
                if (IS_CONST == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -7283,7 +7315,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -7304,7 +7338,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -28735,7 +28771,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
@@ -28760,13 +28798,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+
+                       HANDLE_EXCEPTION();
+               }
                if (IS_CV == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -30026,7 +30070,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONS
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -30047,7 +30093,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONS
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -30760,7 +30808,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
@@ -30785,13 +30835,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+
+                       HANDLE_EXCEPTION();
+               }
                if (IS_CV == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -31117,7 +31173,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -31138,7 +31196,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -31676,7 +31736,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
@@ -31701,13 +31763,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+
+                       HANDLE_EXCEPTION();
+               }
                if (IS_CV == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -32301,7 +32369,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUS
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -32322,7 +32392,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUS
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -38428,7 +38500,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zval_ptr_dtor_nogc(free_op1);
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
@@ -38453,13 +38527,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zval_ptr_dtor_nogc(free_op1);
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+                       zval_ptr_dtor_nogc(free_op1);
+                       HANDLE_EXCEPTION();
+               }
                if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -39013,7 +39093,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zval_ptr_dtor_nogc(free_op1);
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -39034,7 +39116,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zval_ptr_dtor_nogc(free_op1);
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -39317,7 +39401,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zval_ptr_dtor_nogc(free_op1);
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
@@ -39342,13 +39428,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zval_ptr_dtor_nogc(free_op1);
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+                       zval_ptr_dtor_nogc(free_op1);
+                       HANDLE_EXCEPTION();
+               }
                if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -39579,7 +39671,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zval_ptr_dtor_nogc(free_op1);
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -39600,7 +39694,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zval_ptr_dtor_nogc(free_op1);
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -39712,7 +39808,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zval_ptr_dtor_nogc(free_op1);
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
@@ -39737,13 +39835,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
                                /* check if static properties were destoyed */
                                if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                       zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, name->val);
+                                       zval_ptr_dtor_nogc(free_op1);
+                                       HANDLE_EXCEPTION();
                                }
 
                                goto fetch_var_return;
                        }
                }
                retval = zend_std_get_static_property(ce, name, 0);
+               if (UNEXPECTED(EG(exception))) {
+                       zval_ptr_dtor_nogc(free_op1);
+                       HANDLE_EXCEPTION();
+               }
                if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
                }
@@ -39974,7 +40078,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zval_ptr_dtor_nogc(free_op1);
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
@@ -39995,7 +40101,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
 
                                        /* check if static properties were destoyed */
                                        if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
-                                               zend_error_noreturn(E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zend_error(E_EXCEPTION | E_ERROR, "Access to undeclared static property: %s::$%s", ce->name->val, Z_STR_P(varname));
+                                               zval_ptr_dtor_nogc(free_op1);
+                                               HANDLE_EXCEPTION();
                                        }
 
                                        goto is_var_return;
index ec4a5fd4c42da74d8ced381f0514329e012d608b..a452b631f376b358b196c3a8b68afa5a87175964 100644 (file)
@@ -2595,7 +2595,18 @@ static int do_request(zval *this_ptr, xmlDoc *request, char *location, char *act
                        add_soap_fault(this_ptr, "Client", "SoapClient::__doRequest() failed", NULL, NULL);
                        ret = FALSE;
                } else if (Z_TYPE_P(response) != IS_STRING) {
-                       if ((fault = zend_hash_str_find(Z_OBJPROP_P(this_ptr), "__soap_fault", sizeof("__soap_fault")-1)) == NULL) {
+                       if (EG(exception) && instanceof_function(EG(exception)->ce, zend_get_engine_exception())) {
+                               zval rv;
+                               zend_string *msg;
+                               zval exception_object;
+
+                               ZVAL_OBJ(&exception_object, EG(exception));
+                               msg = zval_get_string(zend_read_property(zend_exception_get_base(), &exception_object, "message", sizeof("message")-1, 0, &rv));
+                               /* change class */
+                               EG(exception)->ce = soap_fault_class_entry;
+                               set_soap_fault(&exception_object, NULL, "Client", msg->val, NULL, NULL, NULL);
+                               zend_string_release(msg);
+                       } else if ((fault = zend_hash_str_find(Z_OBJPROP_P(this_ptr), "__soap_fault", sizeof("__soap_fault")-1)) == NULL) {
                                add_soap_fault(this_ptr, "Client", "SoapClient::__doRequest() returned non string value", NULL, NULL);
                        }
                        ret = FALSE;