mirror of
https://github.com/lua/lua.git
synced 2024-11-23 18:23:43 +08:00
string pointers are always fully aligned
This commit is contained in:
parent
6875fdc8be
commit
d2e340f467
10
ldebug.c
10
ldebug.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ldebug.c,v 1.60 2001/02/07 18:13:49 roberto Exp roberto $
|
||||
** $Id: ldebug.c,v 1.61 2001/02/09 18:37:33 roberto Exp roberto $
|
||||
** Debug Interface
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -198,7 +198,7 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {
|
||||
|
||||
|
||||
static void infoLproto (lua_Debug *ar, Proto *f) {
|
||||
ar->source = f->source->str;
|
||||
ar->source = getstr(f->source);
|
||||
ar->linedefined = f->lineDefined;
|
||||
ar->what = "Lua";
|
||||
}
|
||||
@ -249,7 +249,7 @@ static const char *travglobals (lua_State *L, const TObject *o) {
|
||||
for (i=0; i<g->size; i++) {
|
||||
if (luaO_equalObj(o, val(node(g, i))) &&
|
||||
ttype_key(node(g, i)) == LUA_TSTRING)
|
||||
return tsvalue_key(node(g, i))->str;
|
||||
return getstr(tsvalue_key(node(g, i)));
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -499,7 +499,7 @@ static const char *getobjname (lua_State *L, StkId obj, const char **name) {
|
||||
lua_assert(pc != -1);
|
||||
switch (GET_OPCODE(i)) {
|
||||
case OP_GETGLOBAL: {
|
||||
*name = p->kstr[GETARG_U(i)]->str;
|
||||
*name = getstr(p->kstr[GETARG_U(i)]);
|
||||
return "global";
|
||||
}
|
||||
case OP_GETLOCAL: {
|
||||
@ -509,7 +509,7 @@ static const char *getobjname (lua_State *L, StkId obj, const char **name) {
|
||||
}
|
||||
case OP_PUSHSELF:
|
||||
case OP_GETDOTTED: {
|
||||
*name = p->kstr[GETARG_U(i)]->str;
|
||||
*name = getstr(p->kstr[GETARG_U(i)]);
|
||||
return "field";
|
||||
}
|
||||
default:
|
||||
|
4
lfunc.c
4
lfunc.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lfunc.c,v 1.38 2001/01/29 19:34:02 roberto Exp roberto $
|
||||
** $Id: lfunc.c,v 1.39 2001/02/01 17:40:48 roberto Exp roberto $
|
||||
** Auxiliary functions to manipulate prototypes and closures
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -79,7 +79,7 @@ const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
|
||||
if (pc < f->locvars[i].endpc) { /* is variable active? */
|
||||
local_number--;
|
||||
if (local_number == 0)
|
||||
return f->locvars[i].varname->str;
|
||||
return getstr(f->locvars[i].varname);
|
||||
}
|
||||
}
|
||||
return NULL; /* not found */
|
||||
|
4
llex.c
4
llex.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: llex.c,v 1.75 2001/01/15 18:07:56 roberto Exp roberto $
|
||||
** $Id: llex.c,v 1.76 2001/01/19 13:20:30 roberto Exp roberto $
|
||||
** Lexical Analyzer
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -55,7 +55,7 @@ void luaX_checklimit (LexState *ls, int val, int limit, const char *msg) {
|
||||
|
||||
void luaX_syntaxerror (LexState *ls, const char *s, const char *token) {
|
||||
char buff[MAXSRC];
|
||||
luaO_chunkid(buff, ls->source->str, sizeof(buff));
|
||||
luaO_chunkid(buff, getstr(ls->source), sizeof(buff));
|
||||
luaO_verror(ls->L, "%.99s;\n last token read: `%.30s' at line %d in %.80s",
|
||||
s, token, ls->linenumber, buff);
|
||||
}
|
||||
|
25
lobject.h
25
lobject.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lobject.h,v 1.93 2001/02/02 15:13:05 roberto Exp roberto $
|
||||
** $Id: lobject.h,v 1.94 2001/02/02 16:32:00 roberto Exp roberto $
|
||||
** Type definitions for Lua objects
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -57,7 +57,6 @@ typedef struct lua_TObject {
|
||||
#define clvalue(o) ((o)->value.cl)
|
||||
#define hvalue(o) ((o)->value.h)
|
||||
#define infovalue(o) ((o)->value.info)
|
||||
#define svalue(o) (tsvalue(o)->str)
|
||||
|
||||
|
||||
/* Macros to set values */
|
||||
@ -91,13 +90,6 @@ typedef struct lua_TObject {
|
||||
** String headers for string table
|
||||
*/
|
||||
|
||||
/*
|
||||
** most `malloc' libraries allocate memory in blocks of 8 bytes. TSPACK
|
||||
** tries to make sizeof(TString) a multiple of this granularity, to reduce
|
||||
** waste of space.
|
||||
*/
|
||||
#define TSPACK ((int)sizeof(int))
|
||||
|
||||
typedef struct TString {
|
||||
union {
|
||||
struct { /* for strings */
|
||||
@ -112,10 +104,23 @@ typedef struct TString {
|
||||
size_t len;
|
||||
int marked;
|
||||
struct TString *nexthash; /* chain for hash table */
|
||||
char str[TSPACK]; /* variable length string!! must be the last field! */
|
||||
} TString;
|
||||
|
||||
|
||||
/*
|
||||
** type equivalent to TString, but with maximum alignment requirements
|
||||
*/
|
||||
union L_UTString {
|
||||
TString ts;
|
||||
union L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */
|
||||
};
|
||||
|
||||
|
||||
|
||||
#define getstr(ts) ((char *)(ts) + sizeof(union L_UTString))
|
||||
#define svalue(o) getstr(tsvalue(o))
|
||||
|
||||
|
||||
/*
|
||||
** Function Prototypes
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lparser.c,v 1.130 2001/02/08 11:19:10 roberto Exp roberto $
|
||||
** $Id: lparser.c,v 1.131 2001/02/09 18:37:33 roberto Exp roberto $
|
||||
** LL(1) Parser and code generator for Lua
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -209,7 +209,7 @@ static int search_local (LexState *ls, TString *n, expdesc *var) {
|
||||
static void singlevar (LexState *ls, TString *n, expdesc *var) {
|
||||
int level = search_local(ls, n, var);
|
||||
if (level >= 1) /* neither local (0) nor global (-1)? */
|
||||
luaX_syntaxerror(ls, "cannot access a variable in outer scope", n->str);
|
||||
luaX_syntaxerror(ls, "cannot access a variable in outer scope", getstr(n));
|
||||
else if (level == -1) /* global? */
|
||||
var->u.index = string_constant(ls->fs, n);
|
||||
}
|
||||
@ -235,12 +235,12 @@ static void pushupvalue (LexState *ls, TString *n) {
|
||||
int level = search_local(ls, n, &v);
|
||||
if (level == -1) { /* global? */
|
||||
if (fs->prev == NULL)
|
||||
luaX_syntaxerror(ls, "cannot access an upvalue at top level", n->str);
|
||||
luaX_syntaxerror(ls, "cannot access an upvalue at top level", getstr(n));
|
||||
v.u.index = string_constant(fs->prev, n);
|
||||
}
|
||||
else if (level != 1)
|
||||
luaX_syntaxerror(ls,
|
||||
"upvalue must be global or local to immediately outer scope", n->str);
|
||||
"upvalue must be global or local to immediately outer scope", getstr(n));
|
||||
luaK_code1(fs, OP_PUSHUPVALUE, indexupvalue(ls, &v));
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lstring.c,v 1.55 2001/02/01 17:40:48 roberto Exp roberto $
|
||||
** $Id: lstring.c,v 1.56 2001/02/09 19:53:16 roberto Exp roberto $
|
||||
** String table (keeps all strings handled by Lua)
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -71,7 +71,7 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
|
||||
for (l1=l; l1>=step; l1-=step) /* compute hash */
|
||||
h = h ^ ((h<<5)+(h>>2)+(unsigned char)str[l1-1]);
|
||||
for (ts = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; ts; ts = ts->nexthash) {
|
||||
if (ts->len == l && (memcmp(str, ts->str, l) == 0))
|
||||
if (ts->len == l && (memcmp(str, getstr(ts), l) == 0))
|
||||
return ts;
|
||||
}
|
||||
/* not found */
|
||||
@ -81,8 +81,8 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
|
||||
ts->len = l;
|
||||
ts->u.s.hash = h;
|
||||
ts->u.s.constindex = 0;
|
||||
memcpy(ts->str, str, l);
|
||||
ts->str[l] = 0; /* ending 0 */
|
||||
memcpy(getstr(ts), str, l);
|
||||
getstr(ts)[l] = 0; /* ending 0 */
|
||||
newentry(L, &G(L)->strt, ts, lmod(h, G(L)->strt.size)); /* insert it */
|
||||
return ts;
|
||||
}
|
||||
|
15
lstring.h
15
lstring.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lstring.h,v 1.27 2001/01/10 17:41:50 roberto Exp roberto $
|
||||
** $Id: lstring.h,v 1.28 2001/02/09 19:53:16 roberto Exp roberto $
|
||||
** String table (keep all strings handled by Lua)
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -13,16 +13,6 @@
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** type equivalent to TString, but with maximum alignment requirements
|
||||
*/
|
||||
union L_UTString {
|
||||
TString ts;
|
||||
union L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** any TString with mark>=FIXMARK is never collected.
|
||||
** Marks>=RESERVEDMARK are used to identify reserved words.
|
||||
@ -31,8 +21,7 @@ union L_UTString {
|
||||
#define RESERVEDMARK 3
|
||||
|
||||
|
||||
#define sizestring(l) ((lint32)sizeof(TString) + \
|
||||
((lint32)(l+1)-TSPACK)*(lint32)sizeof(char))
|
||||
#define sizestring(l) ((luint32)sizeof(union L_UTString)+(l)+1)
|
||||
|
||||
#define sizeudata(l) ((luint32)sizeof(union L_UTString)+(l))
|
||||
|
||||
|
8
ltests.c
8
ltests.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltests.c,v 1.64 2001/02/06 18:18:58 roberto Exp roberto $
|
||||
** $Id: ltests.c,v 1.65 2001/02/09 19:53:16 roberto Exp roberto $
|
||||
** Internal Module for Debugging of the Lua Implementation
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -201,7 +201,7 @@ static int liststrings (lua_State *L) {
|
||||
lua_newtable(L);
|
||||
for (i=0; i<p->sizekstr; i++) {
|
||||
lua_pushnumber(L, i+1);
|
||||
lua_pushstring(L, p->kstr[i]->str);
|
||||
lua_pushstring(L, getstr(p->kstr[i]));
|
||||
lua_settable(L, -3);
|
||||
}
|
||||
return 1;
|
||||
@ -537,7 +537,9 @@ static int testC (lua_State *L) {
|
||||
lua_pushnumber(L, lua_tonumber(L, getnum));
|
||||
}
|
||||
else if EQ("tostring") {
|
||||
lua_pushstring(L, lua_tostring(L, getnum));
|
||||
const char *s = lua_tostring(L, getnum);
|
||||
lua_assert((unsigned long)s % 4 == 0); /* check alignment */
|
||||
lua_pushstring(L, s);
|
||||
}
|
||||
else if EQ("tonumber") {
|
||||
lua_pushnumber(L, lua_tonumber(L, getnum));
|
||||
|
4
ltm.c
4
ltm.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltm.c,v 1.64 2001/01/26 11:45:51 roberto Exp roberto $
|
||||
** $Id: ltm.c,v 1.65 2001/02/02 15:13:05 roberto Exp roberto $
|
||||
** Tag methods
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -150,7 +150,7 @@ const char *luaT_typename (global_State *G, const TObject *o) {
|
||||
ts = G->TMtable[tag].name;
|
||||
if (ts == NULL)
|
||||
ts = G->TMtable[t].name;
|
||||
return ts->str;
|
||||
return getstr(ts);
|
||||
}
|
||||
|
||||
|
||||
|
4
ltm.h
4
ltm.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltm.h,v 1.21 2001/01/24 16:20:54 roberto Exp roberto $
|
||||
** $Id: ltm.h,v 1.22 2001/01/25 16:45:36 roberto Exp roberto $
|
||||
** Tag methods
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -62,7 +62,7 @@ struct TM {
|
||||
#define luaT_gettm(G,tag,event) (G->TMtable[tag].method[event])
|
||||
#define luaT_gettmbyObj(G,o,e) (luaT_gettm((G),luaT_tag(o),(e)))
|
||||
|
||||
#define basictypename(G, t) (G->TMtable[t].name->str)
|
||||
#define basictypename(G, t) getstr(G->TMtable[t].name)
|
||||
|
||||
|
||||
#define validtag(G,t) (NUM_TAGS <= (t) && (t) < G->ntag)
|
||||
|
8
lvm.c
8
lvm.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lvm.c,v 1.166 2001/02/07 18:13:49 roberto Exp roberto $
|
||||
** $Id: lvm.c,v 1.167 2001/02/09 18:07:47 roberto Exp roberto $
|
||||
** Lua virtual machine
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -225,9 +225,9 @@ static void call_arith (lua_State *L, StkId p1, TMS event) {
|
||||
|
||||
|
||||
static int luaV_strlessthan (const TString *ls, const TString *rs) {
|
||||
const char *l = ls->str;
|
||||
const char *l = getstr(ls);
|
||||
size_t ll = ls->len;
|
||||
const char *r = rs->str;
|
||||
const char *r = getstr(rs);
|
||||
size_t lr = rs->len;
|
||||
for (;;) {
|
||||
int temp = strcoll(l, r);
|
||||
@ -281,7 +281,7 @@ void luaV_strconc (lua_State *L, int total, StkId top) {
|
||||
tl = 0;
|
||||
for (i=n; i>0; i--) { /* concat all strings */
|
||||
size_t l = tsvalue(top-i)->len;
|
||||
memcpy(buffer+tl, tsvalue(top-i)->str, l);
|
||||
memcpy(buffer+tl, svalue(top-i), l);
|
||||
tl += l;
|
||||
}
|
||||
setsvalue(top-n, luaS_newlstr(L, buffer, tl));
|
||||
|
Loading…
Reference in New Issue
Block a user