aboutsummaryrefslogtreecommitdiff
path: root/lstate.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-02-14 19:47:29 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-02-14 19:47:29 -0200
commitb0a5e156b8e6913c6eb8ed65ab28576b8b88f461 (patch)
tree11b32d6436e2c663171127990509d091c1ea847d /lstate.c
parentac178ee4788c13761ec0850b31ff17673a33f227 (diff)
downloadlua-b0a5e156b8e6913c6eb8ed65ab28576b8b88f461.tar.gz
lua-b0a5e156b8e6913c6eb8ed65ab28576b8b88f461.tar.bz2
lua-b0a5e156b8e6913c6eb8ed65ab28576b8b88f461.zip
no more maximum stack size
Diffstat (limited to 'lstate.c')
-rw-r--r--lstate.c28
1 files changed, 7 insertions, 21 deletions
diff --git a/lstate.c b/lstate.c
index 1f30d03b..4f89a892 100644
--- a/lstate.c
+++ b/lstate.c
@@ -21,22 +21,12 @@
21 21
22 22
23 23
24struct Sopen {
25 lua_State *L;
26 int stacksize;
27};
28
29 24
30static void close_state (lua_State *L); 25static void close_state (lua_State *L);
31 26
32 27
33static void stack_init (lua_State *L, lua_State *OL, int maxstacksize) { 28static void stack_init (lua_State *L, lua_State *OL) {
34 if (maxstacksize == 0)
35 maxstacksize = DEFAULT_MAXSTACK;
36 else
37 maxstacksize += 2*LUA_MINSTACK;
38 L->stack = luaM_newvector(OL, BASIC_STACK_SIZE, TObject); 29 L->stack = luaM_newvector(OL, BASIC_STACK_SIZE, TObject);
39 L->maxstacksize = maxstacksize;
40 L->stacksize = BASIC_STACK_SIZE; 30 L->stacksize = BASIC_STACK_SIZE;
41 L->top = L->stack + RESERVED_STACK_PREFIX; 31 L->top = L->stack + RESERVED_STACK_PREFIX;
42 L->stack_last = L->stack+(BASIC_STACK_SIZE-EXTRA_STACK)-1; 32 L->stack_last = L->stack+(BASIC_STACK_SIZE-EXTRA_STACK)-1;
@@ -53,7 +43,7 @@ static void stack_init (lua_State *L, lua_State *OL, int maxstacksize) {
53** open parts that may cause memory-allocation errors 43** open parts that may cause memory-allocation errors
54*/ 44*/
55static void f_luaopen (lua_State *L, void *ud) { 45static void f_luaopen (lua_State *L, void *ud) {
56 struct Sopen *so = cast(struct Sopen *, ud); 46 UNUSED(ud);
57 /* create a new global state */ 47 /* create a new global state */
58 L->_G = luaM_new(L, global_State); 48 L->_G = luaM_new(L, global_State);
59 G(L)->strt.size = 0; 49 G(L)->strt.size = 0;
@@ -68,7 +58,7 @@ static void f_luaopen (lua_State *L, void *ud) {
68 G(L)->rootudata = NULL; 58 G(L)->rootudata = NULL;
69 G(L)->tmudata = NULL; 59 G(L)->tmudata = NULL;
70 G(L)->nblocks = sizeof(lua_State) + sizeof(global_State); 60 G(L)->nblocks = sizeof(lua_State) + sizeof(global_State);
71 stack_init(L, L, so->stacksize); /* init stack */ 61 stack_init(L, L); /* init stack */
72 /* create default meta table with a dummy table, and then close the loop */ 62 /* create default meta table with a dummy table, and then close the loop */
73 sethvalue(defaultmeta(L), NULL); 63 sethvalue(defaultmeta(L), NULL);
74 sethvalue(defaultmeta(L), luaH_new(L, 0, 4)); 64 sethvalue(defaultmeta(L), luaH_new(L, 0, 4));
@@ -85,7 +75,6 @@ static void f_luaopen (lua_State *L, void *ud) {
85static void preinit_state (lua_State *L) { 75static void preinit_state (lua_State *L) {
86 L->stack = NULL; 76 L->stack = NULL;
87 L->stacksize = 0; 77 L->stacksize = 0;
88 L->maxstacksize = 1;
89 L->errorJmp = NULL; 78 L->errorJmp = NULL;
90 L->callhook = NULL; 79 L->callhook = NULL;
91 L->linehook = NULL; 80 L->linehook = NULL;
@@ -96,7 +85,7 @@ static void preinit_state (lua_State *L) {
96} 85}
97 86
98 87
99LUA_API lua_State *lua_newthread (lua_State *OL, int stacksize) { 88LUA_API lua_State *lua_newthread (lua_State *OL) {
100 lua_State *L; 89 lua_State *L;
101 lua_lock(OL); 90 lua_lock(OL);
102 L = luaM_new(OL, lua_State); 91 L = luaM_new(OL, lua_State);
@@ -106,7 +95,7 @@ LUA_API lua_State *lua_newthread (lua_State *OL, int stacksize) {
106 L->next = OL->next; 95 L->next = OL->next;
107 OL->next = L; 96 OL->next = L;
108 L->previous = OL; 97 L->previous = OL;
109 stack_init(L, OL, stacksize); /* init stack */ 98 stack_init(L, OL); /* init stack */
110 setobj(defaultmeta(L), defaultmeta(OL)); /* share default meta table */ 99 setobj(defaultmeta(L), defaultmeta(OL)); /* share default meta table */
111 setobj(gt(L), gt(OL)); /* share table of globals */ 100 setobj(gt(L), gt(OL)); /* share table of globals */
112 setobj(registry(L), registry(OL)); /* share registry */ 101 setobj(registry(L), registry(OL)); /* share registry */
@@ -116,17 +105,14 @@ LUA_API lua_State *lua_newthread (lua_State *OL, int stacksize) {
116} 105}
117 106
118 107
119LUA_API lua_State *lua_open (int stacksize) { 108LUA_API lua_State *lua_open (void) {
120 struct Sopen so;
121 lua_State *L; 109 lua_State *L;
122 L = luaM_new(NULL, lua_State); 110 L = luaM_new(NULL, lua_State);
123 if (L) { /* allocation OK? */ 111 if (L) { /* allocation OK? */
124 preinit_state(L); 112 preinit_state(L);
125 L->_G = NULL; 113 L->_G = NULL;
126 L->next = L->previous = L; 114 L->next = L->previous = L;
127 so.stacksize = stacksize; 115 if (luaD_runprotected(L, f_luaopen, NULL) != 0) {
128 so.L = NULL;
129 if (luaD_runprotected(L, f_luaopen, &so) != 0) {
130 /* memory allocation error: free partial state */ 116 /* memory allocation error: free partial state */
131 close_state(L); 117 close_state(L);
132 L = NULL; 118 L = NULL;