]> granicus.if.org Git - php/commitdiff
Use FETCH_CLASS_EXCEPTION for instanceof
authorNikita Popov <nikic@php.net>
Mon, 14 Dec 2015 16:50:20 +0000 (17:50 +0100)
committerNikita Popov <nikic@php.net>
Mon, 14 Dec 2015 16:50:20 +0000 (17:50 +0100)
This does not collide with NO_AUTOLOAD -- missing classes will be
silenced, but invalid use of self etc will result in an exception
instead of a fatal error.

Zend/tests/self_instanceof_outside_class.phpt [new file with mode: 0644]
Zend/zend_compile.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/self_instanceof_outside_class.phpt b/Zend/tests/self_instanceof_outside_class.phpt
new file mode 100644 (file)
index 0000000..4caef37
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+instanceof self outside a class
+--FILE--
+<?php
+
+$fn = function() {
+    try {
+        new stdClass instanceof self;
+    } catch (Error $e) {
+        echo $e->getMessage(), "\n";
+    }
+};
+$fn();
+
+?>
+--EXPECT--
+Cannot access self:: when no class scope is active
index ce9477f5886e116d861f3ca028b74fe7c3462daf..e8752788dba18837f84025a5cc5ae1853597b44d 100644 (file)
@@ -6545,7 +6545,8 @@ void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
                        "instanceof expects an object instance, constant given");
        }
 
-       zend_compile_class_ref_ex(&class_node, class_ast, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+       zend_compile_class_ref_ex(&class_node, class_ast,
+               ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION);
 
        opline = zend_emit_op_tmp(result, ZEND_INSTANCEOF, &obj_node, NULL);
 
index ce8554107f3737659967a9b0e31e62c9d7c40446..eccb65a3ae8277c8c86cebcd6fe393b360762397 100644 (file)
@@ -7173,6 +7173,7 @@ ZEND_VM_C_LABEL(try_instanceof):
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               FREE_OP1();
                                HANDLE_EXCEPTION();
                        }
                } else {
index 8c15ff93fe58d7be0a4be674356252da7f4c0f45..71438dd01d4e787d694db084639bc544a1a51092 100644 (file)
@@ -33206,6 +33206,7 @@ try_instanceof:
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -34096,6 +34097,7 @@ try_instanceof:
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -35496,6 +35498,7 @@ try_instanceof:
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -42855,6 +42858,7 @@ try_instanceof:
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               zval_ptr_dtor_nogc(free_op1);
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -43188,6 +43192,7 @@ try_instanceof:
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               zval_ptr_dtor_nogc(free_op1);
                                HANDLE_EXCEPTION();
                        }
                } else {
@@ -43764,6 +43769,7 @@ try_instanceof:
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
+                               zval_ptr_dtor_nogc(free_op1);
                                HANDLE_EXCEPTION();
                        }
                } else {