]> granicus.if.org Git - php/commitdiff
Handle function doc comments
authorNikita Popov <nikic@php.net>
Fri, 18 Jul 2014 13:23:16 +0000 (15:23 +0200)
committerNikita Popov <nikic@php.net>
Fri, 18 Jul 2014 13:23:16 +0000 (15:23 +0200)
Zend/zend_ast.c
Zend/zend_ast.h
Zend/zend_compile.c
Zend/zend_language_parser.y

index 4b87712e7c8562ae006cd46844fa60367023b908..891b36d9afe2d2ee9cb1ead850957726b2b55971 100644 (file)
@@ -47,7 +47,8 @@ ZEND_API zend_ast *zend_ast_create_zval_ex(zval *zv, zend_ast_attr attr)
 
 ZEND_API zend_ast *zend_ast_create_func_decl(
        zend_ast_kind kind, zend_bool returns_ref, zend_uint start_lineno, zend_uint end_lineno,
-       unsigned char *lex_pos, zend_string *name, zend_ast *params, zend_ast *uses, zend_ast *stmt
+       unsigned char *lex_pos, zend_string *doc_comment, zend_string *name,
+       zend_ast *params, zend_ast *uses, zend_ast *stmt
 ) {
        zend_ast_func_decl *ast = emalloc(sizeof(zend_ast_func_decl));
 
@@ -56,6 +57,7 @@ ZEND_API zend_ast *zend_ast_create_func_decl(
        ast->start_lineno = start_lineno;
        ast->end_lineno = end_lineno;
        ast->lex_pos = lex_pos;
+       ast->doc_comment = doc_comment;
        ast->name = name;
        ast->params = params;
        ast->uses = uses;
@@ -349,6 +351,9 @@ ZEND_API void zend_ast_destroy(zend_ast *ast)
                {
                        zend_ast_func_decl *fn = (zend_ast_func_decl *) ast;
                        STR_RELEASE(fn->name);
+                       if (fn->doc_comment) {
+                               STR_RELEASE(fn->doc_comment);
+                       }
                        zend_ast_destroy(fn->params);
                        zend_ast_destroy(fn->uses);
                        zend_ast_destroy(fn->stmt);
index 87cbe9c98e2dd8b3c572f12805d0f89e036fbccb..d3eca8117cb3dbcc3c0078322f0a3988ba050492 100644 (file)
@@ -129,6 +129,7 @@ typedef struct _zend_ast_func_decl {
        zend_uint start_lineno;
        zend_uint end_lineno;
        unsigned char *lex_pos;
+       zend_string *doc_comment;
        zend_string *name;
        zend_ast *params;
        zend_ast *uses;
@@ -148,7 +149,8 @@ ZEND_API zend_ast *zend_ast_create(
 
 ZEND_API zend_ast *zend_ast_create_func_decl(
        zend_ast_kind kind, zend_bool by_ref, zend_uint start_lineno, zend_uint end_lineno,
-       unsigned char *lex_pos, zend_string *name, zend_ast *params, zend_ast *uses, zend_ast *stmt
+       unsigned char *lex_pos, zend_string *doc_comment, zend_string *name,
+       zend_ast *params, zend_ast *uses, zend_ast *stmt
 );
 
 ZEND_API zend_ast *zend_ast_create_dynamic(zend_ast_kind kind);
index 9f5c4a6fee94b3f1f7551a1cd1b64699e1527acf..e6e641abf0e559949777271dcb8e301316f99895 100644 (file)
@@ -1047,7 +1047,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
 {
        zend_op_array op_array;
        zend_string *name = Z_STR(function_name->u.constant);
-       int function_begin_line = function_token->u.op.opline_num;
+       int function_begin_line = function_token->EA;
        zend_uint fn_flags;
        zend_string *lcname;
        zend_bool orig_interactive;
@@ -7025,6 +7025,9 @@ void zend_compile_func_decl(znode *result, zend_ast *ast TSRMLS_DC) {
 
        op_array->line_start = fn->start_lineno;
        op_array->line_end = fn->end_lineno;
+       if (fn->doc_comment) {
+               op_array->doc_comment = STR_COPY(fn->doc_comment);
+       }
        if (fn->returns_ref) {
                op_array->fn_flags |= ZEND_ACC_RETURN_REFERENCE;
        }
index f6471008cace86437b8fcd826dce19bd573206c5..68049e098f99a8fb36f521d5fedaddebb2b38b63 100644 (file)
@@ -390,7 +390,7 @@ unset_variable:
 function_declaration_statement:
        function is_reference T_STRING '(' parameter_list ')' '{' inner_statement_list '}'
                { $$.u.ast = zend_ast_create_func_decl(ZEND_AST_FUNC_DECL, $2.op_type,
-                     $1.u.op.opline_num, CG(zend_lineno), LANG_SCNG(yy_text),
+                     $1.EA, CG(zend_lineno), LANG_SCNG(yy_text), $1.u.op.ptr,
                          Z_STR($3.u.constant), $5.u.ast, NULL, $8.u.ast); }
 ;
 
@@ -629,7 +629,7 @@ class_statement:
                variable_modifiers { CG(access_type) = Z_LVAL($1.u.constant); } class_variable_declaration ';'
        |       class_constant_declaration ';'
        |       trait_use_statement
-       |       method_modifiers function is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$4, 1, $3.op_type, &$1 TSRMLS_CC); }
+       |       method_modifiers function2 is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$4, 1, $3.op_type, &$1 TSRMLS_CC); }
                '(' parameter_list ')' { zend_compile_params($7.u.ast TSRMLS_CC); zend_ast_destroy($7.u.ast); }
                method_body { zend_do_abstract_method(&$4, &$1, &$10 TSRMLS_CC); zend_do_end_function_declaration(&$2 TSRMLS_CC); }
 ;
@@ -872,16 +872,21 @@ expr_without_variable:
                        { $$.u.ast = zend_ast_create_binary(ZEND_YIELD, $4.u.ast, $2.u.ast); }
        |       function is_reference '(' parameter_list ')' lexical_vars '{' inner_statement_list '}'
                        { $$.u.ast = zend_ast_create_func_decl(ZEND_AST_CLOSURE, $2.op_type,
-                             $1.u.op.opline_num, CG(zend_lineno), LANG_SCNG(yy_text),
+                             $1.EA, CG(zend_lineno), LANG_SCNG(yy_text), $1.u.op.ptr,
                                  STR_INIT("{closure}", sizeof("{closure}") - 1, 0),
                                  $4.u.ast, $6.u.ast, $8.u.ast); }
-       |       T_STATIC function is_reference { zend_do_begin_lambda_function_declaration(&$$, &$2, $3.op_type, 1 TSRMLS_CC); }
+       |       T_STATIC function2 is_reference { zend_do_begin_lambda_function_declaration(&$$, &$2, $3.op_type, 1 TSRMLS_CC); }
                '(' parameter_list ')' { zend_compile_params($6.u.ast TSRMLS_CC); zend_ast_destroy($6.u.ast); } lexical_vars { zend_compile_closure_uses($9.u.ast TSRMLS_CC); if ($9.u.ast) zend_ast_destroy($9.u.ast); }
                '{' inner_statement_list '}' { AS($12); zend_do_end_function_declaration(&$2 TSRMLS_CC); $$.u.ast = AST_ZNODE(&$4); }
 ;
 
 function:
-       T_FUNCTION { $$.u.op.opline_num = CG(zend_lineno); }
+       T_FUNCTION
+               { $$.EA = CG(zend_lineno); $$.u.op.ptr = CG(doc_comment); CG(doc_comment) = NULL; }
+;
+
+function2:
+       T_FUNCTION { $$.EA = CG(zend_lineno); }
 ;
 
 lexical_vars: