Skip to content

Commit c7397a4

Browse files
committed
Reverse locals position
1 parent 47fe170 commit c7397a4

3 files changed

Lines changed: 78 additions & 51 deletions

File tree

test/test.c

Lines changed: 72 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -694,46 +694,70 @@ void test_opcodes(void) {
694694
END_TEST();
695695
free(externals.foreign_functions);
696696
///////////////////////////////////
697-
START_TEST(SET_LOCAL / GET_LOCAL, //
698-
"PUSH_INT 10\n" //
699-
"PUSH_INT 20\n" //
700-
"CALL 2 fun1\n" //
701-
"GET_RETVAL\n" //
702-
"HALT 69\n" //
703-
".label fun1\n" //
704-
"ADD\n" //
705-
"SET_LOCAL 0\n" //
706-
"PUSH_INT 5\n" //
707-
"GET_LOCAL 0\n" //
708-
"ADD\n" //
709-
"RETURN_VALUE\n" //
710-
); //
697+
START_TEST(1 SET_LOCAL / GET_LOCAL, //
698+
"PUSH_INT 10\n" //
699+
"PUSH_INT 20\n" //
700+
"PUSH_NULL_N 10\n" //
701+
"CALL 12 fun1\n" //
702+
"GET_RETVAL\n" //
703+
"HALT 69\n" //
704+
".label fun1\n" //
705+
"GET_LOCAL 1\n" //
706+
"RETURN_VALUE\n" //
707+
); //
711708

712709
TEST_EXECUTE;
713-
OP_TEST_START(18, 1, 0);
710+
OP_TEST_START(20, 1, 0);
711+
vm_value = vm_pop(&thread);
712+
assert(vm_value.type == VM_VAL_INT);
713+
assert(vm_value.number.integer == 20);
714+
OP_TEST_END();
715+
716+
END_TEST();
717+
718+
START_TEST(2 SET_LOCAL / GET_LOCAL, //
719+
"PUSH_INT 10\n" //
720+
"PUSH_INT 20\n" //
721+
"PUSH_NULL_N 10\n" //
722+
"CALL 12 fun1\n" //
723+
"GET_RETVAL\n" //
724+
"HALT 69\n" //
725+
".label fun1\n" //
726+
"GET_LOCAL 0\n" //
727+
"GET_LOCAL 1\n" //
728+
"ADD\n" //
729+
"SET_LOCAL 0\n" //
730+
"PUSH_INT 5\n" //
731+
"GET_LOCAL 0\n" //
732+
"ADD\n" //
733+
"RETURN_VALUE\n" //
734+
); //
735+
736+
TEST_EXECUTE;
737+
OP_TEST_START(20, 1, 0);
714738
vm_value = vm_pop(&thread);
715739
assert(vm_value.type == VM_VAL_INT);
716740
assert(vm_value.number.integer == 35);
717741
OP_TEST_END();
718742

719743
END_TEST();
720744

721-
START_TEST(SET_LOCAL / GET_LOCAL, //
722-
"PUSH_INT 1\n" //
723-
"PUSH_INT 2\n" //
724-
"PUSH_INT 3\n" //
725-
"PUSH_INT 4\n" //
726-
"CALL 3 fun1\n" //
727-
"HALT 69\n" //
728-
".label fun1\n" //
729-
"PUSH_INT 10\n" //
730-
"SET_LOCAL 0\n" //
731-
"PUSH_INT 11\n" //
732-
"SET_LOCAL 1\n" //
733-
"PUSH_INT 12\n" //
734-
"SET_LOCAL 2\n" //
735-
"RETURN\n" //
736-
); //
745+
START_TEST(3 SET_LOCAL / GET_LOCAL, //
746+
"PUSH_INT 1\n" //
747+
"PUSH_INT 2\n" //
748+
"PUSH_INT 3\n" //
749+
"PUSH_INT 4\n" //
750+
"CALL 3 fun1\n" //
751+
"HALT 69\n" //
752+
".label fun1\n" //
753+
"PUSH_INT 10\n" //
754+
"SET_LOCAL 0\n" //
755+
"PUSH_INT 11\n" //
756+
"SET_LOCAL 1\n" //
757+
"PUSH_INT 12\n" //
758+
"SET_LOCAL 2\n" //
759+
"RETURN\n" //
760+
); //
737761

738762
TEST_EXECUTE;
739763
OP_TEST_START(27, 1, 0);
@@ -744,23 +768,26 @@ void test_opcodes(void) {
744768

745769
END_TEST();
746770

747-
START_TEST(SET_LOCAL_FF / GET_LOCAL_FF, //
748-
"PUSH_INT 10\n" //
749-
"PUSH_INT 20\n" //
750-
"CALL 2 fun1\n" //
751-
"GET_RETVAL\n" //
752-
"HALT 69\n" //
753-
".label fun1\n" //
754-
"ADD\n" //
755-
"SET_LOCAL_FF 0\n" //
756-
"PUSH_INT 5\n" //
757-
"GET_LOCAL_FF 0\n" //
758-
"ADD\n" //
759-
"RETURN_VALUE\n" //
771+
START_TEST(4 SET_LOCAL_FF / GET_LOCAL_FF, //
772+
"PUSH_INT 10\n" //
773+
"PUSH_INT 20\n" //
774+
"PUSH_NULL_N 10\n" //
775+
"CALL 12 fun1\n" //
776+
"GET_RETVAL\n" //
777+
"HALT 69\n" //
778+
".label fun1\n" //
779+
"GET_LOCAL_FF 0\n" //
780+
"GET_LOCAL_FF 1\n" //
781+
"ADD\n" //
782+
"SET_LOCAL_FF 0\n" //
783+
"PUSH_INT 5\n" //
784+
"GET_LOCAL_FF 0\n" //
785+
"ADD\n" //
786+
"RETURN_VALUE\n" //
760787
);
761788

762789
TEST_EXECUTE;
763-
OP_TEST_START(18, 1, 0);
790+
OP_TEST_START(20, 1, 0);
764791
vm_value = vm_pop(&thread);
765792
assert(vm_value.type == VM_VAL_INT);
766793
assert(vm_value.number.integer == 35);

vm/vm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ void vm_step(vm_thread_t **thread, vm_program_t *program) {
739739
program->prog[(*thread)->pc++];
740740

741741
if (local_idx < (*thread)->frames[(*thread)->fc - 1].locals)
742-
vm_push(thread, (*thread)->stack[(*thread)->fp - (local_idx + 1)]);
742+
vm_push(thread, (*thread)->stack[(*thread)->fp - (*thread)->frames[(*thread)->fc - 1].locals + local_idx]);
743743
else
744744
err = VM_ERR_LOCALNOTEXIST;
745745
}
@@ -753,7 +753,7 @@ void vm_step(vm_thread_t **thread, vm_program_t *program) {
753753

754754
if (local_idx < (*thread)->frames[(*thread)->fc - 1].locals) {
755755
vm_value_t val = vm_pop(thread);
756-
(*thread)->stack[(*thread)->fp - (local_idx + 1)] = val;
756+
(*thread)->stack[(*thread)->fp - (*thread)->frames[(*thread)->fc - 1].locals + local_idx] = val;
757757
} else
758758
err = VM_ERR_LOCALNOTEXIST;
759759
}

vm/vm.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
#include <stdbool.h>
2424
#include <stdint.h>
2525

26-
#define VM_VERSION_MAYOR 2 // indicate a really big change that can cause a lot of incompatibilities with previous versions
27-
#define VM_VERSION_MINOR 3 // indicate some change on API or opcode
28-
#define VM_VERSION_PATCH 2 // indicate some minor change or correction
26+
#define COMPILER_VERSION_MAYOR 2 // indicate a really big change that can cause a lot of incompatibilities with previous versions
27+
#define COMPILER_VERSION_MINOR 3 // indicate some change on API or opcode
28+
#define COMPILER_VERSION_PATCH 2 // indicate some minor change or correction
2929

3030
//////////////// VM CONFIGURATION ////////////////
3131

@@ -345,7 +345,7 @@ typedef struct vm_ffilib_s {
345345
*/
346346
typedef struct vm_frame_s {
347347
uint32_t pc, fp; /**< program counter, frame counter */
348-
uint8_t locals; /**< number of arguments (for call) */
348+
uint8_t locals; /**< number of locals */
349349
uint32_t *gc_mark; /**< garbage collector mark allocator (used for a per frame gc) */
350350
} vm_frame_t;
351351

0 commit comments

Comments
 (0)