Hello internals,

  attached is a patch that brings the '#line' directive to php.
This is especially usefull for parser generators or any other
code shuffling/generator tools. Any opinions? If nothing speaks
against i'd like to commit this before heading towards OSCON
be end of next week. (oatch is against head of course).

-- 
Best regards,
 Marcus                          mailto:[EMAIL PROTECTED]
Index: Zend/zend_compile.c
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.c,v
retrieving revision 1.717
diff -u -p -d -r1.717 zend_compile.c
--- Zend/zend_compile.c 13 Jun 2006 12:56:20 -0000      1.717
+++ Zend/zend_compile.c 15 Jul 2006 18:20:03 -0000
@@ -208,6 +208,23 @@ ZEND_API char *zend_set_compiled_filenam
 }
 
 
+ZEND_API void zend_do_line_directive(long lineno, char *file, int file_len 
TSRMLS_DC)
+{
+       zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+
+       CG(zend_lineno) = lineno;
+       file = estrndup(file, file_len);
+       zend_set_compiled_filename(file TSRMLS_CC);
+
+       opline->opcode = ZEND_LINE_DIRECTIVE;
+       SET_UNUSED(opline->result);     
+       opline->op1.op_type = IS_CONST;
+       ZVAL_LONG(&opline->op1.u.constant, lineno);
+       opline->op2.op_type = IS_CONST;
+       ZVAL_STRINGL(&opline->op2.u.constant, file, file_len, 0);
+}
+
+
 ZEND_API void zend_restore_compiled_filename(char *original_compiled_filename 
TSRMLS_DC)
 {
        CG(compiled_filename) = original_compiled_filename;
Index: Zend/zend_compile.h
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.h,v
retrieving revision 1.343
diff -u -p -d -r1.343 zend_compile.h
--- Zend/zend_compile.h 13 Jun 2006 12:56:20 -0000      1.343
+++ Zend/zend_compile.h 15 Jul 2006 18:20:03 -0000
@@ -332,6 +332,7 @@ ZEND_API int lex_scan(zval *zendlval TSR
 void startup_scanner(TSRMLS_D);
 void shutdown_scanner(TSRMLS_D);
 
+ZEND_API void zend_do_line_directive(long lineno, char *file, int file_len 
TSRMLS_DC);
 ZEND_API char *zend_set_compiled_filename(char *new_compiled_filename 
TSRMLS_DC);
 ZEND_API void zend_restore_compiled_filename(char *original_compiled_filename 
TSRMLS_DC);
 ZEND_API char *zend_get_compiled_filename(TSRMLS_D);
Index: Zend/zend_language_scanner.l
===================================================================
RCS file: /repository/ZendEngine2/zend_language_scanner.l,v
retrieving revision 1.155
diff -u -p -d -r1.155 zend_language_scanner.l
--- Zend/zend_language_scanner.l        12 Jun 2006 17:06:39 -0000      1.155
+++ Zend/zend_language_scanner.l        15 Jul 2006 18:20:04 -0000
@@ -1396,6 +1396,7 @@ EXPONENT_DNUM     (({LNUM}|{DNUM})[eE][+-]?{
 HNUM   "0x"[0-9a-fA-F]+
 LABEL  [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
 WHITESPACE [ \n\r\t]+
+WSONLY [ \t]+
 TABS_AND_SPACES [ \t]*
 TOKENS [;:,.\[\]()|^&+-/*=%!~$<>[EMAIL PROTECTED]
 ENCAPSED_TOKENS [\[\]{}$]
@@ -2099,6 +2100,28 @@ NEWLINE ("\r"|"\n"|"\r\n")
 }
 
 
+<ST_IN_SCRIPTING>"#"{WSONLY}*"line"{WSONLY}{LNUM}{WSONLY}["][^"\r\n]*["]{NEWLINE}
 {
+/* " */
+       char *s, *e;
+       long l;
+
+       errno = 0;
+       s = strchr(yytext, 'e') + 1;
+       l = strtol(s, &e, 0);
+       if (errno == ERANGE) { /* overflow */
+               zend_error(E_COMPILE_ERROR, "#line directive invalid");
+       }
+       s = strchr(e + 1, '"') + 1;
+       e = strrchr(s, '"');
+       zend_do_line_directive(l, s, e - s TSRMLS_CC);
+       Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */
+       Z_STRLEN_P(zendlval) = yyleng;
+       Z_TYPE_P(zendlval) = IS_STRING;
+       BEGIN(ST_IN_SCRIPTING);
+       return T_COMMENT;
+}
+
+
 <ST_IN_SCRIPTING>"#"|"//" {
        BEGIN(ST_ONE_LINE_COMMENT);
        yymore();
Index: Zend/zend_vm_def.h
===================================================================
RCS file: /repository/ZendEngine2/zend_vm_def.h,v
retrieving revision 1.125
diff -u -p -d -r1.125 zend_vm_def.h
--- Zend/zend_vm_def.h  12 Jul 2006 21:14:11 -0000      1.125
+++ Zend/zend_vm_def.h  15 Jul 2006 18:20:05 -0000
@@ -3893,4 +3893,18 @@ ZEND_VM_HANDLER(151, ZEND_U_NORMALIZE, C
        ZEND_VM_NEXT_OPCODE();
 }
 
+ZEND_VM_HANDLER(152, ZEND_LINE_DIRECTIVE, CONST, ANY)
+{
+       zend_op *opline = EX(opline);
+       zend_free_op free_op1, free_op2;
+       /*zval *line = GET_OP1_ZVAL_PTR(BP_VAR_R);*/
+       zval *file = GET_OP2_ZVAL_PTR(BP_VAR_R);
+
+       zend_set_compiled_filename(Z_STRVAL_P(file) TSRMLS_CC);
+
+       FREE_OP1_IF_VAR();
+       FREE_OP2_IF_VAR();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 ZEND_VM_EXPORT_HELPER(zend_do_fcall, zend_do_fcall_common_helper)
Index: Zend/zend_vm_execute.h
===================================================================
RCS file: /repository/ZendEngine2/zend_vm_execute.h,v
retrieving revision 1.129
diff -u -p -d -r1.129 zend_vm_execute.h
--- Zend/zend_vm_execute.h      12 Jul 2006 21:14:11 -0000      1.129
+++ Zend/zend_vm_execute.h      15 Jul 2006 18:20:10 -0000
@@ -2334,6 +2334,19 @@ static int ZEND_U_NORMALIZE_SPEC_CONST_H
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_LINE_DIRECTIVE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       zend_op *opline = EX(opline);
+       zend_free_op free_op2;
+       /*zval *line = &opline->op1.u.constant;*/
+       zval *file = get_zval_ptr(&opline->op2, EX(Ts), &free_op2, BP_VAR_R);
+
+       zend_set_compiled_filename(Z_STRVAL_P(file) TSRMLS_CC);
+
+       FREE_OP_IF_VAR(free_op2);
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        zend_op *opline = EX(opline);
@@ -31093,6 +31106,31 @@ void zend_init_opcodes_handlers()
        ZEND_U_NORMALIZE_SPEC_CV_HANDLER,
        ZEND_U_NORMALIZE_SPEC_CV_HANDLER,
        ZEND_U_NORMALIZE_SPEC_CV_HANDLER,
+       ZEND_LINE_DIRECTIVE_SPEC_CONST_HANDLER,
+       ZEND_LINE_DIRECTIVE_SPEC_CONST_HANDLER,
+       ZEND_LINE_DIRECTIVE_SPEC_CONST_HANDLER,
+       ZEND_LINE_DIRECTIVE_SPEC_CONST_HANDLER,
+       ZEND_LINE_DIRECTIVE_SPEC_CONST_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
+       ZEND_NULL_HANDLER,
        ZEND_NULL_HANDLER
   };
   zend_opcode_handlers = (opcode_handler_t*)labels;
Index: Zend/zend_vm_opcodes.h
===================================================================
RCS file: /repository/ZendEngine2/zend_vm_opcodes.h,v
retrieving revision 1.67
diff -u -p -d -r1.67 zend_vm_opcodes.h
--- Zend/zend_vm_opcodes.h      10 Mar 2006 08:29:22 -0000      1.67
+++ Zend/zend_vm_opcodes.h      15 Jul 2006 18:20:10 -0000
@@ -149,3 +149,4 @@
 #define ZEND_HANDLE_EXCEPTION        149
 #define ZEND_USER_OPCODE             150
 #define ZEND_U_NORMALIZE             151
+#define ZEND_LINE_DIRECTIVE          152
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to