reduce copying strings around (ensure refs are not erased)
parent
64130a12bf
commit
e3cff816c7
|
@ -322,7 +322,6 @@ struct OSTD_EXPORT cs_alias: cs_ident {
|
||||||
return p_val;
|
return p_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_cstr(cs_value &v) const;
|
|
||||||
void get_cval(cs_value &v) const;
|
void get_cval(cs_value &v) const;
|
||||||
private:
|
private:
|
||||||
cs_alias(cs_state &cs, ostd::string_range n, cs_string a, int flags);
|
cs_alias(cs_state &cs, ostd::string_range n, cs_string a, int flags);
|
||||||
|
|
47
src/cs_vm.cc
47
src/cs_vm.cc
|
@ -457,7 +457,7 @@ static inline void callcommand(
|
||||||
auto buf = ostd::appender<cs_string>();
|
auto buf = ostd::appender<cs_string>();
|
||||||
cscript::util::tvals_concat(buf, ostd::iter(args, args + i), " ");
|
cscript::util::tvals_concat(buf, ostd::iter(args, args + i), " ");
|
||||||
cs_value tv{cs};
|
cs_value tv{cs};
|
||||||
tv.set_str(std::move(buf.get()));
|
tv.set_str(buf.get());
|
||||||
cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), res);
|
cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -792,7 +792,7 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
|
|
||||||
case CsCodeVal | CsRetString: {
|
case CsCodeVal | CsRetString: {
|
||||||
uint32_t len = op >> 8;
|
uint32_t len = op >> 8;
|
||||||
args[numargs++].set_str(cs_string{
|
args[numargs++].set_str(ostd::string_range{
|
||||||
reinterpret_cast<char const *>(code),
|
reinterpret_cast<char const *>(code),
|
||||||
reinterpret_cast<char const *>(code) + len
|
reinterpret_cast<char const *>(code) + len
|
||||||
});
|
});
|
||||||
|
@ -845,7 +845,8 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
numargs++;
|
numargs++;
|
||||||
continue;
|
continue;
|
||||||
case CsCodeDup | CsRetString:
|
case CsCodeDup | CsRetString:
|
||||||
args[numargs].set_str(args[numargs - 1].get_str());
|
args[numargs] = args[numargs - 1];
|
||||||
|
args[numargs].force_str();
|
||||||
numargs++;
|
numargs++;
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -1002,14 +1003,11 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
cs_value &arg = args[numargs - 1];
|
cs_value &arg = args[numargs - 1];
|
||||||
switch (cs_get_lookupu_type(cs, arg, id, op)) {
|
switch (cs_get_lookupu_type(cs, arg, id, op)) {
|
||||||
case CsIdAlias:
|
case CsIdAlias:
|
||||||
arg.set_str(
|
arg = static_cast<cs_alias *>(id)->get_value();
|
||||||
static_cast<cs_alias *>(id)->get_value().get_str()
|
arg.force_str();
|
||||||
);
|
|
||||||
continue;
|
continue;
|
||||||
case CsIdSvar:
|
case CsIdSvar:
|
||||||
arg.set_str(cs_string{
|
arg.set_str(static_cast<cs_svar *>(id)->get_value());
|
||||||
static_cast<cs_svar *>(id)->get_value()
|
|
||||||
});
|
|
||||||
continue;
|
continue;
|
||||||
case CsIdIvar:
|
case CsIdIvar:
|
||||||
arg.set_str(
|
arg.set_str(
|
||||||
|
@ -1029,16 +1027,16 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case CsCodeLookup | CsRetString:
|
case CsCodeLookup | CsRetString:
|
||||||
args[numargs++].set_str(
|
args[numargs] = cs_get_lookup_id(cs, op)->get_value();
|
||||||
cs_get_lookup_id(cs, op)->get_value().get_str()
|
args[numargs++].force_str();
|
||||||
);
|
|
||||||
continue;
|
continue;
|
||||||
case CsCodeLookupArg | CsRetString: {
|
case CsCodeLookupArg | CsRetString: {
|
||||||
cs_alias *a = cs_get_lookuparg_id(cs, op);
|
cs_alias *a = cs_get_lookuparg_id(cs, op);
|
||||||
if (!a) {
|
if (!a) {
|
||||||
args[numargs++].set_str("");
|
args[numargs++].set_str("");
|
||||||
} else {
|
} else {
|
||||||
args[numargs++].set_str(a->get_value().get_str());
|
args[numargs] = a->get_value();
|
||||||
|
args[numargs++].force_str();
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1138,9 +1136,7 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
static_cast<cs_alias *>(id)->get_value().get_val(arg);
|
static_cast<cs_alias *>(id)->get_value().get_val(arg);
|
||||||
continue;
|
continue;
|
||||||
case CsIdSvar:
|
case CsIdSvar:
|
||||||
arg.set_str(cs_string{
|
arg.set_str(static_cast<cs_svar *>(id)->get_value());
|
||||||
static_cast<cs_svar *>(id)->get_value()
|
|
||||||
});
|
|
||||||
continue;
|
continue;
|
||||||
case CsIdIvar:
|
case CsIdIvar:
|
||||||
arg.set_int(static_cast<cs_ivar *>(id)->get_value());
|
arg.set_int(static_cast<cs_ivar *>(id)->get_value());
|
||||||
|
@ -1175,7 +1171,8 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
cs_value &arg = args[numargs - 1];
|
cs_value &arg = args[numargs - 1];
|
||||||
switch (cs_get_lookupu_type(cs, arg, id, op)) {
|
switch (cs_get_lookupu_type(cs, arg, id, op)) {
|
||||||
case CsIdAlias:
|
case CsIdAlias:
|
||||||
static_cast<cs_alias *>(id)->get_cstr(arg);
|
arg = static_cast<cs_alias *>(id)->get_value();
|
||||||
|
arg.force_str();
|
||||||
continue;
|
continue;
|
||||||
case CsIdSvar:
|
case CsIdSvar:
|
||||||
arg.set_str(static_cast<cs_svar *>(id)->get_value());
|
arg.set_str(static_cast<cs_svar *>(id)->get_value());
|
||||||
|
@ -1198,14 +1195,16 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case CsCodeLookupM | CsRetString:
|
case CsCodeLookupM | CsRetString:
|
||||||
cs_get_lookup_id(cs, op)->get_cstr(args[numargs++]);
|
args[numargs] = cs_get_lookup_id(cs, op)->get_value();
|
||||||
|
args[numargs++].force_str();
|
||||||
continue;
|
continue;
|
||||||
case CsCodeLookupMarg | CsRetString: {
|
case CsCodeLookupMarg | CsRetString: {
|
||||||
cs_alias *a = cs_get_lookuparg_id(cs, op);
|
cs_alias *a = cs_get_lookuparg_id(cs, op);
|
||||||
if (!a) {
|
if (!a) {
|
||||||
args[numargs++].set_str("");
|
args[numargs++].set_str("");
|
||||||
} else {
|
} else {
|
||||||
a->get_cstr(args[numargs++]);
|
args[numargs] = a->get_value();
|
||||||
|
args[numargs++].force_str();
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1247,9 +1246,9 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
|
|
||||||
case CsCodeSvar | CsRetString:
|
case CsCodeSvar | CsRetString:
|
||||||
case CsCodeSvar | CsRetNull:
|
case CsCodeSvar | CsRetNull:
|
||||||
args[numargs++].set_str(cs_string{static_cast<cs_svar *>(
|
args[numargs++].set_str(static_cast<cs_svar *>(
|
||||||
cs.p_state->identmap[op >> 8]
|
cs.p_state->identmap[op >> 8]
|
||||||
)->get_value()});
|
)->get_value());
|
||||||
continue;
|
continue;
|
||||||
case CsCodeSvar | CsRetInt:
|
case CsCodeSvar | CsRetInt:
|
||||||
args[numargs++].set_int(cs_parse_int(static_cast<cs_svar *>(
|
args[numargs++].set_int(cs_parse_int(static_cast<cs_svar *>(
|
||||||
|
@ -1380,7 +1379,7 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
&args[offset], &args[offset + callargs]
|
&args[offset], &args[offset + callargs]
|
||||||
), " ");
|
), " ");
|
||||||
cs_value tv{cs};
|
cs_value tv{cs};
|
||||||
tv.set_str(std::move(buf.get()));
|
tv.set_str(buf.get());
|
||||||
cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), result);
|
cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), result);
|
||||||
}
|
}
|
||||||
force_arg(result, op & CsCodeRetMask);
|
force_arg(result, op & CsCodeRetMask);
|
||||||
|
@ -1403,7 +1402,7 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
((op & CsCodeOpMask) == CsCodeConc) ? " " : ""
|
((op & CsCodeOpMask) == CsCodeConc) ? " " : ""
|
||||||
);
|
);
|
||||||
numargs = numargs - numconc;
|
numargs = numargs - numconc;
|
||||||
args[numargs].set_str(std::move(buf.get()));
|
args[numargs].set_str(buf.get());
|
||||||
force_arg(args[numargs], op & CsCodeRetMask);
|
force_arg(args[numargs], op & CsCodeRetMask);
|
||||||
numargs++;
|
numargs++;
|
||||||
continue;
|
continue;
|
||||||
|
@ -1419,7 +1418,7 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
|
||||||
buf, ostd::iter(&args[numargs - numconc], &args[numargs])
|
buf, ostd::iter(&args[numargs - numconc], &args[numargs])
|
||||||
);
|
);
|
||||||
numargs = numargs - numconc;
|
numargs = numargs - numconc;
|
||||||
result.set_str(std::move(buf.get()));
|
result.set_str(buf.get());
|
||||||
force_arg(result, op & CsCodeRetMask);
|
force_arg(result, op & CsCodeRetMask);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -659,23 +659,6 @@ OSTD_EXPORT void cs_state::print_var(cs_var *v) {
|
||||||
ostd::writeln(v->to_printable());
|
ostd::writeln(v->to_printable());
|
||||||
}
|
}
|
||||||
|
|
||||||
void cs_alias::get_cstr(cs_value &v) const {
|
|
||||||
switch (p_val.get_type()) {
|
|
||||||
case cs_value_type::String:
|
|
||||||
v = p_val;
|
|
||||||
break;
|
|
||||||
case cs_value_type::Int:
|
|
||||||
v.set_str(intstr(p_val.get_int()));
|
|
||||||
break;
|
|
||||||
case cs_value_type::Float:
|
|
||||||
v.set_str(floatstr(p_val.get_float()));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
v.set_str("");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cs_alias::get_cval(cs_value &v) const {
|
void cs_alias::get_cval(cs_value &v) const {
|
||||||
switch (p_val.get_type()) {
|
switch (p_val.get_type()) {
|
||||||
case cs_value_type::String:
|
case cs_value_type::String:
|
||||||
|
|
Loading…
Reference in New Issue