aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1999-02-04 14:36:16 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1999-02-04 14:36:16 -0200
commitcbc58af26094ad6498c4160cf9710adc7883aa94 (patch)
tree8caa9f7162543ec4e224b2abbf038cb06d0f94ad /lvm.c
parent80001ab0eb3ad95f370796b26dacfdd7e9874877 (diff)
downloadlua-cbc58af26094ad6498c4160cf9710adc7883aa94.tar.gz
lua-cbc58af26094ad6498c4160cf9710adc7883aa94.tar.bz2
lua-cbc58af26094ad6498c4160cf9710adc7883aa94.zip
new opcode for "long" arguments (3 bytes)
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/lvm.c b/lvm.c
index d10dae92..d6befc1a 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.42 1999/02/02 17:57:49 roberto Exp roberto $ 2** $Id: lvm.c,v 1.43 1999/02/02 19:41:17 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*/
@@ -328,6 +328,7 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
328 } 328 }
329 for (;;) { 329 for (;;) {
330 register int aux = 0; 330 register int aux = 0;
331 switchentry:
331 switch ((OpCode)*pc++) { 332 switch ((OpCode)*pc++) {
332 333
333 case ENDCODE: aux = 1; 334 case ENDCODE: aux = 1;
@@ -348,14 +349,14 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
348 S->top -= (aux+1); 349 S->top -= (aux+1);
349 break; 350 break;
350 351
351 case PUSHNUMBERW: aux = highbyte(*pc++); 352 case PUSHNUMBERW: aux += highbyte(*pc++);
352 case PUSHNUMBER: aux += *pc++; 353 case PUSHNUMBER: aux += *pc++;
353 ttype(S->top) = LUA_T_NUMBER; 354 ttype(S->top) = LUA_T_NUMBER;
354 nvalue(S->top) = aux-NUMOFFSET; 355 nvalue(S->top) = aux-NUMOFFSET;
355 S->top++; 356 S->top++;
356 break; 357 break;
357 358
358 case PUSHCONSTANTW: aux = highbyte(*pc++); 359 case PUSHCONSTANTW: aux += highbyte(*pc++);
359 case PUSHCONSTANT: aux += *pc++; 360 case PUSHCONSTANT: aux += *pc++;
360 *S->top++ = consts[aux]; 361 *S->top++ = consts[aux];
361 break; 362 break;
@@ -368,22 +369,22 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
368 *S->top++ = *((S->stack+base) + aux); 369 *S->top++ = *((S->stack+base) + aux);
369 break; 370 break;
370 371
371 case GETGLOBALW: aux = highbyte(*pc++); 372 case GETGLOBALW: aux += highbyte(*pc++);
372 case GETGLOBAL: aux += *pc++; 373 case GETGLOBAL: aux += *pc++;
373 luaV_getglobal(tsvalue(&consts[aux])); 374 luaV_getglobal(tsvalue(&consts[aux]));
374 break; 375 break;
375 376
376 case GETTABLE: 377 case GETTABLE:
377 luaV_gettable(); 378 luaV_gettable();
378 break; 379 break;
379 380
380 case GETDOTTEDW: aux = highbyte(*pc++); 381 case GETDOTTEDW: aux += highbyte(*pc++);
381 case GETDOTTED: aux += *pc++; 382 case GETDOTTED: aux += *pc++;
382 *S->top++ = consts[aux]; 383 *S->top++ = consts[aux];
383 luaV_gettable(); 384 luaV_gettable();
384 break; 385 break;
385 386
386 case PUSHSELFW: aux = highbyte(*pc++); 387 case PUSHSELFW: aux += highbyte(*pc++);
387 case PUSHSELF: aux += *pc++; { 388 case PUSHSELF: aux += *pc++; {
388 TObject receiver = *(S->top-1); 389 TObject receiver = *(S->top-1);
389 *S->top++ = consts[aux]; 390 *S->top++ = consts[aux];
@@ -392,7 +393,7 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
392 break; 393 break;
393 } 394 }
394 395
395 case CREATEARRAYW: aux = highbyte(*pc++); 396 case CREATEARRAYW: aux += highbyte(*pc++);
396 case CREATEARRAY: aux += *pc++; 397 case CREATEARRAY: aux += *pc++;
397 luaC_checkGC(); 398 luaC_checkGC();
398 avalue(S->top) = luaH_new(aux); 399 avalue(S->top) = luaH_new(aux);
@@ -408,12 +409,12 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
408 *((S->stack+base) + aux) = *(S->top-1); 409 *((S->stack+base) + aux) = *(S->top-1);
409 break; 410 break;
410 411
411 case SETGLOBALW: aux = highbyte(*pc++); 412 case SETGLOBALW: aux += highbyte(*pc++);
412 case SETGLOBAL: aux += *pc++; 413 case SETGLOBAL: aux += *pc++;
413 luaV_setglobal(tsvalue(&consts[aux])); 414 luaV_setglobal(tsvalue(&consts[aux]));
414 break; 415 break;
415 416
416 case SETGLOBALDUPW: aux = highbyte(*pc++); 417 case SETGLOBALDUPW: aux += highbyte(*pc++);
417 case SETGLOBALDUP: aux += *pc++; 418 case SETGLOBALDUP: aux += *pc++;
418 *S->top = *(S->top-1); 419 *S->top = *(S->top-1);
419 S->top++; 420 S->top++;
@@ -435,7 +436,7 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
435 luaV_settable(S->top-3-(*pc++), 1); 436 luaV_settable(S->top-3-(*pc++), 1);
436 break; 437 break;
437 438
438 case SETLISTW: aux = highbyte(*pc++); 439 case SETLISTW: aux += highbyte(*pc++);
439 case SETLIST: aux += *pc++; { 440 case SETLIST: aux += *pc++; {
440 int n = *(pc++); 441 int n = *(pc++);
441 TObject *arr = S->top-n-1; 442 TObject *arr = S->top-n-1;
@@ -561,34 +562,34 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
561 nvalue(S->top-1) = 1; 562 nvalue(S->top-1) = 1;
562 break; 563 break;
563 564
564 case ONTJMPW: aux = highbyte(*pc++); 565 case ONTJMPW: aux += highbyte(*pc++);
565 case ONTJMP: aux += *pc++; 566 case ONTJMP: aux += *pc++;
566 if (ttype(S->top-1) != LUA_T_NIL) pc += aux; 567 if (ttype(S->top-1) != LUA_T_NIL) pc += aux;
567 else S->top--; 568 else S->top--;
568 break; 569 break;
569 570
570 case ONFJMPW: aux = highbyte(*pc++); 571 case ONFJMPW: aux += highbyte(*pc++);
571 case ONFJMP: aux += *pc++; 572 case ONFJMP: aux += *pc++;
572 if (ttype(S->top-1) == LUA_T_NIL) pc += aux; 573 if (ttype(S->top-1) == LUA_T_NIL) pc += aux;
573 else S->top--; 574 else S->top--;
574 break; 575 break;
575 576
576 case JMPW: aux = highbyte(*pc++); 577 case JMPW: aux += highbyte(*pc++);
577 case JMP: aux += *pc++; 578 case JMP: aux += *pc++;
578 pc += aux; 579 pc += aux;
579 break; 580 break;
580 581
581 case IFFJMPW: aux = highbyte(*pc++); 582 case IFFJMPW: aux += highbyte(*pc++);
582 case IFFJMP: aux += *pc++; 583 case IFFJMP: aux += *pc++;
583 if (ttype(--S->top) == LUA_T_NIL) pc += aux; 584 if (ttype(--S->top) == LUA_T_NIL) pc += aux;
584 break; 585 break;
585 586
586 case IFTUPJMPW: aux = highbyte(*pc++); 587 case IFTUPJMPW: aux += highbyte(*pc++);
587 case IFTUPJMP: aux += *pc++; 588 case IFTUPJMP: aux += *pc++;
588 if (ttype(--S->top) != LUA_T_NIL) pc -= aux; 589 if (ttype(--S->top) != LUA_T_NIL) pc -= aux;
589 break; 590 break;
590 591
591 case IFFUPJMPW: aux = highbyte(*pc++); 592 case IFFUPJMPW: aux += highbyte(*pc++);
592 case IFFUPJMP: aux += *pc++; 593 case IFFUPJMP: aux += *pc++;
593 if (ttype(--S->top) == LUA_T_NIL) pc -= aux; 594 if (ttype(--S->top) == LUA_T_NIL) pc -= aux;
594 break; 595 break;
@@ -605,7 +606,7 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
605 break; 606 break;
606 } 607 }
607 608
608 case SETLINEW: aux = highbyte(*pc++); 609 case SETLINEW: aux += highbyte(*pc++);
609 case SETLINE: aux += *pc++; 610 case SETLINE: aux += *pc++;
610 if ((S->stack+base-1)->ttype != LUA_T_LINE) { 611 if ((S->stack+base-1)->ttype != LUA_T_LINE) {
611 /* open space for LINE value */ 612 /* open space for LINE value */
@@ -618,6 +619,10 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
618 luaD_lineHook(aux); 619 luaD_lineHook(aux);
619 break; 620 break;
620 621
622 case LONGARG:
623 aux = highbyte(highbyte(*pc++));
624 goto switchentry; /* do not reset "aux" */
625
621 } 626 }
622 } 627 }
623} 628}