diff options
Diffstat (limited to '')
| -rw-r--r-- | lvm.c | 145 |
1 files changed, 84 insertions, 61 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.7 1997/10/01 20:05:34 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.8 1997/10/06 14:51:11 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 | */ |
| @@ -284,25 +284,25 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 284 | int aux; | 284 | int aux; |
| 285 | switch ((OpCode)(aux = *pc++)) { | 285 | switch ((OpCode)(aux = *pc++)) { |
| 286 | 286 | ||
| 287 | case PUSHNIL: | 287 | case PUSHNIL0: |
| 288 | ttype(luaD_stack.top++) = LUA_T_NIL; | 288 | ttype(luaD_stack.top++) = LUA_T_NIL; |
| 289 | break; | 289 | break; |
| 290 | 290 | ||
| 291 | case PUSHNILS: { | 291 | case PUSHNIL: |
| 292 | int n = *pc++; | 292 | aux = *pc++; |
| 293 | while (n--) | 293 | do { |
| 294 | ttype(luaD_stack.top++) = LUA_T_NIL; | 294 | ttype(luaD_stack.top++) = LUA_T_NIL; |
| 295 | } while (aux--); | ||
| 295 | break; | 296 | break; |
| 296 | } | ||
| 297 | 297 | ||
| 298 | case PUSHBYTE: | 298 | case PUSHNUMBER: |
| 299 | aux = *pc++; goto pushnumber; | 299 | aux = *pc++; goto pushnumber; |
| 300 | 300 | ||
| 301 | case PUSHWORD: | 301 | case PUSHNUMBERW: |
| 302 | aux = next_word(pc); goto pushnumber; | 302 | aux = next_word(pc); goto pushnumber; |
| 303 | 303 | ||
| 304 | case PUSH0: case PUSH1: case PUSH2: | 304 | case PUSHNUMBER0: case PUSHNUMBER1: case PUSHNUMBER2: |
| 305 | aux -= PUSH0; | 305 | aux -= PUSHNUMBER0; |
| 306 | pushnumber: | 306 | pushnumber: |
| 307 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 307 | ttype(luaD_stack.top) = LUA_T_NUMBER; |
| 308 | nvalue(luaD_stack.top) = aux; | 308 | nvalue(luaD_stack.top) = aux; |
| @@ -312,25 +312,21 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 312 | case PUSHLOCAL: | 312 | case PUSHLOCAL: |
| 313 | aux = *pc++; goto pushlocal; | 313 | aux = *pc++; goto pushlocal; |
| 314 | 314 | ||
| 315 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: | 315 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3: |
| 316 | case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: | 316 | case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: |
| 317 | case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: | ||
| 318 | case PUSHLOCAL9: | ||
| 319 | aux -= PUSHLOCAL0; | 317 | aux -= PUSHLOCAL0; |
| 320 | pushlocal: | 318 | pushlocal: |
| 321 | *luaD_stack.top++ = *((luaD_stack.stack+base) + aux); | 319 | *luaD_stack.top++ = *((luaD_stack.stack+base) + aux); |
| 322 | break; | 320 | break; |
| 323 | 321 | ||
| 324 | case GETGLOBAL: | 322 | case GETGLOBALW: |
| 325 | aux = next_word(pc); goto getglobal; | 323 | aux = next_word(pc); goto getglobal; |
| 326 | 324 | ||
| 327 | case GETGLOBALB: | 325 | case GETGLOBAL: |
| 328 | aux = *pc++; goto getglobal; | 326 | aux = *pc++; goto getglobal; |
| 329 | 327 | ||
| 330 | case GETGLOBAL0: case GETGLOBAL1: case GETGLOBAL2: | 328 | case GETGLOBAL0: case GETGLOBAL1: case GETGLOBAL2: case GETGLOBAL3: |
| 331 | case GETGLOBAL3: case GETGLOBAL4: case GETGLOBAL5: | 329 | case GETGLOBAL4: case GETGLOBAL5: case GETGLOBAL6: case GETGLOBAL7: |
| 332 | case GETGLOBAL6: case GETGLOBAL7: case GETGLOBAL8: | ||
| 333 | case GETGLOBAL9: | ||
| 334 | aux -= GETGLOBAL0; | 330 | aux -= GETGLOBAL0; |
| 335 | getglobal: | 331 | getglobal: |
| 336 | luaV_getglobal(tsvalue(&consts[aux])); | 332 | luaV_getglobal(tsvalue(&consts[aux])); |
| @@ -340,10 +336,10 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 340 | luaV_gettable(); | 336 | luaV_gettable(); |
| 341 | break; | 337 | break; |
| 342 | 338 | ||
| 343 | case PUSHSELF: | 339 | case PUSHSELFW: |
| 344 | aux = next_word(pc); goto pushself; | 340 | aux = next_word(pc); goto pushself; |
| 345 | 341 | ||
| 346 | case PUSHSELFB: | 342 | case PUSHSELF: |
| 347 | aux = *pc++; | 343 | aux = *pc++; |
| 348 | pushself: { | 344 | pushself: { |
| 349 | TObject receiver = *(luaD_stack.top-1); | 345 | TObject receiver = *(luaD_stack.top-1); |
| @@ -353,16 +349,15 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 353 | break; | 349 | break; |
| 354 | } | 350 | } |
| 355 | 351 | ||
| 356 | case PUSHCONSTANT: | 352 | case PUSHCONSTANTW: |
| 357 | aux = next_word(pc); goto pushconstant; | 353 | aux = next_word(pc); goto pushconstant; |
| 358 | 354 | ||
| 359 | case PUSHCONSTANTB: | 355 | case PUSHCONSTANT: |
| 360 | aux = *pc++; goto pushconstant; | 356 | aux = *pc++; goto pushconstant; |
| 361 | 357 | ||
| 362 | case PUSHCONSTANT0: case PUSHCONSTANT1: case PUSHCONSTANT2: | 358 | case PUSHCONSTANT0: case PUSHCONSTANT1: case PUSHCONSTANT2: |
| 363 | case PUSHCONSTANT3: case PUSHCONSTANT4: case PUSHCONSTANT5: | 359 | case PUSHCONSTANT3: case PUSHCONSTANT4: case PUSHCONSTANT5: |
| 364 | case PUSHCONSTANT6: case PUSHCONSTANT7: case PUSHCONSTANT8: | 360 | case PUSHCONSTANT6: case PUSHCONSTANT7: |
| 365 | case PUSHCONSTANT9: | ||
| 366 | aux -= PUSHCONSTANT0; | 361 | aux -= PUSHCONSTANT0; |
| 367 | pushconstant: | 362 | pushconstant: |
| 368 | *luaD_stack.top++ = consts[aux]; | 363 | *luaD_stack.top++ = consts[aux]; |
| @@ -380,20 +375,22 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 380 | case SETLOCAL: | 375 | case SETLOCAL: |
| 381 | aux = *pc++; goto setlocal; | 376 | aux = *pc++; goto setlocal; |
| 382 | 377 | ||
| 383 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: | 378 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: case SETLOCAL3: |
| 384 | case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: | 379 | case SETLOCAL4: case SETLOCAL5: case SETLOCAL6: case SETLOCAL7: |
| 385 | case SETLOCAL6: case SETLOCAL7: case SETLOCAL8: | ||
| 386 | case SETLOCAL9: | ||
| 387 | aux -= SETLOCAL0; | 380 | aux -= SETLOCAL0; |
| 388 | setlocal: | 381 | setlocal: |
| 389 | *((luaD_stack.stack+base) + aux) = *(--luaD_stack.top); | 382 | *((luaD_stack.stack+base) + aux) = *(--luaD_stack.top); |
| 390 | break; | 383 | break; |
| 391 | 384 | ||
| 392 | case SETGLOBAL: | 385 | case SETGLOBALW: |
| 393 | aux = next_word(pc); goto setglobal; | 386 | aux = next_word(pc); goto setglobal; |
| 394 | 387 | ||
| 395 | case SETGLOBALB: | 388 | case SETGLOBAL: |
| 396 | aux = *pc++; | 389 | aux = *pc++; goto setglobal; |
| 390 | |||
| 391 | case SETGLOBAL0: case SETGLOBAL1: case SETGLOBAL2: case SETGLOBAL3: | ||
| 392 | case SETGLOBAL4: case SETGLOBAL5: case SETGLOBAL6: case SETGLOBAL7: | ||
| 393 | aux -= SETGLOBAL0; | ||
| 397 | setglobal: | 394 | setglobal: |
| 398 | luaV_setglobal(tsvalue(&consts[aux])); | 395 | luaV_setglobal(tsvalue(&consts[aux])); |
| 399 | break; | 396 | break; |
| @@ -406,6 +403,9 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 406 | luaV_settable(luaD_stack.top-3-(*pc++), 2); | 403 | luaV_settable(luaD_stack.top-3-(*pc++), 2); |
| 407 | break; | 404 | break; |
| 408 | 405 | ||
| 406 | case SETLISTW: | ||
| 407 | aux = next_word(pc); aux *= LFIELDS_PER_FLUSH; goto setlist; | ||
| 408 | |||
| 409 | case SETLIST: | 409 | case SETLIST: |
| 410 | aux = *(pc++) * LFIELDS_PER_FLUSH; goto setlist; | 410 | aux = *(pc++) * LFIELDS_PER_FLUSH; goto setlist; |
| 411 | 411 | ||
| @@ -423,23 +423,27 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 423 | break; | 423 | break; |
| 424 | } | 424 | } |
| 425 | 425 | ||
| 426 | case SETMAP: { | 426 | case SETMAP0: |
| 427 | int n = *(pc++); | 427 | aux = 0; goto setmap; |
| 428 | TObject *arr = luaD_stack.top-(2*n)-1; | 428 | |
| 429 | while (n--) { | 429 | case SETMAP: |
| 430 | aux = *(pc++); | ||
| 431 | setmap: { | ||
| 432 | TObject *arr = luaD_stack.top-(2*aux)-3; | ||
| 433 | do { | ||
| 430 | *(luaH_set (avalue(arr), luaD_stack.top-2)) = *(luaD_stack.top-1); | 434 | *(luaH_set (avalue(arr), luaD_stack.top-2)) = *(luaD_stack.top-1); |
| 431 | luaD_stack.top-=2; | 435 | luaD_stack.top-=2; |
| 432 | } | 436 | } while (aux--); |
| 433 | break; | 437 | break; |
| 434 | } | 438 | } |
| 435 | 439 | ||
| 436 | case POPS: | 440 | case POP: |
| 437 | aux = *pc++; goto pop; | 441 | aux = *pc++; goto pop; |
| 438 | 442 | ||
| 439 | case POP1: case POP2: | 443 | case POP0: case POP1: |
| 440 | aux -= (POP1-1); | 444 | aux -= POP0; |
| 441 | pop: | 445 | pop: |
| 442 | luaD_stack.top -= aux; | 446 | luaD_stack.top -= (aux+1); |
| 443 | break; | 447 | break; |
| 444 | 448 | ||
| 445 | case ARGS: | 449 | case ARGS: |
| @@ -451,10 +455,13 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 451 | adjust_varargs(base + *(pc++)); | 455 | adjust_varargs(base + *(pc++)); |
| 452 | break; | 456 | break; |
| 453 | 457 | ||
| 454 | case CREATEARRAY: | 458 | case CREATEARRAYW: |
| 455 | aux = next_word(pc); goto createarray; | 459 | aux = next_word(pc); goto createarray; |
| 456 | 460 | ||
| 457 | case CREATEARRAYB: | 461 | case CREATEARRAY0: case CREATEARRAY1: |
| 462 | aux -= CREATEARRAY0; goto createarray; | ||
| 463 | |||
| 464 | case CREATEARRAY: | ||
| 458 | aux = *pc++; | 465 | aux = *pc++; |
| 459 | createarray: | 466 | createarray: |
| 460 | luaC_checkGC(); | 467 | luaC_checkGC(); |
| @@ -569,58 +576,66 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 569 | nvalue(luaD_stack.top-1) = 1; | 576 | nvalue(luaD_stack.top-1) = 1; |
| 570 | break; | 577 | break; |
| 571 | 578 | ||
| 579 | case ONTJMPW: | ||
| 580 | aux = next_word(pc); goto ontjmp; | ||
| 581 | |||
| 572 | case ONTJMP: | 582 | case ONTJMP: |
| 573 | aux = *pc++; | 583 | aux = *pc++; |
| 584 | ontjmp: | ||
| 574 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) pc += aux; | 585 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) pc += aux; |
| 575 | else luaD_stack.top--; | 586 | else luaD_stack.top--; |
| 576 | break; | 587 | break; |
| 577 | 588 | ||
| 589 | case ONFJMPW: | ||
| 590 | aux = next_word(pc); goto onfjmp; | ||
| 591 | |||
| 578 | case ONFJMP: | 592 | case ONFJMP: |
| 579 | aux = *pc++; | 593 | aux = *pc++; |
| 594 | onfjmp: | ||
| 580 | if (ttype(luaD_stack.top-1) == LUA_T_NIL) pc += aux; | 595 | if (ttype(luaD_stack.top-1) == LUA_T_NIL) pc += aux; |
| 581 | else luaD_stack.top--; | 596 | else luaD_stack.top--; |
| 582 | break; | 597 | break; |
| 583 | 598 | ||
| 584 | case JMP: | 599 | case JMPW: |
| 585 | aux = next_word(pc); goto jmp; | 600 | aux = next_word(pc); goto jmp; |
| 586 | 601 | ||
| 587 | case JMPB: | 602 | case JMP: |
| 588 | aux = *pc++; | 603 | aux = *pc++; |
| 589 | jmp: | 604 | jmp: |
| 590 | pc += aux; | 605 | pc += aux; |
| 591 | break; | 606 | break; |
| 592 | 607 | ||
| 593 | case IFFJMP: | 608 | case IFFJMPW: |
| 594 | aux = next_word(pc); goto iffjmp; | 609 | aux = next_word(pc); goto iffjmp; |
| 595 | 610 | ||
| 596 | case IFFJMPB: | 611 | case IFFJMP: |
| 597 | aux = *pc++; | 612 | aux = *pc++; |
| 598 | iffjmp: | 613 | iffjmp: |
| 599 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc += aux; | 614 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc += aux; |
| 600 | break; | 615 | break; |
| 601 | 616 | ||
| 602 | case IFTUPJMP: | 617 | case IFTUPJMPW: |
| 603 | aux = next_word(pc); goto iftupjmp; | 618 | aux = next_word(pc); goto iftupjmp; |
| 604 | 619 | ||
| 605 | case IFTUPJMPB: | 620 | case IFTUPJMP: |
| 606 | aux = *pc++; | 621 | aux = *pc++; |
| 607 | iftupjmp: | 622 | iftupjmp: |
| 608 | if (ttype(--luaD_stack.top) != LUA_T_NIL) pc -= aux; | 623 | if (ttype(--luaD_stack.top) != LUA_T_NIL) pc -= aux; |
| 609 | break; | 624 | break; |
| 610 | 625 | ||
| 611 | case IFFUPJMP: | 626 | case IFFUPJMPW: |
| 612 | aux = next_word(pc); goto iffupjmp; | 627 | aux = next_word(pc); goto iffupjmp; |
| 613 | 628 | ||
| 614 | case IFFUPJMPB: | 629 | case IFFUPJMP: |
| 615 | aux = *pc++; | 630 | aux = *pc++; |
| 616 | iffupjmp: | 631 | iffupjmp: |
| 617 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= aux; | 632 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= aux; |
| 618 | break; | 633 | break; |
| 619 | 634 | ||
| 620 | case CLOSURE: | 635 | case CLOSUREW: |
| 621 | aux = next_word(pc); goto closure; | 636 | aux = next_word(pc); goto closure; |
| 622 | 637 | ||
| 623 | case CLOSUREB: | 638 | case CLOSURE: |
| 624 | aux = *pc++; | 639 | aux = *pc++; |
| 625 | closure: | 640 | closure: |
| 626 | *luaD_stack.top++ = consts[aux]; | 641 | *luaD_stack.top++ = consts[aux]; |
| @@ -628,9 +643,14 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 628 | luaC_checkGC(); | 643 | luaC_checkGC(); |
| 629 | break; | 644 | break; |
| 630 | 645 | ||
| 631 | case CALLFUNC: { | 646 | case CALLFUNC: |
| 647 | aux = *pc++; goto callfunc; | ||
| 648 | |||
| 649 | case CALLFUNC0: case CALLFUNC1: | ||
| 650 | aux -= CALLFUNC0; | ||
| 651 | callfunc: { | ||
| 632 | StkId newBase = (luaD_stack.top-luaD_stack.stack)-(*pc++); | 652 | StkId newBase = (luaD_stack.top-luaD_stack.stack)-(*pc++); |
| 633 | luaD_call(newBase, *pc++); | 653 | luaD_call(newBase, aux); |
| 634 | break; | 654 | break; |
| 635 | } | 655 | } |
| 636 | 656 | ||
| @@ -642,19 +662,22 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 642 | luaD_callHook(base, LUA_T_MARK, 1); | 662 | luaD_callHook(base, LUA_T_MARK, 1); |
| 643 | return (base + ((aux==RETCODE) ? *pc : 0)); | 663 | return (base + ((aux==RETCODE) ? *pc : 0)); |
| 644 | 664 | ||
| 645 | case SETLINE: { | 665 | case SETLINEW: |
| 646 | int line = next_word(pc); | 666 | aux = next_word(pc); goto setline; |
| 667 | |||
| 668 | case SETLINE: | ||
| 669 | aux = *pc++; | ||
| 670 | setline: | ||
| 647 | if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { | 671 | if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { |
| 648 | /* open space for LINE value */ | 672 | /* open space for LINE value */ |
| 649 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); | 673 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); |
| 650 | base++; | 674 | base++; |
| 651 | (luaD_stack.stack+base-1)->ttype = LUA_T_LINE; | 675 | (luaD_stack.stack+base-1)->ttype = LUA_T_LINE; |
| 652 | } | 676 | } |
| 653 | (luaD_stack.stack+base-1)->value.i = line; | 677 | (luaD_stack.stack+base-1)->value.i = aux; |
| 654 | if (lua_linehook) | 678 | if (lua_linehook) |
| 655 | luaD_lineHook(line); | 679 | luaD_lineHook(aux); |
| 656 | break; | 680 | break; |
| 657 | } | ||
| 658 | 681 | ||
| 659 | #ifdef DEBUG | 682 | #ifdef DEBUG |
| 660 | default: | 683 | default: |
