diff --git a/src/cs_gen.cc b/src/cs_gen.cc index 277bfb4..fb18a84 100644 --- a/src/cs_gen.cc +++ b/src/cs_gen.cc @@ -118,6 +118,30 @@ void gen_state::gen_val( } } +void gen_state::gen_main_null() { + code.reserve(code.size() + 4); + code.push_back(BC_INST_START); + gen_val_null(); + code.push_back(BC_INST_RESULT); + code.push_back(BC_INST_EXIT); +} + +void gen_state::gen_main_integer(integer_type v) { + code.reserve(code.size() + bc_store_size + 3); + code.push_back(BC_INST_START); + gen_val_integer(v); + code.push_back(BC_INST_RESULT); + code.push_back(BC_INST_EXIT); +} + +void gen_state::gen_main_float(float_type v) { + code.reserve(code.size() + bc_store_size + 3); + code.push_back(BC_INST_START); + gen_val_float(v); + code.push_back(BC_INST_RESULT); + code.push_back(BC_INST_EXIT); +} + void gen_state::gen_block() { code.push_back(BC_INST_EMPTY); } diff --git a/src/cs_gen.hh b/src/cs_gen.hh index 0d7fdcd..72aec86 100644 --- a/src/cs_gen.hh +++ b/src/cs_gen.hh @@ -40,6 +40,10 @@ struct gen_state { std::size_t line = 0 ); + void gen_main_null(); + void gen_main_integer(integer_type v); + void gen_main_float(float_type v); + void gen_block(); std::pair gen_block( std::string_view v, std::size_t line, diff --git a/src/cs_vm.cc b/src/cs_vm.cc index 11e160b..bb8b45c 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -691,18 +691,10 @@ std::uint32_t *vm_exec( gen_state gs{ts}; switch (arg.get_type()) { case value_type::INTEGER: - gs.code.reserve(8); - gs.code.push_back(BC_INST_START); - gs.gen_val_integer(arg.get_integer()); - gs.code.push_back(BC_INST_RESULT); - gs.code.push_back(BC_INST_EXIT); + gs.gen_main_integer(arg.get_integer()); break; case value_type::FLOAT: - gs.code.reserve(8); - gs.code.push_back(BC_INST_START); - gs.gen_val_float(arg.get_float()); - gs.code.push_back(BC_INST_RESULT); - gs.code.push_back(BC_INST_EXIT); + gs.gen_main_float(arg.get_float()); break; case value_type::STRING: { parser_state ps{ts, gs}; @@ -712,11 +704,7 @@ std::uint32_t *vm_exec( break; } default: - gs.code.reserve(8); - gs.code.push_back(BC_INST_START); - gs.gen_val_null(); - gs.code.push_back(BC_INST_RESULT); - gs.code.push_back(BC_INST_EXIT); + gs.gen_main_null(); break; } std::uint32_t *cbuf = bcode_alloc(ts.istate, gs.code.size());