diff options
-rw-r--r-- | ldo.c | 4 | ||||
-rw-r--r-- | lgc.c | 5 | ||||
-rw-r--r-- | lstate.c | 4 | ||||
-rw-r--r-- | lstate.h | 3 | ||||
-rw-r--r-- | lstring.c | 20 | ||||
-rw-r--r-- | lstring.h | 3 | ||||
-rw-r--r-- | lundump.c | 20 | ||||
-rw-r--r-- | lundump.h | 5 | ||||
-rw-r--r-- | lvm.c | 41 | ||||
-rw-r--r-- | lzio.c | 12 | ||||
-rw-r--r-- | lzio.h | 3 |
11 files changed, 62 insertions, 58 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldo.c,v 2.138 2015/05/22 17:48:19 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 2.139 2015/06/18 14:19:52 roberto Exp roberto $ |
3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -684,7 +684,7 @@ static void f_parser (lua_State *L, void *ud) { | |||
684 | int c = zgetc(p->z); /* read first character */ | 684 | int c = zgetc(p->z); /* read first character */ |
685 | if (c == LUA_SIGNATURE[0]) { | 685 | if (c == LUA_SIGNATURE[0]) { |
686 | checkmode(L, p->mode, "binary"); | 686 | checkmode(L, p->mode, "binary"); |
687 | cl = luaU_undump(L, p->z, &p->buff, p->name); | 687 | cl = luaU_undump(L, p->z, p->name); |
688 | } | 688 | } |
689 | else { | 689 | else { |
690 | checkmode(L, p->mode, "text"); | 690 | checkmode(L, p->mode, "text"); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.205 2015/03/25 13:42:19 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.206 2015/07/13 13:30:03 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -769,12 +769,11 @@ static GCObject **sweeptolive (lua_State *L, GCObject **p, int *n) { | |||
769 | */ | 769 | */ |
770 | 770 | ||
771 | /* | 771 | /* |
772 | ** If possible, free concatenation buffer and shrink string table | 772 | ** If possible, shrink string table |
773 | */ | 773 | */ |
774 | static void checkSizes (lua_State *L, global_State *g) { | 774 | static void checkSizes (lua_State *L, global_State *g) { |
775 | if (g->gckind != KGC_EMERGENCY) { | 775 | if (g->gckind != KGC_EMERGENCY) { |
776 | l_mem olddebt = g->GCdebt; | 776 | l_mem olddebt = g->GCdebt; |
777 | luaZ_freebuffer(L, &g->buff); /* free concatenation buffer */ | ||
778 | if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ | 777 | if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ |
779 | luaS_resize(L, g->strt.size / 2); /* shrink it a little */ | 778 | luaS_resize(L, g->strt.size / 2); /* shrink it a little */ |
780 | g->GCestimate += g->GCdebt - olddebt; /* update estimate */ | 779 | g->GCestimate += g->GCdebt - olddebt; /* update estimate */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.c,v 2.128 2015/03/04 13:31:21 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 2.129 2015/07/13 13:30:03 roberto Exp roberto $ |
3 | ** Global State | 3 | ** Global State |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -241,7 +241,6 @@ static void close_state (lua_State *L) { | |||
241 | if (g->version) /* closing a fully built state? */ | 241 | if (g->version) /* closing a fully built state? */ |
242 | luai_userstateclose(L); | 242 | luai_userstateclose(L); |
243 | luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); | 243 | luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); |
244 | luaZ_freebuffer(L, &g->buff); | ||
245 | freestack(L); | 244 | freestack(L); |
246 | lua_assert(gettotalbytes(g) == sizeof(LG)); | 245 | lua_assert(gettotalbytes(g) == sizeof(LG)); |
247 | (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */ | 246 | (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */ |
@@ -310,7 +309,6 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { | |||
310 | g->strt.size = g->strt.nuse = 0; | 309 | g->strt.size = g->strt.nuse = 0; |
311 | g->strt.hash = NULL; | 310 | g->strt.hash = NULL; |
312 | setnilvalue(&g->l_registry); | 311 | setnilvalue(&g->l_registry); |
313 | luaZ_initbuffer(L, &g->buff); | ||
314 | g->panic = NULL; | 312 | g->panic = NULL; |
315 | g->version = NULL; | 313 | g->version = NULL; |
316 | g->gcstate = GCSpause; | 314 | g->gcstate = GCSpause; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.h,v 2.122 2015/06/01 16:34:37 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 2.123 2015/07/04 16:33:17 roberto Exp roberto $ |
3 | ** Global State | 3 | ** Global State |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -131,7 +131,6 @@ typedef struct global_State { | |||
131 | GCObject *tobefnz; /* list of userdata to be GC */ | 131 | GCObject *tobefnz; /* list of userdata to be GC */ |
132 | GCObject *fixedgc; /* list of objects not to be collected */ | 132 | GCObject *fixedgc; /* list of objects not to be collected */ |
133 | struct lua_State *twups; /* list of threads with open upvalues */ | 133 | struct lua_State *twups; /* list of threads with open upvalues */ |
134 | Mbuffer buff; /* temporary buffer for string concatenation */ | ||
135 | unsigned int gcfinnum; /* number of finalizers to call in each GC step */ | 134 | unsigned int gcfinnum; /* number of finalizers to call in each GC step */ |
136 | int gcpause; /* size of pause between successive GCs */ | 135 | int gcpause; /* size of pause between successive GCs */ |
137 | int gcstepmul; /* GC 'granularity' */ | 136 | int gcstepmul; /* GC 'granularity' */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstring.c,v 2.49 2015/06/01 16:34:37 roberto Exp roberto $ | 2 | ** $Id: lstring.c,v 2.50 2015/06/18 14:20:32 roberto Exp roberto $ |
3 | ** String table (keeps all strings handled by Lua) | 3 | ** String table (keeps all strings handled by Lua) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -119,8 +119,7 @@ void luaS_init (lua_State *L) { | |||
119 | /* | 119 | /* |
120 | ** creates a new string object | 120 | ** creates a new string object |
121 | */ | 121 | */ |
122 | static TString *createstrobj (lua_State *L, const char *str, size_t l, | 122 | static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) { |
123 | int tag, unsigned int h) { | ||
124 | TString *ts; | 123 | TString *ts; |
125 | GCObject *o; | 124 | GCObject *o; |
126 | size_t totalsize; /* total size of TString object */ | 125 | size_t totalsize; /* total size of TString object */ |
@@ -129,12 +128,18 @@ static TString *createstrobj (lua_State *L, const char *str, size_t l, | |||
129 | ts = gco2ts(o); | 128 | ts = gco2ts(o); |
130 | ts->hash = h; | 129 | ts->hash = h; |
131 | ts->extra = 0; | 130 | ts->extra = 0; |
132 | memcpy(getaddrstr(ts), str, l * sizeof(char)); | ||
133 | getaddrstr(ts)[l] = '\0'; /* ending 0 */ | 131 | getaddrstr(ts)[l] = '\0'; /* ending 0 */ |
134 | return ts; | 132 | return ts; |
135 | } | 133 | } |
136 | 134 | ||
137 | 135 | ||
136 | TString *luaS_createlngstrobj (lua_State *L, size_t l) { | ||
137 | TString *ts = createstrobj(L, l, LUA_TLNGSTR, G(L)->seed); | ||
138 | ts->u.lnglen = l; | ||
139 | return ts; | ||
140 | } | ||
141 | |||
142 | |||
138 | void luaS_remove (lua_State *L, TString *ts) { | 143 | void luaS_remove (lua_State *L, TString *ts) { |
139 | stringtable *tb = &G(L)->strt; | 144 | stringtable *tb = &G(L)->strt; |
140 | TString **p = &tb->hash[lmod(ts->hash, tb->size)]; | 145 | TString **p = &tb->hash[lmod(ts->hash, tb->size)]; |
@@ -166,7 +171,8 @@ static TString *internshrstr (lua_State *L, const char *str, size_t l) { | |||
166 | luaS_resize(L, g->strt.size * 2); | 171 | luaS_resize(L, g->strt.size * 2); |
167 | list = &g->strt.hash[lmod(h, g->strt.size)]; /* recompute with new size */ | 172 | list = &g->strt.hash[lmod(h, g->strt.size)]; /* recompute with new size */ |
168 | } | 173 | } |
169 | ts = createstrobj(L, str, l, LUA_TSHRSTR, h); | 174 | ts = createstrobj(L, l, LUA_TSHRSTR, h); |
175 | memcpy(getaddrstr(ts), str, l * sizeof(char)); | ||
170 | ts->shrlen = cast_byte(l); | 176 | ts->shrlen = cast_byte(l); |
171 | ts->u.hnext = *list; | 177 | ts->u.hnext = *list; |
172 | *list = ts; | 178 | *list = ts; |
@@ -185,8 +191,8 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { | |||
185 | TString *ts; | 191 | TString *ts; |
186 | if (l >= (MAX_SIZE - sizeof(TString))/sizeof(char)) | 192 | if (l >= (MAX_SIZE - sizeof(TString))/sizeof(char)) |
187 | luaM_toobig(L); | 193 | luaM_toobig(L); |
188 | ts = createstrobj(L, str, l, LUA_TLNGSTR, G(L)->seed); | 194 | ts = luaS_createlngstrobj(L, l); |
189 | ts->u.lnglen = l; | 195 | memcpy(getaddrstr(ts), str, l * sizeof(char)); |
190 | return ts; | 196 | return ts; |
191 | } | 197 | } |
192 | } | 198 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstring.h,v 1.58 2015/03/04 13:31:21 roberto Exp roberto $ | 2 | ** $Id: lstring.h,v 1.59 2015/03/25 13:42:19 roberto Exp roberto $ |
3 | ** String table (keep all strings handled by Lua) | 3 | ** String table (keep all strings handled by Lua) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -42,6 +42,7 @@ LUAI_FUNC void luaS_remove (lua_State *L, TString *ts); | |||
42 | LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s); | 42 | LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s); |
43 | LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); | 43 | LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); |
44 | LUAI_FUNC TString *luaS_new (lua_State *L, const char *str); | 44 | LUAI_FUNC TString *luaS_new (lua_State *L, const char *str); |
45 | LUAI_FUNC TString *luaS_createlngstrobj (lua_State *L, size_t l); | ||
45 | 46 | ||
46 | 47 | ||
47 | #endif | 48 | #endif |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lundump.c,v 2.40 2014/06/19 18:27:20 roberto Exp roberto $ | 2 | ** $Id: lundump.c,v 2.41 2014/11/02 19:19:04 roberto Exp roberto $ |
3 | ** load precompiled Lua chunks | 3 | ** load precompiled Lua chunks |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -32,7 +32,6 @@ | |||
32 | typedef struct { | 32 | typedef struct { |
33 | lua_State *L; | 33 | lua_State *L; |
34 | ZIO *Z; | 34 | ZIO *Z; |
35 | Mbuffer *b; | ||
36 | const char *name; | 35 | const char *name; |
37 | } LoadState; | 36 | } LoadState; |
38 | 37 | ||
@@ -92,10 +91,15 @@ static TString *LoadString (LoadState *S) { | |||
92 | LoadVar(S, size); | 91 | LoadVar(S, size); |
93 | if (size == 0) | 92 | if (size == 0) |
94 | return NULL; | 93 | return NULL; |
95 | else { | 94 | else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */ |
96 | char *s = luaZ_openspace(S->L, S->b, --size); | 95 | char buff[LUAI_MAXSHORTLEN]; |
97 | LoadVector(S, s, size); | 96 | LoadVector(S, buff, size); |
98 | return luaS_newlstr(S->L, s, size); | 97 | return luaS_newlstr(S->L, buff, size); |
98 | } | ||
99 | else { /* long string */ | ||
100 | TString *ts = luaS_createlngstrobj(S->L, size); | ||
101 | LoadVector(S, getaddrstr(ts), size); /* load directly in final place */ | ||
102 | return ts; | ||
99 | } | 103 | } |
100 | } | 104 | } |
101 | 105 | ||
@@ -251,8 +255,7 @@ static void checkHeader (LoadState *S) { | |||
251 | /* | 255 | /* |
252 | ** load precompiled chunk | 256 | ** load precompiled chunk |
253 | */ | 257 | */ |
254 | LClosure *luaU_undump(lua_State *L, ZIO *Z, Mbuffer *buff, | 258 | LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) { |
255 | const char *name) { | ||
256 | LoadState S; | 259 | LoadState S; |
257 | LClosure *cl; | 260 | LClosure *cl; |
258 | if (*name == '@' || *name == '=') | 261 | if (*name == '@' || *name == '=') |
@@ -263,7 +266,6 @@ LClosure *luaU_undump(lua_State *L, ZIO *Z, Mbuffer *buff, | |||
263 | S.name = name; | 266 | S.name = name; |
264 | S.L = L; | 267 | S.L = L; |
265 | S.Z = Z; | 268 | S.Z = Z; |
266 | S.b = buff; | ||
267 | checkHeader(&S); | 269 | checkHeader(&S); |
268 | cl = luaF_newLclosure(L, LoadByte(&S)); | 270 | cl = luaF_newLclosure(L, LoadByte(&S)); |
269 | setclLvalue(L, L->top, cl); | 271 | setclLvalue(L, L->top, cl); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lundump.h,v 1.43 2014/04/15 14:28:20 roberto Exp roberto $ | 2 | ** $Id: lundump.h,v 1.44 2014/06/19 18:27:20 roberto Exp roberto $ |
3 | ** load precompiled Lua chunks | 3 | ** load precompiled Lua chunks |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -23,8 +23,7 @@ | |||
23 | #define LUAC_FORMAT 0 /* this is the official format */ | 23 | #define LUAC_FORMAT 0 /* this is the official format */ |
24 | 24 | ||
25 | /* load one chunk; from lundump.c */ | 25 | /* load one chunk; from lundump.c */ |
26 | LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, | 26 | LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name); |
27 | const char* name); | ||
28 | 27 | ||
29 | /* dump one chunk; from ldump.c */ | 28 | /* dump one chunk; from ldump.c */ |
30 | LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, | 29 | LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 2.249 2015/08/03 19:50:49 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.250 2015/08/03 20:40:26 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 | */ |
@@ -445,6 +445,17 @@ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { | |||
445 | 445 | ||
446 | #define isemptystr(o) (ttisshrstring(o) && tsvalue(o)->shrlen == 0) | 446 | #define isemptystr(o) (ttisshrstring(o) && tsvalue(o)->shrlen == 0) |
447 | 447 | ||
448 | /* copy strings in stack from top - n up to top - 1 to buffer */ | ||
449 | static void copy2buff (StkId top, int n, char *buff) { | ||
450 | size_t tl = 0; /* size already copied */ | ||
451 | do { | ||
452 | size_t l = vslen(top - n); /* length of string being copied */ | ||
453 | memcpy(buff + tl, svalue(top - n), l * sizeof(char)); | ||
454 | tl += l; | ||
455 | } while (--n > 0); | ||
456 | } | ||
457 | |||
458 | |||
448 | /* | 459 | /* |
449 | ** Main operation for concatenation: concat 'total' values in the stack, | 460 | ** Main operation for concatenation: concat 'total' values in the stack, |
450 | ** from 'L->top - total' up to 'L->top - 1'. | 461 | ** from 'L->top - total' up to 'L->top - 1'. |
@@ -464,24 +475,24 @@ void luaV_concat (lua_State *L, int total) { | |||
464 | else { | 475 | else { |
465 | /* at least two non-empty string values; get as many as possible */ | 476 | /* at least two non-empty string values; get as many as possible */ |
466 | size_t tl = vslen(top - 1); | 477 | size_t tl = vslen(top - 1); |
467 | char *buffer; | 478 | TString *ts; |
468 | int i; | 479 | /* collect total length and number of strings */ |
469 | /* collect total length */ | 480 | for (n = 1; n < total && tostring(L, top - n - 1); n++) { |
470 | for (i = 1; i < total && tostring(L, top-i-1); i++) { | 481 | size_t l = vslen(top - n - 1); |
471 | size_t l = vslen(top - i - 1); | ||
472 | if (l >= (MAX_SIZE/sizeof(char)) - tl) | 482 | if (l >= (MAX_SIZE/sizeof(char)) - tl) |
473 | luaG_runerror(L, "string length overflow"); | 483 | luaG_runerror(L, "string length overflow"); |
474 | tl += l; | 484 | tl += l; |
475 | } | 485 | } |
476 | buffer = luaZ_openspace(L, &G(L)->buff, tl); | 486 | if (tl <= LUAI_MAXSHORTLEN) { /* is result a short string? */ |
477 | tl = 0; | 487 | char buff[LUAI_MAXSHORTLEN]; |
478 | n = i; | 488 | copy2buff(top, n, buff); /* copy strings to buffer */ |
479 | do { /* copy all strings to buffer */ | 489 | ts = luaS_newlstr(L, buff, tl); |
480 | size_t l = vslen(top - i); | 490 | } |
481 | memcpy(buffer+tl, svalue(top-i), l * sizeof(char)); | 491 | else { /* long string; copy strings directly to final result */ |
482 | tl += l; | 492 | ts = luaS_createlngstrobj(L, tl); |
483 | } while (--i > 0); | 493 | copy2buff(top, n, getaddrstr(ts)); |
484 | setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl)); /* create result */ | 494 | } |
495 | setsvalue2s(L, top - n, ts); /* create result */ | ||
485 | } | 496 | } |
486 | total -= n-1; /* got 'n' strings to create 1 new */ | 497 | total -= n-1; /* got 'n' strings to create 1 new */ |
487 | L->top -= n-1; /* popped 'n' strings and pushed one */ | 498 | L->top -= n-1; /* popped 'n' strings and pushed one */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lzio.c,v 1.35 2012/05/14 13:34:18 roberto Exp roberto $ | 2 | ** $Id: lzio.c,v 1.36 2014/11/02 19:19:04 roberto Exp roberto $ |
3 | ** Buffered streams | 3 | ** Buffered streams |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -66,13 +66,3 @@ size_t luaZ_read (ZIO *z, void *b, size_t n) { | |||
66 | return 0; | 66 | return 0; |
67 | } | 67 | } |
68 | 68 | ||
69 | /* ------------------------------------------------------------------------ */ | ||
70 | char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) { | ||
71 | if (n > buff->buffsize) { | ||
72 | if (n < LUA_MINBUFFER) n = LUA_MINBUFFER; | ||
73 | luaZ_resizebuffer(L, buff, n); | ||
74 | } | ||
75 | return buff->buffer; | ||
76 | } | ||
77 | |||
78 | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lzio.h,v 1.29 2014/12/19 13:45:40 roberto Exp roberto $ | 2 | ** $Id: lzio.h,v 1.30 2014/12/19 17:26:14 roberto Exp roberto $ |
3 | ** Buffered streams | 3 | ** Buffered streams |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -44,7 +44,6 @@ typedef struct Mbuffer { | |||
44 | #define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) | 44 | #define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) |
45 | 45 | ||
46 | 46 | ||
47 | LUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n); | ||
48 | LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, | 47 | LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, |
49 | void *data); | 48 | void *data); |
50 | LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n); /* read next n bytes */ | 49 | LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n); /* read next n bytes */ |