eliminate the strref friend kludge

master
Daniel Kolesa 2021-03-23 01:35:04 +01:00
parent 6821260c37
commit f52aeead32
5 changed files with 8 additions and 23 deletions

View File

@ -297,8 +297,7 @@ LIBCUBESCRIPT_EXPORT bool cs_code_is_empty(cs_bcode *code);
struct LIBCUBESCRIPT_EXPORT cs_strref { struct LIBCUBESCRIPT_EXPORT cs_strref {
friend struct cs_value; friend struct cs_value;
/* FIXME: eliminate this */ friend struct cs_strman;
friend inline cs_strref cs_make_strref(char const *p, cs_shared_state *cs);
cs_strref() = delete; cs_strref() = delete;
cs_strref(cs_shared_state *cs, std::string_view str); cs_strref(cs_shared_state *cs, std::string_view str);

View File

@ -42,7 +42,7 @@ char const *cs_strman::ref(char const *ptr) {
return ptr; return ptr;
} }
char const *cs_strman::steal(char *ptr) { cs_strref cs_strman::steal(char *ptr) {
auto *ss = get_ref_state(ptr); auto *ss = get_ref_state(ptr);
auto sr = std::string_view{ptr, ss->length}; auto sr = std::string_view{ptr, ss->length};
/* much like add(), but we already have memory */ /* much like add(), but we already have memory */
@ -50,15 +50,14 @@ char const *cs_strman::steal(char *ptr) {
if (it != counts.end()) { if (it != counts.end()) {
auto *st = it->second; auto *st = it->second;
if (st) { if (st) {
++st->refcount;
/* the buffer is superfluous now */ /* the buffer is superfluous now */
cstate->alloc(ss, ss->length + sizeof(cs_strref_state) + 1, 0); cstate->alloc(ss, ss->length + sizeof(cs_strref_state) + 1, 0);
return reinterpret_cast<char const *>(st + 1); return cs_strref{reinterpret_cast<char const *>(st + 1), cstate};
} }
} }
ss->refcount = 1; ss->refcount = 0; /* cs_strref will increment it */
counts.emplace(sr, ss); counts.emplace(sr, ss);
return ptr; return cs_strref{ptr, cstate};
} }
void cs_strman::unref(char const *ptr) { void cs_strman::unref(char const *ptr) {

View File

@ -58,7 +58,7 @@ struct cs_strman {
/* this will use the provided memory, assuming it is a fresh string that /* this will use the provided memory, assuming it is a fresh string that
* is yet to be added; the memory must be allocated with alloc_buf() * is yet to be added; the memory must be allocated with alloc_buf()
*/ */
char const *steal(char *ptr); cs_strref steal(char *ptr);
/* decrements the reference count and removes it from the system if /* decrements the reference count and removes it from the system if
* that reaches zero; likewise, only safe with pointers that are managed * that reaches zero; likewise, only safe with pointers that are managed

View File

@ -18,13 +18,6 @@ cs_float cs_parse_float(
std::string_view input, std::string_view *end = nullptr std::string_view input, std::string_view *end = nullptr
); );
struct cs_strman;
struct cs_shared_state;
inline cs_strref cs_make_strref(char const *p, cs_shared_state *cs) {
return cs_strref{p, cs};
}
} /* namespace cscript */ } /* namespace cscript */
#endif /* LIBCUBESCRIPT_CS_UTIL_HH */ #endif /* LIBCUBESCRIPT_CS_UTIL_HH */

View File

@ -65,10 +65,7 @@ void cs_init_lib_string(cs_state &cs) {
for (std::size_t i = 0; i < inps.size(); ++i) { for (std::size_t i = 0; i < inps.size(); ++i) {
buf[i] = tolower(inps[i]); buf[i] = tolower(inps[i]);
} }
auto const *cbuf = ics->strman->steal(buf); res.set_str(ics->strman->steal(buf));
auto sr = cs_make_strref(cbuf, ics);
ics->strman->unref(cbuf);
res.set_str(sr);
}); });
cs.new_command("strupper", "s", [](auto &ccs, auto args, auto &res) { cs.new_command("strupper", "s", [](auto &ccs, auto args, auto &res) {
@ -78,10 +75,7 @@ void cs_init_lib_string(cs_state &cs) {
for (std::size_t i = 0; i < inps.size(); ++i) { for (std::size_t i = 0; i < inps.size(); ++i) {
buf[i] = toupper(inps[i]); buf[i] = toupper(inps[i]);
} }
auto const *cbuf = ics->strman->steal(buf); res.set_str(ics->strman->steal(buf));
auto sr = cs_make_strref(cbuf, ics);
ics->strman->unref(cbuf);
res.set_str(sr);
}); });
cs.new_command("escape", "s", [](auto &ccs, auto args, auto &res) { cs.new_command("escape", "s", [](auto &ccs, auto args, auto &res) {