#include "macro.hpp" #include "src/Compiler.hpp" namespace fkstd { void assert_static_fail(Compiler& compiler, std::shared_ptr node, std::shared_ptr program) { try { compiler.compile_prog(node->child(1), program); } catch(std::exception const&) { program->load_const(std::make_shared(TYPE_BOOL, true, node->loc())); return; } std::stringstream ss; ss << "assertion failed"; node->loc().error(LOG_ERROR, ss.str()); } void decl(Compiler& compiler, std::shared_ptr node, std::shared_ptr program) { static addr_t addr = 0; addr++; std::string ident = node->child(1)->repr(); auto rhs = node->child(2); compiler.compile_prog(rhs, program); auto entry = compiler.sym()->declare_local(ident, addr, node->loc()) .set_node(rhs); program->add(OP_STORE_LOCAL, addr); } void block(Compiler& compiler, std::shared_ptr node, std::shared_ptr program) { compiler.sym()->enter_scope(); for (size_t i=1; isize(); i++) { compiler.compile_prog(node->child(i), program); if (i != node->size() - 1) { program->add(OP_POP); } } compiler.sym()->leave_scope(); } void if_macro(Compiler& compiler, std::shared_ptr node, std::shared_ptr program) { auto if_expr = node->child(1); auto then_expr = node->child(2); auto else_expr = node->child(3); compiler.compile_prog(if_expr, program); size_t to_else = program->add(OP_BNE, 0 /*else*/); compiler.compile_prog(then_expr, program); size_t to_end = program->add(OP_BR, 0 /* end */); program->set_param(to_else, program->size()); compiler.compile_prog(else_expr, program); program->set_param(to_end, program->size()); } }