aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-31 15:06:32 +0100
committerBad Diode <bd@badd10de.dev>2021-10-31 15:06:32 +0100
commitc324b3ce34b977d229b9bc6fa00fabc731ee65dd (patch)
tree4d5e903fc5c757102b203d67b1b3e0dc4aa35403 /src/parser.c
parent20c662d8dd751422b5624b11249cd8331abd8fa1 (diff)
downloadbdl-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.c28
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 [] = {
14uint64_t 14uint64_t
15symbol_hash(const HashTable *table, void *key) { 15symbol_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) {
72Object * 72Object *
73parse_string(Token tok) { 73parse_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
80Object * 79Object *
81parse_symbol(Token tok) { 80parse_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 }