diff --git a/src/cs_val.cc b/src/cs_val.cc index 2fa0fda..a9d20b7 100644 --- a/src/cs_val.cc +++ b/src/cs_val.cc @@ -4,6 +4,18 @@ namespace cscript { +static cs_string intstr(cs_int v) { + auto app = ostd::appender(); + cscript::util::format_int(app, v); + return std::move(app.get()); +} + +static cs_string floatstr(cs_float v) { + auto app = ostd::appender(); + cscript::util::format_float(app, v); + return std::move(app.get()); +} + template struct stor_priv_t { cs_shared_state *state; diff --git a/src/cs_vm.cc b/src/cs_vm.cc index 655502f..6196f36 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -1021,14 +1021,12 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { arg.set_str(static_cast(id)->get_value()); continue; case CsIdIvar: - arg.set_str( - intstr(static_cast(id)->get_value()) - ); + arg.set_int(static_cast(id)->get_value()); + arg.force_str(); continue; case CsIdFvar: - arg.set_str( - floatstr(static_cast(id)->get_value()) - ); + arg.set_float(static_cast(id)->get_value()); + arg.force_str(); continue; case CsIdUnknown: arg.set_str(""); @@ -1189,14 +1187,12 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { arg.set_str(static_cast(id)->get_value()); continue; case CsIdIvar: - arg.set_str( - intstr(static_cast(id)->get_value()) - ); + arg.set_int(static_cast(id)->get_value()); + arg.force_str(); continue; case CsIdFvar: - arg.set_str( - floatstr(static_cast(id)->get_value()) - ); + arg.set_float(static_cast(id)->get_value()); + arg.force_str(); continue; case CsIdUnknown: arg.set_str(""); @@ -1285,9 +1281,10 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { )->get_value()); continue; case CS_CODE_IVAR | CS_RET_STRING: - args[numargs++].set_str(intstr(static_cast( + args[numargs].set_int(static_cast( cs.p_state->identmap[op >> 8] - )->get_value())); + )->get_value()); + args[numargs++].force_str(); continue; case CS_CODE_IVAR | CS_RET_FLOAT: args[numargs++].set_float(cs_float(static_cast( @@ -1324,11 +1321,10 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { )->get_value()); continue; case CS_CODE_FVAR | CS_RET_STRING: - args[numargs++].set_str(floatstr( - static_cast( - cs.p_state->identmap[op >> 8] - )->get_value() - )); + args[numargs].set_int(static_cast( + cs.p_state->identmap[op >> 8] + )->get_value()); + args[numargs++].force_str(); continue; case CS_CODE_FVAR | CS_RET_INT: args[numargs++].set_int(int(static_cast( diff --git a/src/cs_vm.hh b/src/cs_vm.hh index 5c049c2..29bb898 100644 --- a/src/cs_vm.hh +++ b/src/cs_vm.hh @@ -314,9 +314,6 @@ struct cs_gen_state { void skip_comments(); }; -cs_string intstr(cs_int v); -cs_string floatstr(cs_float v); - bool cs_check_num(ostd::string_range s); static inline void bcode_incr(uint32_t *bc) { diff --git a/src/cubescript.cc b/src/cubescript.cc index 6b95013..4d878de 100644 --- a/src/cubescript.cc +++ b/src/cubescript.cc @@ -3,18 +3,6 @@ namespace cscript { -cs_string intstr(cs_int v) { - auto app = ostd::appender(); - cscript::util::format_int(app, v); - return std::move(app.get()); -} - -cs_string floatstr(cs_float v) { - auto app = ostd::appender(); - cscript::util::format_float(app, v); - return std::move(app.get()); -} - bool cs_check_num(ostd::string_range s) { if (isdigit(s[0])) { return true; @@ -879,9 +867,12 @@ cs_float cs_clamp_fvar(cs_state &cs, cs_fvar *fv, cs_float v) { } else { return v; } + cs_value vmin{cs}, vmax{cs}; + vmin.set_float(fv->get_val_min()); + vmax.set_float(fv->get_val_max()); throw cs_error( - cs, "valid range for '%s' is %s..%s", floatstr(fv->get_val_min()), - floatstr(fv->get_val_max()) + cs, "valid range for '%s' is %s..%s", fv->get_name(), + vmin.force_str(), vmax.force_str() ); return v; }