abstract away ugly bcode reference creation

master
Daniel Kolesa 2021-04-09 01:12:52 +02:00
parent dcd5f61748
commit c0fc1aa452
5 changed files with 15 additions and 28 deletions

View File

@ -4,12 +4,17 @@
#include "cs_gen.hh" #include "cs_gen.hh"
#include "cs_bcode.hh"
#include "cs_ident.hh" #include "cs_ident.hh"
#include "cs_parser.hh" #include "cs_parser.hh"
namespace cubescript { namespace cubescript {
bcode_ref gen_state::steal_ref() {
auto *cp = bcode_alloc(ts.istate, code.size());
std::memcpy(cp, code.data(), code.size() * sizeof(std::uint32_t));
return bcode_ref{reinterpret_cast<bcode *>(cp + 1)};
}
void gen_state::gen_val_null() { void gen_state::gen_val_null() {
code.push_back(BC_INST_VAL_INT | BC_RET_NULL); code.push_back(BC_INST_VAL_INT | BC_RET_NULL);
} }

View File

@ -8,6 +8,7 @@
#include <cubescript/cubescript.hh> #include <cubescript/cubescript.hh>
#include "cs_std.hh" #include "cs_std.hh"
#include "cs_bcode.hh"
#include "cs_thread.hh" #include "cs_thread.hh"
namespace cubescript { namespace cubescript {
@ -21,6 +22,8 @@ struct gen_state {
ts{tsr}, code{tsr.istate} ts{tsr}, code{tsr.istate}
{} {}
bcode_ref steal_ref();
void gen_val_null(); void gen_val_null();
void gen_val_integer(integer_type v = 0); void gen_val_integer(integer_type v = 0);

View File

@ -661,9 +661,7 @@ static any_value do_run(
ps.src_name = file; ps.src_name = file;
ps.gen_main(code, VAL_ANY); ps.gen_main(code, VAL_ANY);
} }
std::uint32_t *cbuf = bcode_alloc(ts.istate, gs.code.size()); auto cref = gs.steal_ref();
std::memcpy(cbuf, gs.code.data(), gs.code.size() * sizeof(std::uint32_t));
bcode_ref cref{reinterpret_cast<bcode *>(cbuf + 1)};
bcode *p = cref; bcode *p = cref;
vm_exec(ts, p->get_raw(), ret); vm_exec(ts, p->get_raw(), ret);
return ret; return ret;

View File

@ -271,11 +271,9 @@ bcode_ref any_value::force_code(state &cs) {
} }
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{state_p{cs}.ts(), gs}.gen_main(get_string());
uint32_t *cbuf = bcode_alloc(state_p{cs}.ts().istate, gs.code.size()); auto bc = gs.steal_ref();
std::memcpy(cbuf, gs.code.data(), gs.code.size() * sizeof(std::uint32_t));
auto *bc = reinterpret_cast<bcode *>(cbuf + 1);
set_code(bc); set_code(bc);
return bcode_ref{bc}; return bc;
} }
ident &any_value::force_ident(state &cs) { ident &any_value::force_ident(state &cs) {

View File

@ -241,10 +241,7 @@ bool exec_alias(
if (!aast.node->code) { if (!aast.node->code) {
gen_state gs{ts}; gen_state gs{ts};
parser_state{ts, gs}.gen_main(aast.node->val_s.get_string()); parser_state{ts, gs}.gen_main(aast.node->val_s.get_string());
/* i wish i could steal the memory somehow */ aast.node->code = gs.steal_ref();
uint32_t *code = bcode_alloc(ts.istate, gs.code.size());
memcpy(code, gs.code.data(), gs.code.size() * sizeof(uint32_t));
aast.node->code = bcode_ref{reinterpret_cast<bcode *>(code + 1)};
} }
bcode_ref coderef = aast.node->code; bcode_ref coderef = aast.node->code;
auto cleanup = [&]() { auto cleanup = [&]() {
@ -701,14 +698,7 @@ std::uint32_t *vm_exec(
gs.gen_main_null(); gs.gen_main_null();
break; break;
} }
std::uint32_t *cbuf = bcode_alloc(ts.istate, gs.code.size()); arg.set_code(gs.steal_ref());
std::memcpy(
cbuf, gs.code.data(),
gs.code.size() * sizeof(std::uint32_t)
);
arg.set_code(
reinterpret_cast<bcode *>(cbuf + 1)
);
continue; continue;
} }
@ -720,14 +710,7 @@ std::uint32_t *vm_exec(
if (!s.empty()) { if (!s.empty()) {
gen_state gs{ts}; gen_state gs{ts};
parser_state{ts, gs}.gen_main(s); parser_state{ts, gs}.gen_main(s);
std::uint32_t *cbuf = bcode_alloc( arg.set_code(gs.steal_ref());
ts.istate, gs.code.size()
);
std::memcpy(
cbuf, gs.code.data(),
gs.code.size() * sizeof(std::uint32_t)
);
arg.set_code(reinterpret_cast<bcode *>(cbuf + 1));
} else { } else {
arg.force_none(); arg.force_none();
} }