Skip to content

Commit 3517a6e

Browse files
authored
Merge pull request #42 from Bytom/assign
if stmt
2 parents 72ddae8 + d97a756 commit 3517a6e

1 file changed

Lines changed: 57 additions & 28 deletions

File tree

compiler/codegen.c

Lines changed: 57 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,30 @@ fix_labels(OpcodeBuf *ob)
9494
}
9595
}
9696

97+
static int
98+
get_label(OpcodeBuf *ob)
99+
{
100+
int ret;
101+
102+
if (ob->label_table_alloc_size < ob->label_table_size + 1) {
103+
ob->label_table = realloc(ob->label_table,
104+
(ob->label_table_alloc_size
105+
+ LABEL_TABLE_ALLOC_SIZE)
106+
* sizeof(LabelTable));
107+
ob->label_table_alloc_size += LABEL_TABLE_ALLOC_SIZE;
108+
}
109+
ret = ob->label_table_size;
110+
ob->label_table_size++;
111+
112+
return ret;
113+
}
114+
115+
static void
116+
set_label(OpcodeBuf *ob, int label)
117+
{
118+
ob->label_table[label].label_address = ob->size;
119+
}
120+
97121
static SVM_Byte *
98122
fix_opcode_buf(OpcodeBuf *ob)
99123
{
@@ -317,13 +341,42 @@ generate_block_statement(SVM_Executable *exe, Block *current_block,
317341
Block *block_stmt,
318342
OpcodeBuf *ob)
319343
{
344+
generate_statement_list(exe, current_block, block_stmt->statement_list, ob);
320345
}
321346

322347
static void
323-
generate_if_statement(SVM_Executable *exe, Block *current_block,
324-
IfStatement *if_smt,
325-
OpcodeBuf *ob)
326-
{
348+
generate_if_statement(SVM_Executable *exe, Block *block,
349+
IfStatement *if_s, OpcodeBuf *ob)
350+
{
351+
int if_false_label;
352+
int end_label;
353+
Elseif *elseif;
354+
355+
generate_expression(exe, block, if_s->condition, ob);
356+
if_false_label = get_label(ob);
357+
generate_code(ob, OP_JUMPIF, if_false_label);
358+
// TODO: set JumpTarget
359+
generate_statement_list(exe, if_s->then_block,
360+
if_s->then_block->statement_list, ob);
361+
end_label = get_label(ob);
362+
generate_code(ob, OP_JUMP, end_label);
363+
set_label(ob, if_false_label);
364+
365+
for (elseif = if_s->elseif_list; elseif; elseif = elseif->next) {
366+
generate_expression(exe, block, elseif->condition, ob);
367+
if_false_label = get_label(ob);
368+
generate_code(ob, OP_JUMPIF, if_false_label);
369+
generate_statement_list(exe, elseif->block,
370+
elseif->block->statement_list, ob);
371+
generate_code(ob, OP_JUMP, end_label);
372+
set_label(ob, if_false_label);
373+
}
374+
if (if_s->else_block) {
375+
generate_statement_list(exe, if_s->else_block,
376+
if_s->else_block->statement_list,
377+
ob);
378+
}
379+
set_label(ob, end_label);
327380
}
328381

329382
static void
@@ -444,30 +497,6 @@ generate_binary_expression(SVM_Executable *exe, Block *block,
444497
generate_code(ob, code);
445498
}
446499

447-
static int
448-
get_label(OpcodeBuf *ob)
449-
{
450-
int ret;
451-
452-
if (ob->label_table_alloc_size < ob->label_table_size + 1) {
453-
ob->label_table = realloc(ob->label_table,
454-
(ob->label_table_alloc_size
455-
+ LABEL_TABLE_ALLOC_SIZE)
456-
* sizeof(LabelTable));
457-
ob->label_table_alloc_size += LABEL_TABLE_ALLOC_SIZE;
458-
}
459-
ret = ob->label_table_size;
460-
ob->label_table_size++;
461-
462-
return ret;
463-
}
464-
465-
static void
466-
set_label(OpcodeBuf *ob, int label)
467-
{
468-
ob->label_table[label].label_address = ob->size;
469-
}
470-
471500
static void
472501
generate_logical_expression(SVM_Executable *exe, Block *block,
473502
Expression *expr, OpcodeBuf *ob,

0 commit comments

Comments
 (0)