hide bcode pointers from public api

master
Daniel Kolesa 2021-04-10 03:37:59 +02:00
parent 6d6a115d0c
commit 83aa8bfd07
9 changed files with 42 additions and 34 deletions

View File

@ -14,7 +14,6 @@ struct LIBCUBESCRIPT_EXPORT bcode_ref {
bcode_ref(): bcode_ref():
p_code(nullptr) p_code(nullptr)
{} {}
bcode_ref(struct bcode *v);
bcode_ref(bcode_ref const &v); bcode_ref(bcode_ref const &v);
bcode_ref(bcode_ref &&v): bcode_ref(bcode_ref &&v):
p_code(v.p_code) p_code(v.p_code)
@ -28,11 +27,13 @@ struct LIBCUBESCRIPT_EXPORT bcode_ref {
bcode_ref &operator=(bcode_ref &&v); bcode_ref &operator=(bcode_ref &&v);
bool empty() const; bool empty() const;
operator bool() const; operator bool() const;
operator struct bcode *() const;
private: private:
friend struct bcode_p;
bcode_ref(struct bcode *v);
struct bcode *p_code; struct bcode *p_code;
}; };

View File

@ -45,10 +45,6 @@ LIBCUBESCRIPT_EXPORT bcode_ref::operator bool() const {
return p_code != nullptr; return p_code != nullptr;
} }
LIBCUBESCRIPT_EXPORT bcode_ref::operator bcode *() const {
return p_code;
}
/* private funcs */ /* private funcs */
struct bcode_hdr { struct bcode_hdr {

View File

@ -208,6 +208,20 @@ empty_block *bcode_init_empty(internal_state *cs);
void bcode_free_empty(internal_state *cs, empty_block *empty); void bcode_free_empty(internal_state *cs, empty_block *empty);
bcode *bcode_get_empty(empty_block *empty, std::size_t val); bcode *bcode_get_empty(empty_block *empty, std::size_t val);
struct bcode_p {
bcode_p(bcode_ref const &r): br{const_cast<bcode_ref *>(&r)} {}
bcode *get() {
return br->p_code;
}
static bcode_ref make_ref(bcode *v) {
return bcode_ref{v};
}
bcode_ref *br;
};
} /* namespace cubescript */ } /* namespace cubescript */
#endif #endif

View File

