summaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-14 14:45:59 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-14 14:45:59 -0300
commitd1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b (patch)
tree316783459a8fdc85cddf7920560f6cddf4514cab /lvm.c
parent9e84bf18db779bea66947c1ca08db9bf8dc593c8 (diff)
downloadlua-d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b.tar.gz
lua-d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b.tar.bz2
lua-d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b.zip
details
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c175
1 files changed, 83 insertions, 92 deletions
diff --git a/lvm.c b/lvm.c
index e4fee4ed..ec2db70e 100644
--- a/lvm.c
+++ b/lvm.c
@@ -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}