Short strings can be external, too
That complicates a little object equality (and therefore table access for long strings), but the old behavior was somewhat weird. (Short strings, a concept otherwise absent from the manual, could not be external.)
This commit is contained in:
46
lstring.c
46
lstring.c
@@ -39,14 +39,14 @@
|
||||
|
||||
|
||||
/*
|
||||
** equality for long strings
|
||||
** generic equality for strings
|
||||
*/
|
||||
int luaS_eqlngstr (TString *a, TString *b) {
|
||||
size_t len = a->u.lnglen;
|
||||
lua_assert(a->tt == LUA_VLNGSTR && b->tt == LUA_VLNGSTR);
|
||||
return (a == b) || /* same instance or... */
|
||||
((len == b->u.lnglen) && /* equal length and ... */
|
||||
(memcmp(getlngstr(a), getlngstr(b), len) == 0)); /* equal contents */
|
||||
int luaS_eqstr (TString *a, TString *b) {
|
||||
size_t len1, len2;
|
||||
const char *s1 = getlstr(a, len1);
|
||||
const char *s2 = getlstr(b, len2);
|
||||
return ((len1 == len2) && /* equal length and ... */
|
||||
(memcmp(s1, s2, len1) == 0)); /* equal contents */
|
||||
}
|
||||
|
||||
|
||||
@@ -315,28 +315,9 @@ static void f_newext (lua_State *L, void *ud) {
|
||||
}
|
||||
|
||||
|
||||
static void f_pintern (lua_State *L, void *ud) {
|
||||
struct NewExt *ne = cast(struct NewExt *, ud);
|
||||
ne->ts = internshrstr(L, ne->s, ne->len);
|
||||
}
|
||||
|
||||
|
||||
TString *luaS_newextlstr (lua_State *L,
|
||||
const char *s, size_t len, lua_Alloc falloc, void *ud) {
|
||||
struct NewExt ne;
|
||||
if (len <= LUAI_MAXSHORTLEN) { /* short string? */
|
||||
ne.s = s; ne.len = len;
|
||||
if (!falloc)
|
||||
f_pintern(L, &ne); /* just internalize string */
|
||||
else {
|
||||
TStatus status = luaD_rawrunprotected(L, f_pintern, &ne);
|
||||
(*falloc)(ud, cast_voidp(s), len + 1, 0); /* free external string */
|
||||
if (status != LUA_OK) /* memory error? */
|
||||
luaM_error(L); /* re-raise memory error */
|
||||
}
|
||||
return ne.ts;
|
||||
}
|
||||
/* "normal" case: long strings */
|
||||
if (!falloc) {
|
||||
ne.kind = LSTRFIX;
|
||||
f_newext(L, &ne); /* just create header */
|
||||
@@ -357,3 +338,16 @@ TString *luaS_newextlstr (lua_State *L,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Normalize an external string: If it is short, internalize it.
|
||||
*/
|
||||
TString *luaS_normstr (lua_State *L, TString *ts) {
|
||||
size_t len = ts->u.lnglen;
|
||||
if (len > LUAI_MAXSHORTLEN)
|
||||
return ts; /* long string; keep the original */
|
||||
else {
|
||||
const char *str = getlngstr(ts);
|
||||
return internshrstr(L, str, len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user