]> granicus.if.org Git - php/commitdiff
Fix implementing_class handling
authorNikita Popov <nikic@php.net>
Sun, 26 Apr 2015 14:03:58 +0000 (16:03 +0200)
committerNikita Popov <nikic@php.net>
Sun, 26 Apr 2015 14:03:58 +0000 (16:03 +0200)
Zend/tests/anon/010.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/anon/010.phpt b/Zend/tests/anon/010.phpt
new file mode 100644 (file)
index 0000000..917989a
--- /dev/null
@@ -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)
index eaf6978401e42fd66f7d7b75a263b5ad274120c8..4adc27d724ec39167d8b9770e8148eea4fd939cb 100644 (file)
@@ -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;
 }