diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-10-08 15:46:08 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-10-08 15:46:08 -0300 |
| commit | b3d0682fb94f56a438dbb4fdb2b3440ccc10cfb4 (patch) | |
| tree | 746fc9900768dfaf1ddffca35cb4f6fd55903bbf /ldo.c | |
| parent | 02afc892d5ce5d85e88faac443d7294589ee697a (diff) | |
| download | lua-b3d0682fb94f56a438dbb4fdb2b3440ccc10cfb4.tar.gz lua-b3d0682fb94f56a438dbb4fdb2b3440ccc10cfb4.tar.bz2 lua-b3d0682fb94f56a438dbb4fdb2b3440ccc10cfb4.zip | |
use of different buffers for scanner and concatenation
Diffstat (limited to 'ldo.c')
| -rw-r--r-- | ldo.c | 7 |
1 files changed, 5 insertions, 2 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 1.193 2002/08/30 19:09:21 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 1.194 2002/09/02 20:00:41 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 | */ |
| @@ -420,12 +420,13 @@ int luaD_pcall (lua_State *L, int nargs, int nresults, ptrdiff_t errfunc) { | |||
| 420 | */ | 420 | */ |
| 421 | struct SParser { /* data to `f_parser' */ | 421 | struct SParser { /* data to `f_parser' */ |
| 422 | ZIO *z; | 422 | ZIO *z; |
| 423 | Mbuffer buff; /* buffer to be used by the scanner */ | ||
| 423 | int bin; | 424 | int bin; |
| 424 | }; | 425 | }; |
| 425 | 426 | ||
| 426 | static void f_parser (lua_State *L, void *ud) { | 427 | static void f_parser (lua_State *L, void *ud) { |
| 427 | struct SParser *p = cast(struct SParser *, ud); | 428 | struct SParser *p = cast(struct SParser *, ud); |
| 428 | Proto *tf = p->bin ? luaU_undump(L, p->z) : luaY_parser(L, p->z); | 429 | Proto *tf = p->bin ? luaU_undump(L, p->z) : luaY_parser(L, p->z, &p->buff); |
| 429 | Closure *cl = luaF_newLclosure(L, 0, gt(L)); | 430 | Closure *cl = luaF_newLclosure(L, 0, gt(L)); |
| 430 | cl->l.p = tf; | 431 | cl->l.p = tf; |
| 431 | setclvalue(L->top, cl); | 432 | setclvalue(L->top, cl); |
| @@ -439,11 +440,13 @@ int luaD_protectedparser (lua_State *L, ZIO *z, int bin) { | |||
| 439 | int status; | 440 | int status; |
| 440 | ptrdiff_t oldtopr = savestack(L, L->top); /* save current top */ | 441 | ptrdiff_t oldtopr = savestack(L, L->top); /* save current top */ |
| 441 | p.z = z; p.bin = bin; | 442 | p.z = z; p.bin = bin; |
| 443 | luaZ_initbuffer(L, &p.buff); | ||
| 442 | /* before parsing, give a (good) chance to GC */ | 444 | /* before parsing, give a (good) chance to GC */ |
| 443 | if (G(L)->nblocks + G(L)->nblocks/4 >= G(L)->GCthreshold) | 445 | if (G(L)->nblocks + G(L)->nblocks/4 >= G(L)->GCthreshold) |
| 444 | luaC_collectgarbage(L); | 446 | luaC_collectgarbage(L); |
| 445 | old_blocks = G(L)->nblocks; | 447 | old_blocks = G(L)->nblocks; |
| 446 | status = luaD_rawrunprotected(L, f_parser, &p); | 448 | status = luaD_rawrunprotected(L, f_parser, &p); |
| 449 | luaZ_freebuffer(L, &p.buff); | ||
| 447 | if (status == 0) { | 450 | if (status == 0) { |
| 448 | /* add new memory to threshold (as it probably will stay) */ | 451 | /* add new memory to threshold (as it probably will stay) */ |
| 449 | lua_assert(G(L)->nblocks >= old_blocks); | 452 | lua_assert(G(L)->nblocks >= old_blocks); |
