make push_alias/alias_stack responsible for unsetting unknown flag
This commit is contained in:
parent
9d7853a840
commit
99ec1a8583
|
@ -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<alias *>(a);
|
||||
static_cast<alias_impl *>(p_alias)->push_arg(
|
||||
auto *aimp = static_cast<alias_impl *>(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() {
|
||||
|
|
|
@ -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);
|
||||
|
|
10
src/cs_vm.cc
10
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<alias_impl *>(id)->push_arg(st);
|
||||
auto *aimp = static_cast<alias_impl *>(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<alias_impl *>(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<alias_impl *>(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<alias_impl *>(id)->push_arg(
|
||||
ts.idstack.emplace_back(*ts.pstate), false
|
||||
ts.idstack.emplace_back(*ts.pstate)
|
||||
);
|
||||
ts.callstack->usedargs[id->get_index()] = true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue