Hi,

Attached are the patches that allow the "use" statement that was introduced with closures to appear within every function statement except method definitions. I think this feature is a good addition because it resolves inconsistency between closures and unticked functions. In a nutshell,

<?php
function foo() use (&$some_globals) {
    echo $some_globals;
}
?>

is equivalent to

<?php
function foo() {
    global $some_globals;
    echo $some_globals;
}
?>

While,

<?php
function bar() {
    $some_local_var = '';
    function fubar() use (&$some_local_var) {
        echo $some_local_var;
    }
}
?>

and

<?php
function bar() {
    function fubar() {
        global $some_local_var;
        echo $some_local_var;
    }
}
?>

are of course not the same.
? .gdb_history
Index: Zend/zend_closures.c
===================================================================
RCS file: /repository/ZendEngine2/zend_closures.c,v
retrieving revision 1.4
diff -u -r1.4 zend_closures.c
--- Zend/zend_closures.c        14 Jul 2008 12:17:16 -0000      1.4
+++ Zend/zend_closures.c        17 Jul 2008 23:16:29 -0000
@@ -213,44 +213,6 @@
 }
 /* }}} */
 
-static int zval_copy_static_var(zval **p, int num_args, va_list args, 
zend_hash_key *key) /* {{{ */
-{
-       HashTable *target = va_arg(args, HashTable*);
-       zend_bool is_ref;
-       TSRMLS_FETCH();
-       
-       if (Z_TYPE_PP(p) & (IS_LEXICAL_VAR|IS_LEXICAL_REF)) {
-               is_ref = Z_TYPE_PP(p) & IS_LEXICAL_REF;
-
-               if (!EG(active_symbol_table)) {
-                       zend_rebuild_symbol_table(TSRMLS_C);
-               }
-               if (zend_u_hash_quick_find(EG(active_symbol_table), key->type, 
key->arKey, key->nKeyLength, key->h, (void **) &p) == FAILURE) {
-                       if (is_ref) {
-                               zval *tmp;
-
-                               ALLOC_INIT_ZVAL(tmp);
-                               Z_SET_ISREF_P(tmp);
-                               zend_u_hash_quick_add(EG(active_symbol_table), 
key->type, key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), 
(void**)&p);
-                       } else {
-                               p = &EG(uninitialized_zval_ptr);
-                               zend_error(E_NOTICE,"Undefined variable: %s", 
key->arKey);
-                       }
-               } else {
-                       if (is_ref) {
-                               SEPARATE_ZVAL_TO_MAKE_IS_REF(p);
-                       } else if (Z_ISREF_PP(p)) {
-                               SEPARATE_ZVAL(p);
-                       }
-               }
-       }
-       if (zend_u_hash_quick_add(target, key->type, key->arKey, 
key->nKeyLength, key->h, p, sizeof(zval*), NULL) == SUCCESS) {
-               Z_ADDREF_PP(p);
-       }
-       return ZEND_HASH_APPLY_KEEP;
-}
-/* }}} */
-
 ZEND_API void zend_create_closure(zval *res, zend_function *func, 
zend_class_entry *scope, zval *this_ptr TSRMLS_DC) /* {{{ */
 {
        zend_closure *closure;
@@ -263,11 +225,8 @@
 
        if (closure->func.type == ZEND_USER_FUNCTION) {
                if (closure->func.op_array.static_variables) {
-                       HashTable *static_variables = 
closure->func.op_array.static_variables;
-       
-                       
ALLOC_HASHTABLE(closure->func.op_array.static_variables);
-                       
zend_u_hash_init(closure->func.op_array.static_variables, 
zend_hash_num_elements(static_variables), NULL, ZVAL_PTR_DTOR, 0, UG(unicode));
-                       zend_hash_apply_with_arguments(static_variables, 
(apply_func_args_t)zval_copy_static_var, 1, 
closure->func.op_array.static_variables);
+                       zend_do_bind_static_variables(&closure->func.op_array 
TSRMLS_CC);
+                       func->op_array.static_variables = NULL;
                }
                (*closure->func.op_array.refcount)++;
        }
Index: Zend/zend_compile.c
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.c,v
retrieving revision 1.829
diff -u -r1.829 zend_compile.c
--- Zend/zend_compile.c 14 Jul 2008 12:17:16 -0000      1.829
+++ Zend/zend_compile.c 17 Jul 2008 23:16:30 -0000
@@ -1511,7 +1511,7 @@
 }
 /* }}} */
 
