summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_compile.c4
-rw-r--r--Zend/zend_compile.h2
-rw-r--r--Zend/zend_globals.h2
-rw-r--r--Zend/zend_highlight.c1
-rw-r--r--Zend/zend_language_parser.y2
-rw-r--r--Zend/zend_language_scanner.l28
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;
}