remove some more raw bcode usage
parent
b2caade276
commit
2b0392e27e
|
@ -75,11 +75,11 @@ static inline void bcode_free(std::uint32_t *bc) {
|
||||||
std_allocator<std::uint32_t>{hdr->cs}.deallocate(rp, hdr->asize);
|
std_allocator<std::uint32_t>{hdr->cs}.deallocate(rp, hdr->asize);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bcode_incr(std::uint32_t *bc) {
|
static inline void bcode_incr(std::uint32_t *bc) {
|
||||||
*bc += 0x100;
|
*bc += 0x100;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bcode_decr(std::uint32_t *bc) {
|
static inline void bcode_decr(std::uint32_t *bc) {
|
||||||
*bc -= 0x100;
|
*bc -= 0x100;
|
||||||
if (std::int32_t(*bc) < 0x100) {
|
if (std::int32_t(*bc) < 0x100) {
|
||||||
bcode_free(bc);
|
bcode_free(bc);
|
||||||
|
|
|
@ -207,8 +207,6 @@ enum {
|
||||||
|
|
||||||
std::uint32_t *bcode_alloc(internal_state *cs, std::size_t sz);
|
std::uint32_t *bcode_alloc(internal_state *cs, std::size_t sz);
|
||||||
|
|
||||||
void bcode_incr(std::uint32_t *code);
|
|
||||||
void bcode_decr(std::uint32_t *code);
|
|
||||||
void bcode_addref(std::uint32_t *code);
|
void bcode_addref(std::uint32_t *code);
|
||||||
void bcode_unref(std::uint32_t *code);
|
void bcode_unref(std::uint32_t *code);
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ alias_impl::alias_impl(
|
||||||
state &cs, string_ref name, string_ref a, int fl
|
state &cs, string_ref name, string_ref a, int fl
|
||||||
):
|
):
|
||||||
ident_impl{ident_type::ALIAS, name, fl},
|
ident_impl{ident_type::ALIAS, name, fl},
|
||||||
p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial}
|
p_initial{cs}, p_acode{}, p_astack{&p_initial}
|
||||||
{
|
{
|
||||||
p_initial.val_s.set_str(a);
|
p_initial.val_s.set_str(a);
|
||||||
}
|
}
|
||||||
|
@ -81,35 +81,35 @@ alias_impl::alias_impl(
|
||||||
state &cs, string_ref name, std::string_view a, int fl
|
state &cs, string_ref name, std::string_view a, int fl
|
||||||
):
|
):
|
||||||
ident_impl{ident_type::ALIAS, name, fl},
|
ident_impl{ident_type::ALIAS, name, fl},
|
||||||
p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial}
|
p_initial{cs}, p_acode{}, p_astack{&p_initial}
|
||||||
{
|
{
|
||||||
p_initial.val_s.set_str(a);
|
p_initial.val_s.set_str(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
alias_impl::alias_impl(state &cs, string_ref name, integer_type a, int fl):
|
alias_impl::alias_impl(state &cs, string_ref name, integer_type a, int fl):
|
||||||
ident_impl{ident_type::ALIAS, name, fl},
|
ident_impl{ident_type::ALIAS, name, fl},
|
||||||
p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial}
|
p_initial{cs}, p_acode{}, p_astack{&p_initial}
|
||||||
{
|
{
|
||||||
p_initial.val_s.set_int(a);
|
p_initial.val_s.set_int(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
alias_impl::alias_impl(state &cs, string_ref name, float_type a, int fl):
|
alias_impl::alias_impl(state &cs, string_ref name, float_type a, int fl):
|
||||||
ident_impl{ident_type::ALIAS, name, fl},
|
ident_impl{ident_type::ALIAS, name, fl},
|
||||||
p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial}
|
p_initial{cs}, p_acode{}, p_astack{&p_initial}
|
||||||
{
|
{
|
||||||
p_initial.val_s.set_float(a);
|
p_initial.val_s.set_float(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
alias_impl::alias_impl(state &cs, string_ref name, int fl):
|
alias_impl::alias_impl(state &cs, string_ref name, int fl):
|
||||||
ident_impl{ident_type::ALIAS, name, fl},
|
ident_impl{ident_type::ALIAS, name, fl},
|
||||||
p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial}
|
p_initial{cs}, p_acode{}, p_astack{&p_initial}
|
||||||
{
|
{
|
||||||
p_initial.val_s.set_none();
|
p_initial.val_s.set_none();
|
||||||
}
|
}
|
||||||
|
|
||||||
alias_impl::alias_impl(state &cs, string_ref name, any_value v, int fl):
|
alias_impl::alias_impl(state &cs, string_ref name, any_value v, int fl):
|
||||||
ident_impl{ident_type::ALIAS, name, fl},
|
ident_impl{ident_type::ALIAS, name, fl},
|
||||||
p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial}
|
p_initial{cs}, p_acode{}, p_astack{&p_initial}
|
||||||
{
|
{
|
||||||
p_initial.val_s = v;
|
p_initial.val_s = v;
|
||||||
}
|
}
|
||||||
|
@ -144,9 +144,6 @@ void alias_impl::redo_arg(ident_stack &st) {
|
||||||
p_astack = st.next;
|
p_astack = st.next;
|
||||||
clean_code();
|
clean_code();
|
||||||
p_acode = st.val_s.get_code();
|
p_acode = st.val_s.get_code();
|
||||||
if (p_acode) {
|
|
||||||
bcode_incr(p_acode->get_raw());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void alias_impl::set_arg(thread_state &ts, any_value &v) {
|
void alias_impl::set_arg(thread_state &ts, any_value &v) {
|
||||||
|
@ -166,13 +163,10 @@ void alias_impl::set_alias(thread_state &ts, any_value &v) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void alias_impl::clean_code() {
|
void alias_impl::clean_code() {
|
||||||
if (p_acode) {
|
p_acode = bcode_ref{};
|
||||||
bcode_decr(p_acode->get_raw());
|
|
||||||
p_acode = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bcode *alias_impl::compile_code(thread_state &ts) {
|
bcode_ref const &alias_impl::compile_code(thread_state &ts) {
|
||||||
if (!p_acode) {
|
if (!p_acode) {
|
||||||
codegen_state gs(ts);
|
codegen_state gs(ts);
|
||||||
gs.code.reserve(64);
|
gs.code.reserve(64);
|
||||||
|
@ -180,8 +174,7 @@ bcode *alias_impl::compile_code(thread_state &ts) {
|
||||||
/* 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));
|
||||||
bcode_incr(code);
|
p_acode = bcode_ref{reinterpret_cast<bcode *>(code + 1)};
|
||||||
p_acode = reinterpret_cast<bcode *>(code);
|
|
||||||
}
|
}
|
||||||
return p_acode;
|
return p_acode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,10 +103,10 @@ struct alias_impl: ident_impl, alias {
|
||||||
void set_alias(thread_state &ts, any_value &v);
|
void set_alias(thread_state &ts, any_value &v);
|
||||||
|
|
||||||
void clean_code();
|
void clean_code();
|
||||||
bcode *compile_code(thread_state &ts);
|
bcode_ref const &compile_code(thread_state &ts);
|
||||||
|
|
||||||
ident_stack p_initial;
|
ident_stack p_initial;
|
||||||
bcode *p_acode;
|
bcode_ref p_acode;
|
||||||
ident_stack *p_astack;
|
ident_stack *p_astack;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -796,14 +796,9 @@ static void do_run(
|
||||||
gs.done();
|
gs.done();
|
||||||
std::uint32_t *cbuf = bcode_alloc(ts.istate, gs.code.size());
|
std::uint32_t *cbuf = bcode_alloc(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));
|
||||||
bcode_incr(cbuf);
|
bcode_ref cref{reinterpret_cast<bcode *>(cbuf + 1)};
|
||||||
try {
|
bcode *p = cref;
|
||||||
vm_exec(ts, cbuf + 1, ret);
|
vm_exec(ts, p->get_raw(), ret);
|
||||||
} catch (...) {
|
|
||||||
bcode_decr(cbuf);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
bcode_decr(cbuf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT void state::run(std::string_view code, any_value &ret) {
|
LIBCUBESCRIPT_EXPORT void state::run(std::string_view code, any_value &ret) {
|
||||||
|
|
|
@ -221,12 +221,10 @@ void exec_alias(
|
||||||
ts.pstate->identflags |= a->get_flags()&IDENT_FLAG_OVERRIDDEN;
|
ts.pstate->identflags |= a->get_flags()&IDENT_FLAG_OVERRIDDEN;
|
||||||
ident_link aliaslink = {a, ts.callstack, uargs};
|
ident_link aliaslink = {a, ts.callstack, uargs};
|
||||||
ts.callstack = &aliaslink;
|
ts.callstack = &aliaslink;
|
||||||
std::uint32_t *codep = static_cast<
|
bcode_ref coderef = static_cast<
|
||||||
alias_impl *
|
alias_impl *
|
||||||
>(a)->compile_code(ts)->get_raw();
|
>(a)->compile_code(ts);
|
||||||
bcode_incr(codep);
|
|
||||||
auto cleanup = [&]() {
|
auto cleanup = [&]() {
|
||||||
bcode_decr(codep);
|
|
||||||
ts.callstack = aliaslink.next;
|
ts.callstack = aliaslink.next;
|
||||||
ts.pstate->identflags = oldflags;
|
ts.pstate->identflags = oldflags;
|
||||||
auto amask = aliaslink.usedargs;
|
auto amask = aliaslink.usedargs;
|
||||||
|
@ -248,7 +246,8 @@ void exec_alias(
|
||||||
nargs = offset - skip;
|
nargs = offset - skip;
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
vm_exec(ts, codep + 1, result);
|
bcode *p = coderef;
|
||||||
|
vm_exec(ts, p->get_raw(), result);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
cleanup();
|
cleanup();
|
||||||
throw;
|
throw;
|
||||||
|
|
Loading…
Reference in New Issue