diff --git a/src/cs_ident.cc b/src/cs_ident.cc index a0cbf53..8a504fc 100644 --- a/src/cs_ident.cc +++ b/src/cs_ident.cc @@ -72,50 +72,49 @@ alias_impl::alias_impl( state &cs, string_ref name, string_ref a, int fl ): ident_impl{ident_type::ALIAS, name, fl}, - p_acode{nullptr}, p_astack{nullptr}, p_val{cs} + p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial} { - p_val.set_str(a); + p_initial.val_s.set_str(a); } alias_impl::alias_impl( state &cs, string_ref name, std::string_view a, int fl ): ident_impl{ident_type::ALIAS, name, fl}, - p_acode{nullptr}, p_astack{nullptr}, p_val{cs} + p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial} { - p_val.set_str(a); + p_initial.val_s.set_str(a); } alias_impl::alias_impl(state &cs, string_ref name, integer_type a, int fl): ident_impl{ident_type::ALIAS, name, fl}, - p_acode{nullptr}, p_astack{nullptr}, p_val{cs} + p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial} { - p_val.set_int(a); + p_initial.val_s.set_int(a); } alias_impl::alias_impl(state &cs, string_ref name, float_type a, int fl): ident_impl{ident_type::ALIAS, name, fl}, - p_acode{nullptr}, p_astack{nullptr}, p_val{cs} + p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial} { - p_val.set_float(a); + p_initial.val_s.set_float(a); } alias_impl::alias_impl(state &cs, string_ref name, int fl): ident_impl{ident_type::ALIAS, name, fl}, - p_acode{nullptr}, p_astack{nullptr}, p_val{cs} + p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial} { - p_val.set_none(); + p_initial.val_s.set_none(); } alias_impl::alias_impl(state &cs, string_ref name, any_value v, int fl): ident_impl{ident_type::ALIAS, name, fl}, - p_acode{nullptr}, p_astack{nullptr}, p_val{cs} + p_initial{cs}, p_acode{nullptr}, p_astack{&p_initial} { - p_val = v; + p_initial.val_s = v; } void alias_impl::push_arg(ident_stack &st, bool um) { - st.val_s = std::move(p_val); st.next = p_astack; p_astack = &st; clean_code(); @@ -125,29 +124,21 @@ void alias_impl::push_arg(ident_stack &st, bool um) { } void alias_impl::pop_arg() { - if (!p_astack) { + if (p_astack == &p_initial) { return; } - ident_stack *st = p_astack; - p_val = std::move(p_astack->val_s); + p_astack = p_astack->next; clean_code(); - p_astack = st->next; } void alias_impl::undo_arg(ident_stack &st) { - ident_stack *prev = p_astack; - st.val_s = std::move(p_val); - st.next = prev; - p_astack = prev->next; - p_val = std::move(prev->val_s); + st.next = p_astack; + p_astack = p_astack->next; clean_code(); } void alias_impl::redo_arg(ident_stack &st) { - ident_stack *prev = st.next; - prev->val_s = std::move(p_val); - p_astack = prev; - p_val = std::move(st.val_s); + p_astack = st.next; clean_code(); } @@ -158,11 +149,11 @@ void alias_impl::set_arg(thread_state &ts, any_value &v) { push_arg(ts.idstack.emplace_back(*ts.pstate), false); ts.callstack->usedargs[get_index()] = true; } - p_val = std::move(v); + p_astack->val_s = std::move(v); } void alias_impl::set_alias(thread_state &ts, any_value &v) { - p_val = std::move(v); + p_astack->val_s = std::move(v); clean_code(); p_flags = (p_flags & ts.pstate->identflags) | ts.pstate->identflags; } @@ -400,7 +391,7 @@ LIBCUBESCRIPT_EXPORT void string_var::set_value(string_ref val) { } LIBCUBESCRIPT_EXPORT any_value alias::get_value() const { - return static_cast(this)->p_val; + return static_cast(this)->p_astack->val_s; } LIBCUBESCRIPT_EXPORT std::string_view command::get_args() const { @@ -432,7 +423,7 @@ LIBCUBESCRIPT_EXPORT bool alias_stack::set(any_value val) { if (!p_alias) { return false; } - static_cast(p_alias)->p_val = std::move(val); + static_cast(p_alias)->p_astack->val_s = std::move(val); return true; } diff --git a/src/cs_ident.hh b/src/cs_ident.hh index 197ac0c..71d92cb 100644 --- a/src/cs_ident.hh +++ b/src/cs_ident.hh @@ -105,9 +105,9 @@ struct alias_impl: ident_impl, alias { void clean_code(); bcode *compile_code(thread_state &ts); + ident_stack p_initial; bcode *p_acode; ident_stack *p_astack; - any_value p_val; }; struct command_impl: ident_impl, command { diff --git a/src/cs_vm.cc b/src/cs_vm.cc index bafd94b..111eeb2 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -212,7 +212,7 @@ void exec_alias( 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.p_val = std::move(args[offset + i]); + ap.p_astack->val_s = std::move(args[offset + i]); uargs[i] = true; } auto oldargs = anargs->get_value(); diff --git a/tools/edit_linenoise.hh b/tools/edit_linenoise.hh index a8ba57f..13e585a 100644 --- a/tools/edit_linenoise.hh +++ b/tools/edit_linenoise.hh @@ -42,10 +42,6 @@ inline std::string ln_hint(char const *buf, int &color, int &bold) { return args; } -inline void ln_hint_free(void *hint) { - delete[] static_cast(hint); -} - inline void init_lineedit(cs::state &cs, std::string_view) { /* sensible default history size */ linenoise::SetHistoryMaxLen(1000);