-void zend_do_end_function_declaration(znode *function_token TSRMLS_DC) /* {{{ 
*/
+void zend_do_end_function_declaration(znode *function_token, zend_bool 
is_closure TSRMLS_DC) /* {{{ */
 {
        unsigned int lcname_len;
        zstr lcname;
@@ -1554,6 +1554,9 @@
        }
 
        CG(active_op_array)->line_end = zend_get_compiled_lineno(TSRMLS_C);
+       if (is_closure) {
+               CG(active_op_array)->fn_flags |= ZEND_ACC_CLOSURE;
+       }
        CG(active_op_array) = function_token->u.op_array;
 
 
@@ -1679,7 +1682,8 @@
        lcname = zend_u_str_case_fold(Z_TYPE(function_name->u.constant), 
Z_UNIVAL(function_name->u.constant), Z_UNILEN(function_name->u.constant), 0, 
&lcname_len);
        if ((zend_u_hash_find(CG(function_table), 
Z_TYPE(function_name->u.constant), lcname, lcname_len+1, (void **) 
&function)==FAILURE) ||
            ((CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS) &&
-            (function->type == ZEND_INTERNAL_FUNCTION))) {
+                (function->type == ZEND_INTERNAL_FUNCTION)) ||
+               (function->common.fn_flags & ZEND_ACC_CLOSURE)) {
                zend_do_begin_dynamic_function_call(function_name, prefix_len 
TSRMLS_CC);
                efree(lcname.v);
                return 1; /* Dynamic */
@@ -2988,6 +2992,53 @@
 }
 /* }}} */
 
+
+static int zval_copy_static_var(zval **p, int num_args, va_list args, 
zend_hash_key *key) /* {{{  */
+{
+       TSRMLS_FETCH_FROM_CTX(va_arg(args, void*));
+       zend_bool is_ref;
+
+       if (Z_TYPE_PP(p) & (IS_LEXICAL_VAR|IS_LEXICAL_REF)) {
+               zval **src;
+               TSRMLS_FETCH();
+               is_ref = Z_TYPE_PP(p) & IS_LEXICAL_REF;
+
+               if (!EG(active_symbol_table)) {
+                       zend_rebuild_symbol_table(TSRMLS_C);
+               }
+               if (zend_u_hash_quick_find(EG(active_symbol_table), key->type, 
key->arKey, key->nKeyLength, key->h, (void **) &src) == FAILURE) {
+                       if (is_ref) {
+                               zval *tmp;
+
+                               ALLOC_INIT_ZVAL(tmp);
+                               Z_SET_ISREF_P(tmp);
+                               zend_u_hash_quick_add(EG(active_symbol_table), 
key->type, key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), 
(void**)&src);
+                       } else {
+                               src = &EG(uninitialized_zval_ptr);
+                               zend_error(E_NOTICE,"Undefined variable: %s", 
key->arKey);
+                       }
+               } else {
+                       if (is_ref) {
+                               SEPARATE_ZVAL_TO_MAKE_IS_REF(src);
+                       } else if (Z_ISREF_PP(p)) {
+                               SEPARATE_ZVAL(src);
+                       }
+               }
+               Z_ADDREF_PP(src);
+               zval_ptr_dtor(p);
+               *p = *src;
+       }
+       return ZEND_HASH_APPLY_KEEP;
+}
+/* }}} */
+
+
+ZEND_API void zend_do_bind_static_variables(zend_op_array *op_array TSRMLS_DC)
+{
+       zend_hash_apply_with_arguments(op_array->static_variables, 
(apply_func_args_t)zval_copy_static_var, 1 TSRMLS_CC);
+}
+
+
 ZEND_API int do_bind_function(zend_op *opline, HashTable *function_table, 
zend_bool compile_time) /* {{{ */
 {
        zend_function *function;
@@ -2997,6 +3048,12 @@
        }
 
        zend_u_hash_find(function_table, Z_TYPE(opline->op1.u.constant), 
Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (void *) 
&function);
+
+       /* closures cannot be bound beforehand */
+       if ((function->common.fn_flags & ZEND_ACC_CLOSURE) && compile_time) {
+               return FAILURE;
+       }
+
        if (zend_u_hash_add(function_table, Z_TYPE(opline->op2.u.constant), 
Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant)+1, function, 
sizeof(zend_function), NULL)==FAILURE) {
                int error_level = compile_time ? E_COMPILE_ERROR : E_ERROR;
                zend_function *function;
@@ -3018,6 +3075,11 @@
                return FAILURE;
        } else {
                (*function->op_array.refcount)++;
+               if ((function->common.fn_flags & ZEND_ACC_CLOSURE) &&
+                   function->op_array.static_variables) {
+                       TSRMLS_FETCH();
+                       zend_do_bind_static_variables(&function->op_array 
TSRMLS_CC);
+               }
                function->op_array.static_variables = NULL; /* NULL out the 
unbound function */
                return SUCCESS;
        }
Index: Zend/zend_compile.h
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.h,v
retrieving revision 1.383
diff -u -r1.383 zend_compile.h
--- Zend/zend_compile.h 8 Jul 2008 07:05:03 -0000       1.383
+++ Zend/zend_compile.h 17 Jul 2008 23:16:30 -0000
@@ -241,6 +241,9 @@
 #define ZEND_RETURN_VALUE                              0
 #define ZEND_RETURN_REFERENCE                  1
 
+#define ZEND_NO_LEXICAL_VARS            0
+#define ZEND_LEXICAL_VARS               1
+
 typedef struct _zend_internal_function {
        /* Common elements */
        zend_uchar type;
@@ -426,7 +429,7 @@
 
 int zend_do_verify_access_types(znode *current_access_type, znode 
*new_modifier);
 void zend_do_begin_function_declaration(znode *function_token, znode 
*function_name, int is_method, int return_reference, znode *fn_flags_znode 
TSRMLS_DC);
-void zend_do_end_function_declaration(znode *function_token TSRMLS_DC);
+void zend_do_end_function_declaration(znode *function_token, zend_bool 
is_closure TSRMLS_DC);
 void zend_do_receive_arg(zend_uchar op, znode *var, znode *offset, znode 
*initialization, znode *class_type, znode *varname, zend_bool pass_by_reference 
TSRMLS_DC);
 int zend_do_begin_function_call(znode *function_name, zend_bool 
check_namespace TSRMLS_DC);
 void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC);
@@ -452,6 +455,7 @@
 ZEND_API zend_class_entry *do_bind_inherited_class(zend_op *opline, HashTable 
*class_table, zend_class_entry *parent_ce, zend_bool compile_time TSRMLS_DC);
 ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, 
zend_class_entry *iface TSRMLS_DC);
 ZEND_API void zend_do_implement_interface(zend_class_entry *ce, 
zend_class_entry *iface TSRMLS_DC);
+ZEND_API void zend_do_bind_static_variables(zend_op_array *op_array TSRMLS_DC);
 void zend_do_implements_interface(znode *interface_znode TSRMLS_DC);
 
 ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry 
*parent_ce TSRMLS_DC);
Index: Zend/zend_language_parser.y
===================================================================
RCS file: /repository/ZendEngine2/zend_language_parser.y,v
retrieving revision 1.207
diff -u -r1.207 zend_language_parser.y
--- Zend/zend_language_parser.y 8 Jul 2008 07:05:03 -0000       1.207
+++ Zend/zend_language_parser.y 17 Jul 2008 23:16:30 -0000
@@ -305,7 +305,7 @@
 
 unticked_function_declaration_statement:
                function is_reference T_STRING { 
zend_do_begin_function_declaration(&$1, &$3, 0, $2.op_type, NULL TSRMLS_CC); }
-                       '(' parameter_list ')' '{' inner_statement_list '}' { 
zend_do_end_function_declaration(&$1 TSRMLS_CC); }
+                       '(' parameter_list ')' lexical_vars '{' 
inner_statement_list '}' { zend_do_end_function_declaration(&$1, $7.op_type 
TSRMLS_CC); }
 ;
 
 unticked_class_declaration_statement:
@@ -513,7 +513,7 @@
                variable_modifiers { CG(access_type) = Z_LVAL($1.u.constant); } 
