feat: add 'reserved word' construct
Co-authored-by: Amaan Qureshi <amaanq12@gmail.com>
This commit is contained in:
parent
2a63077cac
commit
201b41cf11
31 changed files with 2367 additions and 1628 deletions
|
|
@ -153,6 +153,9 @@ typedef struct {
|
|||
int32_t deserialize;
|
||||
} external_scanner;
|
||||
int32_t primary_state_ids;
|
||||
int32_t name;
|
||||
int32_t reserved_words;
|
||||
uint16_t max_reserved_word_set_size;
|
||||
} LanguageInWasmMemory;
|
||||
|
||||
// LexerInWasmMemory - The memory layout of a `TSLexer` when compiled to wasm32.
|
||||
|
|
@ -414,6 +417,17 @@ static void *copy_strings(
|
|||
return result;
|
||||
}
|
||||
|
||||
static void *copy_string(
|
||||
const uint8_t *data,
|
||||
int32_t address
|
||||
) {
|
||||
const char *string = (const char *)&data[address];
|
||||
size_t len = strlen(string);
|
||||
char *result = ts_malloc(len + 1);
|
||||
memcpy(result, string, len + 1);
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool name_eq(const wasm_name_t *name, const char *string) {
|
||||
return strncmp(string, name->data, name->size) == 0;
|
||||
}
|
||||
|
|
@ -1202,24 +1216,24 @@ const TSLanguage *ts_wasm_store_load_language(
|
|||
memcpy(&wasm_language, &memory[language_address], sizeof(LanguageInWasmMemory));
|
||||
|
||||
int32_t addresses[] = {
|
||||
wasm_language.alias_map,
|
||||
wasm_language.alias_sequences,
|
||||
wasm_language.field_map_entries,
|
||||
wasm_language.field_map_slices,
|
||||
wasm_language.field_names,
|
||||
wasm_language.keyword_lex_fn,
|
||||
wasm_language.lex_fn,
|
||||
wasm_language.lex_modes,
|
||||
wasm_language.parse_actions,
|
||||
wasm_language.parse_table,
|
||||
wasm_language.primary_state_ids,
|
||||
wasm_language.primary_state_ids,
|
||||
wasm_language.public_symbol_map,
|
||||
wasm_language.small_parse_table,
|
||||
wasm_language.small_parse_table_map,
|
||||
wasm_language.symbol_metadata,
|
||||
wasm_language.symbol_metadata,
|
||||
wasm_language.parse_actions,
|
||||
wasm_language.symbol_names,
|
||||
wasm_language.field_names,
|
||||
wasm_language.field_map_slices,
|
||||
wasm_language.field_map_entries,
|
||||
wasm_language.symbol_metadata,
|
||||
wasm_language.public_symbol_map,
|
||||
wasm_language.alias_map,
|
||||
wasm_language.alias_sequences,
|
||||
wasm_language.lex_modes,
|
||||
wasm_language.lex_fn,
|
||||
wasm_language.keyword_lex_fn,
|
||||
wasm_language.primary_state_ids,
|
||||
wasm_language.name,
|
||||
wasm_language.reserved_words,
|
||||
wasm_language.external_token_count > 0 ? wasm_language.external_scanner.states : 0,
|
||||
wasm_language.external_token_count > 0 ? wasm_language.external_scanner.symbol_map : 0,
|
||||
wasm_language.external_token_count > 0 ? wasm_language.external_scanner.create : 0,
|
||||
|
|
@ -1274,7 +1288,7 @@ const TSLanguage *ts_wasm_store_load_language(
|
|||
),
|
||||
.lex_modes = copy(
|
||||
&memory[wasm_language.lex_modes],
|
||||
wasm_language.state_count * sizeof(TSLexMode)
|
||||
wasm_language.state_count * sizeof(TSLexerMode)
|
||||
),
|
||||
};
|
||||
|
||||
|
|
@ -1350,6 +1364,15 @@ const TSLanguage *ts_wasm_store_load_language(
|
|||
);
|
||||
}
|
||||
|
||||
if (language->version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) {
|
||||
language->name = copy_string(memory, wasm_language.name);
|
||||
language->reserved_words = copy(
|
||||
&memory[wasm_language.reserved_words],
|
||||
wasm_language.max_reserved_word_set_size * sizeof(TSSymbol)
|
||||
);
|
||||
language->max_reserved_word_set_size = wasm_language.max_reserved_word_set_size;
|
||||
}
|
||||
|
||||
if (language->external_token_count > 0) {
|
||||
language->external_scanner.symbol_map = copy(
|
||||
&memory[wasm_language.external_scanner.symbol_map],
|
||||
|
|
@ -1731,6 +1754,8 @@ void ts_wasm_language_release(const TSLanguage *self) {
|
|||
ts_free((void *)self->field_map_slices);
|
||||
ts_free((void *)self->field_names);
|
||||
ts_free((void *)self->lex_modes);
|
||||
ts_free((void *)self->name);
|
||||
ts_free((void *)self->reserved_words);
|
||||
ts_free((void *)self->parse_actions);
|
||||
ts_free((void *)self->parse_table);
|
||||
ts_free((void *)self->primary_state_ids);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue