From 970e37f318441ed30ce00d789ab16cc68a703584 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 30 Mar 2021 20:24:46 +0200 Subject: [PATCH] make alias pushing separate from setting value --- src/cs_ident.cc | 15 ++++++--------- src/cs_ident.hh | 2 +- src/cs_val.cc | 10 +++------- src/cs_vm.cc | 17 ++++++----------- 4 files changed, 16 insertions(+), 28 deletions(-) diff --git a/src/cs_ident.cc b/src/cs_ident.cc index 628d832..411b4b2 100644 --- a/src/cs_ident.cc +++ b/src/cs_ident.cc @@ -114,11 +114,10 @@ alias_impl::alias_impl(state &cs, string_ref name, any_value v, int fl): p_val = v; } -void alias_impl::push_arg(any_value &v, ident_stack &st, bool um) { +void alias_impl::push_arg(ident_stack &st, bool um) { st.val_s = std::move(p_val); st.next = p_astack; p_astack = &st; - p_val = std::move(v); clean_code(); if (um) { p_flags &= ~IDENT_FLAG_UNKNOWN; @@ -154,12 +153,12 @@ void alias_impl::redo_arg(ident_stack &st) { void alias_impl::set_arg(thread_state &ts, any_value &v) { if (ident_is_used_arg(this, ts)) { - p_val = std::move(v); clean_code(); } else { - push_arg(v, ts.idstack.emplace_back(*ts.pstate), false); + push_arg(ts.idstack.emplace_back(*ts.pstate), false); ts.callstack->usedargs[get_index()] = true; } + p_val = std::move(v); } void alias_impl::set_alias(thread_state &ts, any_value &v) { @@ -445,14 +444,12 @@ LIBCUBESCRIPT_EXPORT bool alias_stack::push(any_value val) { return false; } auto &ts = *p_state.thread_pointer(); + auto &ap = *static_cast(p_alias); if (!p_pushed) { - static_cast(p_alias)->push_arg( - val, ts.idstack.emplace_back(p_state) - ); + ap.push_arg(ts.idstack.emplace_back(p_state)); p_pushed = true; - } else { - static_cast(p_alias)->p_val = std::move(val); } + ap.p_val = std::move(val); return true; } diff --git a/src/cs_ident.hh b/src/cs_ident.hh index 259e91f..197ac0c 100644 --- a/src/cs_ident.hh +++ b/src/cs_ident.hh @@ -95,7 +95,7 @@ struct alias_impl: ident_impl, alias { alias_impl(state &cs, string_ref n, int flags); alias_impl(state &cs, string_ref n, any_value v, int flags); - void push_arg(any_value &v, ident_stack &st, bool um = true); + void push_arg(ident_stack &st, bool um = true); void pop_arg(); void undo_arg(ident_stack &st); void redo_arg(ident_stack &st); diff --git a/src/cs_val.cc b/src/cs_val.cc index 44ee9ab..b7aab40 100644 --- a/src/cs_val.cc +++ b/src/cs_val.cc @@ -452,16 +452,12 @@ bool stacked_value::push() { return false; } auto &ts = *p_state.thread_pointer(); + auto &ap = *static_cast(p_a); if (!p_pushed) { - static_cast(p_a)->push_arg( - *this, ts.idstack.emplace_back(p_state) - ); + ap.push_arg(ts.idstack.emplace_back(p_state)); p_pushed = true; - } else { - static_cast(p_a)->p_val = std::move( - *static_cast(this) - ); } + ap.p_val = std::move(*static_cast(this)); return true; } diff --git a/src/cs_vm.cc b/src/cs_vm.cc index e148ac4..0d1fadc 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -10,8 +10,7 @@ namespace cubescript { static inline void push_alias(state &cs, ident *id, ident_stack &st) { if (id->is_alias() && !(id->get_flags() & IDENT_FLAG_ARG)) { - any_value nv{cs}; - static_cast(id)->push_arg(nv, st); + static_cast(id)->push_arg(st); } } @@ -210,9 +209,9 @@ void exec_alias( argset uargs{}; std::size_t noff = ts.idstack.size(); for(std::size_t i = 0; i < callargs; i++) { - static_cast(ts.istate->identmap[i])->push_arg( - args[offset + i], ts.idstack.emplace_back(*ts.pstate), false - ); + auto &ap = *static_cast(ts.istate->identmap[i]); + ap.push_arg(ts.idstack.emplace_back(*ts.pstate), false); + ap.p_val = std::move(args[offset + i]); uargs[i] = true; } auto oldargs = anargs->get_value(); @@ -728,10 +727,8 @@ std::uint32_t *vm_exec( (a->get_flags() & IDENT_FLAG_ARG) && !ident_is_used_arg(a, ts) ) { - any_value nv{cs}; static_cast(a)->push_arg( - nv, ts.idstack.emplace_back(*ts.pstate), - false + ts.idstack.emplace_back(*ts.pstate), false ); ts.callstack->usedargs[a->get_index()] = true; } @@ -748,10 +745,8 @@ std::uint32_t *vm_exec( (id->get_flags() & IDENT_FLAG_ARG) && !ident_is_used_arg(id, ts) ) { - any_value nv{cs}; static_cast(id)->push_arg( - nv, ts.idstack.emplace_back(*ts.pstate), - false + ts.idstack.emplace_back(*ts.pstate), false ); ts.callstack->usedargs[id->get_index()] = true; }