class_variable_declaration ';'
        |       class_constant_declaration ';'
        |       method_modifiers function is_reference T_STRING { 
zend_do_begin_function_declaration(&$2, &$4, 1, $3.op_type, &$1 TSRMLS_CC); } 
'('
-                       parameter_list ')' method_body { 
zend_do_abstract_method(&$4, &$1, &$9 TSRMLS_CC); 
zend_do_end_function_declaration(&$2 TSRMLS_CC); }
+                       parameter_list ')' method_body { 
zend_do_abstract_method(&$4, &$1, &$9 TSRMLS_CC); 
zend_do_end_function_declaration(&$2, 0 TSRMLS_CC); }
 ;
 
 
@@ -648,9 +648,9 @@
        |       '`' { CG(literal_type) = UG(unicode)?IS_UNICODE:IS_STRING; } 
encaps_list '`' { zend_do_shell_exec(&$$, &$3 TSRMLS_CC); }
        |       T_PRINT expr  { zend_do_print(&$$, &$2 TSRMLS_CC); }
        |       function is_reference '(' { 
zend_do_begin_lambda_function_declaration(&$$, &$1, $2.op_type, 0 TSRMLS_CC); }
-                       parameter_list ')' lexical_vars '{' 
inner_statement_list '}' {  zend_do_end_function_declaration(&$1 TSRMLS_CC); $$ 
= $4; }
+                       parameter_list ')' lexical_vars '{' 
inner_statement_list '}' {  zend_do_end_function_declaration(&$1, 1 TSRMLS_CC); 
$$ = $4; }
        |       T_STATIC function is_reference '(' { 
zend_do_begin_lambda_function_declaration(&$$, &$2, $3.op_type, 1 TSRMLS_CC); }
-                       parameter_list ')' lexical_vars '{' 
inner_statement_list '}' {  zend_do_end_function_declaration(&$2 TSRMLS_CC); $$ 
= $5; }
+                       parameter_list ')' lexical_vars '{' 
inner_statement_list '}' {  zend_do_end_function_declaration(&$2, 1 TSRMLS_CC); 
$$ = $5; }
 ;
 
 function:
@@ -658,8 +658,8 @@
 ;
 
 lexical_vars:
-               /* emptry */
-       |       T_USE '(' lexical_var_list ')'
+               /* emptry */ { $$.op_type = ZEND_NO_LEXICAL_VARS; }
+       |       T_USE '(' lexical_var_list ')' { $$.op_type = 
ZEND_LEXICAL_VARS; }
 ;
 
 lexical_var_list:
diff -r 28a314562273 Zend/zend_closures.c
--- a/Zend/zend_closures.c      Fri Jul 18 07:16:51 2008 +0900
+++ b/Zend/zend_closures.c      Fri Jul 18 08:01:06 2008 +0900
@@ -201,44 +201,6 @@ void zend_register_closure_ce(TSRMLS_D) 
 }
 /* }}} */
 
