add more codegen utilities

master
Daniel Kolesa 2021-04-09 00:50:13 +02:00
parent 5f67b205df
commit 283f23394d
3 changed files with 31 additions and 15 deletions

View File

@ -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<integer_type> + 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<float_type> + 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() { void gen_state::gen_block() {
code.push_back(BC_INST_EMPTY); code.push_back(BC_INST_EMPTY);
} }

View File

@ -40,6 +40,10 @@ struct gen_state {
std::size_t line = 0 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(); void gen_block();
std::pair<std::size_t, std::string_view> gen_block( std::pair<std::size_t, std::string_view> gen_block(
std::string_view v, std::size_t line, std::string_view v, std::size_t line,

View File

@ -691,18 +691,10 @@ std::uint32_t *vm_exec(
gen_state gs{ts}; gen_state gs{ts};
switch (arg.get_type()) { switch (arg.get_type()) {
case value_type::INTEGER: case value_type::INTEGER:
gs.code.reserve(8); gs.gen_main_integer(arg.get_integer());
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);
break; break;
case value_type::FLOAT: case value_type::FLOAT:
gs.code.reserve(8); gs.gen_main_float(arg.get_float());
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);
break; break;
case value_type::STRING: { case value_type::STRING: {
parser_state ps{ts, gs}; parser_state ps{ts, gs};
@ -712,11 +704,7 @@ std::uint32_t *vm_exec(
break; break;
} }
default: default:
gs.code.reserve(8); gs.gen_main_null();
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);
break; break;
} }
std::uint32_t *cbuf = bcode_alloc(ts.istate, gs.code.size()); std::uint32_t *cbuf = bcode_alloc(ts.istate, gs.code.size());