aboutsummaryrefslogtreecommitdiffstats
path: root/src/ir.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-12-22 18:07:53 +0100
committerBad Diode <bd@badd10de.dev>2021-12-22 18:07:53 +0100
commit7ad32a2a907150e3ce71e89f126ca2a530550158 (patch)
tree2c5db028cd7e5b5244db3d43f7561d7a8327f07a /src/ir.h
parentfd65adf81f6c3e7e94755a83e22f7e0a19f8bd99 (diff)
downloadbdl-7ad32a2a907150e3ce71e89f126ca2a530550158.tar.gz
bdl-7ad32a2a907150e3ce71e89f126ca2a530550158.zip
Add builtin object type
Diffstat (limited to 'src/ir.h')
-rw-r--r--src/ir.h53
1 files changed, 31 insertions, 22 deletions
diff --git a/src/ir.h b/src/ir.h
index b42e02f..a42cd48 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -115,34 +115,43 @@ proc_alloc(ProgramIr *program, StringView name) {
115void compile_object(ProgramIr *program, Procedure *proc, Object *obj); 115void compile_object(ProgramIr *program, Procedure *proc, Object *obj);
116 116
117void 117void
118compile_arithmetic_list(ProgramIr *program, Procedure *proc, Op op, Object *obj) { 118compile_arithmetic(ProgramIr *program, Procedure *proc, Op op,
119 size_t op_line = obj->head->line; 119 size_t line, size_t col, Object *args) {
120 size_t op_col = obj->head->col; 120 compile_object(program, proc, args->head);
121 obj = obj->tail; 121 args = args->tail;
122 122 while (args != NULL) {
123 compile_object(program, proc, obj->head); 123 compile_object(program, proc, args->head);
124 obj = obj->tail; 124 args = args->tail;
125 while (obj != NULL) { 125 Instruction inst = (Instruction){op, NULL, line, col};
126 compile_object(program, proc, obj->head);
127 obj = obj->tail;
128 Instruction inst = (Instruction){op, NULL, op_line, op_col};
129 array_push(proc->instructions, inst); 126 array_push(proc->instructions, inst);
130 } 127 }
131} 128}
132 129
133void 130void
134compile_proc_call(ProgramIr *program, Procedure *proc, Object *obj) { 131compile_proc_call(ProgramIr *program, Procedure *proc, Object *obj) {
135 // TODO: Handle this on the parser? 132 size_t line = obj->line;
136 if (sv_equal(&obj->head->text, &STRING("+"))) { 133 size_t col = obj->col;
137 compile_arithmetic_list(program, proc, OP_ADD, obj); 134 if (obj->head->type == OBJ_TYPE_BUILTIN) {
138 } else if (sv_equal(&obj->head->text, &STRING("-"))) { 135 switch (obj->head->builtin) {
139 compile_arithmetic_list(program, proc, OP_SUB, obj); 136 case BUILTIN_ADD: {
140 } else if (sv_equal(&obj->head->text, &STRING("*"))) { 137 compile_arithmetic(program, proc, OP_ADD, line, col, obj->tail);
141 compile_arithmetic_list(program, proc, OP_MUL, obj); 138 } break;
142 } else if (sv_equal(&obj->head->text, &STRING("/"))) { 139 case BUILTIN_SUB: {
143 compile_arithmetic_list(program, proc, OP_DIV, obj); 140 compile_arithmetic(program, proc, OP_SUB, line, col, obj->tail);
144 } else if (sv_equal(&obj->head->text, &STRING("%"))) { 141 } break;
145 compile_arithmetic_list(program, proc, OP_MOD, obj); 142 case BUILTIN_MUL: {
143 compile_arithmetic(program, proc, OP_MUL, line, col, obj->tail);
144 } break;
145 case BUILTIN_DIV: {
146 compile_arithmetic(program, proc, OP_DIV, line, col, obj->tail);
147 } break;
148 case BUILTIN_MOD: {
149 compile_arithmetic(program, proc, OP_MOD, line, col, obj->tail);
150 } break;
151 default: {
152 assert(false && "builtin not implemented");
153 } break;
154 }
146 } else { 155 } else {
147 assert(false && "compile_proc_call: not implemented"); 156 assert(false && "compile_proc_call: not implemented");
148 } 157 }