diff --git a/src/cs_ident.cc b/src/cs_ident.cc index 22b8e26..a3c1967 100644 --- a/src/cs_ident.cc +++ b/src/cs_ident.cc @@ -114,12 +114,9 @@ alias_impl::alias_impl(state &cs, string_ref name, any_value v, int fl): p_initial.val_s = v; } -void alias_impl::push_arg(ident_stack &st, bool um) { +void alias_impl::push_arg(ident_stack &st) { st.next = p_astack; p_astack = &st; - if (um) { - p_flags &= ~IDENT_FLAG_UNKNOWN; - } } void alias_impl::pop_arg() { @@ -142,7 +139,7 @@ void alias_impl::set_arg(thread_state &ts, any_value &v) { if (ident_is_used_arg(this, ts)) { p_astack->code = bcode_ref{}; } else { - push_arg(ts.idstack.emplace_back(*ts.pstate), false); + push_arg(ts.idstack.emplace_back(*ts.pstate)); ts.callstack->usedargs[get_index()] = true; } p_astack->val_s = std::move(v); @@ -389,14 +386,16 @@ LIBCUBESCRIPT_EXPORT int command::get_num_args() const { /* external API for alias stack management */ LIBCUBESCRIPT_EXPORT alias_stack::alias_stack(state &cs, ident *a) { - if (!a || !a->is_alias()) { + if (!a || !a->is_alias() || (a->get_flags() & IDENT_FLAG_ARG)) { p_alias = nullptr; return; } - p_alias = static_cast(a); - static_cast(p_alias)->push_arg( + auto *aimp = static_cast(p_alias); + p_alias = aimp; + aimp->push_arg( cs.thread_pointer()->idstack.emplace_back(cs) ); + aimp->p_flags &= ~IDENT_FLAG_UNKNOWN; } LIBCUBESCRIPT_EXPORT alias_stack::~alias_stack() { diff --git a/src/cs_ident.hh b/src/cs_ident.hh index 4b957ba..938dc73 100644 --- a/src/cs_ident.hh +++ b/src/cs_ident.hh @@ -96,7 +96,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(ident_stack &st, bool um = true); + void push_arg(ident_stack &st); void pop_arg(); void undo_arg(ident_stack &st); void redo_arg(ident_stack &st); diff --git a/src/cs_vm.cc b/src/cs_vm.cc index f69722e..d6c9092 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -11,7 +11,9 @@ namespace cubescript { static inline void push_alias(ident *id, ident_stack &st) { if (id->is_alias() && !(id->get_flags() & IDENT_FLAG_ARG)) { - static_cast(id)->push_arg(st); + auto *aimp = static_cast(id); + aimp->push_arg(st); + aimp->p_flags &= ~IDENT_FLAG_UNKNOWN; } } @@ -211,7 +213,7 @@ void exec_alias( std::size_t noff = ts.idstack.size(); for(std::size_t i = 0; i < callargs; i++) { auto &ap = *static_cast(ts.istate->identmap[i]); - ap.push_arg(ts.idstack.emplace_back(*ts.pstate), false); + ap.push_arg(ts.idstack.emplace_back(*ts.pstate)); ap.p_astack->val_s = std::move(args[offset + i]); uargs[i] = true; } @@ -738,7 +740,7 @@ std::uint32_t *vm_exec( !ident_is_used_arg(a, ts) ) { static_cast(a)->push_arg( - ts.idstack.emplace_back(*ts.pstate), false + ts.idstack.emplace_back(*ts.pstate) ); ts.callstack->usedargs[a->get_index()] = true; } @@ -756,7 +758,7 @@ std::uint32_t *vm_exec( !ident_is_used_arg(id, ts) ) { static_cast(id)->push_arg( - ts.idstack.emplace_back(*ts.pstate), false + ts.idstack.emplace_back(*ts.pstate) ); ts.callstack->usedargs[id->get_index()] = true; }