diff options
author | Nikita Popov <nikic@php.net> | 2015-04-26 16:03:58 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-04-26 16:03:58 +0200 |
commit | 83618934441057bc3375adb22284688ca0559d6b (patch) | |
tree | 56c4749542d41ba797b19b580d212958815a957e | |
parent | f2f890a256d6605448db5bf4604da6f63fbd6fea (diff) | |
download | php-git-83618934441057bc3375adb22284688ca0559d6b.tar.gz |
Fix implementing_class handling
-rw-r--r-- | Zend/tests/anon/010.phpt | 23 | ||||
-rw-r--r-- | Zend/zend_compile.c | 7 |
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; } |