# HG changeset patch # User aziz # Date 1182859380 0 # Node ID 2b7be1d67d4d9f6bbf5ee48b67527ce4b520b40f # Parent 9d5ceb0f8be962b495af01b706f86a3058126c57 - Optimized scanner of block comments. diff -r 9d5ceb0f8be9 -r 2b7be1d67d4d trunk/src/Lexer.d --- a/trunk/src/Lexer.d Tue Jun 26 10:20:00 2007 +0000 +++ b/trunk/src/Lexer.d Tue Jun 26 12:03:00 2007 +0000 @@ -306,9 +306,9 @@ } } case '*': + c = *++p; while (1) { - c = *++p; switch (c) { case '\r': @@ -316,28 +316,35 @@ ++p; case '\n': ++loc; + c = *++p; continue; - case '*': - if (p[1] == '/') - { - p += 2; - LreturnBC: - t.type = TOK.Comment; - t.end = p; - return; - } - break; - case LS[0]: - if (p[1] == LS[1] && (p[2] == LS[2] || p[2] == PS[2])) { - p += 2; - ++loc; - } - break; case 0, _Z_: error(MID.UnterminatedBlockComment); goto LreturnBC; default: } + + c <<= 8; + c |= *++p; + switch (c) + { + case 0x2A2F: // */ + ++p; + LreturnBC: + t.type = TOK.Comment; + t.end = p; + return; + case 0xE280: // LS[0..1] || PS[0..1] + if (p[1] == LS[2] || p[1] == PS[2]) + { + ++loc; + c = *(p += 2); + continue; + } + default: + c &= char.max; + continue; + } } assert(0); case '/': @@ -968,4 +975,4 @@ foreach (i, t; tokens) assert(t.span == toks[i], std.string.format("Lexed '%s' but expected '%s'", t.span, toks[i])); -} \ No newline at end of file +}