aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-09-24 16:43:11 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-09-24 16:43:11 -0300
commit0dd6d1080e7f58eb17cb8a2ad3fc5801ed7c0532 (patch)
tree172953fb17b51eabde010564c86e27317f1bcc29 /lvm.c
parent3c820d622ec105815b6510015db8f9e6d81a05bc (diff)
downloadlua-0dd6d1080e7f58eb17cb8a2ad3fc5801ed7c0532.tar.gz
lua-0dd6d1080e7f58eb17cb8a2ad3fc5801ed7c0532.tar.bz2
lua-0dd6d1080e7f58eb17cb8a2ad3fc5801ed7c0532.zip
new opcode variants.
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c85
1 files changed, 55 insertions, 30 deletions
diff --git a/lvm.c b/lvm.c
index 90237f14..5b7971c6 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.3 1997/09/19 21:17:52 roberto Exp roberto $ 2** $Id: lvm.c,v 1.4 1997/09/22 20:53:20 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*/
@@ -22,9 +22,9 @@
22#include "lvm.h" 22#include "lvm.h"
23 23
24 24
25#define get_prevword(pc) (*(pc-2)+(*(pc-1)<<8)) 25#define skip_word(pc) (pc+=2)
26#define get_word(pc) (pc+=2, get_prevword(pc)) 26#define get_word(pc) (*(pc)+(*((pc)+1)<<8))
27#define skip_word(pc) {pc+=2;} 27#define next_word(pc) (pc+=2, get_word(pc-2))
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), ... */
@@ -300,7 +300,7 @@ StkId luaV_execute (Closure *cl, StkId base)
300 aux = *pc++; goto pushnumber; 300 aux = *pc++; goto pushnumber;
301 301
302 case PUSHWORD: 302 case PUSHWORD:
303 aux = get_word(pc); goto pushnumber; 303 aux = next_word(pc); goto pushnumber;
304 304
305 case PUSH0: case PUSH1: case PUSH2: 305 case PUSH0: case PUSH1: case PUSH2:
306 aux -= PUSH0; 306 aux -= PUSH0;
@@ -323,10 +323,16 @@ StkId luaV_execute (Closure *cl, StkId base)
323 break; 323 break;
324 324
325 case GETGLOBAL: 325 case GETGLOBAL:
326 aux = get_word(pc); goto getglobal; 326 aux = next_word(pc); goto getglobal;
327 327
328 case GETGLOBALB: 328 case GETGLOBALB:
329 aux = *pc++; 329 aux = *pc++; goto getglobal;
330
331 case GETGLOBAL0: case GETGLOBAL1: case GETGLOBAL2:
332 case GETGLOBAL3: case GETGLOBAL4: case GETGLOBAL5:
333 case GETGLOBAL6: case GETGLOBAL7: case GETGLOBAL8:
334 case GETGLOBAL9:
335 aux -= GETGLOBAL0;
330 getglobal: 336 getglobal:
331 luaV_getglobal(luaG_findsymbol(tsvalue(&consts[aux]))); 337 luaV_getglobal(luaG_findsymbol(tsvalue(&consts[aux])));
332 break; 338 break;
@@ -336,7 +342,7 @@ StkId luaV_execute (Closure *cl, StkId base)
336 break; 342 break;
337 343
338 case PUSHSELF: 344 case PUSHSELF:
339 aux = get_word(pc); goto pushself; 345 aux = next_word(pc); goto pushself;
340 346
341 case PUSHSELFB: 347 case PUSHSELFB:
342 aux = *pc++; 348 aux = *pc++;
@@ -349,10 +355,16 @@ StkId luaV_execute (Closure *cl, StkId base)
349 } 355 }
350 356
351 case PUSHCONSTANT: 357 case PUSHCONSTANT:
352 aux = get_word(pc); goto pushconstant; 358 aux = next_word(pc); goto pushconstant;
353 359
354 case PUSHCONSTANTB: 360 case PUSHCONSTANTB:
355 aux = *pc++; 361 aux = *pc++; goto pushconstant;
362
363 case PUSHCONSTANT0: case PUSHCONSTANT1: case PUSHCONSTANT2:
364 case PUSHCONSTANT3: case PUSHCONSTANT4: case PUSHCONSTANT5:
365 case PUSHCONSTANT6: case PUSHCONSTANT7: case PUSHCONSTANT8:
366 case PUSHCONSTANT9:
367 aux -= PUSHCONSTANT0;
356 pushconstant: 368 pushconstant:
357 *luaD_stack.top++ = consts[aux]; 369 *luaD_stack.top++ = consts[aux];
358 break; 370 break;
@@ -360,8 +372,8 @@ StkId luaV_execute (Closure *cl, StkId base)
360 case PUSHUPVALUE: 372 case PUSHUPVALUE:
361 aux = *pc++; goto pushupvalue; 373 aux = *pc++; goto pushupvalue;
362 374
363 case PUSHUPVALUE0: 375 case PUSHUPVALUE0: case PUSHUPVALUE1:
364 aux = 0; 376 aux -= PUSHUPVALUE0;
365 pushupvalue: 377 pushupvalue:
366 *luaD_stack.top++ = cl->consts[aux+1]; 378 *luaD_stack.top++ = cl->consts[aux+1];
367 break; 379 break;
@@ -379,7 +391,7 @@ StkId luaV_execute (Closure *cl, StkId base)
379 break; 391 break;
380 392
381 case SETGLOBAL: 393 case SETGLOBAL:
382 aux = get_word(pc); goto setglobal; 394 aux = next_word(pc); goto setglobal;
383 395
384 case SETGLOBALB: 396 case SETGLOBALB:
385 aux = *pc++; 397 aux = *pc++;
@@ -442,7 +454,7 @@ StkId luaV_execute (Closure *cl, StkId base)
442 454
443 case CREATEARRAY: 455 case CREATEARRAY:
444 luaC_checkGC(); 456 luaC_checkGC();
445 avalue(luaD_stack.top) = luaH_new(get_word(pc)); 457 avalue(luaD_stack.top) = luaH_new(next_word(pc));
446 ttype(luaD_stack.top) = LUA_T_ARRAY; 458 ttype(luaD_stack.top) = LUA_T_ARRAY;
447 luaD_stack.top++; 459 luaD_stack.top++;
448 break; 460 break;
@@ -554,45 +566,58 @@ StkId luaV_execute (Closure *cl, StkId base)
554 break; 566 break;
555 567
556 case ONTJMP: 568 case ONTJMP:
557 skip_word(pc);
558 if (ttype(luaD_stack.top-1) != LUA_T_NIL) 569 if (ttype(luaD_stack.top-1) != LUA_T_NIL)
559 pc += get_prevword(pc); 570 pc += *pc;
560 else 571 else {
572 pc++;
561 luaD_stack.top--; 573 luaD_stack.top--;
574 }
562 break; 575 break;
563 576
564 case ONFJMP: 577 case ONFJMP:
565 skip_word(pc);
566 if (ttype(luaD_stack.top-1) == LUA_T_NIL) 578 if (ttype(luaD_stack.top-1) == LUA_T_NIL)
567 pc += get_prevword(pc); 579 pc += *pc;
568 else 580 else {
581 pc++;
569 luaD_stack.top--; 582 luaD_stack.top--;
583 }
570 break; 584 break;
571 585
572 case JMP: 586 case JMP:
573 skip_word(pc); 587 pc += get_word(pc);
574 pc += get_prevword(pc); 588 break;
589
590 case UPJMPB:
591 pc -= *pc;
575 break; 592 break;
576 593
577 case UPJMP: 594 case UPJMP:
578 skip_word(pc); 595 pc -= get_word(pc);
579 pc -= get_prevword(pc);
580 break; 596 break;
581 597
582 case IFFJMP: 598 case IFFJMP:
583 skip_word(pc);
584 if (ttype(--luaD_stack.top) == LUA_T_NIL) 599 if (ttype(--luaD_stack.top) == LUA_T_NIL)
585 pc += get_prevword(pc); 600 pc += get_word(pc);
601 else
602 skip_word(pc);
603 break;
604
605 case IFFUPJMPB:
606 if (ttype(--luaD_stack.top) == LUA_T_NIL)
607 pc -= *pc;
608 else
609 pc++;
586 break; 610 break;
587 611
588 case IFFUPJMP: 612 case IFFUPJMP:
589 skip_word(pc);
590 if (ttype(--luaD_stack.top) == LUA_T_NIL) 613 if (ttype(--luaD_stack.top) == LUA_T_NIL)
591 pc -= get_prevword(pc); 614 pc -= get_word(pc);
615 else
616 skip_word(pc);
592 break; 617 break;
593 618
594 case CLOSURE: 619 case CLOSURE:
595 aux = get_word(pc); goto closure; 620 aux = next_word(pc); goto closure;
596 621
597 case CLOSUREB: 622 case CLOSUREB:
598 aux = *pc++; 623 aux = *pc++;
@@ -617,7 +642,7 @@ StkId luaV_execute (Closure *cl, StkId base)
617 return (base + ((aux==RETCODE) ? *pc : 0)); 642 return (base + ((aux==RETCODE) ? *pc : 0));
618 643
619 case SETLINE: { 644 case SETLINE: {
620 int line = get_word(pc); 645 int line = next_word(pc);
621 if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { 646 if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) {
622 /* open space for LINE value */ 647 /* open space for LINE value */
623 luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); 648 luaD_openstack((luaD_stack.top-luaD_stack.stack)-base);