make push_alias/alias_stack responsible for unsetting unknown flag

master
Daniel Kolesa 2021-04-02 04:34:14 +02:00
parent 9d7853a840
commit 99ec1a8583
3 changed files with 14 additions and 13 deletions

View File

@ -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() {

View File

@ -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);

View File

@ -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;
}