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 /lvm.c | |
| 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 'lvm.c')
| -rw-r--r-- | lvm.c | 15 |
1 files changed, 8 insertions, 7 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.184 2001/06/11 14:56:42 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.185 2001/06/15 19:17:17 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -249,9 +249,9 @@ static void call_arith (lua_State *L, StkId p1, TObject *p2, | |||
| 249 | 249 | ||
| 250 | static int luaV_strlessthan (const TString *ls, const TString *rs) { | 250 | static int luaV_strlessthan (const TString *ls, const TString *rs) { |
| 251 | const l_char *l = getstr(ls); | 251 | const l_char *l = getstr(ls); |
| 252 | size_t ll = ls->len; | 252 | size_t ll = ls->tsv.len; |
| 253 | const l_char *r = getstr(rs); | 253 | const l_char *r = getstr(rs); |
| 254 | size_t lr = rs->len; | 254 | size_t lr = rs->tsv.len; |
| 255 | for (;;) { | 255 | for (;;) { |
| 256 | int temp = strcoll(l, r); | 256 | int temp = strcoll(l, r); |
| 257 | if (temp != 0) return (temp < 0); | 257 | if (temp != 0) return (temp < 0); |
| @@ -289,20 +289,21 @@ void luaV_strconc (lua_State *L, int total, StkId top) { | |||
| 289 | if (tostring(L, top-2) || tostring(L, top-1)) { | 289 | if (tostring(L, top-2) || tostring(L, top-1)) { |
| 290 | if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) | 290 | if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) |
| 291 | luaG_concaterror(L, top-2, top-1); | 291 | luaG_concaterror(L, top-2, top-1); |
| 292 | } else if (tsvalue(top-1)->len > 0) { /* if len=0, do nothing */ | 292 | } else if (tsvalue(top-1)->tsv.len > 0) { /* if len=0, do nothing */ |
| 293 | /* at least two string values; get as many as possible */ | 293 | /* at least two string values; get as many as possible */ |
| 294 | lu_mem tl = (lu_mem)tsvalue(top-1)->len + (lu_mem)tsvalue(top-2)->len; | 294 | lu_mem tl = (lu_mem)tsvalue(top-1)->tsv.len + |
| 295 | (lu_mem)tsvalue(top-2)->tsv.len; | ||
| 295 | l_char *buffer; | 296 | l_char *buffer; |
| 296 | int i; | 297 | int i; |
| 297 | while (n < total && !tostring(L, top-n-1)) { /* collect total length */ | 298 | while (n < total && !tostring(L, top-n-1)) { /* collect total length */ |
| 298 | tl += tsvalue(top-n-1)->len; | 299 | tl += tsvalue(top-n-1)->tsv.len; |
| 299 | n++; | 300 | n++; |
| 300 | } | 301 | } |
| 301 | if (tl > MAX_SIZET) luaD_error(L, l_s("string size overflow")); | 302 | if (tl > MAX_SIZET) luaD_error(L, l_s("string size overflow")); |
| 302 | buffer = luaO_openspace(L, tl, l_char); | 303 | buffer = luaO_openspace(L, tl, l_char); |
| 303 | tl = 0; | 304 | tl = 0; |
| 304 | for (i=n; i>0; i--) { /* concat all strings */ | 305 | for (i=n; i>0; i--) { /* concat all strings */ |
| 305 | size_t l = tsvalue(top-i)->len; | 306 | size_t l = tsvalue(top-i)->tsv.len; |
| 306 | memcpy(buffer+tl, svalue(top-i), l); | 307 | memcpy(buffer+tl, svalue(top-i), l); |
| 307 | tl += l; | 308 | tl += l; |
| 308 | } | 309 | } |
