From 83aa8bfd07d89665ce7030ebf1da20ba13d2dd8a Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Sat, 10 Apr 2021 03:37:59 +0200 Subject: [PATCH] hide bcode pointers from public api --- include/cubescript/cubescript/value.hh | 7 ++++--- src/cs_bcode.cc | 4 ---- src/cs_bcode.hh | 14 +++++++++++++ src/cs_gen.cc | 2 +- src/cs_state.cc | 6 ++---- src/cs_val.cc | 6 +++--- src/cs_vm.cc | 27 +++++++++++++------------- src/lib_base.cc | 8 ++++---- src/lib_list.cc | 2 +- 9 files changed, 42 insertions(+), 34 deletions(-) diff --git a/include/cubescript/cubescript/value.hh b/include/cubescript/cubescript/value.hh index c8cf17f..7593c89 100644 --- a/include/cubescript/cubescript/value.hh +++ b/include/cubescript/cubescript/value.hh @@ -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; }; diff --git a/src/cs_bcode.cc b/src/cs_bcode.cc index 34be0a1..086d87a 100644 --- a/src/cs_bcode.cc +++ b/src/cs_bcode.cc @@ -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 { diff --git a/src/cs_bcode.hh b/src/cs_bcode.hh index 444979c..be4dd41 100644 --- a/src/cs_bcode.hh +++ b/src/cs_bcode.hh @@ -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(&r)} {} + + bcode *get() { + return br->p_code; + } + + static bcode_ref make_ref(bcode *v) { + return bcode_ref{v}; + } + + bcode_ref *br; +}; + } /* namespace cubescript */ #endif diff --git a/src/cs_gen.cc b/src/cs_gen.cc index c0d35d5..71759f4 100644 --- a/src/cs_gen.cc +++ b/src/cs_gen.cc @@ -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(cp + 1)}; + return bcode_p::make_ref(reinterpret_cast(cp + 1)); } void gen_state::gen_pop() { diff --git a/src/cs_state.cc b/src/cs_state.cc index 310c094..b86d50a 100644 --- a/src/cs_state.cc +++ b/src/cs_state.cc @@ -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(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; } diff --git a/src/cs_val.cc b/src/cs_val.cc index 15963c6..b1832b0 100644 --- a/src/cs_val.cc +++ b/src/cs_val.cc @@ -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(&p_stor)}; + return bcode_p::make_ref(csv_get(&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(&p_stor)}; + return bcode_p::make_ref(csv_get(&p_stor)); } ident *any_value::get_ident() const { diff --git a/src/cs_vm.cc b/src/cs_vm.cc index b8ebb09..102f773 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -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(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: { diff --git a/src/lib_base.cc b/src/lib_base.cc index 9f39448..78b5889 100644 --- a/src/lib_base.cc +++ b/src/lib_base.cc @@ -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() ); }); diff --git a/src/lib_list.cc b/src/lib_list.cc index 9328f68..c85ed05 100644 --- a/src/lib_list.cc +++ b/src/lib_list.cc @@ -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() ); }); }