]> granicus.if.org Git - php/commitdiff
Implement a different way to catch documentation comments.
authorAndrei Zmievski <andrei@php.net>
Wed, 2 Apr 2003 16:51:49 +0000 (16:51 +0000)
committerAndrei Zmievski <andrei@php.net>
Wed, 2 Apr 2003 16:51:49 +0000 (16:51 +0000)
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_globals.h
Zend/zend_language_parser.y
Zend/zend_language_scanner.l

index 4f19fab0e01ca1c590e1524cbc104098ef253d6c..71dc97ba86534716500bf1c223a740a8bca186f9 100644 (file)
@@ -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;
index 6879eda18860cd28213db5040521fcc02f072581..20eb0fcfcce83e980cdf4b35aa967388fd99ebe1 100644 (file)
 #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;
 
index ac335fc47326f87b742fd23c67e224fc58a6e4e3..39bb83c8e9c2e350fbcc667c22ee705433dc995e 100644 (file)
@@ -130,6 +130,9 @@ struct _zend_compiler_globals {
        znode implementing_class;
 
        zend_uint access_type;
+
+       char *doc_comment;
+       zend_uint doc_comment_len;
 };
 
 
index 147d5fb74e80401f7c014d296f56ad083ce1c1ca..bdc00084880f500a8502cc55d735d6aeab142322 100644 (file)
@@ -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:
index e27bda46d0d32ea8358f22e8282f70d6a1c5dbda..9d128c36a5d9c7b214f2c89de963afcb13035132 100644 (file)
@@ -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}
 }
 
 <ST_DOC_COMMENT>"*/" {
+       CG(doc_comment) = yytext;     /* no copying - intentional */
+       CG(doc_comment_len) = yyleng;
        HANDLE_NEWLINES(yytext, yyleng);
        BEGIN(ST_IN_SCRIPTING);
        return T_DOC_COMMENT;