diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-14 14:45:59 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-14 14:45:59 -0300 |
| commit | d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b (patch) | |
| tree | 316783459a8fdc85cddf7920560f6cddf4514cab /lvm.c | |
| parent | 9e84bf18db779bea66947c1ca08db9bf8dc593c8 (diff) | |
| download | lua-d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b.tar.gz lua-d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b.tar.bz2 lua-d1ffd1a1c5639d6ad84b695d3c6dae9e37830a0b.zip | |
details
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 175 |
1 files changed, 83 insertions, 92 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.125 2000/08/10 19:50:47 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.126 2000/08/11 16:17:28 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 | */ |
| @@ -371,25 +371,24 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 371 | if (linehook) | 371 | if (linehook) |
| 372 | traceexec(L, base, top, linehook); | 372 | traceexec(L, base, top, linehook); |
| 373 | switch (GET_OPCODE(i)) { | 373 | switch (GET_OPCODE(i)) { |
| 374 | 374 | case OP_END: { | |
| 375 | case OP_END: | ||
| 376 | return L->top; /* no results */ | 375 | return L->top; /* no results */ |
| 377 | 376 | } | |
| 378 | case OP_RETURN: | 377 | case OP_RETURN: { |
| 379 | L->top = top; | 378 | L->top = top; |
| 380 | return base+GETARG_U(i); | 379 | return base+GETARG_U(i); |
| 381 | 380 | } | |
| 382 | case OP_CALL: | 381 | case OP_CALL: { |
| 383 | L->top = top; | 382 | L->top = top; |
| 384 | luaD_call(L, base+GETARG_A(i), GETARG_B(i)); | 383 | luaD_call(L, base+GETARG_A(i), GETARG_B(i)); |
| 385 | top = L->top; | 384 | top = L->top; |
| 386 | break; | 385 | break; |
| 387 | 386 | } | |
| 388 | case OP_TAILCALL: | 387 | case OP_TAILCALL: { |
| 389 | L->top = top; | 388 | L->top = top; |
| 390 | luaD_call(L, base+GETARG_A(i), MULT_RET); | 389 | luaD_call(L, base+GETARG_A(i), MULT_RET); |
| 391 | return base+GETARG_B(i); | 390 | return base+GETARG_B(i); |
| 392 | 391 | } | |
| 393 | case OP_PUSHNIL: { | 392 | case OP_PUSHNIL: { |
| 394 | int n = GETARG_U(i); | 393 | int n = GETARG_U(i); |
| 395 | LUA_ASSERT(n>0, "invalid argument"); | 394 | LUA_ASSERT(n>0, "invalid argument"); |
| @@ -398,66 +397,65 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 398 | } while (--n > 0); | 397 | } while (--n > 0); |
| 399 | break; | 398 | break; |
| 400 | } | 399 | } |
| 401 | 400 | case OP_POP: { | |
| 402 | case OP_POP: | ||
| 403 | top -= GETARG_U(i); | 401 | top -= GETARG_U(i); |
| 404 | break; | 402 | break; |
| 405 | 403 | } | |
| 406 | case OP_PUSHINT: | 404 | case OP_PUSHINT: { |
| 407 | ttype(top) = TAG_NUMBER; | 405 | ttype(top) = TAG_NUMBER; |
| 408 | nvalue(top) = (Number)GETARG_S(i); | 406 | nvalue(top) = (Number)GETARG_S(i); |
| 409 | top++; | 407 | top++; |
| 410 | break; | 408 | break; |
| 411 | 409 | } | |
| 412 | case OP_PUSHSTRING: | 410 | case OP_PUSHSTRING: { |
| 413 | ttype(top) = TAG_STRING; | 411 | ttype(top) = TAG_STRING; |
| 414 | tsvalue(top) = kstr[GETARG_U(i)]; | 412 | tsvalue(top) = kstr[GETARG_U(i)]; |
| 415 | top++; | 413 | top++; |
| 416 | break; | 414 | break; |
| 417 | 415 | } | |
| 418 | case OP_PUSHNUM: | 416 | case OP_PUSHNUM: { |
| 419 | ttype(top) = TAG_NUMBER; | 417 | ttype(top) = TAG_NUMBER; |
| 420 | nvalue(top) = tf->knum[GETARG_U(i)]; | 418 | nvalue(top) = tf->knum[GETARG_U(i)]; |
| 421 | top++; | 419 | top++; |
| 422 | break; | 420 | break; |
| 423 | 421 | } | |
| 424 | case OP_PUSHNEGNUM: | 422 | case OP_PUSHNEGNUM: { |
| 425 | ttype(top) = TAG_NUMBER; | 423 | ttype(top) = TAG_NUMBER; |
| 426 | nvalue(top) = -tf->knum[GETARG_U(i)]; | 424 | nvalue(top) = -tf->knum[GETARG_U(i)]; |
| 427 | top++; | 425 | top++; |
| 428 | break; | 426 | break; |
| 429 | 427 | } | |
| 430 | case OP_PUSHUPVALUE: | 428 | case OP_PUSHUPVALUE: { |
| 431 | *top++ = cl->upvalue[GETARG_U(i)]; | 429 | *top++ = cl->upvalue[GETARG_U(i)]; |
| 432 | break; | 430 | break; |
| 433 | 431 | } | |
| 434 | case OP_GETLOCAL: | 432 | case OP_GETLOCAL: { |
| 435 | *top++ = *(base+GETARG_U(i)); | 433 | *top++ = *(base+GETARG_U(i)); |
| 436 | break; | 434 | break; |
| 437 | 435 | } | |
| 438 | case OP_GETGLOBAL: | 436 | case OP_GETGLOBAL: { |
| 439 | luaV_getglobal(L, kstr[GETARG_U(i)], top); | 437 | luaV_getglobal(L, kstr[GETARG_U(i)], top); |
| 440 | top++; | 438 | top++; |
| 441 | break; | 439 | break; |
| 442 | 440 | } | |
| 443 | case OP_GETTABLE: | 441 | case OP_GETTABLE: { |
| 444 | luaV_gettable(L, top); | 442 | luaV_gettable(L, top); |
| 445 | top--; | 443 | top--; |
| 446 | break; | 444 | break; |
| 447 | 445 | } | |
| 448 | case OP_GETDOTTED: | 446 | case OP_GETDOTTED: { |
| 449 | ttype(top) = TAG_STRING; | 447 | ttype(top) = TAG_STRING; |
| 450 | tsvalue(top++) = kstr[GETARG_U(i)]; | 448 | tsvalue(top++) = kstr[GETARG_U(i)]; |
| 451 | luaV_gettable(L, top); | 449 | luaV_gettable(L, top); |
| 452 | top--; | 450 | top--; |
| 453 | break; | 451 | break; |
| 454 | 452 | } | |
| 455 | case OP_GETINDEXED: | 453 | case OP_GETINDEXED: { |
| 456 | *top++ = *(base+GETARG_U(i)); | 454 | *top++ = *(base+GETARG_U(i)); |
| 457 | luaV_gettable(L, top); | 455 | luaV_gettable(L, top); |
| 458 | top--; | 456 | top--; |
| 459 | break; | 457 | break; |
| 460 | 458 | } | |
| 461 | case OP_PUSHSELF: { | 459 | case OP_PUSHSELF: { |
| 462 | TObject receiver; | 460 | TObject receiver; |
| 463 | receiver = *(top-1); | 461 | receiver = *(top-1); |
| @@ -467,29 +465,28 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 467 | *(top-1) = receiver; | 465 | *(top-1) = receiver; |
| 468 | break; | 466 | break; |
| 469 | } | 467 | } |
| 470 | 468 | case OP_CREATETABLE: { | |
| 471 | case OP_CREATETABLE: | ||
| 472 | L->top = top; | 469 | L->top = top; |
| 473 | luaC_checkGC(L); | 470 | luaC_checkGC(L); |
| 474 | hvalue(top) = luaH_new(L, GETARG_U(i)); | 471 | hvalue(top) = luaH_new(L, GETARG_U(i)); |
| 475 | ttype(top) = TAG_TABLE; | 472 | ttype(top) = TAG_TABLE; |
| 476 | top++; | 473 | top++; |
| 477 | break; | 474 | break; |
| 478 | 475 | } | |
| 479 | case OP_SETLOCAL: | 476 | case OP_SETLOCAL: { |
| 480 | *(base+GETARG_U(i)) = *(--top); | 477 | *(base+GETARG_U(i)) = *(--top); |
| 481 | break; | 478 | break; |
| 482 | 479 | } | |
| 483 | case OP_SETGLOBAL: | 480 | case OP_SETGLOBAL: { |
| 484 | luaV_setglobal(L, kstr[GETARG_U(i)], top); | 481 | luaV_setglobal(L, kstr[GETARG_U(i)], top); |
| 485 | top--; | 482 | top--; |
| 486 | break; | 483 | break; |
| 487 | 484 | } | |
| 488 | case OP_SETTABLE: | 485 | case OP_SETTABLE: { |
| 489 | luaV_settable(L, top-GETARG_A(i), top); | 486 | luaV_settable(L, top-GETARG_A(i), top); |
| 490 | top -= GETARG_B(i); /* pop values */ | 487 | top -= GETARG_B(i); /* pop values */ |
| 491 | break; | 488 | break; |
| 492 | 489 | } | |
| 493 | case OP_SETLIST: { | 490 | case OP_SETLIST: { |
| 494 | int aux = GETARG_A(i) * LFIELDS_PER_FLUSH; | 491 | int aux = GETARG_A(i) * LFIELDS_PER_FLUSH; |
| 495 | int n = GETARG_B(i); | 492 | int n = GETARG_B(i); |
| @@ -499,7 +496,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 499 | *luaH_setint(L, arr, n+aux) = *(--top); | 496 | *luaH_setint(L, arr, n+aux) = *(--top); |
| 500 | break; | 497 | break; |
| 501 | } | 498 | } |
| 502 | |||
| 503 | case OP_SETMAP: { | 499 | case OP_SETMAP: { |
| 504 | int n = GETARG_U(i); | 500 | int n = GETARG_U(i); |
| 505 | StkId finaltop = top-2*n; | 501 | StkId finaltop = top-2*n; |
| @@ -511,16 +507,15 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 511 | } | 507 | } |
| 512 | break; | 508 | break; |
| 513 | } | 509 | } |
| 514 | 510 | case OP_ADD: { | |
| 515 | case OP_ADD: | ||
| 516 | if (tonumber(top-2) || tonumber(top-1)) | 511 | if (tonumber(top-2) || tonumber(top-1)) |
| 517 | call_arith(L, top, IM_ADD); | 512 | call_arith(L, top, IM_ADD); |
| 518 | else | 513 | else |
| 519 | nvalue(top-2) += nvalue(top-1); | 514 | nvalue(top-2) += nvalue(top-1); |
| 520 | top--; | 515 | top--; |
| 521 | break; | 516 | break; |
| 522 | 517 | } | |
| 523 | case OP_ADDI: | 518 | case OP_ADDI: { |
| 524 | if (tonumber(top-1)) { | 519 | if (tonumber(top-1)) { |
| 525 | ttype(top) = TAG_NUMBER; | 520 | ttype(top) = TAG_NUMBER; |
| 526 | nvalue(top) = (Number)GETARG_S(i); | 521 | nvalue(top) = (Number)GETARG_S(i); |
| @@ -529,37 +524,37 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 529 | else | 524 | else |
| 530 | nvalue(top-1) += (Number)GETARG_S(i); | 525 | nvalue(top-1) += (Number)GETARG_S(i); |
| 531 | break; | 526 | break; |
| 532 | 527 | } | |
| 533 | case OP_SUB: | 528 | case OP_SUB: { |
| 534 | if (tonumber(top-2) || tonumber(top-1)) | 529 | if (tonumber(top-2) || tonumber(top-1)) |
| 535 | call_arith(L, top, IM_SUB); | 530 | call_arith(L, top, IM_SUB); |
| 536 | else | 531 | else |
| 537 | nvalue(top-2) -= nvalue(top-1); | 532 | nvalue(top-2) -= nvalue(top-1); |
| 538 | top--; | 533 | top--; |
| 539 | break; | 534 | break; |
| 540 | 535 | } | |
| 541 | case OP_MULT: | 536 | case OP_MULT: { |
| 542 | if (tonumber(top-2) || tonumber(top-1)) | 537 | if (tonumber(top-2) || tonumber(top-1)) |
| 543 | call_arith(L, top, IM_MUL); | 538 | call_arith(L, top, IM_MUL); |
| 544 | else | 539 | else |
| 545 | nvalue(top-2) *= nvalue(top-1); | 540 | nvalue(top-2) *= nvalue(top-1); |
| 546 | top--; | 541 | top--; |
| 547 | break; | 542 | break; |
| 548 | 543 | } | |
| 549 | case OP_DIV: | 544 | case OP_DIV: { |
| 550 | if (tonumber(top-2) || tonumber(top-1)) | 545 | if (tonumber(top-2) || tonumber(top-1)) |
| 551 | call_arith(L, top, IM_DIV); | 546 | call_arith(L, top, IM_DIV); |
| 552 | else | 547 | else |
| 553 | nvalue(top-2) /= nvalue(top-1); | 548 | nvalue(top-2) /= nvalue(top-1); |
| 554 | top--; | 549 | top--; |
| 555 | break; | 550 | break; |
| 556 | 551 | } | |
| 557 | case OP_POW: | 552 | case OP_POW: { |
| 558 | if (!call_binTM(L, top, IM_POW)) | 553 | if (!call_binTM(L, top, IM_POW)) |
| 559 | lua_error(L, "undefined operation"); | 554 | lua_error(L, "undefined operation"); |
| 560 | top--; | 555 | top--; |
| 561 | break; | 556 | break; |
| 562 | 557 | } | |
| 563 | case OP_CONCAT: { | 558 | case OP_CONCAT: { |
| 564 | int n = GETARG_U(i); | 559 | int n = GETARG_U(i); |
| 565 | strconc(L, n, top); | 560 | strconc(L, n, top); |
| @@ -568,8 +563,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 568 | luaC_checkGC(L); | 563 | luaC_checkGC(L); |
| 569 | break; | 564 | break; |
| 570 | } | 565 | } |
| 571 | 566 | case OP_MINUS: { | |
| 572 | case OP_MINUS: | ||
| 573 | if (tonumber(top-1)) { | 567 | if (tonumber(top-1)) { |
| 574 | ttype(top) = TAG_NIL; | 568 | ttype(top) = TAG_NIL; |
| 575 | call_arith(L, top+1, IM_UNM); | 569 | call_arith(L, top+1, IM_UNM); |
| @@ -577,71 +571,71 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 577 | else | 571 | else |
| 578 | nvalue(top-1) = -nvalue(top-1); | 572 | nvalue(top-1) = -nvalue(top-1); |
| 579 | break; | 573 | break; |
| 580 | 574 | } | |
| 581 | case OP_NOT: | 575 | case OP_NOT: { |
| 582 | ttype(top-1) = | 576 | ttype(top-1) = |
| 583 | (ttype(top-1) == TAG_NIL) ? TAG_NUMBER : TAG_NIL; | 577 | (ttype(top-1) == TAG_NIL) ? TAG_NUMBER : TAG_NIL; |
| 584 | nvalue(top-1) = 1; | 578 | nvalue(top-1) = 1; |
| 585 | break; | 579 | break; |
| 586 | 580 | } | |
| 587 | case OP_JMPNE: | 581 | case OP_JMPNE: { |
| 588 | top -= 2; | 582 | top -= 2; |
| 589 | if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i); | 583 | if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i); |
| 590 | break; | 584 | break; |
| 591 | 585 | } | |
| 592 | case OP_JMPEQ: | 586 | case OP_JMPEQ: { |
| 593 | top -= 2; | 587 | top -= 2; |
| 594 | if (luaO_equalObj(top, top+1)) pc += GETARG_S(i); | 588 | if (luaO_equalObj(top, top+1)) pc += GETARG_S(i); |
| 595 | break; | 589 | break; |
| 596 | 590 | } | |
| 597 | case OP_JMPLT: | 591 | case OP_JMPLT: { |
| 598 | top -= 2; | 592 | top -= 2; |
| 599 | if (luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); | 593 | if (luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); |
| 600 | break; | 594 | break; |
| 601 | 595 | } | |
| 602 | case OP_JMPLE: /* a <= b === !(b<a) */ | 596 | case OP_JMPLE: { /* a <= b === !(b<a) */ |
| 603 | top -= 2; | 597 | top -= 2; |
| 604 | if (!luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); | 598 | if (!luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); |
| 605 | break; | 599 | break; |
| 606 | 600 | } | |
| 607 | case OP_JMPGT: /* a > b === (b<a) */ | 601 | case OP_JMPGT: { /* a > b === (b<a) */ |
| 608 | top -= 2; | 602 | top -= 2; |
| 609 | if (luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); | 603 | if (luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); |
| 610 | break; | 604 | break; |
| 611 | 605 | } | |
| 612 | case OP_JMPGE: /* a >= b === !(a<b) */ | 606 | case OP_JMPGE: { /* a >= b === !(a<b) */ |
| 613 | top -= 2; | 607 | top -= 2; |
| 614 | if (!luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); | 608 | if (!luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); |
| 615 | break; | 609 | break; |
| 616 | 610 | } | |
| 617 | case OP_JMPT: | 611 | case OP_JMPT: { |
| 618 | if (ttype(--top) != TAG_NIL) pc += GETARG_S(i); | 612 | if (ttype(--top) != TAG_NIL) pc += GETARG_S(i); |
| 619 | break; | 613 | break; |
| 620 | 614 | } | |
| 621 | case OP_JMPF: | 615 | case OP_JMPF: { |
| 622 | if (ttype(--top) == TAG_NIL) pc += GETARG_S(i); | 616 | if (ttype(--top) == TAG_NIL) pc += GETARG_S(i); |
| 623 | break; | 617 | break; |
| 624 | 618 | } | |
| 625 | case OP_JMPONT: | 619 | case OP_JMPONT: { |
| 626 | if (ttype(top-1) != TAG_NIL) pc += GETARG_S(i); | 620 | if (ttype(top-1) != TAG_NIL) pc += GETARG_S(i); |
| 627 | else top--; | 621 | else top--; |
| 628 | break; | 622 | break; |
| 629 | 623 | } | |
| 630 | case OP_JMPONF: | 624 | case OP_JMPONF: { |
| 631 | if (ttype(top-1) == TAG_NIL) pc += GETARG_S(i); | 625 | if (ttype(top-1) == TAG_NIL) pc += GETARG_S(i); |
| 632 | else top--; | 626 | else top--; |
| 633 | break; | 627 | break; |
| 634 | 628 | } | |
| 635 | case OP_JMP: | 629 | case OP_JMP: { |
| 636 | pc += GETARG_S(i); | 630 | pc += GETARG_S(i); |
| 637 | break; | 631 | break; |
| 638 | 632 | } | |
| 639 | case OP_PUSHNILJMP: | 633 | case OP_PUSHNILJMP: { |
| 640 | ttype(top++) = TAG_NIL; | 634 | ttype(top++) = TAG_NIL; |
| 641 | pc++; | 635 | pc++; |
| 642 | break; | 636 | break; |
| 643 | 637 | } | |
| 644 | case OP_FORPREP: | 638 | case OP_FORPREP: { |
| 645 | if (tonumber(top-1)) | 639 | if (tonumber(top-1)) |
| 646 | lua_error(L, "`for' step must be a number"); | 640 | lua_error(L, "`for' step must be a number"); |
| 647 | if (tonumber(top-2)) | 641 | if (tonumber(top-2)) |
| @@ -655,7 +649,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 655 | pc += GETARG_S(i)+1; /* jump to loop end */ | 649 | pc += GETARG_S(i)+1; /* jump to loop end */ |
| 656 | } | 650 | } |
| 657 | break; | 651 | break; |
| 658 | 652 | } | |
| 659 | case OP_FORLOOP: { | 653 | case OP_FORLOOP: { |
| 660 | LUA_ASSERT(ttype(top-1) == TAG_NUMBER, "invalid step"); | 654 | LUA_ASSERT(ttype(top-1) == TAG_NUMBER, "invalid step"); |
| 661 | LUA_ASSERT(ttype(top-2) == TAG_NUMBER, "invalid limit"); | 655 | LUA_ASSERT(ttype(top-2) == TAG_NUMBER, "invalid limit"); |
| @@ -670,7 +664,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 670 | pc += GETARG_S(i); /* repeat loop */ | 664 | pc += GETARG_S(i); /* repeat loop */ |
| 671 | break; | 665 | break; |
| 672 | } | 666 | } |
| 673 | |||
| 674 | case OP_LFORPREP: { | 667 | case OP_LFORPREP: { |
| 675 | if (ttype(top-1) != TAG_TABLE) | 668 | if (ttype(top-1) != TAG_TABLE) |
| 676 | lua_error(L, "`for' table must be a table"); | 669 | lua_error(L, "`for' table must be a table"); |
| @@ -688,7 +681,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 688 | } | 681 | } |
| 689 | break; | 682 | break; |
| 690 | } | 683 | } |
| 691 | |||
| 692 | case OP_LFORLOOP: { | 684 | case OP_LFORLOOP: { |
| 693 | int n; | 685 | int n; |
| 694 | top -= 2; /* remove old index,value */ | 686 | top -= 2; /* remove old index,value */ |
| @@ -705,14 +697,13 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 705 | } | 697 | } |
| 706 | break; | 698 | break; |
| 707 | } | 699 | } |
| 708 | 700 | case OP_CLOSURE: { | |
| 709 | case OP_CLOSURE: | ||
| 710 | L->top = top; | 701 | L->top = top; |
| 711 | luaV_Lclosure(L, tf->kproto[GETARG_A(i)], GETARG_B(i)); | 702 | luaV_Lclosure(L, tf->kproto[GETARG_A(i)], GETARG_B(i)); |
| 712 | top = L->top; | 703 | top = L->top; |
| 713 | luaC_checkGC(L); | 704 | luaC_checkGC(L); |
| 714 | break; | 705 | break; |
| 715 | 706 | } | |
| 716 | } | 707 | } |
| 717 | } | 708 | } |
| 718 | } | 709 | } |
