diff options
| author | gingerBill <bill@gingerbill.org> | 2021-08-02 16:47:32 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-08-02 16:47:32 +0100 |
| commit | b0e64ca7e88a357dda71cb784ae2b12bd3f0be20 (patch) | |
| tree | 4d2d4867f2eb4856d300e5b20e9a330d89aa9902 /src/tokenizer.cpp | |
| parent | 7f3d4cb50463dbc0ef9154ea467209ff52ddadc2 (diff) | |
Prepare tokenizer for optimizations
Diffstat (limited to 'src/tokenizer.cpp')
| -rw-r--r-- | src/tokenizer.cpp | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 42044bae1..8d27525e8 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -1070,38 +1070,51 @@ bool scan_escape(Tokenizer *t) { gb_inline void tokenizer_skip_line(Tokenizer *t) { -#if 0 - while (t->curr_rune != '\n' && t->curr_rune != GB_RUNE_EOF) { - advance_to_next_rune(t); - } -#elif 0 +#if 1 while (t->read_curr != t->end && t->curr_rune != '\n' && t->curr_rune != GB_RUNE_EOF) { - t->curr = t->read_curr; - t->curr_rune = *t->read_curr; + t->column_minus_one++; + t->curr = t->read_curr++; + t->curr_rune = *t->curr; if (t->curr_rune == 0) { tokenizer_err(t, "Illegal character NUL"); } - t->read_curr++; } #else - while (t->read_curr != t->end && t->curr_rune != '\n' && t->curr_rune != GB_RUNE_EOF) { - t->curr = t->read_curr; - t->curr_rune = *t->read_curr; - if (t->curr_rune == 0) { - tokenizer_err(t, "Illegal character NUL"); +loop_start:; + u8 *p = t->read_curr; + for (; p < t->end; p++) { + switch (*p) { + case '\n': + case 0xff: + goto loop_end; + case 0: + goto illegal_nul; } - t->read_curr++; } + +loop_end: + p = gb_min(p, t->end); + t->column_minus_one += cast(i32)(p - t->read_curr); + t->read_curr = p; + t->curr = p-1; + t->curr_rune = *t->curr; + return; + +illegal_nul:; + p = gb_min(p, t->end); + t->column_minus_one += cast(i32)(p - t->read_curr); + t->read_curr = p; + t->curr = p-1; + t->curr_rune = *t->curr; + tokenizer_err(t, "Illegal character NUL"); + goto loop_start; #endif } -void tokenizer_get_token(Tokenizer *t, Token *token, int repeat=0) { - // Skip whitespace - if (t->flags & TokenizerFlag_InsertSemicolon && t->insert_semicolon) { +gb_inline void tokenizer_skip_whitespace(Tokenizer *t, bool on_newline) { + if (on_newline) { for (;;) { switch (t->curr_rune) { - case '\n': - break; case ' ': case '\t': case '\r': @@ -1113,7 +1126,7 @@ void tokenizer_get_token(Tokenizer *t, Token *token, int repeat=0) { } else { for (;;) { switch (t->curr_rune) { - case '\n': // only on t->insert_semicolon + case '\n': case ' ': case '\t': case '\r': @@ -1123,7 +1136,10 @@ void tokenizer_get_token(Tokenizer *t, Token *token, int repeat=0) { break; } } +} +void tokenizer_get_token(Tokenizer *t, Token *token, int repeat=0) { + tokenizer_skip_whitespace(t, t->insert_semicolon); token->kind = Token_Invalid; token->string.text = t->curr; |