@ -27,7 +27,7 @@ std::uint32_t gen_state::peek(std::size_t idx) const {
bcode_ref gen_state::steal_ref() { bcode_ref gen_state::steal_ref() {
auto *cp = bcode_alloc(ts.istate, code.size()); auto *cp = bcode_alloc(ts.istate, code.size());
std::memcpy(cp, code.data(), code.size() * sizeof(std::uint32_t)); std::memcpy(cp, code.data(), code.size() * sizeof(std::uint32_t));
return bcode_ref{reinterpret_cast<bcode *>(cp + 1)}; return bcode_p::make_ref(reinterpret_cast<bcode *>(cp + 1));
} }
void gen_state::gen_pop() { void gen_state::gen_pop() {

View File

@ -646,8 +646,7 @@ LIBCUBESCRIPT_EXPORT void state::init_libs(int libs) {
LIBCUBESCRIPT_EXPORT any_value state::run(bcode_ref const &code) { LIBCUBESCRIPT_EXPORT any_value state::run(bcode_ref const &code) {
any_value ret{*this}; any_value ret{*this};
bcode *p = code; vm_exec(*p_tstate, bcode_p{code}.get()->get_raw(), ret);
vm_exec(*p_tstate, reinterpret_cast<std::uint32_t *>(p), ret);
return ret; return ret;
} }
@ -658,8 +657,7 @@ static any_value do_run(
gen_state gs{ts}; gen_state gs{ts};
gs.gen_main(code, file); gs.gen_main(code, file);
auto cref = gs.steal_ref(); auto cref = gs.steal_ref();
bcode *p = cref; vm_exec(ts, bcode_p{cref}.get()->get_raw(), ret);
vm_exec(ts, p->get_raw(), ret);
return ret; return ret;
} }

View File

@ -168,7 +168,7 @@ void any_value::set_none() {
} }
void any_value::set_code(bcode_ref const &val) { void any_value::set_code(bcode_ref const &val) {
bcode *p = val; bcode *p = bcode_p{val}.get();
csv_cleanup(p_type, &p_stor); csv_cleanup(p_type, &p_stor);
p_type = value_type::CODE; p_type = value_type::CODE;
bcode_addref(p->get_raw()); bcode_addref(p->get_raw());
@ -265,7 +265,7 @@ std::string_view any_value::force_string() {
bcode_ref any_value::force_code(state &cs) { bcode_ref any_value::force_code(state &cs) {
switch (get_type()) { switch (get_type()) {
case value_type::CODE: case value_type::CODE:
return bcode_ref{csv_get<bcode *>(&p_stor)}; return bcode_p::make_ref(csv_get<bcode *>(&p_stor));
default: default:
break; break;
} }
@ -326,7 +326,7 @@ bcode_ref any_value::get_code() const {
if (get_type() != value_type::CODE) { if (get_type() != value_type::CODE) {
return bcode_ref{}; return bcode_ref{};
} }
return bcode_ref{csv_get<bcode *>(&p_stor)}; return bcode_p::make_ref(csv_get<bcode *>(&p_stor));
} }
ident *any_value::get_ident() const { ident *any_value::get_ident() const {

View File

@ -141,9 +141,9 @@ void exec_command(
if (rep) { if (rep) {
break; break;
} }
args[i].set_code( args[i].set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_NULL) bcode_get_empty(ts.istate->empty, VAL_NULL)
); ));
fakeargs++; fakeargs++;
} else { } else {
args[i].force_code(*ts.pstate); args[i].force_code(*ts.pstate);
@ -268,8 +268,7 @@ bool exec_alias(
nargs = offset - skip; nargs = offset - skip;
}; };
try { try {
bcode *p = coderef; vm_exec(ts, bcode_p{coderef}.get()->get_raw(), result);
vm_exec(ts, p->get_raw(), result);
} catch (...) { } catch (...) {
cleanup(); cleanup();
throw; throw;
@ -653,32 +652,32 @@ std::uint32_t *vm_exec(
case BC_INST_BLOCK: { case BC_INST_BLOCK: {
std::uint32_t len = op >> 8; std::uint32_t len = op >> 8;
args.emplace_back(cs).set_code( args.emplace_back(cs).set_code(bcode_p::make_ref(
reinterpret_cast<bcode *>(code + 1) reinterpret_cast<bcode *>(code + 1)
); ));
code += len; code += len;
continue; continue;
} }
case BC_INST_EMPTY | BC_RET_NULL: case BC_INST_EMPTY | BC_RET_NULL:
args.emplace_back(cs).set_code( args.emplace_back(cs).set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_NULL) bcode_get_empty(ts.istate->empty, VAL_NULL)
); ));
break; break;
case BC_INST_EMPTY | BC_RET_STRING: case BC_INST_EMPTY | BC_RET_STRING:
args.emplace_back(cs).set_code( args.emplace_back(cs).set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_STRING) bcode_get_empty(ts.istate->empty, VAL_STRING)
); ));
break; break;
case BC_INST_EMPTY | BC_RET_INT: case BC_INST_EMPTY | BC_RET_INT:
args.emplace_back(cs).set_code( args.emplace_back(cs).set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_INT) bcode_get_empty(ts.istate->empty, VAL_INT)
); ));
break; break;
case BC_INST_EMPTY | BC_RET_FLOAT: case BC_INST_EMPTY | BC_RET_FLOAT:
args.emplace_back(cs).set_code( args.emplace_back(cs).set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_FLOAT) bcode_get_empty(ts.istate->empty, VAL_FLOAT)
); ));
break; break;
case BC_INST_COMPILE: { case BC_INST_COMPILE: {

View File

@ -171,7 +171,7 @@ void init_lib_base(state &gcs) {
gcs.new_command("loop", "rie", [](auto &cs, auto args, auto &) { gcs.new_command("loop", "rie", [](auto &cs, auto args, auto &) {
do_loop( do_loop(
cs, *args[0].get_ident(), 0, args[1].get_integer(), 1, nullptr, cs, *args[0].get_ident(), 0, args[1].get_integer(), 1, bcode_ref{},
args[2].get_code() args[2].get_code()
); );
}); });
@ -179,14 +179,14 @@ void init_lib_base(state &gcs) {
gcs.new_command("loop+", "riie", [](auto &cs, auto args, auto &) { gcs.new_command("loop+", "riie", [](auto &cs, auto args, auto &) {
do_loop( do_loop(
cs, *args[0].get_ident(), args[1].get_integer(), cs, *args[0].get_ident(), args[1].get_integer(),
args[2].get_integer(), 1, nullptr, args[3].get_code() args[2].get_integer(), 1, bcode_ref{}, args[3].get_code()
); );
}); });
gcs.new_command("loop*", "riie", [](auto &cs, auto args, auto &) { gcs.new_command("loop*", "riie", [](auto &cs, auto args, auto &) {
do_loop( do_loop(
cs, *args[0].get_ident(), 0, args[1].get_integer(), cs, *args[0].get_ident(), 0, args[1].get_integer(),
args[2].get_integer(), nullptr, args[3].get_code() args[2].get_integer(), bcode_ref{}, args[3].get_code()
); );
}); });
@ -194,7 +194,7 @@ void init_lib_base(state &gcs) {
do_loop( do_loop(
cs, *args[0].get_ident(), args[1].get_integer(), cs, *args[0].get_ident(), args[1].get_integer(),
args[3].get_integer(), args[2].get_integer(), args[3].get_integer(), args[2].get_integer(),
nullptr, args[4].get_code() bcode_ref{}, args[4].get_code()
); );
}); });

View File

@ -622,7 +622,7 @@ static void init_lib_list_sort(state &gcs) {
gcs.new_command("uniquelist", "srre", [](auto &cs, auto args, auto &res) { gcs.new_command("uniquelist", "srre", [](auto &cs, auto args, auto &res) {
list_sort( list_sort(
cs, res, args[0].get_string(), args[1].get_ident(), cs, res, args[0].get_string(), args[1].get_ident(),
args[2].get_ident(), nullptr, args[3].get_code() args[2].get_ident(), bcode_ref{}, args[3].get_code()
); );
}); });
} }