aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-02-14 14:51:08 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-02-14 14:51:08 -0200
commit3afe85b2ce9ffdc8eca819ddc1c05414701606fd (patch)
tree4433002ba359cfb376c61c69c93af9de13e29331 /lvm.c
parent52aad0ab5937d4df6fe07aedbf9987f2f792698c (diff)
downloadlua-3afe85b2ce9ffdc8eca819ddc1c05414701606fd.tar.gz
lua-3afe85b2ce9ffdc8eca819ddc1c05414701606fd.tar.bz2
lua-3afe85b2ce9ffdc8eca819ddc1c05414701606fd.zip
new version for INSTRUCTION formats
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c231
1 files changed, 97 insertions, 134 deletions
diff --git a/lvm.c b/lvm.c
index f8c46ec0..f1c1ee83 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.85 2000/02/08 16:39:42 roberto Exp roberto $ 2** $Id: lvm.c,v 1.86 2000/02/11 16:52:54 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*/
@@ -280,6 +280,11 @@ void luaV_comparison (lua_State *L) {
280} 280}
281 281
282 282
283#define setbool(o,cond) if (cond) { \
284 ttype(o) = LUA_T_NUMBER; nvalue(o) = 1.0; } \
285 else ttype(o) = LUA_T_NIL
286
287
283void luaV_pack (lua_State *L, StkId firstelem, int nvararg, TObject *tab) { 288void luaV_pack (lua_State *L, StkId firstelem, int nvararg, TObject *tab) {
284 int i; 289 int i;
285 Hash *htab; 290 Hash *htab;
@@ -313,90 +318,80 @@ static void adjust_varargs (lua_State *L, StkId base, int nfixargs) {
313StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf, 318StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
314 register StkId base) { 319 register StkId base) {
315 register StkId top; /* keep top local, for performance */ 320 register StkId top; /* keep top local, for performance */
316 register const Byte *pc = tf->code; 321 register const Instruction *pc = tf->code;
317 TaggedString **kstr = tf->kstr; 322 TaggedString **kstr = tf->kstr;
318 if (L->callhook) 323 if (L->callhook)
319 luaD_callHook(L, base-1, L->callhook, "call"); 324 luaD_callHook(L, base-1, L->callhook, "call");
320 luaD_checkstack(L, (*pc++)+EXTRA_STACK); 325 luaD_checkstack(L, tf->maxstacksize+EXTRA_STACK);
321 if (*pc < ZEROVARARG) 326 if (tf->is_vararg) { /* varargs? */
322 luaD_adjusttop(L, base, *(pc++)); 327 adjust_varargs(L, base, tf->numparams);
323 else { /* varargs */
324 adjust_varargs(L, base, (*pc++)-ZEROVARARG);
325 luaC_checkGC(L); 328 luaC_checkGC(L);
326 } 329 }
330 else
331 luaD_adjusttop(L, base, tf->numparams);
327 top = L->top; 332 top = L->top;
328 for (;;) { 333 for (;;) {
329 register int aux = 0; 334 register Instruction i = *pc++;
330 switchentry: 335 switch (GET_OPCODE(i)) {
331 switch ((OpCode)*pc++) {
332 336
333 case ENDCODE: 337 case ENDCODE:
334 return L->top; /* no results */ 338 return L->top; /* no results */
335 339
336 case RETCODE: 340 case RETCODE:
337 L->top = top; 341 L->top = top;
338 return base+(*pc++); 342 return base+GETARG_U(i);
339 343
340 case CALL: aux = *pc++; 344 case CALL:
341 L->top = top; 345 L->top = top;
342 luaD_call(L, base+(*pc++), aux); 346 luaD_call(L, base+GETARG_A(i), GETARG_B(i));
343 top = L->top; 347 top = L->top;
344 break; 348 break;
345 349
346 case TAILCALL: aux = *pc++; 350 case TAILCALL:
347 L->top = top; 351 L->top = top;
348 luaD_call(L, base+(*pc++), MULT_RET); 352 luaD_call(L, base+GETARG_A(i), MULT_RET);
349 return base+aux; 353 return base+GETARG_B(i);
350 354
351 case PUSHNIL: aux = *pc++; 355 case PUSHNIL: {
356 register int n = GETARG_U(i);
352 do { 357 do {
353 ttype(top++) = LUA_T_NIL; 358 ttype(top++) = LUA_T_NIL;
354 } while (aux--); 359 } while (n--);
355 break;
356
357 case POP: aux = *pc++;
358 top -= aux;
359 break; 360 break;
361 }
360 362
361 case PUSHINTW: aux += highbyte(L, *pc++); 363 case POP:
362 case PUSHINT: aux += *pc++; 364 top -= GETARG_U(i);
363 ttype(top) = LUA_T_NUMBER;
364 nvalue(top) = aux;
365 top++;
366 break; 365 break;
367 366
368 case PUSHINTNEGW: aux += highbyte(L, *pc++); 367 case PUSHINT:
369 case PUSHINTNEG: aux += *pc++;
370 ttype(top) = LUA_T_NUMBER; 368 ttype(top) = LUA_T_NUMBER;
371 nvalue(top) = -aux; 369 nvalue(top) = (real)GETARG_S(i);
372 top++; 370 top++;
373 break; 371 break;
374 372
375 case PUSHSTRINGW: aux += highbyte(L, *pc++); 373 case PUSHSTRING:
376 case PUSHSTRING: aux += *pc++;
377 ttype(top) = LUA_T_STRING; 374 ttype(top) = LUA_T_STRING;
378 tsvalue(top) = kstr[aux]; 375 tsvalue(top) = kstr[GETARG_U(i)];
379 top++; 376 top++;
380 break; 377 break;
381 378
382 case PUSHNUMBERW: aux += highbyte(L, *pc++); 379 case PUSHNUMBER:
383 case PUSHNUMBER: aux += *pc++;
384 ttype(top) = LUA_T_NUMBER; 380 ttype(top) = LUA_T_NUMBER;
385 nvalue(top) = tf->knum[aux]; 381 nvalue(top) = tf->knum[GETARG_U(i)];
386 top++; 382 top++;
387 break; 383 break;
388 384
389 case PUSHUPVALUE: aux = *pc++; 385 case PUSHUPVALUE:
390 *top++ = cl->consts[aux+1]; 386 *top++ = cl->consts[GETARG_U(i)+1];
391 break; 387 break;
392 388
393 case PUSHLOCAL: aux = *pc++; 389 case PUSHLOCAL:
394 *top++ = *(base+aux); 390 *top++ = *(base+GETARG_U(i));
395 break; 391 break;
396 392
397 case GETGLOBALW: aux += highbyte(L, *pc++); 393 case GETGLOBAL:
398 case GETGLOBAL: aux += *pc++; 394 luaV_getglobal(L, kstr[GETARG_U(i)]->u.s.gv, top);
399 luaV_getglobal(L, kstr[aux]->u.s.gv, top);
400 top++; 395 top++;
401 break; 396 break;
402 397
@@ -405,41 +400,37 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
405 top--; 400 top--;
406 break; 401 break;
407 402
408 case GETDOTTEDW: aux += highbyte(L, *pc++); 403 case GETDOTTED:
409 case GETDOTTED: aux += *pc++;
410 ttype(top) = LUA_T_STRING; 404 ttype(top) = LUA_T_STRING;
411 tsvalue(top++) = kstr[aux]; 405 tsvalue(top++) = kstr[GETARG_U(i)];
412 luaV_gettable(L, top); 406 luaV_gettable(L, top);
413 top--; 407 top--;
414 break; 408 break;
415 409
416 case PUSHSELFW: aux += highbyte(L, *pc++); 410 case PUSHSELF: {
417 case PUSHSELF: aux += *pc++; {
418 TObject receiver; 411 TObject receiver;
419 receiver = *(top-1); 412 receiver = *(top-1);
420 ttype(top) = LUA_T_STRING; 413 ttype(top) = LUA_T_STRING;
421 tsvalue(top++) = kstr[aux]; 414 tsvalue(top++) = kstr[GETARG_U(i)];
422 luaV_gettable(L, top); 415 luaV_gettable(L, top);
423 *(top-1) = receiver; 416 *(top-1) = receiver;
424 break; 417 break;
425 } 418 }
426 419
427 case CREATEARRAYW: aux += highbyte(L, *pc++); 420 case CREATETABLE:
428 case CREATEARRAY: aux += *pc++;
429 L->top = top; 421 L->top = top;
430 luaC_checkGC(L); 422 luaC_checkGC(L);
431 avalue(top) = luaH_new(L, aux); 423 avalue(top) = luaH_new(L, GETARG_U(i));
432 ttype(top) = LUA_T_ARRAY; 424 ttype(top) = LUA_T_ARRAY;
433 top++; 425 top++;
434 break; 426 break;
435 427
436 case SETLOCAL: aux = *pc++; 428 case SETLOCAL:
437 *(base+aux) = *(--top); 429 *(base+GETARG_U(i)) = *(--top);
438 break; 430 break;
439 431
440 case SETGLOBALW: aux += highbyte(L, *pc++); 432 case SETGLOBAL:
441 case SETGLOBAL: aux += *pc++; 433 luaV_setglobal(L, kstr[GETARG_U(i)]->u.s.gv, top);
442 luaV_setglobal(L, kstr[aux]->u.s.gv, top);
443 top--; 434 top--;
444 break; 435 break;
445 436
@@ -449,91 +440,81 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
449 break; 440 break;
450 441
451 case SETTABLE: 442 case SETTABLE:
452 luaV_settable(L, top-3-(*pc++), top); 443 luaV_settable(L, top-3-GETARG_U(i), top);
453 top--; /* pop value */ 444 top--; /* pop value */
454 break; 445 break;
455 446
456 case SETLISTW: aux += highbyte(L, *pc++); 447 case SETLIST: {
457 case SETLIST: aux += *pc++; { 448 int aux = GETARG_A(i) * LFIELDS_PER_FLUSH;
458 int n = *(pc++); 449 int n = GETARG_B(i)+1;
459 Hash *arr = avalue(top-n-1); 450 Hash *arr = avalue(top-n-1);
460 L->top = top-n; /* final value of `top' (in case of errors) */ 451 L->top = top-n; /* final value of `top' (in case of errors) */
461 aux *= LFIELDS_PER_FLUSH;
462 for (; n; n--) 452 for (; n; n--)
463 luaH_setint(L, arr, n+aux, --top); 453 luaH_setint(L, arr, n+aux, --top);
464 break; 454 break;
465 } 455 }
466 456
467 case SETMAP: aux = *pc++; { 457 case SETMAP: {
468 StkId finaltop = top-2*(aux+1); 458 int n = GETARG_U(i);
459 StkId finaltop = top-2*(n+1);
469 Hash *arr = avalue(finaltop-1); 460 Hash *arr = avalue(finaltop-1);
470 L->top = finaltop; /* final value of `top' (in case of errors) */ 461 L->top = finaltop; /* final value of `top' (in case of errors) */
471 do { 462 do {
472 luaH_set(L, arr, top-2, top-1); 463 luaH_set(L, arr, top-2, top-1);
473 top-=2; 464 top-=2;
474 } while (aux--); 465 } while (n--);
475 break; 466 break;
476 } 467 }
477 468
478 case NEQOP: aux = 1; 469 case NEQOP:
470 top--;
471 setbool(top-1, !luaO_equalObj(top-1, top));
472 break;
473
479 case EQOP: 474 case EQOP:
480 top--; 475 top--;
481 aux = (luaO_equalObj(top-1, top) != aux); 476 setbool(top-1, luaO_equalObj(top-1, top));
482 booleanresult:
483 if (aux) {
484 ttype(top-1) = LUA_T_NUMBER;
485 nvalue(top-1) = 1.0;
486 }
487 else ttype(top-1) = LUA_T_NIL;
488 break; 477 break;
489 478
490 case LTOP: 479 case LTOP:
491 top--; 480 top--;
492 if (ttype(top-1) == LUA_T_NUMBER && ttype(top) == LUA_T_NUMBER) 481 if (ttype(top-1) == LUA_T_NUMBER && ttype(top) == LUA_T_NUMBER)
493 aux = nvalue(top-1) < nvalue(top); 482 setbool(top-1, nvalue(top-1) < nvalue(top));
494 else if (ttype(top-1) == LUA_T_STRING && ttype(top) == LUA_T_STRING) 483 else if (ttype(top-1) == LUA_T_STRING && ttype(top) == LUA_T_STRING)
495 aux = luaV_strcomp(tsvalue(top-1), tsvalue(top)) < 0; 484 setbool(top-1, luaV_strcomp(tsvalue(top-1), tsvalue(top)) < 0);
496 else { 485 else
497 call_binTM(L, top+1, IM_LT, "unexpected type in comparison"); 486 call_binTM(L, top+1, IM_LT, "unexpected type in comparison");
498 break; 487 break;
499 }
500 goto booleanresult;
501 488
502 case LEOP: 489 case LEOP:
503 top--; 490 top--;
504 if (ttype(top-1) == LUA_T_NUMBER && ttype(top) == LUA_T_NUMBER) 491 if (ttype(top-1) == LUA_T_NUMBER && ttype(top) == LUA_T_NUMBER)
505 aux = nvalue(top-1) <= nvalue(top); 492 setbool(top-1, nvalue(top-1) <= nvalue(top));
506 else if (ttype(top-1) == LUA_T_STRING && ttype(top) == LUA_T_STRING) 493 else if (ttype(top-1) == LUA_T_STRING && ttype(top) == LUA_T_STRING)
507 aux = luaV_strcomp(tsvalue(top-1), tsvalue(top)) <= 0; 494 setbool(top-1, luaV_strcomp(tsvalue(top-1), tsvalue(top)) <= 0);
508 else { 495 else
509 call_binTM(L, top+1, IM_LE, "unexpected type in comparison"); 496 call_binTM(L, top+1, IM_LE, "unexpected type in comparison");
510 break; 497 break;
511 }
512 goto booleanresult;
513 498
514 case GTOP: 499 case GTOP:
515 top--; 500 top--;
516 if (ttype(top-1) == LUA_T_NUMBER && ttype(top) == LUA_T_NUMBER) 501 if (ttype(top-1) == LUA_T_NUMBER && ttype(top) == LUA_T_NUMBER)
517 aux = nvalue(top-1) > nvalue(top); 502 setbool(top-1, nvalue(top-1) > nvalue(top));
518 else if (ttype(top-1) == LUA_T_STRING && ttype(top) == LUA_T_STRING) 503 else if (ttype(top-1) == LUA_T_STRING && ttype(top) == LUA_T_STRING)
519 aux = luaV_strcomp(tsvalue(top-1), tsvalue(top)) > 0; 504 setbool(top-1, luaV_strcomp(tsvalue(top-1), tsvalue(top)) > 0);
520 else { 505 else
521 call_binTM(L, top+1, IM_GT, "unexpected type in comparison"); 506 call_binTM(L, top+1, IM_GT, "unexpected type in comparison");
522 break; 507 break;
523 }
524 goto booleanresult;
525 508
526 case GEOP: 509 case GEOP:
527 top--; 510 top--;
528 if (ttype(top-1) == LUA_T_NUMBER && ttype(top) == LUA_T_NUMBER) 511 if (ttype(top-1) == LUA_T_NUMBER && ttype(top) == LUA_T_NUMBER)
529 aux = nvalue(top-1) >= nvalue(top); 512 setbool(top-1, nvalue(top-1) >= nvalue(top));
530 else if (ttype(top-1) == LUA_T_STRING && ttype(top) == LUA_T_STRING) 513 else if (ttype(top-1) == LUA_T_STRING && ttype(top) == LUA_T_STRING)
531 aux = luaV_strcomp(tsvalue(top-1), tsvalue(top)) >= 0; 514 setbool(top-1, luaV_strcomp(tsvalue(top-1), tsvalue(top)) >= 0);
532 else { 515 else
533 call_binTM(L, top+1, IM_GE, "unexpected type in comparison"); 516 call_binTM(L, top+1, IM_GE, "unexpected type in comparison");
534 break; 517 break;
535 }
536 goto booleanresult;
537 518
538 case ADDOP: 519 case ADDOP:
539 if (tonumber(top-1) || tonumber(top-2)) 520 if (tonumber(top-1) || tonumber(top-2))
@@ -597,71 +578,53 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
597 nvalue(top-1) = 1; 578 nvalue(top-1) = 1;
598 break; 579 break;
599 580
600 case ONTJMPW: aux += highbyte(L, *pc++); 581 case ONTJMP:
601 case ONTJMP: aux += *pc++; 582 if (ttype(top-1) != LUA_T_NIL) pc += GETARG_S(i);
602 if (ttype(top-1) != LUA_T_NIL) pc += aux;
603 else top--; 583 else top--;
604 break; 584 break;
605 585
606 case ONFJMPW: aux += highbyte(L, *pc++); 586 case ONFJMP:
607 case ONFJMP: aux += *pc++; 587 if (ttype(top-1) == LUA_T_NIL) pc += GETARG_S(i);
608 if (ttype(top-1) == LUA_T_NIL) pc += aux;
609 else top--; 588 else top--;
610 break; 589 break;
611 590
612 case JMPW: aux += highbyte(L, *pc++); 591 case JMP:
613 case JMP: aux += *pc++; 592 pc += GETARG_S(i);
614 pc += aux;
615 break; 593 break;
616 594
617 case IFFJMPW: aux += highbyte(L, *pc++); 595 case IFTJMP:
618 case IFFJMP: aux += *pc++; 596 if (ttype(--top) != LUA_T_NIL) pc += GETARG_S(i);
619 if (ttype(--top) == LUA_T_NIL) pc += aux;
620 break; 597 break;
621 598
622 case IFTUPJMPW: aux += highbyte(L, *pc++); 599 case IFFJMP:
623 case IFTUPJMP: aux += *pc++; 600 if (ttype(--top) == LUA_T_NIL) pc += GETARG_S(i);
624 if (ttype(--top) != LUA_T_NIL) pc -= aux;
625 break; 601 break;
626 602
627 case IFFUPJMPW: aux += highbyte(L, *pc++); 603 case CLOSURE:
628 case IFFUPJMP: aux += *pc++;
629 if (ttype(--top) == LUA_T_NIL) pc -= aux;
630 break;
631
632 case CLOSUREW: aux += highbyte(L, *pc++);
633 case CLOSURE: aux += *pc++;
634 ttype(top) = LUA_T_LPROTO; 604 ttype(top) = LUA_T_LPROTO;
635 tfvalue(top) = tf->kproto[aux]; 605 tfvalue(top) = tf->kproto[GETARG_A(i)];
636 L->top = ++top; 606 L->top = ++top;
637 aux = *pc++; /* number of upvalues */ 607 luaV_closure(L, GETARG_B(i));
638 luaV_closure(L, aux); 608 top -= GETARG_B(i);
639 luaC_checkGC(L); 609 luaC_checkGC(L);
640 top -= aux;
641 break; 610 break;
642 611
643 case SETLINEW: aux += highbyte(L, *pc++); 612 case SETLINE:
644 case SETLINE: aux += *pc++;
645 if ((base-1)->ttype != LUA_T_LINE) { 613 if ((base-1)->ttype != LUA_T_LINE) {
646 /* open space for LINE value */ 614 /* open space for LINE value */
647 int i = top-base; 615 int n = top-base;
648 while (i--) base[i+1] = base[i]; 616 while (n--) base[n+1] = base[n];
649 base++; 617 base++;
650 top++; 618 top++;
651 (base-1)->ttype = LUA_T_LINE; 619 (base-1)->ttype = LUA_T_LINE;
652 } 620 }
653 (base-1)->value.i = aux; 621 (base-1)->value.i = GETARG_U(i);
654 if (L->linehook) { 622 if (L->linehook) {
655 L->top = top; 623 L->top = top;
656 luaD_lineHook(L, base-2, aux); 624 luaD_lineHook(L, base-2, GETARG_U(i));
657 } 625 }
658 break; 626 break;
659 627
660 case LONGARGW: aux += highbyte(L, *pc++);
661 case LONGARG: aux += *pc++;
662 aux = highbyte(L, highbyte(L, aux));
663 goto switchentry; /* do not reset `aux' */
664
665 } 628 }
666 } 629 }
667} 630}