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)
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
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;
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) {
/* 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;
}
/* }}} */
}
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)));