assert isinstance(argument, int)
return '(int32_t){}'.format(argument)
+def generate_label_argument(argument):
+ return 'LABEL_{}'.format(argument)
+
def generate_null_argument(argument):
assert argument is None
return 'NULL'
'gt': generate_null_argument_from(2),
'gte': generate_null_argument_from(2),
'idiv': generate_null_argument_from(2),
+ 'jump': generate_label_argument,
+ 'jump_if_false': generate_label_argument,
'lt': generate_null_argument_from(2),
'lte': generate_null_argument_from(2),
'mod': generate_null_argument_from(2),
{% include "arithmetic_instruction.c" %}
{% endwith %}
+void jump(Thread* thread, Argument argument) {
+ thread->program_counter = argument.label - 1; // We will increment before running
+}
+
+void jump_if_false(Thread* thread, Argument argument) {
+ assert(!Stack_isEmpty(&(thread->stack)));
+ Object result = Stack_pop(&(thread->stack));
+ assert(result.type == BOOLEAN);
+
+ if(!(result.value.boolean)) {
+ jump(thread, argument);
+ }
+}
+
{% with name='lt', operation='<' %}
{% include "comparison_instruction.c" %}
{% endwith %}
{% include "comparison_instruction.c" %}
{% endwith %}
-void neg(struct Thread* thread, Argument argument) {
+void neg(Thread* thread, Argument argument) {
assert(!Stack_isEmpty(&(thread->stack)));
Object result = Stack_pop(&(thread->stack));
assert(result.type == INTEGER);
int main() {
Thread thread;
- Thread_initialize(&thread, 0);
+ Thread_initialize(&thread, LABEL___main__);
for(; program[thread.program_counter].instruction != end; thread.program_counter++) {
program[thread.program_counter].instruction(