diff --git a/.github/workflows/continuous-integration-v2.yml b/.github/workflows/continuous-integration-v2.yml index f104553..b547260 100644 --- a/.github/workflows/continuous-integration-v2.yml +++ b/.github/workflows/continuous-integration-v2.yml @@ -50,6 +50,7 @@ jobs: commands: - { build: make repl, run: out/repl.exe -f '../scripts/example.toy' } - { build: make repl, run: out/repl.exe -f '../scripts/example-print.toy' } + - { build: make repl, run: out/repl.exe -f '../scripts/example-variables.toy' } runs-on: ${{ matrix.platforms.os }} steps: diff --git a/README.md b/README.md index 737d90f..c9382c1 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,9 @@ print 6 * 7; //strings can be concatenated with the .. operator print "Hello" .. "world!"; +//declare a variable +var foobar = 42; + //more examples to be added as the features are implemented ``` @@ -53,6 +56,7 @@ This source code is covered by the zlib license (see [LICENSE.md](LICENSE.md)). For a guide on how you can contribute, see [CONTRIBUTING.md](CONTRIBUTING.md). +@8051Enthusiast - `fixAlignment()` trick @hiperiondev - v1 Disassembler, v1 porting support and feedback @add00 - v1 Library support @gruelingpine185 - Unofficial v1 MacOS support diff --git a/source/toy_vm.c b/source/toy_vm.c index db6f847..0844fb6 100644 --- a/source/toy_vm.c +++ b/source/toy_vm.c @@ -15,24 +15,23 @@ vm->routine[vm->routineCounter++] #define READ_UNSIGNED_INT(vm) \ - *((unsigned int*)(vm->routine + _read_postfix(&(vm->routineCounter), 4))) + *((unsigned int*)(vm->routine + readPostfixUtil(&(vm->routineCounter), 4))) #define READ_INT(vm) \ - *((int*)(vm->routine + _read_postfix(&(vm->routineCounter), 4))) + *((int*)(vm->routine + readPostfixUtil(&(vm->routineCounter), 4))) #define READ_FLOAT(vm) \ - *((float*)(vm->routine + _read_postfix(&(vm->routineCounter), 4))) + *((float*)(vm->routine + readPostfixUtil(&(vm->routineCounter), 4))) -static inline int _read_postfix(unsigned int* ptr, int amount) { +static inline int readPostfixUtil(unsigned int* ptr, int amount) { int ret = *ptr; *ptr += amount; return ret; } -static inline void fix_alignment(Toy_VM* vm) { - if (vm->routineCounter % 4 != 0) { - vm->routineCounter += (4 - vm->routineCounter % 4); - } +static inline void fixAlignment(Toy_VM* vm) { + //NOTE: It's a tilde, not a negative sign + vm->routineCounter = (vm->routineCounter + 3) & ~0b11; } //instruction handlers @@ -53,19 +52,19 @@ static void processRead(Toy_VM* vm) { } case TOY_VALUE_INTEGER: { - fix_alignment(vm); + fixAlignment(vm); value = TOY_VALUE_FROM_INTEGER(READ_INT(vm)); break; } case TOY_VALUE_FLOAT: { - fix_alignment(vm); + fixAlignment(vm); value = TOY_VALUE_FROM_FLOAT(READ_FLOAT(vm)); break; } case TOY_VALUE_STRING: { - fix_alignment(vm); + fixAlignment(vm); //grab the jump as an integer unsigned int jump = *(unsigned int*)(vm->routine + vm->jumpsAddr + READ_INT(vm)); @@ -107,13 +106,13 @@ static void processRead(Toy_VM* vm) { Toy_pushStack(&vm->stack, value); //leave the counter in a good spot - fix_alignment(vm); + fixAlignment(vm); } static void processDeclare(Toy_VM* vm) { Toy_ValueType type = READ_BYTE(vm); //variable type unsigned int len = READ_BYTE(vm); //name length - fix_alignment(vm); //one spare byte + fixAlignment(vm); //one spare byte //grab the jump unsigned int jump = *(unsigned int*)(vm->routine + vm->jumpsAddr + READ_INT(vm)); @@ -412,7 +411,7 @@ static void process(Toy_VM* vm) { } //prepare for the next instruction - fix_alignment(vm); + fixAlignment(vm); } }