aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-10-13 20:12:04 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-10-13 20:12:04 -0200
commit7c261a13b572fb0f7449f6cdf2b495d0e5bd57d5 (patch)
tree026cbe3e25e1929f171d0f30ac7a588bfb29f573 /lvm.c
parent2bb94d9e22f1f8ab2c00c9296a3920bebe4862bd (diff)
downloadlua-7c261a13b572fb0f7449f6cdf2b495d0e5bd57d5.tar.gz
lua-7c261a13b572fb0f7449f6cdf2b495d0e5bd57d5.tar.bz2
lua-7c261a13b572fb0f7449f6cdf2b495d0e5bd57d5.zip
more uniform treatment to opcode variants.
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c145
1 files changed, 84 insertions, 61 deletions
diff --git a/lvm.c b/lvm.c
index bc0c9dd8..91d923a4 100644
--- a/lvm.c
+++ b/lvm.c
@@ -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: