浏览代码

subtelties in layout of TString

Roberto Ierusalimschy 25 年之前
父节点
当前提交
d1c689af40
共有 3 个文件被更改,包括 28 次插入9 次删除
  1. 11 4
      lobject.h
  2. 14 3
      lstring.c
  3. 3 2
      lstring.h

+ 11 - 4
lobject.h

@@ -1,5 +1,5 @@
 /*
-** $Id: lobject.h,v 1.80 2000/10/26 12:47:05 roberto Exp roberto $
+** $Id: lobject.h,v 1.81 2000/10/30 16:29:59 roberto Exp roberto $
 ** Type definitions for Lua objects
 ** See Copyright Notice in lua.h
 */
@@ -71,9 +71,16 @@ 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 {
-    union L_Umaxalign dummy;  /* ensures maximum alignment for `local' udata */
     struct {  /* for strings */
       unsigned long hash;
       int constindex;  /* hint to reuse constants */
@@ -85,8 +92,8 @@ typedef struct TString {
   } u;
   size_t len;
   struct TString *nexthash;  /* chain for hash table */
-  unsigned char marked;
-  char str[1];   /* variable length string!! must be the last field! */
+  int marked;
+  char str[TSPACK];   /* variable length string!! must be the last field! */
 } TString;
 
 

+ 14 - 3
lstring.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lstring.c,v 1.43 2000/09/29 12:42:13 roberto Exp roberto $
+** $Id: lstring.c,v 1.44 2000/10/26 12:47:05 roberto Exp roberto $
 ** String table (keeps all strings handled by Lua)
 ** See Copyright Notice in lua.h
 */
@@ -15,6 +15,15 @@
 #include "lstring.h"
 
 
+/*
+** type equivalent to TString, but with maximum alignment requirements
+*/
+union L_UTString {
+  TString ts;
+  union L_Umaxalign dummy;  /* ensures maximum alignment for `local' udata */
+};
+
+
 
 void luaS_init (lua_State *L) {
   L->strt.hash = luaM_newvector(L, 1, TString *);
@@ -103,12 +112,14 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
 
 
 TString *luaS_newudata (lua_State *L, size_t s, void *udata) {
-  TString *ts = (TString *)luaM_malloc(L, (lint32)sizeof(TString)+s);
+  union L_UTString *uts = (union L_UTString *)luaM_malloc(L,
+                                (lint32)sizeof(union L_UTString)+s);
+  TString *ts = &uts->ts;
   ts->marked = 0;
   ts->nexthash = NULL;
   ts->len = s;
   ts->u.d.tag = 0;
-  ts->u.d.value = (udata == NULL) ? ts+1 : udata;
+  ts->u.d.value = (udata == NULL) ? uts+1 : udata;
   L->nblocks += sizestring(s);
  /* insert it on table */
   newentry(L, &L->udt, ts, IntPoint(ts->u.d.value) & (L->udt.size-1));

+ 3 - 2
lstring.h

@@ -1,5 +1,5 @@
 /*
-** $Id: lstring.h,v 1.22 2000/09/29 12:42:13 roberto Exp roberto $
+** $Id: lstring.h,v 1.23 2000/10/26 12:47:05 roberto Exp roberto $
 ** String table (keep all strings handled by Lua)
 ** See Copyright Notice in lua.h
 */
@@ -20,7 +20,8 @@
 #define RESERVEDMARK	3
 
 
-#define sizestring(l)	(sizeof(TString)+(lint32)(l)*sizeof(char))
+#define sizestring(l)	((long)sizeof(TString) + \
+                         ((long)(l+1)-TSPACK)*(long)sizeof(char))
 
 
 void luaS_init (lua_State *L);