From 1def48cf7604801abd87e81da8e806e070c1b060 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 30 Mar 2021 20:37:50 +0200 Subject: [PATCH] redo alias_stack for robustness (guarantee order of push/pop) --- include/cubescript/cubescript.hh | 10 ++---- src/cs_ident.cc | 52 ++++++++------------------------ src/lib_base.cc | 8 ++--- 3 files changed, 20 insertions(+), 50 deletions(-) diff --git a/include/cubescript/cubescript.hh b/include/cubescript/cubescript.hh index 3ea5eb6..56afcf0 100644 --- a/include/cubescript/cubescript.hh +++ b/include/cubescript/cubescript.hh @@ -826,19 +826,15 @@ struct LIBCUBESCRIPT_EXPORT alias_stack { alias_stack &operator=(alias_stack const &) = delete; alias_stack &operator=(alias_stack &&v) = delete; - bool set_alias(ident *id); - alias *get_alias() const noexcept; - bool has_alias() const noexcept; + alias *get_alias() noexcept { return p_alias; } + alias const *get_alias() const noexcept { return p_alias; } - bool push(any_value val); - bool pop(); + bool set(any_value val); explicit operator bool() const noexcept; private: - state &p_state; alias *p_alias; - bool p_pushed; }; struct LIBCUBESCRIPT_EXPORT stacked_value: any_value { diff --git a/src/cs_ident.cc b/src/cs_ident.cc index 411b4b2..a0cbf53 100644 --- a/src/cs_ident.cc +++ b/src/cs_ident.cc @@ -413,57 +413,31 @@ LIBCUBESCRIPT_EXPORT int command::get_num_args() const { /* external API for alias stack management */ -LIBCUBESCRIPT_EXPORT alias_stack::alias_stack(state &cs, ident *a): - p_state{cs}, p_pushed{false} -{ - set_alias(a); +LIBCUBESCRIPT_EXPORT alias_stack::alias_stack(state &cs, ident *a) { + if (!a || !a->is_alias()) { + p_alias = nullptr; + return; + } + p_alias = static_cast(a); + static_cast(p_alias)->push_arg( + cs.thread_pointer()->idstack.emplace_back(cs) + ); } LIBCUBESCRIPT_EXPORT alias_stack::~alias_stack() { - pop(); + static_cast(p_alias)->pop_arg(); } -LIBCUBESCRIPT_EXPORT bool alias_stack::set_alias(ident *id) { - if (!id || !id->is_alias()) { - return false; - } - p_alias = static_cast(id); - return true; -} - -LIBCUBESCRIPT_EXPORT alias *alias_stack::get_alias() const noexcept { - return p_alias; -} - -LIBCUBESCRIPT_EXPORT bool alias_stack::has_alias() const noexcept { - return !!p_alias; -} - -LIBCUBESCRIPT_EXPORT bool alias_stack::push(any_value val) { +LIBCUBESCRIPT_EXPORT bool alias_stack::set(any_value val) { if (!p_alias) { return false; } - auto &ts = *p_state.thread_pointer(); - auto &ap = *static_cast(p_alias); - if (!p_pushed) { - ap.push_arg(ts.idstack.emplace_back(p_state)); - p_pushed = true; - } - ap.p_val = std::move(val); - return true; -} - -LIBCUBESCRIPT_EXPORT bool alias_stack::pop() { - if (!p_pushed || !p_alias) { - return false; - } - static_cast(p_alias)->pop_arg(); - p_pushed = false; + static_cast(p_alias)->p_val = std::move(val); return true; } LIBCUBESCRIPT_EXPORT alias_stack::operator bool() const noexcept { - return has_alias(); + return !!p_alias; } } /* namespace cubescript */ diff --git a/src/lib_base.cc b/src/lib_base.cc index 3b5658f..7958268 100644 --- a/src/lib_base.cc +++ b/src/lib_base.cc @@ -16,7 +16,7 @@ static inline void do_loop( any_value idv{cs}; for (integer_type i = 0; i < n; ++i) { idv.set_int(offset + i * step); - st.push(idv); + st.set(idv); if (cond && !cs.run(cond).get_bool()) { break; } @@ -42,7 +42,7 @@ static inline void do_loop_conc( any_value idv{cs}; for (integer_type i = 0; i < n; ++i) { idv.set_int(offset + i * step); - st.push(idv); + st.set(idv); any_value v{cs}; switch (cs.run_loop(body, v)) { case loop_state::BREAK: @@ -163,7 +163,7 @@ void init_lib_base(state &gcs) { return; } if (args[1].get_bool()) { - st.push(args[1]); + st.set(args[1]); cs.run(args[2].get_code(), res); } } @@ -306,7 +306,7 @@ end: if (st.get_alias()->get_flags() & IDENT_FLAG_ARG) { return; } - st.push(args[1]); + st.set(args[1]); cs.run(args[2].get_code(), res); } });