Skip to content

Commit 56f1106

Browse files
committed
Use FETCH_CLASS_EXCEPTION for instanceof
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.
1 parent 7078627 commit 56f1106

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
instanceof self outside a class
3+
--FILE--
4+
<?php
5+
6+
$fn = function() {
7+
try {
8+
new stdClass instanceof self;
9+
} catch (Error $e) {
10+
echo $e->getMessage(), "\n";
11+
}
12+
};
13+
$fn();
14+
15+
?>
16+
--EXPECT--
17+
Cannot access self:: when no class scope is active

Zend/zend_compile.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6545,7 +6545,8 @@ void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
65456545
"instanceof expects an object instance, constant given");
65466546
}
65476547

6548-
zend_compile_class_ref_ex(&class_node, class_ast, ZEND_FETCH_CLASS_NO_AUTOLOAD);
6548+
zend_compile_class_ref_ex(&class_node, class_ast,
6549+
ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION);
65496550

65506551
opline = zend_emit_op_tmp(result, ZEND_INSTANCEOF, &obj_node, NULL);
65516552

Zend/zend_vm_def.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7173,6 +7173,7 @@ ZEND_VM_C_LABEL(try_instanceof):
71737173
ce = zend_fetch_class(NULL, opline->op2.num);
71747174
if (UNEXPECTED(ce == NULL)) {
71757175
ZEND_ASSERT(EG(exception));
7176+
FREE_OP1();
71767177
HANDLE_EXCEPTION();
71777178
}
71787179
} else {

Zend/zend_vm_execute.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33206,6 +33206,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_CONST_HANDL
3320633206
ce = zend_fetch_class(NULL, opline->op2.num);
3320733207
if (UNEXPECTED(ce == NULL)) {
3320833208
ZEND_ASSERT(EG(exception));
33209+
3320933210
HANDLE_EXCEPTION();
3321033211
}
3321133212
} else {
@@ -34096,6 +34097,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_VAR_HANDLER
3409634097
ce = zend_fetch_class(NULL, opline->op2.num);
3409734098
if (UNEXPECTED(ce == NULL)) {
3409834099
ZEND_ASSERT(EG(exception));
34100+
3409934101
HANDLE_EXCEPTION();
3410034102
}
3410134103
} else {
@@ -35496,6 +35498,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_UNUSED_HAND
3549635498
ce = zend_fetch_class(NULL, opline->op2.num);
3549735499
if (UNEXPECTED(ce == NULL)) {
3549835500
ZEND_ASSERT(EG(exception));
35501+
3549935502
HANDLE_EXCEPTION();
3550035503
}
3550135504
} else {
@@ -42855,6 +42858,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_CONST_H
4285542858
ce = zend_fetch_class(NULL, opline->op2.num);
4285642859
if (UNEXPECTED(ce == NULL)) {
4285742860
ZEND_ASSERT(EG(exception));
42861+
zval_ptr_dtor_nogc(free_op1);
4285842862
HANDLE_EXCEPTION();
4285942863
}
4286042864
} else {
@@ -43188,6 +43192,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HAN
4318843192
ce = zend_fetch_class(NULL, opline->op2.num);
4318943193
if (UNEXPECTED(ce == NULL)) {
4319043194
ZEND_ASSERT(EG(exception));
43195+
zval_ptr_dtor_nogc(free_op1);
4319143196
HANDLE_EXCEPTION();
4319243197
}
4319343198
} else {
@@ -43764,6 +43769,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED_
4376443769
ce = zend_fetch_class(NULL, opline->op2.num);
4376543770
if (UNEXPECTED(ce == NULL)) {
4376643771
ZEND_ASSERT(EG(exception));
43772+
zval_ptr_dtor_nogc(free_op1);
4376743773
HANDLE_EXCEPTION();
4376843774
}
4376943775
} else {

0 commit comments

Comments
 (0)