@@ -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+
97121static SVM_Byte *
98122fix_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
322347static 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
329382static 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-
471500static void
472501generate_logical_expression (SVM_Executable * exe , Block * block ,
473502 Expression * expr , OpcodeBuf * ob ,
0 commit comments