fewer direct accesses to code vector

master
Daniel Kolesa 2021-04-09 01:03:29 +02:00
parent e5a05a3199
commit dcd5f61748
4 changed files with 6 additions and 19 deletions

View File

@ -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));

View File

@ -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());

View File

@ -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);

View File

@ -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()
); );