add more codegen utilities
parent
5f67b205df
commit
283f23394d
|
@ -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() {
|
||||
code.push_back(BC_INST_EMPTY);
|
||||
}
|
||||
|
|
|
@ -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<std::size_t, std::string_view> gen_block(
|
||||
std::string_view v, std::size_t line,
|
||||
|
|
18
src/cs_vm.cc
18
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());
|
||||
|
|
Loading…
Reference in New Issue