diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-06-15 17:36:57 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-06-15 17:36:57 -0300 |
commit | 8e586c13fcf3066886a7edd69011304eaad57a2b (patch) | |
tree | 417c2102ba8c4d693c49a2df839612d371eded50 /lobject.h | |
parent | eadf2aaaffa7a35e7f67b150ce0d57f2c17b9231 (diff) | |
download | lua-8e586c13fcf3066886a7edd69011304eaad57a2b.tar.gz lua-8e586c13fcf3066886a7edd69011304eaad57a2b.tar.bz2 lua-8e586c13fcf3066886a7edd69011304eaad57a2b.zip |
cleaner way to ensure alignment for strings and userdata
Diffstat (limited to 'lobject.h')
-rw-r--r-- | lobject.h | 50 |
1 files changed, 23 insertions, 27 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.h,v 1.104 2001/06/06 18:00:19 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 1.105 2001/06/07 15:01:21 roberto Exp roberto $ |
3 | ** Type definitions for Lua objects | 3 | ** Type definitions for Lua objects |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -28,8 +28,8 @@ | |||
28 | 28 | ||
29 | 29 | ||
30 | typedef union { | 30 | typedef union { |
31 | struct TString *ts; | 31 | union TString *ts; |
32 | struct Udata *u; | 32 | union Udata *u; |
33 | struct Closure *cl; | 33 | struct Closure *cl; |
34 | struct Hash *h; | 34 | struct Hash *h; |
35 | lua_Number n; /* LUA_TNUMBER */ | 35 | lua_Number n; /* LUA_TNUMBER */ |
@@ -80,40 +80,36 @@ typedef TObject *StkId; /* index to stack elements */ | |||
80 | /* | 80 | /* |
81 | ** String headers for string table | 81 | ** String headers for string table |
82 | */ | 82 | */ |
83 | typedef struct TString { | 83 | typedef union TString { |
84 | lu_hash hash; | ||
85 | size_t len; | ||
86 | unsigned short constindex; /* hint to reuse constants */ | ||
87 | short marked; | ||
88 | struct TString *nexthash; /* chain for hash table */ | ||
89 | } TString; | ||
90 | |||
91 | |||
92 | |||
93 | /* | ||
94 | ** type equivalent to TString, but with maximum alignment requirements | ||
95 | */ | ||
96 | union L_UTString { | ||
97 | TString ts; | ||
98 | union L_Umaxalign dummy; /* ensures maximum alignment for strings */ | 84 | union L_Umaxalign dummy; /* ensures maximum alignment for strings */ |
99 | }; | 85 | struct { |
86 | lu_hash hash; | ||
87 | size_t len; | ||
88 | unsigned short constindex; /* hint to reuse constants */ | ||
89 | short marked; | ||
90 | union TString *nexthash; /* chain for hash table */ | ||
91 | } tsv; | ||
92 | } TString; | ||
100 | 93 | ||
101 | 94 | ||
102 | #define getstr(ts) ((l_char *)((union L_UTString *)(ts) + 1)) | 95 | #define getstr(ts) ((l_char *)((ts) + 1)) |
103 | #define svalue(o) getstr(tsvalue(o)) | 96 | #define svalue(o) getstr(tsvalue(o)) |
104 | 97 | ||
105 | 98 | ||
106 | 99 | ||
107 | typedef struct Udata { | 100 | typedef union Udata { |
108 | int tag; /* negative means `marked' (only during GC) */ | 101 | union L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ |
109 | void *value; | 102 | struct { |
110 | size_t len; | 103 | int tag; /* negative means `marked' (only during GC) */ |
111 | struct Udata *next; /* chain for list of all udata */ | 104 | void *value; |
105 | size_t len; | ||
106 | union Udata *next; /* chain for list of all udata */ | ||
107 | } uv; | ||
112 | } Udata; | 108 | } Udata; |
113 | 109 | ||
114 | 110 | ||
115 | #define switchudatamark(u) ((u)->tag = (-((u)->tag+1))) | 111 | #define switchudatamark(u) ((u)->uv.tag = (-((u)->uv.tag+1))) |
116 | #define ismarkedudata(u) ((u)->tag < 0) | 112 | #define ismarkedudata(u) ((u)->uv.tag < 0) |
117 | 113 | ||
118 | 114 | ||
119 | 115 | ||