-static int zval_copy_static_var(zval **p, int num_args, va_list args, 
zend_hash_key *key) /* {{{ */
-{
-       HashTable *target = va_arg(args, HashTable*);
-       zend_bool is_ref;
-
-       if (Z_TYPE_PP(p) & (IS_LEXICAL_VAR|IS_LEXICAL_REF)) {
-               TSRMLS_FETCH();
-               is_ref = Z_TYPE_PP(p) & IS_LEXICAL_REF;
-
-               if (!EG(active_symbol_table)) {
-                       zend_rebuild_symbol_table(TSRMLS_C);
-               }
-               if (zend_hash_quick_find(EG(active_symbol_table), key->arKey, 
key->nKeyLength, key->h, (void **) &p) == FAILURE) {
-                       if (is_ref) {
-                               zval *tmp;
-
-                               ALLOC_INIT_ZVAL(tmp);
-                               Z_SET_ISREF_P(tmp);
-                               zend_hash_quick_add(EG(active_symbol_table), 
key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), (void**)&p);
-                       } else {
-                               p = &EG(uninitialized_zval_ptr);
-                               zend_error(E_NOTICE,"Undefined variable: %s", 
key->arKey);
-                       }
-               } else {
-                       if (is_ref) {
-                               SEPARATE_ZVAL_TO_MAKE_IS_REF(p);
-                       } else if (Z_ISREF_PP(p)) {
-                               SEPARATE_ZVAL(p);
-                       }
-               }
-       }
-       if (zend_hash_quick_add(target, key->arKey, key->nKeyLength, key->h, p, 
sizeof(zval*), NULL) == SUCCESS) {
-               Z_ADDREF_PP(p);
-       }
-       return ZEND_HASH_APPLY_KEEP;
-}
-/* }}} */
-
 ZEND_API void zend_create_closure(zval *res, zend_function *func, 
zend_class_entry *scope, zval *this_ptr TSRMLS_DC) /* {{{ */
 {
        zend_closure *closure;
@@ -251,11 +213,8 @@ ZEND_API void zend_create_closure(zval *
 
        if (closure->func.type == ZEND_USER_FUNCTION) {
                if (closure->func.op_array.static_variables) {
-                       HashTable *static_variables = 
closure->func.op_array.static_variables;
-       
-                       
ALLOC_HASHTABLE(closure->func.op_array.static_variables);
-                       zend_hash_init(closure->func.op_array.static_variables, 
zend_hash_num_elements(static_variables), NULL, ZVAL_PTR_DTOR, 0);
-                       zend_hash_apply_with_arguments(static_variables, 
(apply_func_args_t)zval_copy_static_var, 1, 
closure->func.op_array.static_variables);
+                       zend_do_bind_static_variables(&closure->func.op_array 
TSRMLS_CC);
+                       func->op_array.static_variables = NULL;
                }
                (*closure->func.op_array.refcount)++;
        }
diff -r 28a314562273 Zend/zend_compile.c
--- a/Zend/zend_compile.c       Fri Jul 18 07:16:51 2008 +0900
+++ b/Zend/zend_compile.c       Fri Jul 18 08:01:06 2008 +0900
@@ -1438,7 +1438,7 @@ void zend_do_handle_exception(TSRMLS_D)
 }
 
 
-void zend_do_end_function_declaration(znode *function_token TSRMLS_DC)
+void zend_do_end_function_declaration(znode *function_token, zend_bool 
is_closure TSRMLS_DC)
 {
        char lcname[16];
        int name_len;
@@ -1463,6 +1463,9 @@ void zend_do_end_function_declaration(zn
        }
 
        CG(active_op_array)->line_end = zend_get_compiled_lineno(TSRMLS_C);
+       if (is_closure) {
+               CG(active_op_array)->fn_flags |= ZEND_ACC_CLOSURE;
+       }
        CG(active_op_array) = function_token->u.op_array;
 
 
@@ -1577,7 +1580,8 @@ int zend_do_begin_function_call(znode *f
        lcname = zend_str_tolower_dup(function_name->u.constant.value.str.val, 
function_name->u.constant.value.str.len);
        if ((zend_hash_find(CG(function_table), lcname, 
function_name->u.constant.value.str.len+1, (void **) &function)==FAILURE) ||
                ((CG(compiler_options) & 
ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS) &&
-                (function->type == ZEND_INTERNAL_FUNCTION))) {
+                (function->type == ZEND_INTERNAL_FUNCTION)) ||
+               (function->common.fn_flags & ZEND_ACC_CLOSURE)) {
                zend_do_begin_dynamic_function_call(function_name, prefix_len 
TSRMLS_CC);
                efree(lcname);
                return 1; /* Dynamic */
@@ -2880,6 +2884,52 @@ ZEND_API void zend_do_implement_interfac
 }
 
 
+static int zval_copy_static_var(zval **p, int num_args, va_list args, 
zend_hash_key *key) /* {{{  */
+{
+       TSRMLS_FETCH_FROM_CTX(va_arg(args, void*));
+       zend_bool is_ref;
+
+       if (Z_TYPE_PP(p) & (IS_LEXICAL_VAR|IS_LEXICAL_REF)) {
+               zval **src;
+               TSRMLS_FETCH();
+               is_ref = Z_TYPE_PP(p) & IS_LEXICAL_REF;
+
+               if (!EG(active_symbol_table)) {
+                       zend_rebuild_symbol_table(TSRMLS_C);
+               }
+               if (zend_hash_quick_find(EG(active_symbol_table), key->arKey, 
key->nKeyLength, key->h, (void **) &src) == FAILURE) {
+                       if (is_ref) {
+                               zval *tmp;
+
+                               ALLOC_INIT_ZVAL(tmp);
+                               Z_SET_ISREF_P(tmp);
+                               zend_hash_quick_add(EG(active_symbol_table), 
key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), (void**)&src);
+                       } else {
+                               src = &EG(uninitialized_zval_ptr);
+                               zend_error(E_NOTICE,"Undefined variable: %s", 
key->arKey);
+                       }
+               } else {
+                       if (is_ref) {
+                               SEPARATE_ZVAL_TO_MAKE_IS_REF(src);
+                       } else if (Z_ISREF_PP(p)) {
+                               SEPARATE_ZVAL(src);
+                       }
+               }
+               Z_ADDREF_PP(src);
+               zval_ptr_dtor(p);
+               *p = *src;
+       }
+       return ZEND_HASH_APPLY_KEEP;
+}
+/* }}} */
+
+
+ZEND_API void zend_do_bind_static_variables(zend_op_array *op_array TSRMLS_DC)
+{
+       zend_hash_apply_with_arguments(op_array->static_variables, 
(apply_func_args_t)zval_copy_static_var, 1 TSRMLS_CC);
+}
+
+
 ZEND_API int do_bind_function(zend_op *opline, HashTable *function_table, 
zend_bool compile_time)
 {
        zend_function *function;
@@ -2889,6 +2939,12 @@ ZEND_API int do_bind_function(zend_op *o
        }
 
        zend_hash_find(function_table, opline->op1.u.constant.value.str.val, 
opline->op1.u.constant.value.str.len, (void *) &function);
+
+       /* closures cannot be bound beforehand */
+       if ((function->common.fn_flags & ZEND_ACC_CLOSURE) && compile_time) {
+               return FAILURE;
+       }
+
        if (zend_hash_add(function_table, opline->op2.u.constant.value.str.val, 
opline->op2.u.constant.value.str.len+1, function, sizeof(zend_function), 
NULL)==FAILURE) {
                int error_level = compile_time ? E_COMPILE_ERROR : E_ERROR;
                zend_function *function;
@@ -2906,6 +2962,11 @@ ZEND_API int do_bind_function(zend_op *o
                return FAILURE;
        } else {
                (*function->op_array.refcount)++;
+               if ((function->common.fn_flags & ZEND_ACC_CLOSURE) &&
+                   function->op_array.static_variables) {
+                       TSRMLS_FETCH();
+                       zend_do_bind_static_variables(&function->op_array 
TSRMLS_CC);
+               }
                function->op_array.static_variables = NULL; /* NULL out the 
unbound function */
                return SUCCESS;
        }
diff -r 28a314562273 Zend/zend_compile.h
--- a/Zend/zend_compile.h       Fri Jul 18 07:16:51 2008 +0900
+++ b/Zend/zend_compile.h       Fri Jul 18 08:01:06 2008 +0900
@@ -241,6 +241,9 @@ struct _zend_op_array {
 #define ZEND_RETURN_VALUE                              0
 #define ZEND_RETURN_REFERENCE                  1
 
+#define ZEND_NO_LEXICAL_VARS            0
+#define ZEND_LEXICAL_VARS               1
+
 typedef struct _zend_internal_function {
        /* Common elements */
        zend_uchar type;
@@ -418,7 +421,7 @@ void zend_do_add_variable(znode *result,
 
 int zend_do_verify_access_types(znode *current_access_type, znode 
*new_modifier);
 void zend_do_begin_function_declaration(znode *function_token, znode 
*function_name, int is_method, int return_reference, znode *fn_flags_znode 
TSRMLS_DC);
-void zend_do_end_function_declaration(znode *function_token TSRMLS_DC);
+void zend_do_end_function_declaration(znode *function_token, zend_bool 
is_closure TSRMLS_DC);
 void zend_do_receive_arg(zend_uchar op, znode *var, znode *offset, znode 
*initialization, znode *class_type, znode *varname, zend_bool pass_by_reference 
TSRMLS_DC);
 int zend_do_begin_function_call(znode *function_name, zend_bool 
check_namespace TSRMLS_DC);
 void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC);
@@ -444,6 +447,7 @@ ZEND_API zend_class_entry *do_bind_inher
 ZEND_API zend_class_entry *do_bind_inherited_class(zend_op *opline, HashTable 
*class_table, zend_class_entry *parent_ce, zend_bool compile_time TSRMLS_DC);
 ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, 
zend_class_entry *iface TSRMLS_DC);
 ZEND_API void zend_do_implement_interface(zend_class_entry *ce, 
zend_class_entry *iface TSRMLS_DC);
+ZEND_API void zend_do_bind_static_variables(zend_op_array *op_array TSRMLS_DC);
 void zend_do_implements_interface(znode *interface_znode TSRMLS_DC);
 
 ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry 
*parent_ce TSRMLS_DC);
diff -r 28a314562273 Zend/zend_language_parser.y
--- a/Zend/zend_language_parser.y       Fri Jul 18 07:16:51 2008 +0900
+++ b/Zend/zend_language_parser.y       Fri Jul 18 08:01:06 2008 +0900
@@ -303,7 +303,7 @@ is_reference:
 
 unticked_function_declaration_statement:
                function is_reference T_STRING { 
zend_do_begin_function_declaration(&$1, &$3, 0, $2.op_type, NULL TSRMLS_CC); }
-                       '(' parameter_list ')' '{' inner_statement_list '}' { 
zend_do_end_function_declaration(&$1 TSRMLS_CC); }
+                       '(' parameter_list ')' lexical_vars '{' 
inner_statement_list '}' { zend_do_end_function_declaration(&$1, $7.op_type 
TSRMLS_CC); }
 ;
 
 unticked_class_declaration_statement:
@@ -511,7 +511,7 @@ class_statement:
                variable_modifiers { CG(access_type) = Z_LVAL($1.u.constant); } 
class_variable_declaration ';'
        |       class_constant_declaration ';'
        |       method_modifiers function is_reference T_STRING { 
zend_do_begin_function_declaration(&$2, &$4, 1, $3.op_type, &$1 TSRMLS_CC); } 
'('
-                       parameter_list ')' method_body { 
zend_do_abstract_method(&$4, &$1, &$9 TSRMLS_CC); 
zend_do_end_function_declaration(&$2 TSRMLS_CC); }
+                       parameter_list ')' method_body { 
zend_do_abstract_method(&$4, &$1, &$9 TSRMLS_CC); 
zend_do_end_function_declaration(&$2, 0 TSRMLS_CC); }
 ;
 
 
@@ -644,9 +644,9 @@ expr_without_variable:
        |       '`' encaps_list '`' { zend_do_shell_exec(&$$, &$2 TSRMLS_CC); }
        |       T_PRINT expr  { zend_do_print(&$$, &$2 TSRMLS_CC); }
        |       function is_reference '(' { 
zend_do_begin_lambda_function_declaration(&$$, &$1, $2.op_type, 0 TSRMLS_CC); }
-                       parameter_list ')' lexical_vars '{' 
inner_statement_list '}' {  zend_do_end_function_declaration(&$1 TSRMLS_CC); $$ 
= $4; }
+                       parameter_list ')' lexical_vars '{' 
inner_statement_list '}' {  zend_do_end_function_declaration(&$1, 1 TSRMLS_CC); 
$$ = $4; }
        |       T_STATIC function is_reference '(' { 
zend_do_begin_lambda_function_declaration(&$$, &$2, $3.op_type, 1 TSRMLS_CC); }
-                       parameter_list ')' lexical_vars '{' 
inner_statement_list '}' {  zend_do_end_function_declaration(&$2 TSRMLS_CC); $$ 
= $5; }
+                       parameter_list ')' lexical_vars '{' 
inner_statement_list '}' {  zend_do_end_function_declaration(&$2, 1 TSRMLS_CC); 
$$ = $5; }
 ;
 
 function:
@@ -654,8 +654,8 @@ function:
 ;
 
 lexical_vars:
-               /* emptry */
-       |       T_USE '(' lexical_var_list ')'
+               /* emptry */ { $$.op_type = ZEND_NO_LEXICAL_VARS; }
+       |       T_USE '(' lexical_var_list ')' { $$.op_type = 
ZEND_LEXICAL_VARS; }
 ;
 
 lexical_var_list:
diff -r 28a314562273 ext/phar/phar.phar
Binary file ext/phar/phar.phar has changed

Moriyoshi


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to