From c324b3ce34b977d229b9bc6fa00fabc731ee65dd Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 31 Oct 2021 15:06:32 +0100 Subject: Replace string/symbol text field with StringView This will avoid unnecessary allocations, since we always keep the original text file open until the end of the processing. --- src/parser.c | 28 +++++++--------------------- src/parser.h | 2 +- 2 files changed, 8 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/parser.c b/src/parser.c index 31eb172..c042f5d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -14,7 +14,7 @@ static char *builtins [] = { uint64_t symbol_hash(const HashTable *table, void *key) { Object *obj = key; - uint64_t hash = _xor_shift_hash(obj->text, array_size(obj->text)); + uint64_t hash = _xor_shift_hash(obj->text.start, obj->text.n); hash = _fibonacci_hash(hash, table->shift_amount); return hash; } @@ -72,16 +72,14 @@ parse_bool(Token tok) { Object * parse_string(Token tok) { Object *ret = object_alloc(tok, OBJ_TYPE_STRING); - array_init(ret->text, tok.value.n); - array_insert(ret->text, tok.value.start, tok.value.n); + ret->text = tok.value; return ret; } Object * parse_symbol(Token tok) { Object *ret = object_alloc(tok, OBJ_TYPE_SYMBOL); - array_init(ret->text, tok.value.n); - array_insert(ret->text, tok.value.start, tok.value.n); + ret->text = tok.value; return ret; } @@ -535,8 +533,7 @@ parse(Token *tokens, Errors *errors) { char *str = builtins[i]; size_t str_n = strlen(str); Object *symbol = object_alloc((Token){0}, OBJ_TYPE_SYMBOL); - array_init(symbol->text, str_n); - array_insert(symbol->text, str, str_n); + symbol->text = (StringView){str, str_n}; // Insert in global table. ht_insert(global_env->table, symbol, symbol); @@ -601,9 +598,6 @@ object_free(Object *node) { if (node == NULL) { return; } - if (IS_STRING(node) || IS_SYMBOL(node)) { - array_free(node->text); - } if (IS_LAMBDA(node)) { array_free(node->params); array_free(node->body); @@ -665,10 +659,10 @@ object_display(Object *obj) { printf("()"); } break; case OBJ_TYPE_STRING: { - printf("\"%.*s\"", (int)array_size(obj->text), obj->text); + printf("\"%.*s\"", (int)obj->text.n, obj->text.start); } break; case OBJ_TYPE_SYMBOL: { - printf(":%.*s", (int)array_size(obj->text), obj->text); + printf(":%.*s", (int)obj->text.n, obj->text.start); } break; case OBJ_TYPE_PAIR: { printf("("); @@ -732,15 +726,7 @@ object_equal(Object *a, Object *b) { } break; case OBJ_TYPE_SYMBOL: case OBJ_TYPE_STRING: { - if (array_size(a->text) != array_size(b->text)) { - return false; - } - for (size_t i = 0; i < array_size(a->text); i++) { - if (a->text[i] != b->text[i]) { - return false; - } - } - return true; + return sv_equal(&a->text, &b->text); } break; default: break; } diff --git a/src/parser.h b/src/parser.h index 41dafa7..9414a24 100644 --- a/src/parser.h +++ b/src/parser.h @@ -31,7 +31,7 @@ typedef struct Object { // OBJ_TYPE_STRING // OBJ_TYPE_SYMBOL - char *text; + StringView text; // OBJ_TYPE_PAIR struct { -- cgit v1.2.1