diff options
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 126 |
1 files changed, 73 insertions, 53 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.2 1997/09/19 18:40:32 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.3 1997/09/19 21:17:52 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -28,7 +28,7 @@ | |||
| 28 | 28 | ||
| 29 | 29 | ||
| 30 | /* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */ | 30 | /* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */ |
| 31 | #define EXTRA_STACK 4 | 31 | #define EXTRA_STACK 5 |
| 32 | 32 | ||
| 33 | 33 | ||
| 34 | 34 | ||
| @@ -276,14 +276,14 @@ static void adjust_varargs (StkId first_extra_arg) | |||
| 276 | */ | 276 | */ |
| 277 | StkId luaV_execute (Closure *cl, StkId base) | 277 | StkId luaV_execute (Closure *cl, StkId base) |
| 278 | { | 278 | { |
| 279 | TProtoFunc *func = cl->consts[0].value.tf; | 279 | Byte *pc = cl->consts[0].value.tf->code; |
| 280 | Byte *pc = func->code; | 280 | TObject *consts = cl->consts[0].value.tf->consts; |
| 281 | if (lua_callhook) | 281 | if (lua_callhook) |
| 282 | luaD_callHook(base, LUA_T_MARK, 0); | 282 | luaD_callHook(base, LUA_T_MARK, 0); |
| 283 | luaD_checkstack((*pc++)+EXTRA_STACK); | 283 | luaD_checkstack((*pc++)+EXTRA_STACK); |
| 284 | while (1) { | 284 | while (1) { |
| 285 | OpCode opcode; | 285 | int aux; |
| 286 | switch (opcode = (OpCode)*pc++) { | 286 | switch ((OpCode)(aux = *pc++)) { |
| 287 | 287 | ||
| 288 | case PUSHNIL: | 288 | case PUSHNIL: |
| 289 | ttype(luaD_stack.top++) = LUA_T_NIL; | 289 | ttype(luaD_stack.top++) = LUA_T_NIL; |
| @@ -296,89 +296,95 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 296 | break; | 296 | break; |
| 297 | } | 297 | } |
| 298 | 298 | ||
| 299 | case PUSH0: case PUSH1: case PUSH2: | ||
| 300 | ttype(luaD_stack.top) = LUA_T_NUMBER; | ||
| 301 | nvalue(luaD_stack.top) = opcode-PUSH0; | ||
| 302 | luaD_stack.top++; | ||
| 303 | break; | ||
| 304 | |||
| 305 | case PUSHBYTE: | 299 | case PUSHBYTE: |
| 306 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 300 | aux = *pc++; goto pushnumber; |
| 307 | nvalue(luaD_stack.top) = *pc++; | ||
| 308 | luaD_stack.top++; | ||
| 309 | break; | ||
| 310 | 301 | ||
| 311 | case PUSHWORD: | 302 | case PUSHWORD: |
| 303 | aux = get_word(pc); goto pushnumber; | ||
| 304 | |||
| 305 | case PUSH0: case PUSH1: case PUSH2: | ||
| 306 | aux -= PUSH0; | ||
| 307 | pushnumber: | ||
| 312 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 308 | ttype(luaD_stack.top) = LUA_T_NUMBER; |
| 313 | nvalue(luaD_stack.top) = get_word(pc); | 309 | nvalue(luaD_stack.top) = aux; |
| 314 | luaD_stack.top++; | 310 | luaD_stack.top++; |
| 315 | break; | 311 | break; |
| 316 | 312 | ||
| 313 | case PUSHLOCAL: | ||
| 314 | aux = *pc++; goto pushlocal; | ||
| 315 | |||
| 317 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: | 316 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: |
| 318 | case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: | 317 | case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: |
| 319 | case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: | 318 | case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: |
| 320 | case PUSHLOCAL9: | 319 | case PUSHLOCAL9: |
| 321 | *luaD_stack.top++ = | 320 | aux -= PUSHLOCAL0; |
| 322 | *((luaD_stack.stack+base) + (int)(opcode-PUSHLOCAL0)); | 321 | pushlocal: |
| 323 | break; | 322 | *luaD_stack.top++ = *((luaD_stack.stack+base) + aux); |
| 324 | |||
| 325 | case PUSHLOCAL: | ||
| 326 | *luaD_stack.top++ = *((luaD_stack.stack+base) + (*pc++)); | ||
| 327 | break; | 323 | break; |
| 328 | 324 | ||
| 329 | case PUSHGLOBALB: | 325 | case GETGLOBAL: |
| 330 | luaV_getglobal(luaG_findsymbol(tsvalue(&func->consts[*pc++]))); | 326 | aux = get_word(pc); goto getglobal; |
| 331 | break; | ||
| 332 | 327 | ||
| 333 | case PUSHGLOBAL: | 328 | case GETGLOBALB: |
| 334 | luaV_getglobal(luaG_findsymbol(tsvalue(&func->consts[get_word(pc)]))); | 329 | aux = *pc++; |
| 330 | getglobal: | ||
| 331 | luaV_getglobal(luaG_findsymbol(tsvalue(&consts[aux]))); | ||
| 335 | break; | 332 | break; |
| 336 | 333 | ||
| 337 | case GETTABLE: | 334 | case GETTABLE: |
| 338 | luaV_gettable(); | 335 | luaV_gettable(); |
| 339 | break; | 336 | break; |
| 340 | 337 | ||
| 341 | case PUSHSELF: { | 338 | case PUSHSELF: |
| 339 | aux = get_word(pc); goto pushself; | ||
| 340 | |||
| 341 | case PUSHSELFB: | ||
| 342 | aux = *pc++; | ||
| 343 | pushself: { | ||
| 342 | TObject receiver = *(luaD_stack.top-1); | 344 | TObject receiver = *(luaD_stack.top-1); |
| 343 | *luaD_stack.top++ = func->consts[get_word(pc)]; | 345 | *luaD_stack.top++ = consts[aux]; |
| 344 | luaV_gettable(); | 346 | luaV_gettable(); |
| 345 | *luaD_stack.top++ = receiver; | 347 | *luaD_stack.top++ = receiver; |
| 346 | break; | 348 | break; |
| 347 | } | 349 | } |
| 348 | 350 | ||
| 351 | case PUSHCONSTANT: | ||
| 352 | aux = get_word(pc); goto pushconstant; | ||
| 353 | |||
| 349 | case PUSHCONSTANTB: | 354 | case PUSHCONSTANTB: |
| 350 | *luaD_stack.top++ = func->consts[*pc++]; | 355 | aux = *pc++; |
| 356 | pushconstant: | ||
| 357 | *luaD_stack.top++ = consts[aux]; | ||
| 351 | break; | 358 | break; |
| 352 | 359 | ||
| 353 | case PUSHCONSTANT: | 360 | case PUSHUPVALUE: |
| 354 | *luaD_stack.top++ = func->consts[get_word(pc)]; | 361 | aux = *pc++; goto pushupvalue; |
| 355 | break; | ||
| 356 | 362 | ||
| 357 | case PUSHUPVALUE0: | 363 | case PUSHUPVALUE0: |
| 358 | *luaD_stack.top++ = cl->consts[1]; | 364 | aux = 0; |
| 365 | pushupvalue: | ||
| 366 | *luaD_stack.top++ = cl->consts[aux+1]; | ||
| 359 | break; | 367 | break; |
| 360 | 368 | ||
| 361 | case PUSHUPVALUE: | 369 | case SETLOCAL: |
| 362 | *luaD_stack.top++ = cl->consts[(*pc++)+1]; | 370 | aux = *pc++; goto setlocal; |
| 363 | break; | ||
| 364 | 371 | ||
| 365 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: | 372 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: |
| 366 | case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: | 373 | case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: |
| 367 | case SETLOCAL6: case SETLOCAL7: case SETLOCAL8: | 374 | case SETLOCAL6: case SETLOCAL7: case SETLOCAL8: |
| 368 | case SETLOCAL9: | 375 | case SETLOCAL9: |
| 369 | *((luaD_stack.stack+base) + (int)(opcode-SETLOCAL0)) = | 376 | aux -= SETLOCAL0; |
| 370 | *(--luaD_stack.top); | 377 | setlocal: |
| 378 | *((luaD_stack.stack+base) + aux) = *(--luaD_stack.top); | ||
| 371 | break; | 379 | break; |
| 372 | 380 | ||
| 373 | case SETLOCAL: | 381 | case SETGLOBAL: |
| 374 | *((luaD_stack.stack+base) + (*pc++)) = *(--luaD_stack.top); break; | 382 | aux = get_word(pc); goto setglobal; |
| 375 | 383 | ||
| 376 | case SETGLOBALB: | 384 | case SETGLOBALB: |
| 377 | luaV_setglobal(luaG_findsymbol(tsvalue(&func->consts[*pc++]))); | 385 | aux = *pc++; |
| 378 | break; | 386 | setglobal: |
| 379 | 387 | luaV_setglobal(luaG_findsymbol(tsvalue(&consts[aux]))); | |
| 380 | case SETGLOBAL: | ||
| 381 | luaV_setglobal(luaG_findsymbol(tsvalue(&func->consts[get_word(pc)]))); | ||
| 382 | break; | 388 | break; |
| 383 | 389 | ||
| 384 | case SETTABLE0: | 390 | case SETTABLE0: |
| @@ -389,14 +395,17 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 389 | luaV_settable(luaD_stack.top-3-(*pc++), 2); | 395 | luaV_settable(luaD_stack.top-3-(*pc++), 2); |
| 390 | break; | 396 | break; |
| 391 | 397 | ||
| 398 | case SETLIST: | ||
| 399 | aux = *(pc++) * LFIELDS_PER_FLUSH; goto setlist; | ||
| 400 | |||
| 392 | case SETLIST0: | 401 | case SETLIST0: |
| 393 | case SETLIST: { | 402 | aux = 0; |
| 394 | int m = (opcode == SETLIST0) ? 0 : *(pc++) * LFIELDS_PER_FLUSH; | 403 | setlist: { |
| 395 | int n = *(pc++); | 404 | int n = *(pc++); |
| 396 | TObject *arr = luaD_stack.top-n-1; | 405 | TObject *arr = luaD_stack.top-n-1; |
| 397 | for (; n; n--) { | 406 | for (; n; n--) { |
| 398 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 407 | ttype(luaD_stack.top) = LUA_T_NUMBER; |
| 399 | nvalue(luaD_stack.top) = n+m; | 408 | nvalue(luaD_stack.top) = n+aux; |
| 400 | *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); | 409 | *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); |
| 401 | luaD_stack.top--; | 410 | luaD_stack.top--; |
| 402 | } | 411 | } |
| @@ -414,7 +423,12 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 414 | } | 423 | } |
| 415 | 424 | ||
| 416 | case POPS: | 425 | case POPS: |
| 417 | luaD_stack.top -= *(pc++); | 426 | aux = *pc++; goto pop; |
| 427 | |||
| 428 | case POP1: case POP2: | ||
| 429 | aux -= (POP1-1); | ||
| 430 | pop: | ||
| 431 | luaD_stack.top -= aux; | ||
| 418 | break; | 432 | break; |
| 419 | 433 | ||
| 420 | case ARGS: | 434 | case ARGS: |
| @@ -436,7 +450,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 436 | case EQOP: case NEQOP: { | 450 | case EQOP: case NEQOP: { |
| 437 | int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); | 451 | int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); |
| 438 | luaD_stack.top--; | 452 | luaD_stack.top--; |
| 439 | if (opcode == NEQOP) res = !res; | 453 | if (aux == NEQOP) res = !res; |
| 440 | ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; | 454 | ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; |
| 441 | nvalue(luaD_stack.top-1) = 1; | 455 | nvalue(luaD_stack.top-1) = 1; |
| 442 | break; | 456 | break; |
| @@ -578,6 +592,12 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 578 | break; | 592 | break; |
| 579 | 593 | ||
| 580 | case CLOSURE: | 594 | case CLOSURE: |
| 595 | aux = get_word(pc); goto closure; | ||
| 596 | |||
| 597 | case CLOSUREB: | ||
| 598 | aux = *pc++; | ||
| 599 | closure: | ||
| 600 | *luaD_stack.top++ = consts[aux]; | ||
| 581 | luaV_closure(); | 601 | luaV_closure(); |
| 582 | luaC_checkGC(); | 602 | luaC_checkGC(); |
| 583 | break; | 603 | break; |
| @@ -594,7 +614,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 594 | case RETCODE: | 614 | case RETCODE: |
| 595 | if (lua_callhook) | 615 | if (lua_callhook) |
| 596 | luaD_callHook(base, LUA_T_MARK, 1); | 616 | luaD_callHook(base, LUA_T_MARK, 1); |
| 597 | return (base + ((opcode==RETCODE) ? *pc : 0)); | 617 | return (base + ((aux==RETCODE) ? *pc : 0)); |
| 598 | 618 | ||
| 599 | case SETLINE: { | 619 | case SETLINE: { |
| 600 | int line = get_word(pc); | 620 | int line = get_word(pc); |
