Andi and Stas,

Here is reworked version of doc comment patch. It doesn't store last doc
comment in the compiler globals anymore, instead it's returned inside
the T_DOC_COMMENT token. I've also modified a couple of rules in the
parser to store the doc comment in zend_class_entry and zend_op_array
for classes and functions respectively. There is one problem, however,
that I need your help with. I tried adding optional_doc_comment to class
method declaration but it resulted in a bunch of shift/reduce conflicts.
I am not a parser expert, so might you tell me to fix it? The patch is
attached.

-Andrei                                       http://www.gravitonic.com/

"Beware of bugs in the above code; I have only proved it correct,
 not tried it." -- Donald Knuth
Index: zend.h
===================================================================
RCS file: /repository/ZendEngine2/zend.h,v
retrieving revision 1.204
diff -u -2 -b -w -B -r1.204 zend.h
--- zend.h      5 Mar 2003 11:14:41 -0000       1.204
+++ zend.h      21 Mar 2003 15:57:13 -0000
@@ -336,4 +336,7 @@
        zend_uint num_interfaces;
 
+       char *doc_comment;
+       zend_uint doc_comment_len;
+
        /* old handlers */
 #if 0
Index: zend_compile.c
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.c,v
retrieving revision 1.397
diff -u -2 -b -w -B -r1.397 zend_compile.c
--- zend_compile.c      19 Mar 2003 21:17:47 -0000      1.397
+++ zend_compile.c      21 Mar 2003 15:57:13 -0000
@@ -1071,5 +1071,5 @@
 
 
-void zend_do_end_function_declaration(znode *function_token TSRMLS_DC)
+void zend_do_end_function_declaration(znode *function_token, znode *doc_comment 
TSRMLS_DC)
 {
        zend_do_extended_info(TSRMLS_C);
@@ -1077,4 +1077,8 @@
        pass_two(CG(active_op_array) TSRMLS_CC);
        CG(active_op_array)->line_end = CG(zend_lineno);
+       if (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;
+       }
        CG(active_op_array) = function_token->u.op_array;
 
@@ -2180,8 +2184,13 @@
 
 
-void zend_do_end_class_declaration(znode *class_token, znode *parent_token TSRMLS_DC)
+void zend_do_end_class_declaration(znode *class_token, znode *parent_token, znode 
*doc_comment TSRMLS_DC)
 {
        do_inherit_parent_constructor(CG(active_class_entry));
 
+       if (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;
+       }
+
        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);
@@ -3214,5 +3223,4 @@
        switch (retval) {
                case T_COMMENT:
-               case T_DOC_COMMENT:
                case T_OPEN_TAG:
                case T_WHITESPACE:
@@ -3369,4 +3377,7 @@
        ce->constants_updated = 0;
        ce->ce_flags = 0;
+
+       ce->doc_comment = NULL;
+       ce->doc_comment_len = 0;
 
        zend_hash_init_ex(&ce->default_properties, 0, NULL, ZVAL_PTR_DTOR, 
persistent_hashes, 0);
Index: zend_compile.h
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.h,v
retrieving revision 1.225
diff -u -2 -b -w -B -r1.225 zend_compile.h
--- zend_compile.h      19 Mar 2003 21:17:47 -0000      1.225
+++ zend_compile.h      21 Mar 2003 15:57:13 -0000
@@ -149,4 +149,6 @@
        int  line_start;
        int  line_end;
+       char *doc_comment;
+       zend_uint doc_comment_len;
 
        void *reserved[ZEND_MAX_RESERVED_RESOURCES];
@@ -314,5 +316,5 @@
 int zend_do_verify_access_types(znode *current_access_type, znode *new_modifier);
 void zend_do_begin_function_declaration(znode *function_token, znode *function_name, 
int is_method, int return_reference, znode *fn_flags_znode TSRMLS_DC);
-void zend_do_end_function_declaration(znode *function_token TSRMLS_DC);
+void zend_do_end_function_declaration(znode *function_token, znode *doc_comment 
TSRMLS_DC);
 void zend_do_receive_arg(zend_uchar op, znode *var, znode *offset, znode 
*initialization, znode *class_type, zend_uchar pass_type TSRMLS_DC);
 int zend_do_begin_function_call(znode *function_name TSRMLS_DC);
@@ -356,5 +358,5 @@
 
 void zend_do_begin_class_declaration(znode *class_token, znode *class_name, znode 
*parent_class_name TSRMLS_DC);
-void zend_do_end_class_declaration(znode *class_token, znode *parent_token TSRMLS_DC);
+void zend_do_end_class_declaration(znode *class_token, znode *parent_token, znode 
*doc_comment TSRMLS_DC);
 void zend_do_declare_property(znode *var_name, znode *value, zend_uint access_type 
TSRMLS_DC);
 void zend_do_declare_class_constant(znode *var_name, znode *value TSRMLS_DC);
Index: zend_globals.h
===================================================================
RCS file: /repository/ZendEngine2/zend_globals.h,v
retrieving revision 1.121
diff -u -2 -b -w -B -r1.121 zend_globals.h
--- zend_globals.h      19 Mar 2003 21:17:47 -0000      1.121
+++ zend_globals.h      21 Mar 2003 15:57:13 -0000
@@ -86,6 +86,4 @@
        char *heredoc;
        int heredoc_len;
-       char *doc_comment;
-       int doc_comment_len;
 
        zend_op_array *active_op_array;
Index: zend_language_parser.y
===================================================================
RCS file: /repository/ZendEngine2/zend_language_parser.y,v
retrieving revision 1.104
diff -u -2 -b -w -B -r1.104 zend_language_parser.y
--- zend_language_parser.y      19 Mar 2003 21:17:47 -0000      1.104
+++ zend_language_parser.y      21 Mar 2003 15:57:13 -0000
@@ -285,17 +285,21 @@
 
 unticked_function_declaration_statement:
-               T_FUNCTION { $1.u.opline_num = CG(zend_lineno); } is_reference 
T_STRING { zend_do_begin_function_declaration(&$1, &$4, 0, $3.op_type, NULL 
TSRMLS_CC); }
-                       '(' parameter_list ')' '{' inner_statement_list '}' { 
zend_do_end_function_declaration(&$1 TSRMLS_CC); }
+               optional_doc_comment T_FUNCTION { $2.u.opline_num = CG(zend_lineno); } 
is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$5, 0, $4.op_type, 
NULL TSRMLS_CC); }
+                       '(' parameter_list ')' '{' inner_statement_list '}' { 
zend_do_end_function_declaration(&$2, &$1 TSRMLS_CC); }
 ;
 
 unticked_class_declaration_statement:
