diff options
Diffstat (limited to 'src/ir.h')
-rw-r--r-- | src/ir.h | 45 |
1 files changed, 43 insertions, 2 deletions
@@ -112,6 +112,42 @@ proc_alloc(ProgramIr *program, StringView name) { | |||
112 | return proc; | 112 | return proc; |
113 | } | 113 | } |
114 | 114 | ||
115 | void compile_object(ProgramIr *program, Procedure *proc, Object *obj); | ||
116 | |||
117 | void | ||
118 | compile_arithmetic_list(ProgramIr *program, Procedure *proc, Op op, Object *obj) { | ||
119 | size_t op_line = obj->head->line; | ||
120 | size_t op_col = obj->head->col; | ||
121 | obj = obj->tail; | ||
122 | |||
123 | compile_object(program, proc, obj->head); | ||
124 | obj = obj->tail; | ||
125 | while (obj != NULL) { | ||
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); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | void | ||
134 | compile_proc_call(ProgramIr *program, Procedure *proc, Object *obj) { | ||
135 | // TODO: Handle this on the parser? | ||
136 | if (sv_equal(&obj->head->text, &STRING("+"))) { | ||
137 | compile_arithmetic_list(program, proc, OP_ADD, obj); | ||
138 | } else if (sv_equal(&obj->head->text, &STRING("-"))) { | ||
139 | compile_arithmetic_list(program, proc, OP_SUB, obj); | ||
140 | } else if (sv_equal(&obj->head->text, &STRING("*"))) { | ||
141 | compile_arithmetic_list(program, proc, OP_MUL, obj); | ||
142 | } else if (sv_equal(&obj->head->text, &STRING("/"))) { | ||
143 | compile_arithmetic_list(program, proc, OP_DIV, obj); | ||
144 | } else if (sv_equal(&obj->head->text, &STRING("%"))) { | ||
145 | compile_arithmetic_list(program, proc, OP_MOD, obj); | ||
146 | } else { | ||
147 | assert(false && "compile_proc_call: not implemented"); | ||
148 | } | ||
149 | } | ||
150 | |||
115 | void | 151 | void |
116 | compile_object(ProgramIr *program, Procedure *proc, Object *obj) { | 152 | compile_object(ProgramIr *program, Procedure *proc, Object *obj) { |
117 | switch (obj->type) { | 153 | switch (obj->type) { |
@@ -123,12 +159,17 @@ compile_object(ProgramIr *program, Procedure *proc, Object *obj) { | |||
123 | Instruction inst = (Instruction){OP_PUSH, obj, obj->line, obj->col}; | 159 | Instruction inst = (Instruction){OP_PUSH, obj, obj->line, obj->col}; |
124 | array_push(proc->instructions, inst); | 160 | array_push(proc->instructions, inst); |
125 | } break; | 161 | } break; |
126 | // case OBJ_TYPE_PAIR: { compile_proc_call(obj); } break; | 162 | case OBJ_TYPE_PAIR: { compile_proc_call(program, proc, obj); } break; |
127 | // case OBJ_TYPE_IF: { compile_if(obj); } break; | 163 | // case OBJ_TYPE_IF: { compile_if(obj); } break; |
128 | // case OBJ_TYPE_LAMBDA: { compile_lambda(obj); } break; | 164 | // case OBJ_TYPE_LAMBDA: { compile_lambda(obj); } break; |
129 | // case OBJ_TYPE_DEF: { compile_def(obj); } break; | 165 | // case OBJ_TYPE_DEF: { compile_def(obj); } break; |
130 | // case OBJ_TYPE_SYMBOL: { compile_symbol(obj); } break; | 166 | // case OBJ_TYPE_SYMBOL: { compile_symbol(obj); } break; |
131 | default: break; | 167 | default: { |
168 | // TODO: assert? | ||
169 | fprintf(stderr, "NOT IMPLEMENTED: compile_object for "); | ||
170 | OBJ_PRINT(obj); | ||
171 | exit(-1); | ||
172 | } break; | ||
132 | } | 173 | } |
133 | } | 174 | } |
134 | 175 | ||