From bab8633a051d5a7844788b67fca26f02adb3bd2a Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Sun, 4 Apr 2021 02:58:04 +0200 Subject: [PATCH] add proper var value setting helpers --- include/cubescript/cubescript.hh | 9 ++++-- src/cs_ident.cc | 51 ++++++++++++++++++++++++++++++-- src/cs_state.cc | 6 ++-- src/cs_vm.cc | 4 +-- tools/repl.cc | 26 ++++------------ 5 files changed, 64 insertions(+), 32 deletions(-) diff --git a/include/cubescript/cubescript.hh b/include/cubescript/cubescript.hh index fe54826..3ceac87 100644 --- a/include/cubescript/cubescript.hh +++ b/include/cubescript/cubescript.hh @@ -261,7 +261,8 @@ protected: struct LIBCUBESCRIPT_EXPORT integer_var: global_var { integer_type get_value() const; - void set_value(integer_type val); + void set_value(state &cs, integer_type val, bool do_write = true); + void set_raw_value(integer_type val); protected: integer_var() = default; @@ -269,7 +270,8 @@ protected: struct LIBCUBESCRIPT_EXPORT float_var: global_var { float_type get_value() const; - void set_value(float_type val); + void set_value(state &cs, float_type val, bool do_write = true); + void set_raw_value(float_type val); protected: float_var() = default; @@ -277,7 +279,8 @@ protected: struct LIBCUBESCRIPT_EXPORT string_var: global_var { string_ref get_value() const; - void set_value(string_ref val); + void set_value(state &cs, string_ref val, bool do_write = true); + void set_raw_value(string_ref val); protected: string_var() = default; diff --git a/src/cs_ident.cc b/src/cs_ident.cc index f79cbbf..10f268e 100644 --- a/src/cs_ident.cc +++ b/src/cs_ident.cc @@ -350,7 +350,22 @@ LIBCUBESCRIPT_EXPORT integer_type integer_var::get_value() const { return static_cast(this)->p_storage; } -LIBCUBESCRIPT_EXPORT void integer_var::set_value(integer_type val) { +LIBCUBESCRIPT_EXPORT void integer_var::set_value( + state &cs, integer_type val, bool do_write +) { + if (is_read_only()) { + throw error{ + cs, "variable '%s' is read only", get_name().data() + }; + } + if (!do_write) { + return; + } + save(cs); + set_raw_value(val); +} + +LIBCUBESCRIPT_EXPORT void integer_var::set_raw_value(integer_type val) { static_cast(this)->p_storage = val; } @@ -358,7 +373,22 @@ LIBCUBESCRIPT_EXPORT float_type float_var::get_value() const { return static_cast(this)->p_storage; } -LIBCUBESCRIPT_EXPORT void float_var::set_value(float_type val) { +LIBCUBESCRIPT_EXPORT void float_var::set_value( + state &cs, float_type val, bool do_write +) { + if (is_read_only()) { + throw error{ + cs, "variable '%s' is read only", get_name().data() + }; + } + if (!do_write) { + return; + } + save(cs); + set_raw_value(val); +} + +LIBCUBESCRIPT_EXPORT void float_var::set_raw_value(float_type val) { static_cast(this)->p_storage = val; } @@ -366,7 +396,22 @@ LIBCUBESCRIPT_EXPORT string_ref string_var::get_value() const { return static_cast(this)->p_storage; } -LIBCUBESCRIPT_EXPORT void string_var::set_value(string_ref val) { +LIBCUBESCRIPT_EXPORT void string_var::set_value( + state &cs, string_ref val, bool do_write +) { + if (is_read_only()) { + throw error{ + cs, "variable '%s' is read only", get_name().data() + }; + } + if (!do_write) { + return; + } + save(cs); + set_raw_value(std::move(val)); +} + +LIBCUBESCRIPT_EXPORT void string_var::set_raw_value(string_ref val) { static_cast(this)->p_storage = val; } diff --git a/src/cs_state.cc b/src/cs_state.cc index e714d73..c268671 100644 --- a/src/cs_state.cc +++ b/src/cs_state.cc @@ -302,7 +302,7 @@ LIBCUBESCRIPT_EXPORT void state::clear_override(ident &id) { } case ident_type::IVAR: { ivar_impl &iv = static_cast(id); - iv.set_value(iv.p_override); + iv.set_raw_value(iv.p_override); //iv.changed(*this); static_cast( static_cast(&iv) @@ -311,7 +311,7 @@ LIBCUBESCRIPT_EXPORT void state::clear_override(ident &id) { } case ident_type::FVAR: { fvar_impl &fv = static_cast(id); - fv.set_value(fv.p_override); + fv.set_raw_value(fv.p_override); //fv.changed(*this); static_cast( static_cast(&fv) @@ -320,7 +320,7 @@ LIBCUBESCRIPT_EXPORT void state::clear_override(ident &id) { } case ident_type::SVAR: { svar_impl &sv = static_cast(id); - sv.set_value(sv.p_override); + sv.set_raw_value(sv.p_override); //sv.changed(*this); static_cast( static_cast(&sv) diff --git a/src/cs_vm.cc b/src/cs_vm.cc index 4611390..b12f1cf 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -234,7 +234,7 @@ bool exec_alias( auto oldargs = anargs->get_value(); auto oldflags = ts.ident_flags; ts.ident_flags = aast.flags; - anargs->set_value(integer_type(callargs)); + anargs->set_raw_value(integer_type(callargs)); ident_link aliaslink = {a, ts.callstack, uargs}; ts.callstack = &aliaslink; if (!aast.node->code) { @@ -267,7 +267,7 @@ bool exec_alias( } ts.idstack.resize(noff, ident_stack{*ts.pstate}); force_arg(result, op & BC_INST_RET_MASK); - anargs->set_value(integer_type(oldargs)); + anargs->set_raw_value(integer_type(oldargs)); nargs = offset - skip; }; try { diff --git a/tools/repl.cc b/tools/repl.cc index 3b9a879..148501f 100644 --- a/tools/repl.cc +++ b/tools/repl.cc @@ -336,21 +336,15 @@ int main(int argc, char **argv) { } return; } - if (iv->is_read_only()) { - throw cs::error{ - css, "variable '%s' is read only", iv->get_name().data() - }; - } - iv->save(css); if (nargs == 2) { - iv->set_value(args[1].get_int()); + iv->set_value(css, args[1].get_int()); } else if (nargs == 3) { iv->set_value( - (args[1].get_int() << 8) | (args[2].get_int() << 16) + css, (args[1].get_int() << 8) | (args[2].get_int() << 16) ); } else { iv->set_value( - args[1].get_int() | (args[2].get_int() << 8) | + css, args[1].get_int() | (args[2].get_int() << 8) | (args[3].get_int() << 16) ); } @@ -366,13 +360,8 @@ int main(int argc, char **argv) { } else { std::printf("%s = %.7g\n", fv->get_name().data(), val); } - } else if (fv->is_read_only()) { - throw cs::error{ - css, "variable '%s' is read only", fv->get_name().data() - }; } else { - fv->save(css); - fv->set_value(args[1].get_float()); + fv->set_value(css, args[1].get_float()); } }); @@ -386,13 +375,8 @@ int main(int argc, char **argv) { } else { std::printf("%s = [%s]\n", sv->get_name().data(), val.data()); } - } else if (sv->is_read_only()) { - throw cs::error{ - css, "variable '%s' is read only", sv->get_name().data() - }; } else { - sv->save(css); - sv->set_value(args[1].get_str()); + sv->set_value(css, args[1].get_str()); } });