diff options
author | Bad Diode <bd@badd10de.dev> | 2021-12-22 18:07:53 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-12-22 18:07:53 +0100 |
commit | 7ad32a2a907150e3ce71e89f126ca2a530550158 (patch) | |
tree | 2c5db028cd7e5b5244db3d43f7561d7a8327f07a /src/ir.h | |
parent | fd65adf81f6c3e7e94755a83e22f7e0a19f8bd99 (diff) | |
download | bdl-7ad32a2a907150e3ce71e89f126ca2a530550158.tar.gz bdl-7ad32a2a907150e3ce71e89f126ca2a530550158.zip |
Add builtin object type
Diffstat (limited to 'src/ir.h')
-rw-r--r-- | src/ir.h | 53 |
1 files changed, 31 insertions, 22 deletions
@@ -115,34 +115,43 @@ proc_alloc(ProgramIr *program, StringView name) { | |||
115 | void compile_object(ProgramIr *program, Procedure *proc, Object *obj); | 115 | void compile_object(ProgramIr *program, Procedure *proc, Object *obj); |
116 | 116 | ||
117 | void | 117 | void |
118 | compile_arithmetic_list(ProgramIr *program, Procedure *proc, Op op, Object *obj) { | 118 | compile_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 | ||
133 | void | 130 | void |
134 | compile_proc_call(ProgramIr *program, Procedure *proc, Object *obj) { | 131 | compile_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 | } |