diff options
-rw-r--r-- | Zend/zend_compile.c | 4 | ||||
-rw-r--r-- | Zend/zend_compile.h | 2 | ||||
-rw-r--r-- | Zend/zend_globals.h | 2 | ||||
-rw-r--r-- | Zend/zend_highlight.c | 1 | ||||
-rw-r--r-- | Zend/zend_language_parser.y | 2 | ||||
-rw-r--r-- | Zend/zend_language_scanner.l | 28 |
6 files changed, 35 insertions, 4 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a86a565ed0..77d469a676 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -976,6 +976,8 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n op_array.scope = CG(active_class_entry); op_array.ns = CG(active_namespace); + op_array.line_start = CG(zend_lineno); + if (is_method) { char *short_class_name = CG(active_class_entry)->name; int short_class_name_length = CG(active_class_entry)->name_length; @@ -1073,6 +1075,7 @@ void zend_do_end_function_declaration(znode *function_token TSRMLS_DC) zend_do_extended_info(TSRMLS_C); zend_do_return(NULL, 0 TSRMLS_CC); pass_two(CG(active_op_array) TSRMLS_CC); + CG(active_op_array)->line_end = CG(zend_lineno); CG(active_op_array) = function_token->u.op_array; /* Pop the switch and foreach seperators */ @@ -3210,6 +3213,7 @@ int zendlex(znode *zendlval TSRMLS_DC) retval = lex_scan(&zendlval->u.constant TSRMLS_CC); switch (retval) { case T_COMMENT: + case T_DOC_COMMENT: case T_OPEN_TAG: case T_WHITESPACE: retval = zendlex(zendlval TSRMLS_CC); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 20e2928151..39237d61b3 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -146,6 +146,8 @@ struct _zend_op_array { zend_bool uses_this; char *filename; + int line_start; + int line_end; void *reserved[ZEND_MAX_RESERVED_RESOURCES]; }; diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index ac335fc473..3ac7e6aaff 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -85,6 +85,8 @@ struct _zend_compiler_globals { int comment_start_line; char *heredoc; int heredoc_len; + char *doc_comment; + int doc_comment_len; zend_op_array *active_op_array; diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c index 004999d18d..5e3d657685 100644 --- a/Zend/zend_highlight.c +++ b/Zend/zend_highlight.c @@ -97,6 +97,7 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini next_color = syntax_highlighter_ini->highlight_html; break; case T_COMMENT: + case T_DOC_COMMENT: next_color = syntax_highlighter_ini->highlight_comment; break; case T_OPEN_TAG: diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index c5afb6866a..9a4946c4fc 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -130,7 +130,7 @@ %token T_LINE %token T_FILE %token T_COMMENT -%token T_ML_COMMENT +%token T_DOC_COMMENT %token T_OPEN_TAG %token T_OPEN_TAG_WITH_ECHO %token T_CLOSE_TAG diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 7d966fb996..e84874c004 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -41,6 +41,7 @@ %x ST_LOOKING_FOR_PROPERTY %x ST_LOOKING_FOR_VARNAME %x ST_COMMENT +%x ST_DOC_COMMENT %x ST_ONE_LINE_COMMENT %option stack @@ -134,6 +135,10 @@ void shutdown_scanner(TSRMLS_D) efree(CG(heredoc)); CG(heredoc_len)=0; } + if (CG(doc_comment)) { + efree(CG(doc_comment)); + CG(doc_comment_len) = 0; + } } END_EXTERN_C() @@ -1169,6 +1174,12 @@ NAMESPACE_NAME ({LABEL}":")+{LABEL} } } +<ST_IN_SCRIPTING>"/** "{NEWLINE} { + CG(comment_start_line) = CG(zend_lineno); + BEGIN(ST_DOC_COMMENT); + yymore(); +} + <ST_IN_SCRIPTING>"/*" { CG(comment_start_line) = CG(zend_lineno); BEGIN(ST_COMMENT); @@ -1176,17 +1187,28 @@ NAMESPACE_NAME ({LABEL}":")+{LABEL} } -<ST_COMMENT>[^*]+ { +<ST_COMMENT,ST_DOC_COMMENT>[^*]+ { yymore(); } +<ST_DOC_COMMENT>"*/" { + if (CG(doc_comment)) { + efree(CG(doc_comment)); + } + CG(doc_comment) = estrndup(yytext, yyleng); + CG(doc_comment_len) = yyleng; + HANDLE_NEWLINES(yytext, yyleng); + BEGIN(ST_IN_SCRIPTING); + return T_DOC_COMMENT; +} + <ST_COMMENT>"*/" { HANDLE_NEWLINES(yytext, yyleng); BEGIN(ST_IN_SCRIPTING); return T_COMMENT; } -<ST_COMMENT>"*" { +<ST_COMMENT,ST_DOC_COMMENT>"*" { yymore(); } @@ -1552,7 +1574,7 @@ NAMESPACE_NAME ({LABEL}":")+{LABEL} return 0; } -<ST_COMMENT><<EOF>> { +<ST_COMMENT,ST_DOC_COMMENT><<EOF>> { zend_error(E_COMPILE_WARNING,"Unterminated comment starting line %d", CG(comment_start_line)); return 0; } |