aboutsummaryrefslogtreecommitdiff
path: root/ldo.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-12-28 10:55:41 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-12-28 10:55:41 -0200
commit0183b8030c80f57b87874ff7867ccdb172d9d3dc (patch)
tree1033b5a84489a2f1f1bd210b1b120155cd7aeed7 /ldo.c
parent8c49e198654567f770a7d5081b886a7c35201d81 (diff)
downloadlua-0183b8030c80f57b87874ff7867ccdb172d9d3dc.tar.gz
lua-0183b8030c80f57b87874ff7867ccdb172d9d3dc.tar.bz2
lua-0183b8030c80f57b87874ff7867ccdb172d9d3dc.zip
`free' gets size of the block: complete control over memory use
Diffstat (limited to 'ldo.c')
-rw-r--r--ldo.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/ldo.c b/ldo.c
index 140cff45..01485165 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 1.109 2000/10/30 12:38:50 roberto Exp roberto $ 2** $Id: ldo.c,v 1.110 2000/11/24 17:39:56 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*/
@@ -28,38 +28,40 @@
28 28
29 29
30/* space to handle stack overflow errors */ 30/* space to handle stack overflow errors */
31#define EXTRA_STACK (2*LUA_MINSTACK) 31#define EXTRA_STACK (2*LUA_MINSTACK)
32
33
34static void restore_stack_limit (lua_State *L) {
35 StkId limit = L->stack+(L->stacksize-EXTRA_STACK)-1;
36 if (L->top < limit)
37 L->stack_last = limit;
38}
32 39
33 40
34void luaD_init (lua_State *L, int stacksize) { 41void luaD_init (lua_State *L, int stacksize) {
35 L->stack = luaM_newvector(L, stacksize+EXTRA_STACK, TObject); 42 stacksize += EXTRA_STACK;
36 L->nblocks += stacksize*sizeof(TObject); 43 L->stack = luaM_newvector(L, stacksize, TObject);
37 L->stack_last = L->stack+(stacksize-1);
38 L->stacksize = stacksize; 44 L->stacksize = stacksize;
39 L->Cbase = L->top = L->stack; 45 L->Cbase = L->top = L->stack;
46 restore_stack_limit(L);
40} 47}
41 48
42 49
43void luaD_checkstack (lua_State *L, int n) { 50void luaD_checkstack (lua_State *L, int n) {
44 if (L->stack_last - L->top <= n) { /* stack overflow? */ 51 if (L->stack_last - L->top <= n) { /* stack overflow? */
45 if (L->stack_last-L->stack > (L->stacksize-1)) { 52 if (L->stack_last == L->stack+L->stacksize-1) {
46 /* overflow while handling overflow */ 53 /* overflow while handling overflow */
47 luaD_breakrun(L, LUA_ERRERR); /* break run without error message */ 54 luaD_breakrun(L, LUA_ERRERR); /* break run without error message */
48 } 55 }
49 else { 56 else {
50 L->stack_last += EXTRA_STACK; /* to be used by error message */ 57 L->stack_last += EXTRA_STACK; /* to be used by error message */
58 LUA_ASSERT(L->stack_last == L->stack+L->stacksize-1, "wrong stack limit");
51 lua_error(L, "stack overflow"); 59 lua_error(L, "stack overflow");
52 } 60 }
53 } 61 }
54} 62}
55 63
56 64
57static void restore_stack_limit (lua_State *L) {
58 if (L->top - L->stack < L->stacksize - 1)
59 L->stack_last = L->stack + (L->stacksize-1);
60}
61
62
63/* 65/*
64** Adjust stack. Set top to base+extra, pushing NILs if needed. 66** Adjust stack. Set top to base+extra, pushing NILs if needed.
65** (we cannot add base+extra unless we are sure it fits in the stack; 67** (we cannot add base+extra unless we are sure it fits in the stack;