|
9 | 9 | #include <time.h> |
10 | 10 | #include <stdarg.h> |
11 | 11 | #include <stdlib.h> // Required for exit() |
| 12 | +#include <math.h> |
| 13 | + |
12 | 14 |
|
13 | 15 |
|
14 | 16 | #include "../include/common.h" |
@@ -187,7 +189,13 @@ static InterpretResult run(VM* vm) { |
187 | 189 | [OP_TRY] = &&DO_OP_TRY, |
188 | 190 | [OP_CATCH] = &&DO_OP_CATCH, |
189 | 191 | [OP_END_TRY] = &&DO_OP_END_TRY, |
190 | | - [OP_MAKE_FOREIGN] = &&DO_OP_MAKE_FOREIGN |
| 192 | + [OP_MAKE_FOREIGN] = &&DO_OP_MAKE_FOREIGN, |
| 193 | + [OP_MODULO] = &&DO_OP_MODULO, |
| 194 | + [OP_BIT_AND] = &&DO_OP_BIT_AND, |
| 195 | + [OP_BIT_OR] = &&DO_OP_BIT_OR, |
| 196 | + [OP_BIT_XOR] = &&DO_OP_BIT_XOR, |
| 197 | + [OP_LEFT_SHIFT] = &&DO_OP_LEFT_SHIFT, |
| 198 | + [OP_RIGHT_SHIFT] = &&DO_OP_RIGHT_SHIFT |
191 | 199 | }; |
192 | 200 | #pragma GCC diagnostic pop |
193 | 201 |
|
@@ -491,6 +499,7 @@ static InterpretResult run(VM* vm) { |
491 | 499 | DO_OP_PRINT: { |
492 | 500 | printValue(pop(vm)); |
493 | 501 | printf("\n"); |
| 502 | + fflush(stdout); |
494 | 503 | DISPATCH(); |
495 | 504 | } |
496 | 505 | DO_OP_JUMP: { |
@@ -662,6 +671,80 @@ static InterpretResult run(VM* vm) { |
662 | 671 | DISPATCH(); |
663 | 672 | } |
664 | 673 |
|
| 674 | + DO_OP_MODULO: { |
| 675 | + double b = AS_NUMBER(pop(vm)); |
| 676 | + double a = AS_NUMBER(pop(vm)); |
| 677 | + push(vm, NUMBER_VAL(fmod(a, b))); |
| 678 | + DISPATCH(); |
| 679 | + } |
| 680 | + DO_OP_BIT_AND: { |
| 681 | + int b = (int)AS_NUMBER(pop(vm)); |
| 682 | + int a = (int)AS_NUMBER(pop(vm)); |
| 683 | + push(vm, NUMBER_VAL((double)(a & b))); |
| 684 | + DISPATCH(); |
| 685 | + } |
| 686 | + DO_OP_BIT_OR: { |
| 687 | + int b = (int)AS_NUMBER(pop(vm)); |
| 688 | + int a = (int)AS_NUMBER(pop(vm)); |
| 689 | + push(vm, NUMBER_VAL((double)(a | b))); |
| 690 | + DISPATCH(); |
| 691 | + } |
| 692 | + DO_OP_BIT_XOR: { |
| 693 | + int b = (int)AS_NUMBER(pop(vm)); |
| 694 | + int a = (int)AS_NUMBER(pop(vm)); |
| 695 | + push(vm, NUMBER_VAL((double)(a ^ b))); |
| 696 | + DISPATCH(); |
| 697 | + } |
| 698 | + DO_OP_LEFT_SHIFT: { |
| 699 | + int b = (int)AS_NUMBER(pop(vm)); |
| 700 | + int a = (int)AS_NUMBER(pop(vm)); |
| 701 | + push(vm, NUMBER_VAL((double)(a << b))); |
| 702 | + DISPATCH(); |
| 703 | + } |
| 704 | + DO_OP_RIGHT_SHIFT: { |
| 705 | + int b = (int)AS_NUMBER(pop(vm)); |
| 706 | + int a = (int)AS_NUMBER(pop(vm)); |
| 707 | + push(vm, NUMBER_VAL((double)(a >> b))); |
| 708 | + DISPATCH(); |
| 709 | + } |
| 710 | + |
| 711 | + DO_OP_MODULO: { |
| 712 | + double b = AS_NUMBER(pop(vm)); |
| 713 | + double a = AS_NUMBER(pop(vm)); |
| 714 | + push(vm, NUMBER_VAL(fmod(a, b))); |
| 715 | + DISPATCH(); |
| 716 | + } |
| 717 | + DO_OP_BIT_AND: { |
| 718 | + int b = (int)AS_NUMBER(pop(vm)); |
| 719 | + int a = (int)AS_NUMBER(pop(vm)); |
| 720 | + push(vm, NUMBER_VAL((double)(a & b))); |
| 721 | + DISPATCH(); |
| 722 | + } |
| 723 | + DO_OP_BIT_OR: { |
| 724 | + int b = (int)AS_NUMBER(pop(vm)); |
| 725 | + int a = (int)AS_NUMBER(pop(vm)); |
| 726 | + push(vm, NUMBER_VAL((double)(a | b))); |
| 727 | + DISPATCH(); |
| 728 | + } |
| 729 | + DO_OP_BIT_XOR: { |
| 730 | + int b = (int)AS_NUMBER(pop(vm)); |
| 731 | + int a = (int)AS_NUMBER(pop(vm)); |
| 732 | + push(vm, NUMBER_VAL((double)(a ^ b))); |
| 733 | + DISPATCH(); |
| 734 | + } |
| 735 | + DO_OP_LEFT_SHIFT: { |
| 736 | + int b = (int)AS_NUMBER(pop(vm)); |
| 737 | + int a = (int)AS_NUMBER(pop(vm)); |
| 738 | + push(vm, NUMBER_VAL((double)(a << b))); |
| 739 | + DISPATCH(); |
| 740 | + } |
| 741 | + DO_OP_RIGHT_SHIFT: { |
| 742 | + int b = (int)AS_NUMBER(pop(vm)); |
| 743 | + int a = (int)AS_NUMBER(pop(vm)); |
| 744 | + push(vm, NUMBER_VAL((double)(a >> b))); |
| 745 | + DISPATCH(); |
| 746 | + } |
| 747 | + |
665 | 748 | DO_OP_UNKNOWN: { |
666 | 749 | runtimeError(vm, "Unknown opcode %d.", frame->ip[-1]); |
667 | 750 | return INTERPRET_RUNTIME_ERROR; |
@@ -1109,6 +1192,42 @@ static InterpretResult run(VM* vm) { |
1109 | 1192 | push(vm, OBJ_VAL(foreign)); |
1110 | 1193 | break; |
1111 | 1194 | } |
| 1195 | + case OP_MODULO: { |
| 1196 | + double b = AS_NUMBER(pop(vm)); |
| 1197 | + double a = AS_NUMBER(pop(vm)); |
| 1198 | + push(vm, NUMBER_VAL(fmod(a, b))); |
| 1199 | + break; |
| 1200 | + } |
| 1201 | + case OP_BIT_AND: { |
| 1202 | + int b = (int)AS_NUMBER(pop(vm)); |
| 1203 | + int a = (int)AS_NUMBER(pop(vm)); |
| 1204 | + push(vm, NUMBER_VAL((double)(a & b))); |
| 1205 | + break; |
| 1206 | + } |
| 1207 | + case OP_BIT_OR: { |
| 1208 | + int b = (int)AS_NUMBER(pop(vm)); |
| 1209 | + int a = (int)AS_NUMBER(pop(vm)); |
| 1210 | + push(vm, NUMBER_VAL((double)(a | b))); |
| 1211 | + break; |
| 1212 | + } |
| 1213 | + case OP_BIT_XOR: { |
| 1214 | + int b = (int)AS_NUMBER(pop(vm)); |
| 1215 | + int a = (int)AS_NUMBER(pop(vm)); |
| 1216 | + push(vm, NUMBER_VAL((double)(a ^ b))); |
| 1217 | + break; |
| 1218 | + } |
| 1219 | + case OP_LEFT_SHIFT: { |
| 1220 | + int b = (int)AS_NUMBER(pop(vm)); |
| 1221 | + int a = (int)AS_NUMBER(pop(vm)); |
| 1222 | + push(vm, NUMBER_VAL((double)(a << b))); |
| 1223 | + break; |
| 1224 | + } |
| 1225 | + case OP_RIGHT_SHIFT: { |
| 1226 | + int b = (int)AS_NUMBER(pop(vm)); |
| 1227 | + int a = (int)AS_NUMBER(pop(vm)); |
| 1228 | + push(vm, NUMBER_VAL((double)(a >> b))); |
| 1229 | + break; |
| 1230 | + } |
1112 | 1231 | case OP_RETURN: { |
1113 | 1232 | vm->frameCount--; |
1114 | 1233 | if (vm->frameCount == 0) { |
|
0 commit comments