fewer direct accesses to code vector
This commit is contained in:
parent
e5a05a3199
commit
dcd5f61748
|
@ -1595,6 +1595,7 @@ endstatement:
|
||||||
void parser_state::gen_main(std::string_view s, int ret_type) {
|
void parser_state::gen_main(std::string_view s, int ret_type) {
|
||||||
source = s.data();
|
source = s.data();
|
||||||
send = s.data() + s.size();
|
send = s.data() + s.size();
|
||||||
|
gs.code.reserve(gs.code.size() + 8);
|
||||||
gs.code.push_back(BC_INST_START);
|
gs.code.push_back(BC_INST_START);
|
||||||
parse_block(VAL_ANY);
|
parse_block(VAL_ANY);
|
||||||
gs.code.push_back(BC_INST_EXIT | ((ret_type < VAL_ANY) ? (ret_type << BC_INST_RET) : 0));
|
gs.code.push_back(BC_INST_EXIT | ((ret_type < VAL_ANY) ? (ret_type << BC_INST_RET) : 0));
|
||||||
|
|
|
@ -659,7 +659,6 @@ static any_value do_run(
|
||||||
{
|
{
|
||||||
parser_state ps{ts, gs};
|
parser_state ps{ts, gs};
|
||||||
ps.src_name = file;
|
ps.src_name = file;
|
||||||
gs.code.reserve(64);
|
|
||||||
ps.gen_main(code, VAL_ANY);
|
ps.gen_main(code, VAL_ANY);
|
||||||
}
|
}
|
||||||
std::uint32_t *cbuf = bcode_alloc(ts.istate, gs.code.size());
|
std::uint32_t *cbuf = bcode_alloc(ts.istate, gs.code.size());
|
||||||
|
|
|
@ -270,11 +270,7 @@ bcode_ref any_value::force_code(state &cs) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
gen_state gs{state_p{cs}.ts()};
|
gen_state gs{state_p{cs}.ts()};
|
||||||
{
|
parser_state{state_p{cs}.ts(), gs}.gen_main(get_string());
|
||||||
parser_state ps{state_p{cs}.ts(), gs};
|
|
||||||
gs.code.reserve(64);
|
|
||||||
ps.gen_main(get_string());
|
|
||||||
}
|
|
||||||
uint32_t *cbuf = bcode_alloc(state_p{cs}.ts().istate, gs.code.size());
|
uint32_t *cbuf = bcode_alloc(state_p{cs}.ts().istate, gs.code.size());
|
||||||
std::memcpy(cbuf, gs.code.data(), gs.code.size() * sizeof(std::uint32_t));
|
std::memcpy(cbuf, gs.code.data(), gs.code.size() * sizeof(std::uint32_t));
|
||||||
auto *bc = reinterpret_cast<bcode *>(cbuf + 1);
|
auto *bc = reinterpret_cast<bcode *>(cbuf + 1);
|
||||||
|
|
17
src/cs_vm.cc
17
src/cs_vm.cc
|
@ -240,9 +240,7 @@ bool exec_alias(
|
||||||
ts.callstack = &aliaslink;
|
ts.callstack = &aliaslink;
|
||||||
if (!aast.node->code) {
|
if (!aast.node->code) {
|
||||||
gen_state gs{ts};
|
gen_state gs{ts};
|
||||||
parser_state ps{ts, gs};
|
parser_state{ts, gs}.gen_main(aast.node->val_s.get_string());
|
||||||
gs.code.reserve(64);
|
|
||||||
ps.gen_main(aast.node->val_s.get_string());
|
|
||||||
/* i wish i could steal the memory somehow */
|
/* i wish i could steal the memory somehow */
|
||||||
uint32_t *code = bcode_alloc(ts.istate, gs.code.size());
|
uint32_t *code = bcode_alloc(ts.istate, gs.code.size());
|
||||||
memcpy(code, gs.code.data(), gs.code.size() * sizeof(uint32_t));
|
memcpy(code, gs.code.data(), gs.code.size() * sizeof(uint32_t));
|
||||||
|
@ -696,12 +694,9 @@ std::uint32_t *vm_exec(
|
||||||
case value_type::FLOAT:
|
case value_type::FLOAT:
|
||||||
gs.gen_main_float(arg.get_float());
|
gs.gen_main_float(arg.get_float());
|
||||||
break;
|
break;
|
||||||
case value_type::STRING: {
|
case value_type::STRING:
|
||||||
parser_state ps{ts, gs};
|
parser_state{ts, gs}.gen_main(arg.get_string());
|
||||||
gs.code.reserve(64);
|
|
||||||
ps.gen_main(arg.get_string());
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
gs.gen_main_null();
|
gs.gen_main_null();
|
||||||
break;
|
break;
|
||||||
|
@ -724,11 +719,7 @@ std::uint32_t *vm_exec(
|
||||||
std::string_view s = arg.get_string();
|
std::string_view s = arg.get_string();
|
||||||
if (!s.empty()) {
|
if (!s.empty()) {
|
||||||
gen_state gs{ts};
|
gen_state gs{ts};
|
||||||
{
|
parser_state{ts, gs}.gen_main(s);
|
||||||
parser_state ps{ts, gs};
|
|
||||||
gs.code.reserve(64);
|
|
||||||
ps.gen_main(s);
|
|
||||||
}
|
|
||||||
std::uint32_t *cbuf = bcode_alloc(
|
std::uint32_t *cbuf = bcode_alloc(
|
||||||
ts.istate, gs.code.size()
|
ts.istate, gs.code.size()
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue