diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-11-19 15:29:23 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-11-19 15:29:23 -0200 |
| commit | 592a3f289b428e3ee5cc595a266607ad7f5d94ff (patch) | |
| tree | 19a371157be240f7e0f579117d04d466e911afcd /ldo.c | |
| parent | 9cdeb275e7c93007b2ece6f81aaeafe530076805 (diff) | |
| download | lua-592a3f289b428e3ee5cc595a266607ad7f5d94ff.tar.gz lua-592a3f289b428e3ee5cc595a266607ad7f5d94ff.tar.bz2 lua-592a3f289b428e3ee5cc595a266607ad7f5d94ff.zip | |
first implementation of centralized global state.
Diffstat (limited to 'ldo.c')
| -rw-r--r-- | ldo.c | 170 |
1 files changed, 81 insertions, 89 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 1.7 1997/11/04 15:27:53 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 1.8 1997/11/07 15:09:49 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 | */ |
| @@ -16,6 +16,7 @@ | |||
| 16 | #include "lmem.h" | 16 | #include "lmem.h" |
| 17 | #include "lobject.h" | 17 | #include "lobject.h" |
| 18 | #include "lparser.h" | 18 | #include "lparser.h" |
| 19 | #include "lstate.h" | ||
| 19 | #include "ltm.h" | 20 | #include "ltm.h" |
| 20 | #include "lua.h" | 21 | #include "lua.h" |
| 21 | #include "luadebug.h" | 22 | #include "luadebug.h" |
| @@ -30,14 +31,6 @@ | |||
| 30 | #endif | 31 | #endif |
| 31 | 32 | ||
| 32 | 33 | ||
| 33 | struct Stack luaD_stack; | ||
| 34 | |||
| 35 | |||
| 36 | struct C_Lua_Stack luaD_Cstack = {0, 0, 0}; | ||
| 37 | |||
| 38 | static jmp_buf *errorJmp = NULL; /* current error recover point */ | ||
| 39 | |||
| 40 | |||
| 41 | 34 | ||
| 42 | /* | 35 | /* |
| 43 | ** Error messages | 36 | ** Error messages |
| @@ -50,8 +43,6 @@ static void stderrorim (void) | |||
| 50 | fprintf(stderr, "lua error: %s\n", lua_getstring(s)); | 43 | fprintf(stderr, "lua error: %s\n", lua_getstring(s)); |
| 51 | } | 44 | } |
| 52 | 45 | ||
| 53 | TObject luaD_errorim; | ||
| 54 | |||
| 55 | 46 | ||
| 56 | static void initCfunc (TObject *o, lua_CFunction f) | 47 | static void initCfunc (TObject *o, lua_CFunction f) |
| 57 | { | 48 | { |
| @@ -67,24 +58,25 @@ static void initCfunc (TObject *o, lua_CFunction f) | |||
| 67 | 58 | ||
| 68 | void luaD_init (void) | 59 | void luaD_init (void) |
| 69 | { | 60 | { |
| 70 | luaD_stack.stack = luaM_newvector(INIT_STACK_SIZE, TObject); | 61 | L->stacklimit = STACK_LIMIT; |
| 71 | luaD_stack.top = luaD_stack.stack; | 62 | L->stack.stack = luaM_newvector(INIT_STACK_SIZE, TObject); |
| 72 | luaD_stack.last = luaD_stack.stack+(INIT_STACK_SIZE-1); | 63 | L->stack.top = L->stack.stack; |
| 73 | initCfunc(&luaD_errorim, stderrorim); | 64 | L->stack.last = L->stack.stack+(INIT_STACK_SIZE-1); |
| 65 | initCfunc(&L->errorim, stderrorim); | ||
| 74 | } | 66 | } |
| 75 | 67 | ||
| 76 | 68 | ||
| 77 | void luaD_checkstack (int n) | 69 | void luaD_checkstack (int n) |
| 78 | { | 70 | { |
| 79 | if (luaD_stack.last-luaD_stack.top <= n) { | 71 | if (L->stack.last-L->stack.top <= n) { |
| 80 | static int limit = STACK_LIMIT; | 72 | StkId top = L->stack.top-L->stack.stack; |
| 81 | StkId top = luaD_stack.top-luaD_stack.stack; | 73 | int stacksize = (L->stack.last-L->stack.stack)+1+STACK_EXTRA+n; |
| 82 | int stacksize = (luaD_stack.last-luaD_stack.stack)+1+STACK_EXTRA+n; | 74 | L->stack.stack = luaM_reallocvector(L->stack.stack, stacksize,TObject); |
| 83 | luaD_stack.stack = luaM_reallocvector(luaD_stack.stack, stacksize,TObject); | 75 | L->stack.last = L->stack.stack+(stacksize-1); |
| 84 | luaD_stack.last = luaD_stack.stack+(stacksize-1); | 76 | L->stack.top = L->stack.stack + top; |
| 85 | luaD_stack.top = luaD_stack.stack + top; | 77 | if (stacksize >= L->stacklimit) { |
| 86 | if (stacksize >= limit) { | 78 | /* extra space to run error handler */ |
| 87 | limit = stacksize+STACK_EXTRA; /* extra space to run error handler */ | 79 | L->stacklimit = stacksize+STACK_EXTRA; |
| 88 | if (lua_stackedfunction(100) == LUA_NOOBJECT) { | 80 | if (lua_stackedfunction(100) == LUA_NOOBJECT) { |
| 89 | /* less than 100 functions on the stack: cannot be recursive loop */ | 81 | /* less than 100 functions on the stack: cannot be recursive loop */ |
| 90 | lua_error("Lua2C - C2Lua overflow"); | 82 | lua_error("Lua2C - C2Lua overflow"); |
| @@ -101,80 +93,80 @@ void luaD_checkstack (int n) | |||
| 101 | */ | 93 | */ |
| 102 | void luaD_adjusttop (StkId newtop) | 94 | void luaD_adjusttop (StkId newtop) |
| 103 | { | 95 | { |
| 104 | int diff = newtop-(luaD_stack.top-luaD_stack.stack); | 96 | int diff = newtop-(L->stack.top-L->stack.stack); |
| 105 | if (diff <= 0) | 97 | if (diff <= 0) |
| 106 | luaD_stack.top += diff; | 98 | L->stack.top += diff; |
| 107 | else { | 99 | else { |
| 108 | luaD_checkstack(diff); | 100 | luaD_checkstack(diff); |
| 109 | while (diff--) | 101 | while (diff--) |
| 110 | ttype(luaD_stack.top++) = LUA_T_NIL; | 102 | ttype(L->stack.top++) = LUA_T_NIL; |
| 111 | } | 103 | } |
| 112 | } | 104 | } |
| 113 | 105 | ||
| 114 | 106 | ||
| 115 | /* | 107 | /* |
| 116 | ** Open a hole below "nelems" from the luaD_stack.top. | 108 | ** Open a hole below "nelems" from the L->stack.top. |
| 117 | */ | 109 | */ |
| 118 | void luaD_openstack (int nelems) | 110 | void luaD_openstack (int nelems) |
| 119 | { | 111 | { |
| 120 | int i; | 112 | int i; |
| 121 | for (i=0; i<nelems; i++) | 113 | for (i=0; i<nelems; i++) |
| 122 | *(luaD_stack.top-i) = *(luaD_stack.top-i-1); | 114 | *(L->stack.top-i) = *(L->stack.top-i-1); |
| 123 | incr_top; | 115 | incr_top; |
| 124 | } | 116 | } |
| 125 | 117 | ||
| 126 | 118 | ||
| 127 | void luaD_lineHook (int line) | 119 | void luaD_lineHook (int line) |
| 128 | { | 120 | { |
| 129 | struct C_Lua_Stack oldCLS = luaD_Cstack; | 121 | struct C_Lua_Stack oldCLS = L->Cstack; |
| 130 | StkId old_top = luaD_Cstack.lua2C = luaD_Cstack.base = luaD_stack.top-luaD_stack.stack; | 122 | StkId old_top = L->Cstack.lua2C = L->Cstack.base = L->stack.top-L->stack.stack; |
| 131 | luaD_Cstack.num = 0; | 123 | L->Cstack.num = 0; |
| 132 | (*lua_linehook)(line); | 124 | (*lua_linehook)(line); |
| 133 | luaD_stack.top = luaD_stack.stack+old_top; | 125 | L->stack.top = L->stack.stack+old_top; |
| 134 | luaD_Cstack = oldCLS; | 126 | L->Cstack = oldCLS; |
| 135 | } | 127 | } |
| 136 | 128 | ||
| 137 | 129 | ||
| 138 | void luaD_callHook (StkId base, lua_Type type, int isreturn) | 130 | void luaD_callHook (StkId base, lua_Type type, int isreturn) |
| 139 | { | 131 | { |
| 140 | struct C_Lua_Stack oldCLS = luaD_Cstack; | 132 | struct C_Lua_Stack oldCLS = L->Cstack; |
| 141 | StkId old_top = luaD_Cstack.lua2C = luaD_Cstack.base = luaD_stack.top-luaD_stack.stack; | 133 | StkId old_top = L->Cstack.lua2C = L->Cstack.base = L->stack.top-L->stack.stack; |
| 142 | luaD_Cstack.num = 0; | 134 | L->Cstack.num = 0; |
| 143 | if (isreturn) | 135 | if (isreturn) |
| 144 | (*lua_callhook)(LUA_NOOBJECT, "(return)", 0); | 136 | (*lua_callhook)(LUA_NOOBJECT, "(return)", 0); |
| 145 | else { | 137 | else { |
| 146 | TObject *f = luaD_stack.stack+base-1; | 138 | TObject *f = L->stack.stack+base-1; |
| 147 | if (type == LUA_T_PROTO) | 139 | if (type == LUA_T_PROTO) |
| 148 | (*lua_callhook)(Ref(f), tfvalue(protovalue(f))->fileName->str, | 140 | (*lua_callhook)(Ref(f), tfvalue(protovalue(f))->fileName->str, |
| 149 | tfvalue(protovalue(f))->lineDefined); | 141 | tfvalue(protovalue(f))->lineDefined); |
| 150 | else | 142 | else |
| 151 | (*lua_callhook)(Ref(f), "(C)", -1); | 143 | (*lua_callhook)(Ref(f), "(C)", -1); |
| 152 | } | 144 | } |
| 153 | luaD_stack.top = luaD_stack.stack+old_top; | 145 | L->stack.top = L->stack.stack+old_top; |
| 154 | luaD_Cstack = oldCLS; | 146 | L->Cstack = oldCLS; |
| 155 | } | 147 | } |
| 156 | 148 | ||
| 157 | 149 | ||
| 158 | /* | 150 | /* |
| 159 | ** Call a C function. luaD_Cstack.base will point to the top of the stack, | 151 | ** Call a C function. L->Cstack.base will point to the top of the stack, |
| 160 | ** and luaD_Cstack.num is the number of parameters. Returns an index | 152 | ** and L->Cstack.num is the number of parameters. Returns an index |
| 161 | ** to the first result from C. | 153 | ** to the first result from C. |
| 162 | */ | 154 | */ |
| 163 | static StkId callC (lua_CFunction func, StkId base) | 155 | static StkId callC (lua_CFunction func, StkId base) |
| 164 | { | 156 | { |
| 165 | struct C_Lua_Stack oldCLS = luaD_Cstack; | 157 | struct C_Lua_Stack oldCLS = L->Cstack; |
| 166 | StkId firstResult; | 158 | StkId firstResult; |
| 167 | luaD_Cstack.num = (luaD_stack.top-luaD_stack.stack) - base; | 159 | L->Cstack.num = (L->stack.top-L->stack.stack) - base; |
| 168 | /* incorporate parameters on the luaD_stack.stack */ | 160 | /* incorporate parameters on the L->stack.stack */ |
| 169 | luaD_Cstack.lua2C = base; | 161 | L->Cstack.lua2C = base; |
| 170 | luaD_Cstack.base = base+luaD_Cstack.num; /* == top-stack */ | 162 | L->Cstack.base = base+L->Cstack.num; /* == top-stack */ |
| 171 | if (lua_callhook) | 163 | if (lua_callhook) |
| 172 | luaD_callHook(base, LUA_T_CPROTO, 0); | 164 | luaD_callHook(base, LUA_T_CPROTO, 0); |
| 173 | (*func)(); | 165 | (*func)(); |
| 174 | if (lua_callhook) /* func may have changed lua_callhook */ | 166 | if (lua_callhook) /* func may have changed lua_callhook */ |
| 175 | luaD_callHook(base, LUA_T_CPROTO, 1); | 167 | luaD_callHook(base, LUA_T_CPROTO, 1); |
| 176 | firstResult = luaD_Cstack.base; | 168 | firstResult = L->Cstack.base; |
| 177 | luaD_Cstack = oldCLS; | 169 | L->Cstack = oldCLS; |
| 178 | return firstResult; | 170 | return firstResult; |
| 179 | } | 171 | } |
| 180 | 172 | ||
| @@ -182,21 +174,21 @@ static StkId callC (lua_CFunction func, StkId base) | |||
| 182 | void luaD_callTM (TObject *f, int nParams, int nResults) | 174 | void luaD_callTM (TObject *f, int nParams, int nResults) |
| 183 | { | 175 | { |
| 184 | luaD_openstack(nParams); | 176 | luaD_openstack(nParams); |
| 185 | *(luaD_stack.top-nParams-1) = *f; | 177 | *(L->stack.top-nParams-1) = *f; |
| 186 | luaD_call((luaD_stack.top-luaD_stack.stack)-nParams, nResults); | 178 | luaD_call((L->stack.top-L->stack.stack)-nParams, nResults); |
| 187 | } | 179 | } |
| 188 | 180 | ||
| 189 | 181 | ||
| 190 | /* | 182 | /* |
| 191 | ** Call a function (C or Lua). The parameters must be on the luaD_stack.stack, | 183 | ** Call a function (C or Lua). The parameters must be on the L->stack.stack, |
| 192 | ** between [luaD_stack.stack+base,luaD_stack.top). The function to be called is at luaD_stack.stack+base-1. | 184 | ** between [L->stack.stack+base,L->stack.top). The function to be called is at L->stack.stack+base-1. |
| 193 | ** When returns, the results are on the luaD_stack.stack, between [luaD_stack.stack+base-1,luaD_stack.top). | 185 | ** When returns, the results are on the L->stack.stack, between [L->stack.stack+base-1,L->stack.top). |
| 194 | ** The number of results is nResults, unless nResults=MULT_RET. | 186 | ** The number of results is nResults, unless nResults=MULT_RET. |
| 195 | */ | 187 | */ |
| 196 | void luaD_call (StkId base, int nResults) | 188 | void luaD_call (StkId base, int nResults) |
| 197 | { | 189 | { |
| 198 | StkId firstResult; | 190 | StkId firstResult; |
| 199 | TObject *func = luaD_stack.stack+base-1; | 191 | TObject *func = L->stack.stack+base-1; |
| 200 | int i; | 192 | int i; |
| 201 | if (ttype(func) == LUA_T_FUNCTION) { | 193 | if (ttype(func) == LUA_T_FUNCTION) { |
| 202 | TObject *proto = protovalue(func); | 194 | TObject *proto = protovalue(func); |
| @@ -209,7 +201,7 @@ void luaD_call (StkId base, int nResults) | |||
| 209 | TObject *im = luaT_getimbyObj(func, IM_FUNCTION); | 201 | TObject *im = luaT_getimbyObj(func, IM_FUNCTION); |
| 210 | if (ttype(im) == LUA_T_NIL) | 202 | if (ttype(im) == LUA_T_NIL) |
| 211 | lua_error("call expression not a function"); | 203 | lua_error("call expression not a function"); |
| 212 | luaD_callTM(im, (luaD_stack.top-luaD_stack.stack)-(base-1), nResults); | 204 | luaD_callTM(im, (L->stack.top-L->stack.stack)-(base-1), nResults); |
| 213 | return; | 205 | return; |
| 214 | } | 206 | } |
| 215 | /* adjust the number of results */ | 207 | /* adjust the number of results */ |
| @@ -217,29 +209,29 @@ void luaD_call (StkId base, int nResults) | |||
| 217 | luaD_adjusttop(firstResult+nResults); | 209 | luaD_adjusttop(firstResult+nResults); |
| 218 | /* move results to base-1 (to erase parameters and function) */ | 210 | /* move results to base-1 (to erase parameters and function) */ |
| 219 | base--; | 211 | base--; |
| 220 | nResults = luaD_stack.top - (luaD_stack.stack+firstResult); /* actual number of results */ | 212 | nResults = L->stack.top - (L->stack.stack+firstResult); /* actual number of results */ |
| 221 | for (i=0; i<nResults; i++) | 213 | for (i=0; i<nResults; i++) |
| 222 | *(luaD_stack.stack+base+i) = *(luaD_stack.stack+firstResult+i); | 214 | *(L->stack.stack+base+i) = *(L->stack.stack+firstResult+i); |
| 223 | luaD_stack.top -= firstResult-base; | 215 | L->stack.top -= firstResult-base; |
| 224 | } | 216 | } |
| 225 | 217 | ||
| 226 | 218 | ||
| 227 | 219 | ||
| 228 | /* | 220 | /* |
| 229 | ** Traverse all objects on luaD_stack.stack | 221 | ** Traverse all objects on L->stack.stack |
| 230 | */ | 222 | */ |
| 231 | void luaD_travstack (int (*fn)(TObject *)) | 223 | void luaD_travstack (int (*fn)(TObject *)) |
| 232 | { | 224 | { |
| 233 | StkId i; | 225 | StkId i; |
| 234 | for (i = (luaD_stack.top-1)-luaD_stack.stack; i>=0; i--) | 226 | for (i = (L->stack.top-1)-L->stack.stack; i>=0; i--) |
| 235 | fn (luaD_stack.stack+i); | 227 | fn (L->stack.stack+i); |
| 236 | } | 228 | } |
| 237 | 229 | ||
| 238 | 230 | ||
| 239 | 231 | ||
| 240 | static void message (char *s) | 232 | static void message (char *s) |
| 241 | { | 233 | { |
| 242 | TObject im = luaD_errorim; | 234 | TObject im = L->errorim; |
| 243 | if (ttype(&im) != LUA_T_NIL) { | 235 | if (ttype(&im) != LUA_T_NIL) { |
| 244 | lua_pushstring(s); | 236 | lua_pushstring(s); |
| 245 | luaD_callTM(&im, 1, 0); | 237 | luaD_callTM(&im, 1, 0); |
| @@ -252,8 +244,8 @@ static void message (char *s) | |||
| 252 | void lua_error (char *s) | 244 | void lua_error (char *s) |
| 253 | { | 245 | { |
| 254 | if (s) message(s); | 246 | if (s) message(s); |
| 255 | if (errorJmp) | 247 | if (L->errorJmp) |
| 256 | longjmp(*errorJmp, 1); | 248 | longjmp(*((jmp_buf *)L->errorJmp), 1); |
| 257 | else { | 249 | else { |
| 258 | fprintf (stderr, "lua: exit(1). Unable to recover\n"); | 250 | fprintf (stderr, "lua: exit(1). Unable to recover\n"); |
| 259 | exit(1); | 251 | exit(1); |
| @@ -261,40 +253,40 @@ void lua_error (char *s) | |||
| 261 | } | 253 | } |
| 262 | 254 | ||
| 263 | /* | 255 | /* |
| 264 | ** Call the function at luaD_Cstack.base, and incorporate results on | 256 | ** Call the function at L->Cstack.base, and incorporate results on |
| 265 | ** the Lua2C structure. | 257 | ** the Lua2C structure. |
| 266 | */ | 258 | */ |
| 267 | static void do_callinc (int nResults) | 259 | static void do_callinc (int nResults) |
| 268 | { | 260 | { |
| 269 | StkId base = luaD_Cstack.base; | 261 | StkId base = L->Cstack.base; |
| 270 | luaD_call(base+1, nResults); | 262 | luaD_call(base+1, nResults); |
| 271 | luaD_Cstack.lua2C = base; /* position of the luaM_new results */ | 263 | L->Cstack.lua2C = base; /* position of the luaM_new results */ |
| 272 | luaD_Cstack.num = (luaD_stack.top-luaD_stack.stack) - base; /* number of results */ | 264 | L->Cstack.num = (L->stack.top-L->stack.stack) - base; /* number of results */ |
| 273 | luaD_Cstack.base = base + luaD_Cstack.num; /* incorporate results on luaD_stack.stack */ | 265 | L->Cstack.base = base + L->Cstack.num; /* incorporate results on L->stack.stack */ |
| 274 | } | 266 | } |
| 275 | 267 | ||
| 276 | 268 | ||
| 277 | /* | 269 | /* |
| 278 | ** Execute a protected call. Assumes that function is at luaD_Cstack.base and | 270 | ** Execute a protected call. Assumes that function is at L->Cstack.base and |
| 279 | ** parameters are on top of it. Leave nResults on the stack. | 271 | ** parameters are on top of it. Leave nResults on the stack. |
| 280 | */ | 272 | */ |
| 281 | int luaD_protectedrun (int nResults) | 273 | int luaD_protectedrun (int nResults) |
| 282 | { | 274 | { |
| 283 | jmp_buf myErrorJmp; | 275 | jmp_buf myErrorJmp; |
| 284 | int status; | 276 | int status; |
| 285 | struct C_Lua_Stack oldCLS = luaD_Cstack; | 277 | struct C_Lua_Stack oldCLS = L->Cstack; |
| 286 | jmp_buf *oldErr = errorJmp; | 278 | jmp_buf *oldErr = L->errorJmp; |
| 287 | errorJmp = &myErrorJmp; | 279 | L->errorJmp = &myErrorJmp; |
| 288 | if (setjmp(myErrorJmp) == 0) { | 280 | if (setjmp(myErrorJmp) == 0) { |
| 289 | do_callinc(nResults); | 281 | do_callinc(nResults); |
| 290 | status = 0; | 282 | status = 0; |
| 291 | } | 283 | } |
| 292 | else { /* an error occurred: restore luaD_Cstack and luaD_stack.top */ | 284 | else { /* an error occurred: restore L->Cstack and L->stack.top */ |
| 293 | luaD_Cstack = oldCLS; | 285 | L->Cstack = oldCLS; |
| 294 | luaD_stack.top = luaD_stack.stack+luaD_Cstack.base; | 286 | L->stack.top = L->stack.stack+L->Cstack.base; |
| 295 | status = 1; | 287 | status = 1; |
| 296 | } | 288 | } |
| 297 | errorJmp = oldErr; | 289 | L->errorJmp = oldErr; |
| 298 | return status; | 290 | return status; |
| 299 | } | 291 | } |
| 300 | 292 | ||
| @@ -307,8 +299,8 @@ static int protectedparser (ZIO *z, char *chunkname, int bin) | |||
| 307 | int status; | 299 | int status; |
| 308 | TProtoFunc *tf; | 300 | TProtoFunc *tf; |
| 309 | jmp_buf myErrorJmp; | 301 | jmp_buf myErrorJmp; |
| 310 | jmp_buf *oldErr = errorJmp; | 302 | jmp_buf *oldErr = L->errorJmp; |
| 311 | errorJmp = &myErrorJmp; | 303 | L->errorJmp = &myErrorJmp; |
| 312 | if (setjmp(myErrorJmp) == 0) { | 304 | if (setjmp(myErrorJmp) == 0) { |
| 313 | tf = bin ? luaU_undump1(z, chunkname) : luaY_parser(z, chunkname); | 305 | tf = bin ? luaU_undump1(z, chunkname) : luaY_parser(z, chunkname); |
| 314 | status = 0; | 306 | status = 0; |
| @@ -317,12 +309,12 @@ static int protectedparser (ZIO *z, char *chunkname, int bin) | |||
| 317 | tf = NULL; | 309 | tf = NULL; |
| 318 | status = 1; | 310 | status = 1; |
| 319 | } | 311 | } |
| 320 | errorJmp = oldErr; | 312 | L->errorJmp = oldErr; |
| 321 | if (status) return 1; /* error code */ | 313 | if (status) return 1; /* error code */ |
| 322 | if (tf == NULL) return 2; /* 'natural' end */ | 314 | if (tf == NULL) return 2; /* 'natural' end */ |
| 323 | luaD_adjusttop(luaD_Cstack.base+1); /* one slot for the pseudo-function */ | 315 | luaD_adjusttop(L->Cstack.base+1); /* one slot for the pseudo-function */ |
| 324 | luaD_stack.stack[luaD_Cstack.base].ttype = LUA_T_PROTO; | 316 | L->stack.stack[L->Cstack.base].ttype = LUA_T_PROTO; |
| 325 | luaD_stack.stack[luaD_Cstack.base].value.tf = tf; | 317 | L->stack.stack[L->Cstack.base].value.tf = tf; |
| 326 | luaV_closure(0); | 318 | luaV_closure(0); |
| 327 | return 0; | 319 | return 0; |
| 328 | } | 320 | } |
| @@ -332,15 +324,15 @@ static int do_main (ZIO *z, char *chunkname, int bin) | |||
| 332 | { | 324 | { |
| 333 | int status; | 325 | int status; |
| 334 | do { | 326 | do { |
| 335 | long old_blocks = (luaC_checkGC(), luaO_nblocks); | 327 | long old_blocks = (luaC_checkGC(), L->nblocks); |
| 336 | status = protectedparser(z, chunkname, bin); | 328 | status = protectedparser(z, chunkname, bin); |
| 337 | if (status == 1) return 1; /* error */ | 329 | if (status == 1) return 1; /* error */ |
| 338 | else if (status == 2) return 0; /* 'natural' end */ | 330 | else if (status == 2) return 0; /* 'natural' end */ |
| 339 | else { | 331 | else { |
| 340 | unsigned long newelems2 = 2*(luaO_nblocks-old_blocks); | 332 | unsigned long newelems2 = 2*(L->nblocks-old_blocks); |
| 341 | luaC_threshold += newelems2; | 333 | L->GCthreshold += newelems2; |
| 342 | status = luaD_protectedrun(MULT_RET); | 334 | status = luaD_protectedrun(MULT_RET); |
| 343 | luaC_threshold -= newelems2; | 335 | L->GCthreshold -= newelems2; |
| 344 | } | 336 | } |
| 345 | } while (bin && status == 0); | 337 | } while (bin && status == 0); |
| 346 | return status; | 338 | return status; |
| @@ -351,7 +343,7 @@ void luaD_gcIM (TObject *o) | |||
| 351 | { | 343 | { |
| 352 | TObject *im = luaT_getimbyObj(o, IM_GC); | 344 | TObject *im = luaT_getimbyObj(o, IM_GC); |
| 353 | if (ttype(im) != LUA_T_NIL) { | 345 | if (ttype(im) != LUA_T_NIL) { |
| 354 | *luaD_stack.top = *o; | 346 | *L->stack.top = *o; |
| 355 | incr_top; | 347 | incr_top; |
| 356 | luaD_callTM(im, 1, 0); | 348 | luaD_callTM(im, 1, 0); |
| 357 | } | 349 | } |
