| ... | @@ -1716,6 +1716,30 @@ static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) { | ... | @@ -1716,6 +1716,30 @@ static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) { |
| 1716 | return while_node; | 1716 | return while_node; |
| 1717 | } | 1717 | } |
| 1718 | | 1718 | |
| | 1719 | static AstNode *trans_if_statement(Context *c, AstNode *block, IfStmt *stmt) { |
| | 1720 | // if (c) t |
| | 1721 | // if (c) t else e |
| | 1722 | AstNode *if_node = trans_create_node(c, NodeTypeIfBoolExpr); |
| | 1723 | |
| | 1724 | // TODO: condition != 0 |
| | 1725 | AstNode *condition_node = trans_expr(c, true, block, stmt->getCond(), TransRValue); |
| | 1726 | if (condition_node == nullptr) |
| | 1727 | return nullptr; |
| | 1728 | if_node->data.if_bool_expr.condition = condition_node; |
| | 1729 | |
| | 1730 | if_node->data.if_bool_expr.then_block = trans_stmt(c, false, block, stmt->getThen(), TransRValue); |
| | 1731 | if (if_node->data.if_bool_expr.then_block == nullptr) |
| | 1732 | return nullptr; |
| | 1733 | |
| | 1734 | if (stmt->getElse() != nullptr) { |
| | 1735 | if_node->data.if_bool_expr.else_node = trans_stmt(c, false, block, stmt->getElse(), TransRValue); |
| | 1736 | if (if_node->data.if_bool_expr.else_node == nullptr) |
| | 1737 | return nullptr; |
| | 1738 | } |
| | 1739 | |
| | 1740 | return if_node; |
| | 1741 | } |
| | 1742 | |
| 1719 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { | 1743 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { |
| 1720 | Stmt::StmtClass sc = stmt->getStmtClass(); | 1744 | Stmt::StmtClass sc = stmt->getStmtClass(); |
| 1721 | switch (sc) { | 1745 | switch (sc) { |
| ... | @@ -1741,6 +1765,9 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s | ... | @@ -1741,6 +1765,9 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 1741 | return trans_local_declaration(c, block, (DeclStmt *)stmt); | 1765 | return trans_local_declaration(c, block, (DeclStmt *)stmt); |
| 1742 | case Stmt::WhileStmtClass: | 1766 | case Stmt::WhileStmtClass: |
| 1743 | return trans_while_loop(c, block, (WhileStmt *)stmt); | 1767 | return trans_while_loop(c, block, (WhileStmt *)stmt); |
| | 1768 | case Stmt::IfStmtClass: |
| | 1769 | return trans_if_statement(c, block, (IfStmt *)stmt); |
| | 1770 | |
| 1744 | case Stmt::CaseStmtClass: | 1771 | case Stmt::CaseStmtClass: |
| 1745 | emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); | 1772 | emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); |
| 1746 | return nullptr; | 1773 | return nullptr; |
| ... | @@ -2106,9 +2133,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s | ... | @@ -2106,9 +2133,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 2106 | case Stmt::GotoStmtClass: | 2133 | case Stmt::GotoStmtClass: |
| 2107 | emit_warning(c, stmt->getLocStart(), "TODO handle C GotoStmtClass"); | 2134 | emit_warning(c, stmt->getLocStart(), "TODO handle C GotoStmtClass"); |
| 2108 | return nullptr; | 2135 | return nullptr; |
| 2109 | case Stmt::IfStmtClass: | | |
| 2110 | emit_warning(c, stmt->getLocStart(), "TODO handle C IfStmtClass"); | | |
| 2111 | return nullptr; | | |
| 2112 | case Stmt::IndirectGotoStmtClass: | 2136 | case Stmt::IndirectGotoStmtClass: |
| 2113 | emit_warning(c, stmt->getLocStart(), "TODO handle C IndirectGotoStmtClass"); | 2137 | emit_warning(c, stmt->getLocStart(), "TODO handle C IndirectGotoStmtClass"); |
| 2114 | return nullptr; | 2138 | return nullptr; |