No subject
Wed Jun 6 10:14:32 CEST 2012
#line must have, after macro substitution, one of the following
forms:
#line line
#line line source-string-number"
Previously, we handled #line directives completely within the glcpp
lexer, which obviously precludes proper macro substitution.
Instead, just treat #line as a token, allowing normal expansion to
occur; the main GLSL compiler can handle the line directives anyway.
This also allows comments on #line directives, such as:
#line 42 0 /* some pithy comment */
oglconform seems to use this quite a bit, and it seems like it should be
allowed since macro expansion means #line needs to be handled
post-lexer, which means the lexer should eat comments.
+21 oglconforms.
Cc: Carl Worth <cworth at cworth.org>
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/glsl/glcpp/glcpp-lex.l | 33 ++++-----------------------------
1 file changed, 4 insertions(+), 29 deletions(-)
One bad thing about this patch is that it breaks 091-hash-line.c in glcpp's
unit test suite. I'm not sure what to do about that. I could update the
output, but the new output doesn't make much sense anymore...it gives you
lovely messages like:
0:4(1): preprocessor error: #error line 25 error
I also think we should add a test for #line with macro expansion. Maybe
something as simple as:
#define LINE_NUMBER 25
#define SOURCE_STRING_NUMBER 0
#line LINE_NUMBER SOURCE_STRING_NUMBER
But I'm not sure whether to add that as 102, or replace 91. Thoughts?
diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l
index b34f2c0..0ed83f5 100644
--- a/src/glsl/glcpp/glcpp-lex.l
+++ b/src/glsl/glcpp/glcpp-lex.l
@@ -129,35 +129,10 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
return OTHER;
}
-{HASH}line{HSPACE}+{DIGITS}{HSPACE}+{DIGITS}{HSPACE}*$ {
- /* Eat characters until the first digit is
- * encountered
- */
- char *ptr = yytext;
- while (!isdigit(*ptr))
- ptr++;
-
- /* Subtract one from the line number because
- * yylineno is zero-based instead of
- * one-based.
- */
- yylineno = strtol(ptr, &ptr, 0) - 1;
- yylloc->source = strtol(ptr, NULL, 0);
-}
-
-{HASH}line{HSPACE}+{DIGITS}{HSPACE}*$ {
- /* Eat characters until the first digit is
- * encountered
- */
- char *ptr = yytext;
- while (!isdigit(*ptr))
- ptr++;
-
- /* Subtract one from the line number because
- * yylineno is zero-based instead of
- * one-based.
- */
- yylineno = strtol(ptr, &ptr, 0) - 1;
+{HASH}line {
+ yylval->str = ralloc_strdup (yyextra, yytext);
+ yycolumn = 0;
+ return OTHER;
}
<SKIP,INITIAL>{
--
1.7.10.3
More information about the mesa-dev
mailing list