diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-10-13 20:12:04 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-10-13 20:12:04 -0200 |
commit | 7c261a13b572fb0f7449f6cdf2b495d0e5bd57d5 (patch) | |
tree | 026cbe3e25e1929f171d0f30ac7a588bfb29f573 /lvm.c | |
parent | 2bb94d9e22f1f8ab2c00c9296a3920bebe4862bd (diff) | |
download | lua-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.c | 145 |
1 files changed, 84 insertions, 61 deletions
@@ -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: |