diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/parser.c | 28 | ||||
-rw-r--r-- | src/parser.h | 2 |
2 files changed, 8 insertions, 22 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 | } |
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 { | |||
31 | 31 | ||
32 | // OBJ_TYPE_STRING | 32 | // OBJ_TYPE_STRING |
33 | // OBJ_TYPE_SYMBOL | 33 | // OBJ_TYPE_SYMBOL |
34 | char *text; | 34 | StringView text; |
35 | 35 | ||
36 | // OBJ_TYPE_PAIR | 36 | // OBJ_TYPE_PAIR |
37 | struct { | 37 | struct { |