diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-02-14 19:47:29 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-02-14 19:47:29 -0200 |
commit | b0a5e156b8e6913c6eb8ed65ab28576b8b88f461 (patch) | |
tree | 11b32d6436e2c663171127990509d091c1ea847d /lstate.c | |
parent | ac178ee4788c13761ec0850b31ff17673a33f227 (diff) | |
download | lua-b0a5e156b8e6913c6eb8ed65ab28576b8b88f461.tar.gz lua-b0a5e156b8e6913c6eb8ed65ab28576b8b88f461.tar.bz2 lua-b0a5e156b8e6913c6eb8ed65ab28576b8b88f461.zip |
no more maximum stack size
Diffstat (limited to 'lstate.c')
-rw-r--r-- | lstate.c | 28 |
1 files changed, 7 insertions, 21 deletions
@@ -21,22 +21,12 @@ | |||
21 | 21 | ||
22 | 22 | ||
23 | 23 | ||
24 | struct Sopen { | ||
25 | lua_State *L; | ||
26 | int stacksize; | ||
27 | }; | ||
28 | |||
29 | 24 | ||
30 | static void close_state (lua_State *L); | 25 | static void close_state (lua_State *L); |
31 | 26 | ||
32 | 27 | ||
33 | static void stack_init (lua_State *L, lua_State *OL, int maxstacksize) { | 28 | static 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 | */ |
55 | static void f_luaopen (lua_State *L, void *ud) { | 45 | static 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) { | |||
85 | static void preinit_state (lua_State *L) { | 75 | static 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 | ||
99 | LUA_API lua_State *lua_newthread (lua_State *OL, int stacksize) { | 88 | LUA_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 | ||
119 | LUA_API lua_State *lua_open (int stacksize) { | 108 | LUA_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; |