make push_alias/alias_stack responsible for unsetting unknown flag
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;
|
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;
|
st.next = p_astack;
|
||||||
p_astack = &st;
|
p_astack = &st;
|
||||||
if (um) {
|
|
||||||
p_flags &= ~IDENT_FLAG_UNKNOWN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void alias_impl::pop_arg() {
|
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)) {
|
if (ident_is_used_arg(this, ts)) {
|
||||||
p_astack->code = bcode_ref{};
|
p_astack->code = bcode_ref{};
|
||||||
} else {
|
} else {
|
||||||
push_arg(ts.idstack.emplace_back(*ts.pstate), false);
|
push_arg(ts.idstack.emplace_back(*ts.pstate));
|
||||||
ts.callstack->usedargs[get_index()] = true;
|
ts.callstack->usedargs[get_index()] = true;
|
||||||
}
|
}
|
||||||
p_astack->val_s = std::move(v);
|
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 */
|
/* external API for alias stack management */
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT alias_stack::alias_stack(state &cs, ident *a) {
|
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;
|
p_alias = nullptr;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
p_alias = static_cast<alias *>(a);
|
auto *aimp = static_cast<alias_impl *>(p_alias);
|
||||||
static_cast<alias_impl *>(p_alias)->push_arg(
|
p_alias = aimp;
|
||||||
|
aimp->push_arg(
|
||||||
cs.thread_pointer()->idstack.emplace_back(cs)
|
cs.thread_pointer()->idstack.emplace_back(cs)
|
||||||
);
|
);
|
||||||
|
aimp->p_flags &= ~IDENT_FLAG_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT alias_stack::~alias_stack() {
|
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, int flags);
|
||||||
alias_impl(state &cs, string_ref n, any_value v, 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 pop_arg();
|
||||||
void undo_arg(ident_stack &st);
|
void undo_arg(ident_stack &st);
|
||||||
void redo_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) {
|
static inline void push_alias(ident *id, ident_stack &st) {
|
||||||
if (id->is_alias() && !(id->get_flags() & IDENT_FLAG_ARG)) {
|
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();
|
std::size_t noff = ts.idstack.size();
|
||||||
for(std::size_t i = 0; i < callargs; i++) {
|
for(std::size_t i = 0; i < callargs; i++) {
|
||||||
auto &ap = *static_cast<alias_impl *>(ts.istate->identmap[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]);
|
ap.p_astack->val_s = std::move(args[offset + i]);
|
||||||
uargs[i] = true;
|
uargs[i] = true;
|
||||||
}
|
}
|
||||||
|
@ -738,7 +740,7 @@ std::uint32_t *vm_exec(
|
||||||
!ident_is_used_arg(a, ts)
|
!ident_is_used_arg(a, ts)
|
||||||
) {
|
) {
|
||||||
static_cast<alias_impl *>(a)->push_arg(
|
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;
|
ts.callstack->usedargs[a->get_index()] = true;
|
||||||
}
|
}
|
||||||
|
@ -756,7 +758,7 @@ std::uint32_t *vm_exec(
|
||||||
!ident_is_used_arg(id, ts)
|
!ident_is_used_arg(id, ts)
|
||||||
) {
|
) {
|
||||||
static_cast<alias_impl *>(id)->push_arg(
|
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;
|
ts.callstack->usedargs[id->get_index()] = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue