diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1995-10-25 11:05:51 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1995-10-25 11:05:51 -0200 |
| commit | 9efc257d9d774501af4538a289729f3e8e5e3d7e (patch) | |
| tree | c4113f56f9bdcf6e1e66ac11f2cf5483387f3bc8 /opcode.c | |
| parent | fa71304e54f304ceceddef3a4b97b38228822e94 (diff) | |
| download | lua-9efc257d9d774501af4538a289729f3e8e5e3d7e.tar.gz lua-9efc257d9d774501af4538a289729f3e8e5e3d7e.tar.bz2 lua-9efc257d9d774501af4538a289729f3e8e5e3d7e.zip | |
new method to keep debug line information: current line is stored on the
Lua stack, just below (new) base, with tag LUA_T_LINE.
SETLINE opcodes are generated by lex.
Diffstat (limited to 'opcode.c')
| -rw-r--r-- | opcode.c | 60 |
1 files changed, 30 insertions, 30 deletions
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_opcode="$Id: opcode.c,v 3.45 1995/10/17 14:12:45 roberto Exp $"; | 6 | char *rcs_opcode="$Id: opcode.c,v 3.46 1995/10/17 14:30:05 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <setjmp.h> | 8 | #include <setjmp.h> |
| 9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
| @@ -75,7 +75,7 @@ static void lua_initstack (void) | |||
| 75 | stack = newvector(maxstack, Object); | 75 | stack = newvector(maxstack, Object); |
| 76 | stackLimit = stack+maxstack; | 76 | stackLimit = stack+maxstack; |
| 77 | top = stack; | 77 | top = stack; |
| 78 | *top = initial_stack; | 78 | *(top++) = initial_stack; |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | 81 | ||
| @@ -86,19 +86,19 @@ static void lua_initstack (void) | |||
| 86 | 86 | ||
| 87 | static void growstack (void) | 87 | static void growstack (void) |
| 88 | { | 88 | { |
| 89 | StkId t = top-stack; | ||
| 90 | if (stack == &initial_stack) | 89 | if (stack == &initial_stack) |
| 91 | lua_initstack(); | 90 | lua_initstack(); |
| 92 | else | 91 | else |
| 93 | { | 92 | { |
| 93 | StkId t = top-stack; | ||
| 94 | Long maxstack = stackLimit - stack; | 94 | Long maxstack = stackLimit - stack; |
| 95 | maxstack *= 2; | 95 | maxstack *= 2; |
| 96 | stack = growvector(stack, maxstack, Object); | 96 | stack = growvector(stack, maxstack, Object); |
| 97 | stackLimit = stack+maxstack; | 97 | stackLimit = stack+maxstack; |
| 98 | top = stack + t; | ||
| 98 | if (maxstack >= MAX_WORD/2) | 99 | if (maxstack >= MAX_WORD/2) |
| 99 | lua_error("stack size overflow"); | 100 | lua_error("stack size overflow"); |
| 100 | } | 101 | } |
| 101 | top = stack + t; | ||
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | 104 | ||
| @@ -227,16 +227,6 @@ static void callFB (int fb) | |||
| 227 | do_call((top-stack)-nParams, luaI_fallBacks[fb].nResults); | 227 | do_call((top-stack)-nParams, luaI_fallBacks[fb].nResults); |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | /* | ||
| 231 | ** Call the fallback for invalid functions (see do_call) | ||
| 232 | */ | ||
| 233 | static void call_funcFB (StkId base, int nResults) | ||
| 234 | { | ||
| 235 | open_stack((top-stack)-(base-1)); | ||
| 236 | stack[base-1] = luaI_fallBacks[FB_FUNCTION].function; | ||
| 237 | do_call(base, nResults); | ||
| 238 | } | ||
| 239 | |||
| 240 | 230 | ||
| 241 | /* | 231 | /* |
| 242 | ** Call a function (C or Lua). The parameters must be on the stack, | 232 | ** Call a function (C or Lua). The parameters must be on the stack, |
| @@ -248,6 +238,7 @@ static void do_call (StkId base, int nResults) | |||
| 248 | { | 238 | { |
| 249 | StkId firstResult; | 239 | StkId firstResult; |
| 250 | Object *func = stack+base-1; | 240 | Object *func = stack+base-1; |
| 241 | int i; | ||
| 251 | if (tag(func) == LUA_T_CFUNCTION) | 242 | if (tag(func) == LUA_T_CFUNCTION) |
| 252 | { | 243 | { |
| 253 | tag(func) = LUA_T_CMARK; | 244 | tag(func) = LUA_T_CMARK; |
| @@ -260,7 +251,10 @@ static void do_call (StkId base, int nResults) | |||
| 260 | } | 251 | } |
| 261 | else | 252 | else |
| 262 | { /* func is not a function */ | 253 | { /* func is not a function */ |
| 263 | call_funcFB(base, nResults); | 254 | /* Call the fallback for invalid functions */ |
| 255 | open_stack((top-stack)-(base-1)); | ||
| 256 | stack[base-1] = luaI_fallBacks[FB_FUNCTION].function; | ||
| 257 | do_call(base, nResults); | ||
| 264 | return; | 258 | return; |
| 265 | } | 259 | } |
| 266 | /* adjust the number of results */ | 260 | /* adjust the number of results */ |
| @@ -268,14 +262,10 @@ static void do_call (StkId base, int nResults) | |||
| 268 | adjust_top(firstResult+nResults); | 262 | adjust_top(firstResult+nResults); |
| 269 | /* move results to base-1 (to erase parameters and function) */ | 263 | /* move results to base-1 (to erase parameters and function) */ |
| 270 | base--; | 264 | base--; |
| 271 | if (firstResult != base) | 265 | nResults = top - (stack+firstResult); /* actual number of results */ |
| 272 | { | 266 | for (i=0; i<nResults; i++) |
| 273 | int i; | 267 | *(stack+base+i) = *(stack+firstResult+i); |
| 274 | nResults = top - (stack+firstResult); /* actual number of results */ | 268 | top -= firstResult-base; |
| 275 | for (i=0; i<nResults; i++) | ||
| 276 | *(stack+base+i) = *(stack+firstResult+i); | ||
| 277 | top -= firstResult-base; | ||
| 278 | } | ||
| 279 | } | 269 | } |
| 280 | 270 | ||
| 281 | 271 | ||
| @@ -366,9 +356,12 @@ lua_Object lua_stackedfunction (int level) | |||
| 366 | 356 | ||
| 367 | 357 | ||
| 368 | void lua_funcinfo (lua_Object func, char **filename, char **funcname, | 358 | void lua_funcinfo (lua_Object func, char **filename, char **funcname, |
| 369 | char **objname, int *linedefined) | 359 | char **objname, int *line) |
| 370 | { | 360 | { |
| 371 | return luaI_funcInfo(Address(func), filename, funcname, objname, linedefined); | 361 | Object *f = Address(func); |
| 362 | luaI_funcInfo(f, filename, funcname, objname, line); | ||
| 363 | *line = (f+1 < top && (f+1)->tag == LUA_T_LINE) ? | ||
| 364 | (f+1)->value.i : -1; | ||
| 372 | } | 365 | } |
| 373 | 366 | ||
| 374 | 367 | ||
| @@ -587,9 +580,9 @@ lua_Object lua_getparam (int number) | |||
| 587 | */ | 580 | */ |
| 588 | real lua_getnumber (lua_Object object) | 581 | real lua_getnumber (lua_Object object) |
| 589 | { | 582 | { |
| 590 | if (object == LUA_NOOBJECT || tag(Address(object)) == LUA_T_NIL) return 0.0; | 583 | if (object == LUA_NOOBJECT) return 0.0; |
| 591 | if (tonumber (Address(object))) return 0.0; | 584 | if (tonumber (Address(object))) return 0.0; |
| 592 | else return (nvalue(Address(object))); | 585 | else return (nvalue(Address(object))); |
| 593 | } | 586 | } |
| 594 | 587 | ||
| 595 | /* | 588 | /* |
| @@ -597,7 +590,7 @@ real lua_getnumber (lua_Object object) | |||
| 597 | */ | 590 | */ |
| 598 | char *lua_getstring (lua_Object object) | 591 | char *lua_getstring (lua_Object object) |
| 599 | { | 592 | { |
| 600 | if (object == LUA_NOOBJECT || tag(Address(object)) == LUA_T_NIL) return NULL; | 593 | if (object == LUA_NOOBJECT) return NULL; |
| 601 | if (tostring (Address(object))) return NULL; | 594 | if (tostring (Address(object))) return NULL; |
| 602 | else return (svalue(Address(object))); | 595 | else return (svalue(Address(object))); |
| 603 | } | 596 | } |
| @@ -1168,9 +1161,16 @@ static StkId lua_execute (Byte *pc, StkId base) | |||
| 1168 | { | 1161 | { |
| 1169 | CodeWord code; | 1162 | CodeWord code; |
| 1170 | get_word(code,pc); | 1163 | get_word(code,pc); |
| 1171 | lua_debugline = code.w; | 1164 | if ((stack+base-1)->tag != LUA_T_LINE) |
| 1165 | { | ||
| 1166 | /* open space for LINE value */ | ||
| 1167 | open_stack((top-stack)-base); | ||
| 1168 | base++; | ||
| 1169 | (stack+base-1)->tag = LUA_T_LINE; | ||
| 1170 | } | ||
| 1171 | (stack+base-1)->value.i = code.w; | ||
| 1172 | break; | ||
| 1172 | } | 1173 | } |
| 1173 | break; | ||
| 1174 | 1174 | ||
| 1175 | default: | 1175 | default: |
| 1176 | lua_error ("internal error - opcode doesn't match"); | 1176 | lua_error ("internal error - opcode doesn't match"); |
