hide bcode pointers from public api
parent
6d6a115d0c
commit
83aa8bfd07
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
27
src/cs_vm.cc
27
src/cs_vm.cc
|
@ -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: {
|
||||||
|
|
|
@ -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()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue