master
Daniel Kolesa 2016-08-21 00:37:34 +01:00
parent 4408b849da
commit 5c3aa477d2
3 changed files with 24 additions and 26 deletions

View File

@ -67,31 +67,31 @@ Svar::Svar(ostd::ConstCharRange name, char **s, VarCb f, int fl):
Alias::Alias(ostd::ConstCharRange name, char *a, int fl):
Ident(IdentType::alias, name, fl),
code(nullptr), stack(nullptr)
code(nullptr), p_astack(nullptr)
{
val_v.set_mstr(a);
}
Alias::Alias(ostd::ConstCharRange name, CsInt a, int fl):
Ident(IdentType::alias, name, fl),
code(nullptr), stack(nullptr)
code(nullptr), p_astack(nullptr)
{
val_v.set_int(a);
}
Alias::Alias(ostd::ConstCharRange name, CsFloat a, int fl):
Ident(IdentType::alias, name, fl),
code(nullptr), stack(nullptr)
code(nullptr), p_astack(nullptr)
{
val_v.set_float(a);
}
Alias::Alias(ostd::ConstCharRange name, int fl):
Ident(IdentType::alias, name, fl),
code(nullptr), stack(nullptr)
code(nullptr), p_astack(nullptr)
{
val_v.set_null();
}
Alias::Alias(ostd::ConstCharRange name, CsValue const &v, int fl):
Ident(IdentType::alias, name, fl),
code(nullptr), stack(nullptr), val_v(v)
code(nullptr), val_v(v), p_astack(nullptr)
{}
Command::Command(
@ -731,9 +731,16 @@ void Alias::clean_code() {
}
void Alias::push_arg(CsValue const &v, IdentStack &st, bool um) {
if (p_astack == &st) {
/* prevent cycles and unnecessary code elsewhere */
cleanup_value();
set_value(v);
clean_code();
return;
}
st.val_s = val_v;
st.next = stack;
stack = &st;
st.next = p_astack;
p_astack = &st;
set_value(v);
clean_code();
if (um) {
@ -742,21 +749,21 @@ void Alias::push_arg(CsValue const &v, IdentStack &st, bool um) {
}
void Alias::pop_arg() {
if (!stack) {
if (!p_astack) {
return;
}
IdentStack *st = stack;
IdentStack *st = p_astack;
cleanup_value();
set_value(*stack);
set_value(*p_astack);
clean_code();
stack = st->next;
p_astack = st->next;
}
void Alias::undo_arg(IdentStack &st) {
IdentStack *prev = stack;
IdentStack *prev = p_astack;
st.val_s = val_v;
st.next = prev;
stack = prev->next;
p_astack = prev->next;
set_value(*prev);
clean_code();
}
@ -764,7 +771,7 @@ void Alias::undo_arg(IdentStack &st) {
void Alias::redo_arg(IdentStack const &st) {
IdentStack *prev = st.next;
prev->val_s = val_v;
stack = prev;
p_astack = prev;
set_value(st);
clean_code();
}
@ -1165,11 +1172,6 @@ void cs_init_lib_io(CsState &cs) {
}
static inline void cs_set_iter(Alias &a, CsInt i, IdentStack &stack) {
if (a.stack == &stack) {
a.cleanup_value();
a.val_v.set_int(i);
return;
}
CsValue v;
v.set_int(i);
a.push_arg(v, stack);

View File

@ -296,7 +296,6 @@ private:
struct OSTD_EXPORT Alias: Ident {
Bytecode *code;
IdentStack *stack;
CsValue val_v;
Alias(ostd::ConstCharRange n, char *a, int flags);
@ -346,6 +345,9 @@ struct OSTD_EXPORT Alias: Ident {
cleanup_value();
val_v.set_null();
}
private:
IdentStack *p_astack;
};
struct IdentLink {

View File

@ -69,12 +69,6 @@ static inline void cs_list_assoc(CsValueRange args, CsValue &res, F cmp) {
}
static inline void cs_set_iter(Alias &a, char *val, IdentStack &stack) {
if (a.stack == &stack) {
a.cleanup_value();
a.clean_code();
a.set_value_mstr(val);
return;
}
CsValue v;
v.set_mstr(val);
a.push_arg(v, stack);