diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-31 15:06:32 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-31 15:06:32 +0100 |
commit | c324b3ce34b977d229b9bc6fa00fabc731ee65dd (patch) | |
tree | 4d5e903fc5c757102b203d67b1b3e0dc4aa35403 /src/parser.c | |
parent | 20c662d8dd751422b5624b11249cd8331abd8fa1 (diff) | |
download | bdl-c324b3ce34b977d229b9bc6fa00fabc731ee65dd.tar.gz bdl-c324b3ce34b977d229b9bc6fa00fabc731ee65dd.zip |
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.
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 28 |
1 files changed, 7 insertions, 21 deletions
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 [] = { | |||
14 | uint64_t | 14 | uint64_t |
15 | symbol_hash(const HashTable *table, void *key) { | 15 | symbol_hash(const HashTable *table, void *key) { |
16 | Object *obj = key; | 16 | Object *obj = key; |
17 | uint64_t hash = _xor_shift_hash(obj->text, array_size(obj->text)); | 17 | uint64_t hash = _xor_shift_hash(obj->text.start, obj->text.n); |
18 | hash = _fibonacci_hash(hash, table->shift_amount); | 18 | hash = _fibonacci_hash(hash, table->shift_amount); |
19 | return hash; | 19 | return hash; |
20 | } | 20 | } |
@@ -72,16 +72,14 @@ parse_bool(Token tok) { | |||
72 | Object * | 72 | Object * |
73 | parse_string(Token tok) { | 73 | parse_string(Token tok) { |
74 | Object *ret = object_alloc(tok, OBJ_TYPE_STRING); | 74 | Object *ret = object_alloc(tok, OBJ_TYPE_STRING); |
75 | array_init(ret->text, tok.value.n); | 75 | ret->text = tok.value; |
76 | array_insert(ret->text, tok.value.start, tok.value.n); | ||
77 | return ret; | 76 | return ret; |
78 | } | 77 | } |
79 | 78 | ||
80 | Object * | 79 | Object * |
81 | parse_symbol(Token tok) { | 80 | parse_symbol(Token tok) { |
82 | Object *ret = object_alloc(tok, OBJ_TYPE_SYMBOL); | 81 | Object *ret = object_alloc(tok, OBJ_TYPE_SYMBOL); |
83 | array_init(ret->text, tok.value.n); | 82 | ret->text = tok.value; |
84 | array_insert(ret->text, tok.value.start, tok.value.n); | ||
85 | return ret; | 83 | return ret; |
86 | } | 84 | } |
87 | 85 | ||
@@ -535,8 +533,7 @@ parse(Token *tokens, Errors *errors) { | |||
535 | char *str = builtins[i]; | 533 | char *str = builtins[i]; |
536 | size_t str_n = strlen(str); | 534 | size_t str_n = strlen(str); |
537 | Object *symbol = object_alloc((Token){0}, OBJ_TYPE_SYMBOL); | 535 | Object *symbol = object_alloc((Token){0}, OBJ_TYPE_SYMBOL); |
538 | array_init(symbol->text, str_n); | 536 | symbol->text = (StringView){str, str_n}; |
539 | array_insert(symbol->text, str, str_n); | ||
540 | 537 | ||
541 | // Insert in global table. | 538 | // Insert in global table. |
542 | ht_insert(global_env->table, symbol, symbol); | 539 | ht_insert(global_env->table, symbol, symbol); |
@@ -601,9 +598,6 @@ object_free(Object *node) { | |||
601 | if (node == NULL) { | 598 | if (node == NULL) { |
602 | return; | 599 | return; |
603 | } | 600 | } |
604 | if (IS_STRING(node) || IS_SYMBOL(node)) { | ||
605 | array_free(node->text); | ||
606 | } | ||
607 | if (IS_LAMBDA(node)) { | 601 | if (IS_LAMBDA(node)) { |
608 | array_free(node->params); | 602 | array_free(node->params); |
609 | array_free(node->body); | 603 | array_free(node->body); |
@@ -665,10 +659,10 @@ object_display(Object *obj) { | |||
665 | printf("()"); | 659 | printf("()"); |
666 | } break; | 660 | } break; |
667 | case OBJ_TYPE_STRING: { | 661 | case OBJ_TYPE_STRING: { |
668 | printf("\"%.*s\"", (int)array_size(obj->text), obj->text); | 662 | printf("\"%.*s\"", (int)obj->text.n, obj->text.start); |
669 | } break; | 663 | } break; |
670 | case OBJ_TYPE_SYMBOL: { | 664 | case OBJ_TYPE_SYMBOL: { |
671 | printf(":%.*s", (int)array_size(obj->text), obj->text); | 665 | printf(":%.*s", (int)obj->text.n, obj->text.start); |
672 | } break; | 666 | } break; |
673 | case OBJ_TYPE_PAIR: { | 667 | case OBJ_TYPE_PAIR: { |
674 | printf("("); | 668 | printf("("); |
@@ -732,15 +726,7 @@ object_equal(Object *a, Object *b) { | |||
732 | } break; | 726 | } break; |
733 | case OBJ_TYPE_SYMBOL: | 727 | case OBJ_TYPE_SYMBOL: |
734 | case OBJ_TYPE_STRING: { | 728 | case OBJ_TYPE_STRING: { |
735 | if (array_size(a->text) != array_size(b->text)) { | 729 | return sv_equal(&a->text, &b->text); |
736 | return false; | ||
737 | } | ||
738 | for (size_t i = 0; i < array_size(a->text); i++) { | ||
739 | if (a->text[i] != b->text[i]) { | ||
740 | return false; | ||
741 | } | ||
742 | } | ||
743 | return true; | ||
744 | } break; | 730 | } break; |
745 | default: break; | 731 | default: break; |
746 | } | 732 | } |