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

View File

@ -45,10 +45,6 @@ LIBCUBESCRIPT_EXPORT bcode_ref::operator bool() const {
return p_code != nullptr;
}
LIBCUBESCRIPT_EXPORT bcode_ref::operator bcode *() const {
return p_code;
}
/* private funcs */
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);
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 */
#endif

View File

@ -27,7 +27,7 @@ std::uint32_t gen_state::peek(std::size_t idx) const {
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)};
return bcode_p::make_ref(reinterpret_cast<bcode *>(cp + 1));
}
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) {
any_value ret{*this};
bcode *p = code;
vm_exec(*p_tstate, reinterpret_cast<std::uint32_t *>(p), ret);
vm_exec(*p_tstate, bcode_p{code}.get()->get_raw(), ret);
return ret;
}
@ -658,8 +657,7 @@ static any_value do_run(
gen_state gs{ts};
gs.gen_main(code, file);
auto cref = gs.steal_ref();
bcode *p = cref;
vm_exec(ts, p->get_raw(), ret);
vm_exec(ts, bcode_p{cref}.get()->get_raw(), ret);
return ret;
}

View File

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

View File

@ -141,9 +141,9 @@ void exec_command(
if (rep) {
break;
}
args[i].set_code(
args[i].set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_NULL)
);
));
fakeargs++;
} else {
args[i].force_code(*ts.pstate);
@ -268,8 +268,7 @@ bool exec_alias(
nargs = offset - skip;
};
try {
bcode *p = coderef;
vm_exec(ts, p->get_raw(), result);
vm_exec(ts, bcode_p{coderef}.get()->get_raw(), result);
} catch (...) {
cleanup();
throw;
@ -653,32 +652,32 @@ std::uint32_t *vm_exec(
case BC_INST_BLOCK: {
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)
);
));
code += len;
continue;
}
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)
);
));
break;
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)
);
));
break;
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)
);
));
break;
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)
);
));
break;
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 &) {
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()
);
});
@ -179,14 +179,14 @@ void init_lib_base(state &gcs) {
gcs.new_command("loop+", "riie", [](auto &cs, auto args, auto &) {
do_loop(
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 &) {
do_loop(
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(
cs, *args[0].get_ident(), args[1].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) {
list_sort(
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()
);
});
}