aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-12-30 17:01:50 +0100
committerBad Diode <bd@badd10de.dev>2021-12-30 17:01:50 +0100
commit073105080457218e67d999d6d70610914c9effe7 (patch)
treed5c2bddc67fce4e0883d3ced2e1502f900538080 /src/parser.c
parent082764ad89c1b9613b6894d6593dee66041a5e54 (diff)
downloadbdl-073105080457218e67d999d6d70610914c9effe7.tar.gz
bdl-073105080457218e67d999d6d70610914c9effe7.zip
Ensure new procedures are compiled only once
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/parser.c b/src/parser.c
index 29a0444..bd52c49 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -852,7 +852,44 @@ object_equal(Object *a, Object *b) {
852 return sv_equal(&a->text, &b->text); 852 return sv_equal(&a->text, &b->text);
853 } break; 853 } break;
854 case OBJ_TYPE_BUILTIN: { 854 case OBJ_TYPE_BUILTIN: {
855 return a->builtin = b->builtin; 855 return a->builtin == b->builtin;
856 } break;
857 case OBJ_TYPE_PAIR: {
858 Object *a_head = a->head;
859 Object *b_head = b->head;
860 if (!object_equal(a_head, b_head)) {
861 return false;
862 }
863 Object *a_tail = a->tail;
864 Object *b_tail = b->tail;
865 while (a_tail != NULL && b_tail != NULL) {
866 if (!object_equal(a_head, b_head)) {
867 return false;
868 }
869 a_head = a_tail->head;
870 b_head = b_tail->head;
871 a_tail = a_tail->tail;
872 b_tail = b_tail->tail;
873 }
874 if (a_tail == b_tail && object_equal(a_head, b_head)) {
875 return true;
876 }
877 return false;
878 } break;
879 case OBJ_TYPE_LAMBDA: {
880 size_t n_params_a = array_size(a->params);
881 size_t n_params_b = array_size(b->params);
882 size_t n_expr_a = array_size(a->body);
883 size_t n_expr_b = array_size(b->body);
884 if (n_params_a != n_params_b || n_expr_a != n_expr_b) {
885 return false;
886 }
887 for (size_t i = 0; i < array_size(a->body); ++i) {
888 if (!object_equal(a->body[i], b->body[i])) {
889 return false;
890 }
891 }
892 return true;
856 } break; 893 } break;
857 default: break; 894 default: break;
858 } 895 }