diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-14 14:45:59 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-14 14:45:59 -0300 |
commit | d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b (patch) | |
tree | 316783459a8fdc85cddf7920560f6cddf4514cab /lvm.c | |
parent | 9e84bf18db779bea66947c1ca08db9bf8dc593c8 (diff) | |
download | lua-d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b.tar.gz lua-d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b.tar.bz2 lua-d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b.zip |
details
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 175 |
1 files changed, 83 insertions, 92 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.125 2000/08/10 19:50:47 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.126 2000/08/11 16:17:28 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 | */ |
@@ -371,25 +371,24 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
371 | if (linehook) | 371 | if (linehook) |
372 | traceexec(L, base, top, linehook); | 372 | traceexec(L, base, top, linehook); |
373 | switch (GET_OPCODE(i)) { | 373 | switch (GET_OPCODE(i)) { |
374 | 374 | case OP_END: { | |
375 | case OP_END: | ||
376 | return L->top; /* no results */ | 375 | return L->top; /* no results */ |
377 | 376 | } | |
378 | case OP_RETURN: | 377 | case OP_RETURN: { |
379 | L->top = top; | 378 | L->top = top; |
380 | return base+GETARG_U(i); | 379 | return base+GETARG_U(i); |
381 | 380 | } | |
382 | case OP_CALL: | 381 | case OP_CALL: { |
383 | L->top = top; | 382 | L->top = top; |
384 | luaD_call(L, base+GETARG_A(i), GETARG_B(i)); | 383 | luaD_call(L, base+GETARG_A(i), GETARG_B(i)); |
385 | top = L->top; | 384 | top = L->top; |
386 | break; | 385 | break; |
387 | 386 | } | |
388 | case OP_TAILCALL: | 387 | case OP_TAILCALL: { |
389 | L->top = top; | 388 | L->top = top; |
390 | luaD_call(L, base+GETARG_A(i), MULT_RET); | 389 | luaD_call(L, base+GETARG_A(i), MULT_RET); |
391 | return base+GETARG_B(i); | 390 | return base+GETARG_B(i); |
392 | 391 | } | |
393 | case OP_PUSHNIL: { | 392 | case OP_PUSHNIL: { |
394 | int n = GETARG_U(i); | 393 | int n = GETARG_U(i); |
395 | LUA_ASSERT(n>0, "invalid argument"); | 394 | LUA_ASSERT(n>0, "invalid argument"); |
@@ -398,66 +397,65 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
398 | } while (--n > 0); | 397 | } while (--n > 0); |
399 | break; | 398 | break; |
400 | } | 399 | } |
401 | 400 | case OP_POP: { | |
402 | case OP_POP: | ||
403 | top -= GETARG_U(i); | 401 | top -= GETARG_U(i); |
404 | break; | 402 | break; |
405 | 403 | } | |
406 | case OP_PUSHINT: | 404 | case OP_PUSHINT: { |
407 | ttype(top) = TAG_NUMBER; | 405 | ttype(top) = TAG_NUMBER; |
408 | nvalue(top) = (Number)GETARG_S(i); | 406 | nvalue(top) = (Number)GETARG_S(i); |
409 | top++; | 407 | top++; |
410 | break; | 408 | break; |
411 | 409 | } | |
412 | case OP_PUSHSTRING: | 410 | case OP_PUSHSTRING: { |
413 | ttype(top) = TAG_STRING; | 411 | ttype(top) = TAG_STRING; |
414 | tsvalue(top) = kstr[GETARG_U(i)]; | 412 | tsvalue(top) = kstr[GETARG_U(i)]; |
415 | top++; | 413 | top++; |
416 | break; | 414 | break; |
417 | 415 | } | |
418 | case OP_PUSHNUM: | 416 | case OP_PUSHNUM: { |
419 | ttype(top) = TAG_NUMBER; | 417 | ttype(top) = TAG_NUMBER; |
420 | nvalue(top) = tf->knum[GETARG_U(i)]; | 418 | nvalue(top) = tf->knum[GETARG_U(i)]; |
421 | top++; | 419 | top++; |
422 | break; | 420 | break; |
423 | 421 | } | |
424 | case OP_PUSHNEGNUM: | 422 | case OP_PUSHNEGNUM: { |
425 | ttype(top) = TAG_NUMBER; | 423 | ttype(top) = TAG_NUMBER; |
426 | nvalue(top) = -tf->knum[GETARG_U(i)]; | 424 | nvalue(top) = -tf->knum[GETARG_U(i)]; |
427 | top++; | 425 | top++; |
428 | break; | 426 | break; |
429 | 427 | } | |
430 | case OP_PUSHUPVALUE: | 428 | case OP_PUSHUPVALUE: { |
431 | *top++ = cl->upvalue[GETARG_U(i)]; | 429 | *top++ = cl->upvalue[GETARG_U(i)]; |
432 | break; | 430 | break; |
433 | 431 | } | |
434 | case OP_GETLOCAL: | 432 | case OP_GETLOCAL: { |
435 | *top++ = *(base+GETARG_U(i)); | 433 | *top++ = *(base+GETARG_U(i)); |
436 | break; | 434 | break; |
437 | 435 | } | |
438 | case OP_GETGLOBAL: | 436 | case OP_GETGLOBAL: { |
439 | luaV_getglobal(L, kstr[GETARG_U(i)], top); | 437 | luaV_getglobal(L, kstr[GETARG_U(i)], top); |
440 | top++; | 438 | top++; |
441 | break; | 439 | break; |
442 | 440 | } | |
443 | case OP_GETTABLE: | 441 | case OP_GETTABLE: { |
444 | luaV_gettable(L, top); | 442 | luaV_gettable(L, top); |
445 | top--; | 443 | top--; |
446 | break; | 444 | break; |
447 | 445 | } | |
448 | case OP_GETDOTTED: | 446 | case OP_GETDOTTED: { |
449 | ttype(top) = TAG_STRING; | 447 | ttype(top) = TAG_STRING; |
450 | tsvalue(top++) = kstr[GETARG_U(i)]; | 448 | tsvalue(top++) = kstr[GETARG_U(i)]; |
451 | luaV_gettable(L, top); | 449 | luaV_gettable(L, top); |
452 | top--; | 450 | top--; |
453 | break; | 451 | break; |
454 | 452 | } | |
455 | case OP_GETINDEXED: | 453 | case OP_GETINDEXED: { |
456 | *top++ = *(base+GETARG_U(i)); | 454 | *top++ = *(base+GETARG_U(i)); |
457 | luaV_gettable(L, top); | 455 | luaV_gettable(L, top); |
458 | top--; | 456 | top--; |
459 | break; | 457 | break; |
460 | 458 | } | |
461 | case OP_PUSHSELF: { | 459 | case OP_PUSHSELF: { |
462 | TObject receiver; | 460 | TObject receiver; |
463 | receiver = *(top-1); | 461 | receiver = *(top-1); |
@@ -467,29 +465,28 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
467 | *(top-1) = receiver; | 465 | *(top-1) = receiver; |
468 | break; | 466 | break; |
469 | } | 467 | } |
470 | 468 | case OP_CREATETABLE: { | |
471 | case OP_CREATETABLE: | ||
472 | L->top = top; | 469 | L->top = top; |
473 | luaC_checkGC(L); | 470 | luaC_checkGC(L); |
474 | hvalue(top) = luaH_new(L, GETARG_U(i)); | 471 | hvalue(top) = luaH_new(L, GETARG_U(i)); |
475 | ttype(top) = TAG_TABLE; | 472 | ttype(top) = TAG_TABLE; |
476 | top++; | 473 | top++; |
477 | break; | 474 | break; |
478 | 475 | } | |
479 | case OP_SETLOCAL: | 476 | case OP_SETLOCAL: { |
480 | *(base+GETARG_U(i)) = *(--top); | 477 | *(base+GETARG_U(i)) = *(--top); |
481 | break; | 478 | break; |
482 | 479 | } | |
483 | case OP_SETGLOBAL: | 480 | case OP_SETGLOBAL: { |
484 | luaV_setglobal(L, kstr[GETARG_U(i)], top); | 481 | luaV_setglobal(L, kstr[GETARG_U(i)], top); |
485 | top--; | 482 | top--; |
486 | break; | 483 | break; |
487 | 484 | } | |
488 | case OP_SETTABLE: | 485 | case OP_SETTABLE: { |
489 | luaV_settable(L, top-GETARG_A(i), top); | 486 | luaV_settable(L, top-GETARG_A(i), top); |
490 | top -= GETARG_B(i); /* pop values */ | 487 | top -= GETARG_B(i); /* pop values */ |
491 | break; | 488 | break; |
492 | 489 | } | |
493 | case OP_SETLIST: { | 490 | case OP_SETLIST: { |
494 | int aux = GETARG_A(i) * LFIELDS_PER_FLUSH; | 491 | int aux = GETARG_A(i) * LFIELDS_PER_FLUSH; |
495 | int n = GETARG_B(i); | 492 | int n = GETARG_B(i); |
@@ -499,7 +496,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
499 | *luaH_setint(L, arr, n+aux) = *(--top); | 496 | *luaH_setint(L, arr, n+aux) = *(--top); |
500 | break; | 497 | break; |
501 | } | 498 | } |
502 | |||
503 | case OP_SETMAP: { | 499 | case OP_SETMAP: { |
504 | int n = GETARG_U(i); | 500 | int n = GETARG_U(i); |
505 | StkId finaltop = top-2*n; | 501 | StkId finaltop = top-2*n; |
@@ -511,16 +507,15 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
511 | } | 507 | } |
512 | break; | 508 | break; |
513 | } | 509 | } |
514 | 510 | case OP_ADD: { | |
515 | case OP_ADD: | ||
516 | if (tonumber(top-2) || tonumber(top-1)) | 511 | if (tonumber(top-2) || tonumber(top-1)) |
517 | call_arith(L, top, IM_ADD); | 512 | call_arith(L, top, IM_ADD); |
518 | else | 513 | else |
519 | nvalue(top-2) += nvalue(top-1); | 514 | nvalue(top-2) += nvalue(top-1); |
520 | top--; | 515 | top--; |
521 | break; | 516 | break; |
522 | 517 | } | |
523 | case OP_ADDI: | 518 | case OP_ADDI: { |
524 | if (tonumber(top-1)) { | 519 | if (tonumber(top-1)) { |
525 | ttype(top) = TAG_NUMBER; | 520 | ttype(top) = TAG_NUMBER; |
526 | nvalue(top) = (Number)GETARG_S(i); | 521 | nvalue(top) = (Number)GETARG_S(i); |
@@ -529,37 +524,37 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
529 | else | 524 | else |
530 | nvalue(top-1) += (Number)GETARG_S(i); | 525 | nvalue(top-1) += (Number)GETARG_S(i); |
531 | break; | 526 | break; |
532 | 527 | } | |
533 | case OP_SUB: | 528 | case OP_SUB: { |
534 | if (tonumber(top-2) || tonumber(top-1)) | 529 | if (tonumber(top-2) || tonumber(top-1)) |
535 | call_arith(L, top, IM_SUB); | 530 | call_arith(L, top, IM_SUB); |
536 | else | 531 | else |
537 | nvalue(top-2) -= nvalue(top-1); | 532 | nvalue(top-2) -= nvalue(top-1); |
538 | top--; | 533 | top--; |
539 | break; | 534 | break; |
540 | 535 | } | |
541 | case OP_MULT: | 536 | case OP_MULT: { |
542 | if (tonumber(top-2) || tonumber(top-1)) | 537 | if (tonumber(top-2) || tonumber(top-1)) |
543 | call_arith(L, top, IM_MUL); | 538 | call_arith(L, top, IM_MUL); |
544 | else | 539 | else |
545 | nvalue(top-2) *= nvalue(top-1); | 540 | nvalue(top-2) *= nvalue(top-1); |
546 | top--; | 541 | top--; |
547 | break; | 542 | break; |
548 | 543 | } | |
549 | case OP_DIV: | 544 | case OP_DIV: { |
550 | if (tonumber(top-2) || tonumber(top-1)) | 545 | if (tonumber(top-2) || tonumber(top-1)) |
551 | call_arith(L, top, IM_DIV); | 546 | call_arith(L, top, IM_DIV); |
552 | else | 547 | else |
553 | nvalue(top-2) /= nvalue(top-1); | 548 | nvalue(top-2) /= nvalue(top-1); |
554 | top--; | 549 | top--; |
555 | break; | 550 | break; |
556 | 551 | } | |
557 | case OP_POW: | 552 | case OP_POW: { |
558 | if (!call_binTM(L, top, IM_POW)) | 553 | if (!call_binTM(L, top, IM_POW)) |
559 | lua_error(L, "undefined operation"); | 554 | lua_error(L, "undefined operation"); |
560 | top--; | 555 | top--; |
561 | break; | 556 | break; |
562 | 557 | } | |
563 | case OP_CONCAT: { | 558 | case OP_CONCAT: { |
564 | int n = GETARG_U(i); | 559 | int n = GETARG_U(i); |
565 | strconc(L, n, top); | 560 | strconc(L, n, top); |
@@ -568,8 +563,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
568 | luaC_checkGC(L); | 563 | luaC_checkGC(L); |
569 | break; | 564 | break; |
570 | } | 565 | } |
571 | 566 | case OP_MINUS: { | |
572 | case OP_MINUS: | ||
573 | if (tonumber(top-1)) { | 567 | if (tonumber(top-1)) { |
574 | ttype(top) = TAG_NIL; | 568 | ttype(top) = TAG_NIL; |
575 | call_arith(L, top+1, IM_UNM); | 569 | call_arith(L, top+1, IM_UNM); |
@@ -577,71 +571,71 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
577 | else | 571 | else |
578 | nvalue(top-1) = -nvalue(top-1); | 572 | nvalue(top-1) = -nvalue(top-1); |
579 | break; | 573 | break; |
580 | 574 | } | |
581 | case OP_NOT: | 575 | case OP_NOT: { |
582 | ttype(top-1) = | 576 | ttype(top-1) = |
583 | (ttype(top-1) == TAG_NIL) ? TAG_NUMBER : TAG_NIL; | 577 | (ttype(top-1) == TAG_NIL) ? TAG_NUMBER : TAG_NIL; |
584 | nvalue(top-1) = 1; | 578 | nvalue(top-1) = 1; |
585 | break; | 579 | break; |
586 | 580 | } | |
587 | case OP_JMPNE: | 581 | case OP_JMPNE: { |
588 | top -= 2; | 582 | top -= 2; |
589 | if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i); | 583 | if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i); |
590 | break; | 584 | break; |
591 | 585 | } | |
592 | case OP_JMPEQ: | 586 | case OP_JMPEQ: { |
593 | top -= 2; | 587 | top -= 2; |
594 | if (luaO_equalObj(top, top+1)) pc += GETARG_S(i); | 588 | if (luaO_equalObj(top, top+1)) pc += GETARG_S(i); |
595 | break; | 589 | break; |
596 | 590 | } | |
597 | case OP_JMPLT: | 591 | case OP_JMPLT: { |
598 | top -= 2; | 592 | top -= 2; |
599 | if (luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); | 593 | if (luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); |
600 | break; | 594 | break; |
601 | 595 | } | |
602 | case OP_JMPLE: /* a <= b === !(b<a) */ | 596 | case OP_JMPLE: { /* a <= b === !(b<a) */ |
603 | top -= 2; | 597 | top -= 2; |
604 | if (!luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); | 598 | if (!luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); |
605 | break; | 599 | break; |
606 | 600 | } | |
607 | case OP_JMPGT: /* a > b === (b<a) */ | 601 | case OP_JMPGT: { /* a > b === (b<a) */ |
608 | top -= 2; | 602 | top -= 2; |
609 | if (luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); | 603 | if (luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); |
610 | break; | 604 | break; |
611 | 605 | } | |
612 | case OP_JMPGE: /* a >= b === !(a<b) */ | 606 | case OP_JMPGE: { /* a >= b === !(a<b) */ |
613 | top -= 2; | 607 | top -= 2; |
614 | if (!luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); | 608 | if (!luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); |
615 | break; | 609 | break; |
616 | 610 | } | |
617 | case OP_JMPT: | 611 | case OP_JMPT: { |
618 | if (ttype(--top) != TAG_NIL) pc += GETARG_S(i); | 612 | if (ttype(--top) != TAG_NIL) pc += GETARG_S(i); |
619 | break; | 613 | break; |
620 | 614 | } | |
621 | case OP_JMPF: | 615 | case OP_JMPF: { |
622 | if (ttype(--top) == TAG_NIL) pc += GETARG_S(i); | 616 | if (ttype(--top) == TAG_NIL) pc += GETARG_S(i); |
623 | break; | 617 | break; |
624 | 618 | } | |
625 | case OP_JMPONT: | 619 | case OP_JMPONT: { |
626 | if (ttype(top-1) != TAG_NIL) pc += GETARG_S(i); | 620 | if (ttype(top-1) != TAG_NIL) pc += GETARG_S(i); |
627 | else top--; | 621 | else top--; |
628 | break; | 622 | break; |
629 | 623 | } | |
630 | case OP_JMPONF: | 624 | case OP_JMPONF: { |
631 | if (ttype(top-1) == TAG_NIL) pc += GETARG_S(i); | 625 | if (ttype(top-1) == TAG_NIL) pc += GETARG_S(i); |
632 | else top--; | 626 | else top--; |
633 | break; | 627 | break; |
634 | 628 | } | |
635 | case OP_JMP: | 629 | case OP_JMP: { |
636 | pc += GETARG_S(i); | 630 | pc += GETARG_S(i); |
637 | break; | 631 | break; |
638 | 632 | } | |
639 | case OP_PUSHNILJMP: | 633 | case OP_PUSHNILJMP: { |
640 | ttype(top++) = TAG_NIL; | 634 | ttype(top++) = TAG_NIL; |
641 | pc++; | 635 | pc++; |
642 | break; | 636 | break; |
643 | 637 | } | |
644 | case OP_FORPREP: | 638 | case OP_FORPREP: { |
645 | if (tonumber(top-1)) | 639 | if (tonumber(top-1)) |
646 | lua_error(L, "`for' step must be a number"); | 640 | lua_error(L, "`for' step must be a number"); |
647 | if (tonumber(top-2)) | 641 | if (tonumber(top-2)) |
@@ -655,7 +649,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
655 | pc += GETARG_S(i)+1; /* jump to loop end */ | 649 | pc += GETARG_S(i)+1; /* jump to loop end */ |
656 | } | 650 | } |
657 | break; | 651 | break; |
658 | 652 | } | |
659 | case OP_FORLOOP: { | 653 | case OP_FORLOOP: { |
660 | LUA_ASSERT(ttype(top-1) == TAG_NUMBER, "invalid step"); | 654 | LUA_ASSERT(ttype(top-1) == TAG_NUMBER, "invalid step"); |
661 | LUA_ASSERT(ttype(top-2) == TAG_NUMBER, "invalid limit"); | 655 | LUA_ASSERT(ttype(top-2) == TAG_NUMBER, "invalid limit"); |
@@ -670,7 +664,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
670 | pc += GETARG_S(i); /* repeat loop */ | 664 | pc += GETARG_S(i); /* repeat loop */ |
671 | break; | 665 | break; |
672 | } | 666 | } |
673 | |||
674 | case OP_LFORPREP: { | 667 | case OP_LFORPREP: { |
675 | if (ttype(top-1) != TAG_TABLE) | 668 | if (ttype(top-1) != TAG_TABLE) |
676 | lua_error(L, "`for' table must be a table"); | 669 | lua_error(L, "`for' table must be a table"); |
@@ -688,7 +681,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
688 | } | 681 | } |
689 | break; | 682 | break; |
690 | } | 683 | } |
691 | |||
692 | case OP_LFORLOOP: { | 684 | case OP_LFORLOOP: { |
693 | int n; | 685 | int n; |
694 | top -= 2; /* remove old index,value */ | 686 | top -= 2; /* remove old index,value */ |
@@ -705,14 +697,13 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
705 | } | 697 | } |
706 | break; | 698 | break; |
707 | } | 699 | } |
708 | 700 | case OP_CLOSURE: { | |
709 | case OP_CLOSURE: | ||
710 | L->top = top; | 701 | L->top = top; |
711 | luaV_Lclosure(L, tf->kproto[GETARG_A(i)], GETARG_B(i)); | 702 | luaV_Lclosure(L, tf->kproto[GETARG_A(i)], GETARG_B(i)); |
712 | top = L->top; | 703 | top = L->top; |
713 | luaC_checkGC(L); | 704 | luaC_checkGC(L); |
714 | break; | 705 | break; |
715 | 706 | } | |
716 | } | 707 | } |
717 | } | 708 | } |
718 | } | 709 | } |