Browse Source

Cleaner definition for 'TString'

Use a variable-sized array to store string contents at the end of a
structure 'TString', instead of raw memory.
Roberto Ierusalimschy 5 years ago
parent
commit
9514abc2da
2 changed files with 8 additions and 5 deletions
  1. 3 4
      lobject.h
  2. 5 1
      lstring.h

+ 3 - 4
lobject.h

@@ -356,7 +356,7 @@ typedef struct GCObject {
 
 
 /*
-** Header for string value; string bytes follow the end of this structure.
+** Header for a string value.
 */
 typedef struct TString {
   CommonHeader;
@@ -367,16 +367,15 @@ typedef struct TString {
     size_t lnglen;  /* length for long strings */
     struct TString *hnext;  /* linked list for hash table */
   } u;
+  char contents[1];
 } TString;
 
 
 
 /*
 ** Get the actual string (array of bytes) from a 'TString'.
-** (Access to 'extra' ensures that value is really a 'TString'.)
 */
-#define getstr(ts)  \
-  check_exp(sizeof((ts)->extra), cast_charp((ts)) + sizeof(TString))
+#define getstr(ts)  ((ts)->contents)
 
 
 /* get the actual string (array of bytes) from a Lua value */

+ 5 - 1
lstring.h

@@ -19,7 +19,11 @@
 #define MEMERRMSG       "not enough memory"
 
 
-#define sizelstring(l)  (sizeof(TString) + ((l) + 1) * sizeof(char))
+/*
+** Size of a TString: Size of the header plus space for the string
+** itself (including final '\0').
+*/
+#define sizelstring(l)  (offsetof(TString, contents) + ((l) + 1) * sizeof(char))
 
 #define luaS_newliteral(L, s)	(luaS_newlstr(L, "" s, \
                                  (sizeof(s)/sizeof(char))-1))