From: Andrei Zmievski Date: Wed, 2 Apr 2003 16:51:49 +0000 (+0000) Subject: Implement a different way to catch documentation comments. X-Git-Tag: RELEASE_0_5~199 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bdd3b6042c538a58fbb629a832e19cabb4b507a7;p=php Implement a different way to catch documentation comments. --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 4f19fab0e0..71dc97ba86 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1068,6 +1068,12 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n } function_token->throw_list = CG(throw_list); CG(throw_list) = NULL; + + if (CG(doc_comment)) { + CG(active_op_array)->doc_comment = estrndup(CG(doc_comment), CG(doc_comment_len)); + CG(active_op_array)->doc_comment_len = CG(doc_comment_len); + RESET_DOC_COMMENT(); + } } @@ -1077,12 +1083,6 @@ void zend_do_end_function_declaration(znode *function_token TSRMLS_DC) zend_do_return(NULL, 0 TSRMLS_CC); pass_two(CG(active_op_array) TSRMLS_CC); CG(active_op_array)->line_end = zend_get_compiled_lineno(TSRMLS_C); -#if 0 - if (doc_comment && doc_comment->op_type != IS_UNUSED) { - CG(active_op_array)->doc_comment = doc_comment->u.constant.value.str.val; - CG(active_op_array)->doc_comment_len = doc_comment->u.constant.value.str.len; - } -#endif CG(active_op_array) = function_token->u.op_array; /* Pop the switch and foreach seperators */ @@ -2241,6 +2241,12 @@ void zend_do_begin_class_declaration(znode *class_token, znode *class_name, znod opline->result.u.var = get_temporary_variable(CG(active_op_array)); opline->result.op_type = IS_CONST; CG(implementing_class) = opline->result; + + if (CG(doc_comment)) { + CG(active_class_entry)->doc_comment = estrndup(CG(doc_comment), CG(doc_comment_len)); + CG(active_class_entry)->doc_comment_len = CG(doc_comment_len); + RESET_DOC_COMMENT(); + } } @@ -2259,13 +2265,6 @@ void zend_do_end_class_declaration(znode *class_token, znode *parent_token TSRML CG(active_class_entry)->line_end = zend_get_compiled_lineno(TSRMLS_C); -#if 0 - if (doc_comment && doc_comment->op_type != IS_UNUSED) { - CG(active_class_entry)->doc_comment = doc_comment->u.constant.value.str.val; - CG(active_class_entry)->doc_comment_len = doc_comment->u.constant.value.str.len; - } -#endif - if (CG(active_class_entry)->num_interfaces > 0) { CG(active_class_entry)->interfaces = (zend_class_entry **) emalloc(sizeof(zend_class_entry *)*CG(active_class_entry)->num_interfaces); } @@ -3250,7 +3249,6 @@ void zend_do_ticks(TSRMLS_D) } } - void zend_auto_global_dtor(zend_auto_global *auto_global) { free(auto_global->name); @@ -3403,6 +3401,18 @@ void zend_do_begin_namespace(znode *ns_token, znode *ns_name TSRMLS_DC) ns_token->u.previously_active_namespace = CG(active_namespace); CG(active_namespace) = ns; + if (CG(doc_comment)) { + /* + * Do not overwrite previously declared doc comment in case the namespace is + * split over several parts. + */ + if (CG(active_namespace)->doc_comment == NULL) { + CG(active_namespace)->doc_comment = estrndup(CG(doc_comment), CG(doc_comment_len)); + CG(active_namespace)->doc_comment_len = CG(doc_comment_len); + } + RESET_DOC_COMMENT(); + } + /* new symbol tables */ CG(class_table) = &ns->class_table; CG(function_table) = &ns->function_table; @@ -3423,21 +3433,6 @@ void zend_do_end_namespace(znode *ns_token TSRMLS_DC) CG(active_namespace)->line_end = zend_get_compiled_lineno(TSRMLS_C); } -#if 0 - if (doc_comment && doc_comment->op_type != IS_UNUSED) { - /* - * Do not overwrite previously declared doc comment in case the namespace is - * split over several parts. - */ - if (CG(active_namespace)->doc_comment == NULL) { - CG(active_namespace)->doc_comment = doc_comment->u.constant.value.str.val; - CG(active_namespace)->doc_comment_len = doc_comment->u.constant.value.str.len; - } else { - zval_dtor(&doc_comment->u.constant); - } - } -#endif - opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_START_NAMESPACE; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 6879eda188..20eb0fcfcc 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -41,6 +41,12 @@ #define DEC_BPC(op_array) if (CG(interactive)) { ((op_array)->backpatch_count--); } #define HANDLE_INTERACTIVE() if (CG(interactive)) { execute_new_code(TSRMLS_C); } +#define RESET_DOC_COMMENT() \ + do { \ + CG(doc_comment) = NULL; \ + CG(doc_comment_len) = 0; \ + } while (0) + typedef struct _zend_op_array zend_op_array; typedef struct _zend_op zend_op; diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index ac335fc473..39bb83c8e9 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -130,6 +130,9 @@ struct _zend_compiler_globals { znode implementing_class; zend_uint access_type; + + char *doc_comment; + zend_uint doc_comment_len; }; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 147d5fb74e..bdc0008488 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -179,7 +179,7 @@ inner_statement: statement: - unticked_statement { zend_do_ticks(TSRMLS_C); } + unticked_statement { zend_do_ticks(TSRMLS_C); RESET_DOC_COMMENT(); } ; unticked_statement: diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index e27bda46d0..9d128c36a5 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -124,6 +124,7 @@ void startup_scanner(TSRMLS_D) { CG(heredoc) = NULL; CG(heredoc_len)=0; + RESET_DOC_COMMENT(); SCNG(yy_start_stack_ptr) = 0; SCNG(yy_start_stack_depth) = 0; } @@ -135,6 +136,7 @@ void shutdown_scanner(TSRMLS_D) efree(CG(heredoc)); CG(heredoc_len)=0; } + RESET_DOC_COMMENT(); } END_EXTERN_C() @@ -1201,6 +1203,8 @@ NAMESPACE_NAME ({LABEL}":")+{LABEL} } "*/" { + CG(doc_comment) = yytext; /* no copying - intentional */ + CG(doc_comment_len) = yyleng; HANDLE_NEWLINES(yytext, yyleng); BEGIN(ST_IN_SCRIPTING); return T_DOC_COMMENT;