-               class_entry_type T_STRING extends_from
-                       { zend_do_begin_class_declaration(&$1, &$2, &$3 TSRMLS_CC); } 
+               optional_doc_comment class_entry_type T_STRING extends_from
+                       { zend_do_begin_class_declaration(&$2, &$3, &$4 TSRMLS_CC); } 
                        implements_list
                        '{'
                                class_statement_list
-                       '}' { zend_do_end_class_declaration(&$1, &$2 TSRMLS_CC); }
+                       '}' { zend_do_end_class_declaration(&$2, &$4, &$1 TSRMLS_CC); }
 ;
 
+optional_doc_comment:
+               T_DOC_COMMENT { $$ = $1; }
+    |   /* empty */   { $$.op_type = IS_UNUSED; }
+;
 
 class_entry_type:
@@ -505,5 +509,5 @@
        |       class_constant_declaration ';'
        |       method_modifiers T_FUNCTION { $2.u.opline_num = CG(zend_lineno); } 
is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$5, 1, $4.op_type, 
&$1 TSRMLS_CC); } '(' 
-                       parameter_list ')' method_body { zend_do_abstract_method(&$5, 
&$1, &$10 TSRMLS_CC); zend_do_end_function_declaration(&$2 TSRMLS_CC); }
+                       parameter_list ')' method_body { zend_do_abstract_method(&$5, 
&$1, &$10 TSRMLS_CC); zend_do_end_function_declaration(&$2, NULL TSRMLS_CC); }
 ;
 
Index: zend_language_scanner.l
===================================================================
RCS file: /repository/ZendEngine2/zend_language_scanner.l,v
retrieving revision 1.81
diff -u -2 -b -w -B -r1.81 zend_language_scanner.l
--- zend_language_scanner.l     19 Mar 2003 21:17:47 -0000      1.81
+++ zend_language_scanner.l     21 Mar 2003 15:57:13 -0000
@@ -136,8 +136,4 @@
                CG(heredoc_len)=0;
        }
-       if (CG(doc_comment)) {
-               efree(CG(doc_comment));
-               CG(doc_comment_len) = 0;
-       }
 }
 END_EXTERN_C()
@@ -1193,9 +1189,7 @@
 
 <ST_DOC_COMMENT>"*/" {
-       if (CG(doc_comment)) {
-               efree(CG(doc_comment));
-       }
-       CG(doc_comment) = estrndup(yytext, yyleng);
-       CG(doc_comment_len) = yyleng;
+       zendlval->value.str.val = (char *)estrndup(yytext, yyleng);
+       zendlval->value.str.len = yyleng;
+       zendlval->type = IS_STRING;
        HANDLE_NEWLINES(yytext, yyleng);
        BEGIN(ST_IN_SCRIPTING);
Index: zend_opcode.c
===================================================================
RCS file: /repository/ZendEngine2/zend_opcode.c,v
retrieving revision 1.85
diff -u -2 -b -w -B -r1.85 zend_opcode.c
--- zend_opcode.c       5 Mar 2003 11:14:43 -0000       1.85
+++ zend_opcode.c       21 Mar 2003 15:57:13 -0000
@@ -75,4 +75,6 @@
        op_array->function_name = NULL;
        op_array->filename = zend_get_compiled_filename(TSRMLS_C);
+    op_array->doc_comment = NULL;
+    op_array->doc_comment_len = 0;
 
        op_array->arg_types = NULL;
@@ -158,4 +160,7 @@
                                efree(ce->interfaces);
                        }
+                       if (ce->doc_comment) {
+                               efree(ce->doc_comment);
+                       }
                        efree(ce);
                        break;
@@ -231,4 +236,7 @@
                efree(op_array->function_name);
        }
+    if (op_array->doc_comment) {
+        efree(op_array->doc_comment);
+    }
        if (op_array->arg_types) {
                efree(op_array->arg_types);

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to