]> granicus.if.org Git - php/commitdiff
Fix for #70159 - Better magic constants substitution
authorJulien Pauli <jpauli@php.net>
Tue, 28 Jul 2015 13:27:58 +0000 (15:27 +0200)
committerJulien Pauli <jpauli@php.net>
Tue, 28 Jul 2015 14:30:08 +0000 (16:30 +0200)
NEWS
Zend/tests/nested_method_and_function.phpt
Zend/zend_compile.c

diff --git a/NEWS b/NEWS
index 3d41dd90868f7f23d16871e8c1da7e15bae81ce4..6802c7993934039add7f99a46460f96b9b2778e1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP                                                                        NEWS
 06 Aug 2015, PHP 7.0.0 Beta 3
 
 - Core:
+  . Fixed bug #70159 (__CLASS__ is lost in closures). (Julien)
   . Fixed bug #70156 (Segfault in zend_find_alias_name). (Laruence)
   . Fixed bug #70124 (null ptr deref / seg fault in ZEND_HANDLE_EXCEPTION).
     (Laruence)
index 46d55ddc52be50004ca9eee624e3014f8fa4de32..19f92ad260cecadb5207231ca57dfdd41be34a0f 100644 (file)
@@ -10,20 +10,30 @@ class Foo {
                function foo() {
                        var_dump(__FUNCTION__);
                        var_dump(__METHOD__);
+                       var_dump(__CLASS__);
                }
 
                foo();
                
                var_dump(__FUNCTION__);
                var_dump(__METHOD__);
+               var_dump(__CLASS__);
+               
+               return function() {var_dump(__FUNCTION__); var_dump(__METHOD__); var_dump(__CLASS__); };
        }
 }
 
-Foo::bar();
+$c = Foo::bar();
 
+$c();
 ?>
 --EXPECT--
 string(7) "Baz\foo"
 string(7) "Baz\foo"
+string(7) "Baz\Foo"
 string(3) "bar"
 string(12) "Baz\Foo::bar"
+string(7) "Baz\Foo"
+string(13) "Baz\{closure}"
+string(13) "Baz\{closure}"
+string(7) "Baz\Foo"
\ No newline at end of file
index b7be2e94596d2ece6554e9c3edc79282c6a436b7..a60a44638a9bc88c21372c2da5e67da8a01eeb63 100644 (file)
@@ -4797,7 +4797,6 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
        zend_bool is_method = decl->kind == ZEND_AST_METHOD;
 
        zend_op_array *orig_op_array = CG(active_op_array);
-       zend_class_entry *orig_ce = CG(active_class_entry);
        zend_op_array *op_array = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
        zend_oparray_context orig_oparray_context;
 
@@ -4823,10 +4822,6 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
 
        CG(active_op_array) = op_array;
 
-       if (!is_method) {
-               CG(active_class_entry) = NULL;
-       }
-
        zend_oparray_context_begin(&orig_oparray_context);
 
        if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO) {
@@ -4862,7 +4857,6 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
        /* Pop the loop variable stack separator */
        zend_stack_del_top(&CG(loop_var_stack));
 
-       CG(active_class_entry) = orig_ce;
        CG(active_op_array) = orig_op_array;
 }
 /* }}} */
@@ -5692,7 +5686,9 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
                        }
                        break;
                case T_METHOD_C:
-                       if (ce) {
+                       if ((op_array && !op_array->scope && op_array->function_name) || (op_array->fn_flags & ZEND_ACC_CLOSURE)) {
+                               ZVAL_STR_COPY(zv, op_array->function_name);
+                       } else if (ce) {
                                if (op_array && op_array->function_name) {
                                        ZVAL_NEW_STR(zv, zend_concat3(ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), "::", 2,
                                                ZSTR_VAL(op_array->function_name), ZSTR_LEN(op_array->function_name)));