summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2015-04-26 16:03:58 +0200
committerNikita Popov <nikic@php.net>2015-04-26 16:03:58 +0200
commit83618934441057bc3375adb22284688ca0559d6b (patch)
tree56c4749542d41ba797b19b580d212958815a957e
parentf2f890a256d6605448db5bf4604da6f63fbd6fea (diff)
downloadphp-git-83618934441057bc3375adb22284688ca0559d6b.tar.gz
Fix implementing_class handling
-rw-r--r--Zend/tests/anon/010.phpt23
-rw-r--r--Zend/zend_compile.c7
2 files changed, 28 insertions, 2 deletions
diff --git a/Zend/tests/anon/010.phpt b/Zend/tests/anon/010.phpt
new file mode 100644
index 0000000000..917989a7e2
--- /dev/null
+++ b/Zend/tests/anon/010.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Trait binding after anon class
+--FILE--
+<?php
+
+trait T {
+ public function m1() { return 42; }
+}
+
+class C {
+ public function m2() {
+ return new class {};
+ }
+
+ use T;
+}
+
+$c = new C;
+var_dump($c->m1());
+
+?>
+--EXPECT--
+int(42)
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index eaf6978401..4adc27d724 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -4923,7 +4923,9 @@ zend_class_entry *zend_compile_class_decl(zend_ast *ast) /* {{{ */
zend_class_entry *ce = zend_arena_alloc(&CG(arena), sizeof(zend_class_entry));
zend_op *opline;
znode declare_node, extends_node;
- zend_class_entry *active = CG(active_class_entry);
+
+ zend_class_entry *original_ce = CG(active_class_entry);
+ znode original_implementing_class = FC(implementing_class);
if (decl->flags & ZEND_ACC_ANON_CLASS) {
decl->name = name = zend_generate_anon_class_name();
@@ -5088,7 +5090,8 @@ zend_class_entry *zend_compile_class_decl(zend_ast *ast) /* {{{ */
ce->ce_flags |= ZEND_ACC_IMPLEMENT_INTERFACES;
}
- CG(active_class_entry) = active;
+ FC(implementing_class) = original_implementing_class;
+ CG(active_class_entry) = original_ce;
return ce;
}