From 0e7fffcfe0381e1e41800e1a14e621280a3c6cb9 Mon Sep 17 00:00:00 2001 From: hanez Date: Mon, 15 Sep 2025 08:39:41 +0200 Subject: [PATCH] ufff --- examples/objects_more.fun | 49 +++++++ src/fun.c | 1 + src/parser.c | 42 +++++- src/vm.c | 127 +++++++++--------- src/{vm_case_abs.inc => vm_case_abs.c} | 0 src/{vm_case_add.inc => vm_case_add.c} | 0 src/{vm_case_and.inc => vm_case_and.c} | 0 ...se_arr_insert.inc => vm_case_arr_insert.c} | 0 ...{vm_case_arr_pop.inc => vm_case_arr_pop.c} | 0 ...m_case_arr_push.inc => vm_case_arr_push.c} | 0 ...se_arr_remove.inc => vm_case_arr_remove.c} | 0 ...{vm_case_arr_set.inc => vm_case_arr_set.c} | 0 src/{vm_case_call.inc => vm_case_call.c} | 0 src/{vm_case_clamp.inc => vm_case_clamp.c} | 0 src/{vm_case_clear.inc => vm_case_clear.c} | 0 ...m_case_contains.inc => vm_case_contains.c} | 0 src/{vm_case_div.inc => vm_case_div.c} | 0 src/{vm_case_dup.inc => vm_case_dup.c} | 0 ...case_enumerate.inc => vm_case_enumerate.c} | 0 src/{vm_case_eq.inc => vm_case_eq.c} | 0 src/{vm_case_find.inc => vm_case_find.c} | 0 src/{vm_case_gt.inc => vm_case_gt.c} | 0 src/{vm_case_gte.inc => vm_case_gte.c} | 0 src/{vm_case_halt.inc => vm_case_halt.c} | 0 ...{vm_case_has_key.inc => vm_case_has_key.c} | 0 ...case_index_get.inc => vm_case_index_get.c} | 0 ...m_case_index_of.inc => vm_case_index_of.c} | 0 ...case_index_set.inc => vm_case_index_set.c} | 0 src/{vm_case_join.inc => vm_case_join.c} | 0 src/{vm_case_jump.inc => vm_case_jump.c} | 0 ...p_if_false.inc => vm_case_jump_if_false.c} | 0 src/{vm_case_keys.inc => vm_case_keys.c} | 0 src/{vm_case_len.inc => vm_case_len.c} | 0 ...se_load_const.inc => vm_case_load_const.c} | 0 ..._load_global.inc => vm_case_load_global.c} | 0 ...se_load_local.inc => vm_case_load_local.c} | 0 src/{vm_case_lt.inc => vm_case_lt.c} | 0 src/{vm_case_lte.inc => vm_case_lte.c} | 0 ...se_make_array.inc => vm_case_make_array.c} | 0 ...m_case_make_map.inc => vm_case_make_map.c} | 0 src/{vm_case_max.inc => vm_case_max.c} | 0 src/{vm_case_min.inc => vm_case_min.c} | 0 src/{vm_case_mod.inc => vm_case_mod.c} | 0 src/{vm_case_mul.inc => vm_case_mul.c} | 0 src/{vm_case_neq.inc => vm_case_neq.c} | 0 src/{vm_case_nop.inc => vm_case_nop.c} | 0 src/{vm_case_not.inc => vm_case_not.c} | 0 src/{vm_case_or.inc => vm_case_or.c} | 0 src/{vm_case_pop.inc => vm_case_pop.c} | 0 src/{vm_case_pow.inc => vm_case_pow.c} | 0 src/{vm_case_print.inc => vm_case_print.c} | 0 ...se_random_int.inc => vm_case_random_int.c} | 0 ..._random_seed.inc => vm_case_random_seed.c} | 0 ...case_read_file.inc => vm_case_read_file.c} | 0 src/{vm_case_return.inc => vm_case_return.c} | 0 src/{vm_case_slice.inc => vm_case_slice.c} | 0 src/{vm_case_split.inc => vm_case_split.c} | 0 ...tore_global.inc => vm_case_store_global.c} | 0 ..._store_local.inc => vm_case_store_local.c} | 0 src/{vm_case_sub.inc => vm_case_sub.c} | 0 src/{vm_case_substr.inc => vm_case_substr.c} | 0 src/{vm_case_swap.inc => vm_case_swap.c} | 0 ...case_to_number.inc => vm_case_to_number.c} | 0 ...case_to_string.inc => vm_case_to_string.c} | 0 src/{vm_case_values.inc => vm_case_values.c} | 0 ...se_write_file.inc => vm_case_write_file.c} | 0 src/{vm_case_zip.inc => vm_case_zip.c} | 0 67 files changed, 154 insertions(+), 65 deletions(-) create mode 100644 examples/objects_more.fun rename src/{vm_case_abs.inc => vm_case_abs.c} (100%) rename src/{vm_case_add.inc => vm_case_add.c} (100%) rename src/{vm_case_and.inc => vm_case_and.c} (100%) rename src/{vm_case_arr_insert.inc => vm_case_arr_insert.c} (100%) rename src/{vm_case_arr_pop.inc => vm_case_arr_pop.c} (100%) rename src/{vm_case_arr_push.inc => vm_case_arr_push.c} (100%) rename src/{vm_case_arr_remove.inc => vm_case_arr_remove.c} (100%) rename src/{vm_case_arr_set.inc => vm_case_arr_set.c} (100%) rename src/{vm_case_call.inc => vm_case_call.c} (100%) rename src/{vm_case_clamp.inc => vm_case_clamp.c} (100%) rename src/{vm_case_clear.inc => vm_case_clear.c} (100%) rename src/{vm_case_contains.inc => vm_case_contains.c} (100%) rename src/{vm_case_div.inc => vm_case_div.c} (100%) rename src/{vm_case_dup.inc => vm_case_dup.c} (100%) rename src/{vm_case_enumerate.inc => vm_case_enumerate.c} (100%) rename src/{vm_case_eq.inc => vm_case_eq.c} (100%) rename src/{vm_case_find.inc => vm_case_find.c} (100%) rename src/{vm_case_gt.inc => vm_case_gt.c} (100%) rename src/{vm_case_gte.inc => vm_case_gte.c} (100%) rename src/{vm_case_halt.inc => vm_case_halt.c} (100%) rename src/{vm_case_has_key.inc => vm_case_has_key.c} (100%) rename src/{vm_case_index_get.inc => vm_case_index_get.c} (100%) rename src/{vm_case_index_of.inc => vm_case_index_of.c} (100%) rename src/{vm_case_index_set.inc => vm_case_index_set.c} (100%) rename src/{vm_case_join.inc => vm_case_join.c} (100%) rename src/{vm_case_jump.inc => vm_case_jump.c} (100%) rename src/{vm_case_jump_if_false.inc => vm_case_jump_if_false.c} (100%) rename src/{vm_case_keys.inc => vm_case_keys.c} (100%) rename src/{vm_case_len.inc => vm_case_len.c} (100%) rename src/{vm_case_load_const.inc => vm_case_load_const.c} (100%) rename src/{vm_case_load_global.inc => vm_case_load_global.c} (100%) rename src/{vm_case_load_local.inc => vm_case_load_local.c} (100%) rename src/{vm_case_lt.inc => vm_case_lt.c} (100%) rename src/{vm_case_lte.inc => vm_case_lte.c} (100%) rename src/{vm_case_make_array.inc => vm_case_make_array.c} (100%) rename src/{vm_case_make_map.inc => vm_case_make_map.c} (100%) rename src/{vm_case_max.inc => vm_case_max.c} (100%) rename src/{vm_case_min.inc => vm_case_min.c} (100%) rename src/{vm_case_mod.inc => vm_case_mod.c} (100%) rename src/{vm_case_mul.inc => vm_case_mul.c} (100%) rename src/{vm_case_neq.inc => vm_case_neq.c} (100%) rename src/{vm_case_nop.inc => vm_case_nop.c} (100%) rename src/{vm_case_not.inc => vm_case_not.c} (100%) rename src/{vm_case_or.inc => vm_case_or.c} (100%) rename src/{vm_case_pop.inc => vm_case_pop.c} (100%) rename src/{vm_case_pow.inc => vm_case_pow.c} (100%) rename src/{vm_case_print.inc => vm_case_print.c} (100%) rename src/{vm_case_random_int.inc => vm_case_random_int.c} (100%) rename src/{vm_case_random_seed.inc => vm_case_random_seed.c} (100%) rename src/{vm_case_read_file.inc => vm_case_read_file.c} (100%) rename src/{vm_case_return.inc => vm_case_return.c} (100%) rename src/{vm_case_slice.inc => vm_case_slice.c} (100%) rename src/{vm_case_split.inc => vm_case_split.c} (100%) rename src/{vm_case_store_global.inc => vm_case_store_global.c} (100%) rename src/{vm_case_store_local.inc => vm_case_store_local.c} (100%) rename src/{vm_case_sub.inc => vm_case_sub.c} (100%) rename src/{vm_case_substr.inc => vm_case_substr.c} (100%) rename src/{vm_case_swap.inc => vm_case_swap.c} (100%) rename src/{vm_case_to_number.inc => vm_case_to_number.c} (100%) rename src/{vm_case_to_string.inc => vm_case_to_string.c} (100%) rename src/{vm_case_values.inc => vm_case_values.c} (100%) rename src/{vm_case_write_file.inc => vm_case_write_file.c} (100%) rename src/{vm_case_zip.inc => vm_case_zip.c} (100%) diff --git a/examples/objects_more.fun b/examples/objects_more.fun new file mode 100644 index 0000000..6817f6e --- /dev/null +++ b/examples/objects_more.fun @@ -0,0 +1,49 @@ +#!/usr/bin/env fun + +// Objects as maps: nested fields, methods with explicit self + +// A method to move a 2D point by dx, dy +fun move(self, dx, dy) + self["x"] = self["x"] + dx + self["y"] = self["y"] + dy + return 0 + +// Create a point directly and inspect fields +p = { "x": 1, "y": 2, "move": move } +print(p["x"]) // -> 1 +print(p["y"]) // -> 2 + +// Update a field directly +p["x"] = 10 +print(p["x"]) // -> 10 + +// Call method with explicit self +move(p, 3, -2) +print(p["x"]) // -> 13 +print(p["y"]) // -> 0 + +// Nested object example +rect = { + "pos": { "x": 0, "y": 0 }, + "size": { "w": 5, "h": 4 } +} +print(rect["pos"]["x"]) // -> 0 +print(rect["size"]["w"]) // -> 5 + +// Mutate nested fields +rect["pos"]["x"] = rect["pos"]["x"] + 7 +rect["size"]["h"] = rect["size"]["h"] + 1 +print(rect["pos"]["x"]) // -> 7 +print(rect["size"]["h"]) // -> 5 + +/* Expected output: +1 +2 +10 +13 +0 +0 +5 +7 +5 +*/ diff --git a/src/fun.c b/src/fun.c index 051adb3..f7be308 100644 --- a/src/fun.c +++ b/src/fun.c @@ -20,6 +20,7 @@ static int is_blank_line(const char *s) { return 1; } + static const char* lstrip(const char *s) { while (*s == ' ' || *s == '\t') s++; return s; diff --git a/src/parser.c b/src/parser.c index 0f473cd..8a6c134 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1489,9 +1489,9 @@ static void parse_simple_statement(Bytecode *bc, const char *src, size_t len, si return; } - /* array element assignment: name[expr] = expr */ + /* array element assignment: name[expr] = expr and nested: name[expr1][expr2] = expr */ if (local_pos < len && src[local_pos] == '[') { - /* load array variable */ + /* load array/map variable */ if (lidx >= 0) { bytecode_add_instruction(bc, OP_LOAD_LOCAL, lidx); } else { @@ -1509,6 +1509,44 @@ static void parse_simple_statement(Bytecode *bc, const char *src, size_t len, si return; } skip_spaces(src, len, &local_pos); + + /* Nested index: name[expr1][expr2] = value */ + if (local_pos < len && src[local_pos] == '[') { + /* Reduce base: stack currently has container, index1 -> get inner container */ + bytecode_add_instruction(bc, OP_INDEX_GET, 0); + + local_pos++; /* second '[' */ + if (!emit_expression(bc, src, len, &local_pos)) { + parser_fail(local_pos, "Expected nested index expression after '['"); + free(name); + return; + } + if (!consume_char(src, len, &local_pos, ']')) { + parser_fail(local_pos, "Expected ']' after nested index"); + free(name); + return; + } + skip_spaces(src, len, &local_pos); + if (local_pos >= len || src[local_pos] != '=') { + parser_fail(local_pos, "Expected '=' after nested array index"); + free(name); + return; + } + local_pos++; /* '=' */ + if (!emit_expression(bc, src, len, &local_pos)) { + parser_fail(local_pos, "Expected expression after '='"); + free(name); + return; + } + /* perform set into inner container */ + bytecode_add_instruction(bc, OP_INDEX_SET, 0); + free(name); + *pos = local_pos; + skip_to_eol(src, len, pos); + return; + } + + /* Single-level: name[expr] = value */ if (local_pos >= len || src[local_pos] != '=') { parser_fail(local_pos, "Expected '=' after array index"); free(name); diff --git a/src/vm.c b/src/vm.c index 7bc7480..a425ccc 100644 --- a/src/vm.c +++ b/src/vm.c @@ -192,69 +192,70 @@ void vm_run(VM *vm, Bytecode *entry) { vm->instr_count++; /* count each executed instruction */ switch (inst.op) { - #include "vm_case_nop.inc" - #include "vm_case_load_const.inc" - #include "vm_case_load_local.inc" - #include "vm_case_store_local.inc" - #include "vm_case_add.inc" - #include "vm_case_sub.inc" - #include "vm_case_mul.inc" - #include "vm_case_div.inc" - #include "vm_case_lt.inc" - #include "vm_case_lte.inc" - #include "vm_case_jump.inc" - #include "vm_case_gt.inc" - #include "vm_case_gte.inc" - #include "vm_case_eq.inc" - #include "vm_case_neq.inc" - #include "vm_case_jump_if_false.inc" - #include "vm_case_call.inc" - #include "vm_case_return.inc" - #include "vm_case_print.inc" - #include "vm_case_halt.inc" - #include "vm_case_pop.inc" - #include "vm_case_dup.inc" - #include "vm_case_swap.inc" - #include "vm_case_make_array.inc" - #include "vm_case_index_get.inc" - #include "vm_case_index_set.inc" - #include "vm_case_len.inc" - #include "vm_case_arr_push.inc" - #include "vm_case_arr_pop.inc" - #include "vm_case_arr_set.inc" - #include "vm_case_arr_insert.inc" - #include "vm_case_arr_remove.inc" - #include "vm_case_slice.inc" - #include "vm_case_to_number.inc" - #include "vm_case_to_string.inc" - #include "vm_case_split.inc" - #include "vm_case_join.inc" - #include "vm_case_substr.inc" - #include "vm_case_find.inc" - #include "vm_case_contains.inc" - #include "vm_case_index_of.inc" - #include "vm_case_clear.inc" - #include "vm_case_enumerate.inc" - #include "vm_case_zip.inc" - #include "vm_case_min.inc" - #include "vm_case_max.inc" - #include "vm_case_clamp.inc" - #include "vm_case_abs.inc" - #include "vm_case_pow.inc" - #include "vm_case_random_seed.inc" - #include "vm_case_random_int.inc" - #include "vm_case_make_map.inc" - #include "vm_case_keys.inc" - #include "vm_case_values.inc" - #include "vm_case_has_key.inc" - #include "vm_case_read_file.inc" - #include "vm_case_write_file.inc" - #include "vm_case_load_global.inc" - #include "vm_case_store_global.inc" - #include "vm_case_mod.inc" - #include "vm_case_and.inc" - #include "vm_case_or.inc" - #include "vm_case_not.inc" + /* All opcode handlers as .c includes */ + #include "vm_case_nop.c" + #include "vm_case_load_const.c" + #include "vm_case_load_local.c" + #include "vm_case_store_local.c" + #include "vm_case_add.c" + #include "vm_case_sub.c" + #include "vm_case_mul.c" + #include "vm_case_div.c" + #include "vm_case_lt.c" + #include "vm_case_lte.c" + #include "vm_case_jump.c" + #include "vm_case_gt.c" + #include "vm_case_gte.c" + #include "vm_case_eq.c" + #include "vm_case_neq.c" + #include "vm_case_jump_if_false.c" + #include "vm_case_call.c" + #include "vm_case_return.c" + #include "vm_case_print.c" + #include "vm_case_halt.c" + #include "vm_case_pop.c" + #include "vm_case_dup.c" + #include "vm_case_swap.c" + #include "vm_case_make_array.c" + #include "vm_case_index_get.c" + #include "vm_case_index_set.c" + #include "vm_case_len.c" + #include "vm_case_arr_push.c" + #include "vm_case_arr_pop.c" + #include "vm_case_arr_set.c" + #include "vm_case_arr_insert.c" + #include "vm_case_arr_remove.c" + #include "vm_case_slice.c" + #include "vm_case_to_number.c" + #include "vm_case_to_string.c" + #include "vm_case_split.c" + #include "vm_case_join.c" + #include "vm_case_substr.c" + #include "vm_case_find.c" + #include "vm_case_contains.c" + #include "vm_case_index_of.c" + #include "vm_case_clear.c" + #include "vm_case_enumerate.c" + #include "vm_case_zip.c" + #include "vm_case_min.c" + #include "vm_case_max.c" + #include "vm_case_clamp.c" + #include "vm_case_abs.c" + #include "vm_case_pow.c" + #include "vm_case_random_seed.c" + #include "vm_case_random_int.c" + #include "vm_case_make_map.c" + #include "vm_case_keys.c" + #include "vm_case_values.c" + #include "vm_case_has_key.c" + #include "vm_case_read_file.c" + #include "vm_case_write_file.c" + #include "vm_case_load_global.c" + #include "vm_case_store_global.c" + #include "vm_case_mod.c" + #include "vm_case_and.c" + #include "vm_case_or.c" + #include "vm_case_not.c" default: if (!opcode_is_valid(inst.op)) { fprintf(stderr, "Runtime error: unknown opcode %d (%s) at instruction %d\n", diff --git a/src/vm_case_abs.inc b/src/vm_case_abs.c similarity index 100% rename from src/vm_case_abs.inc rename to src/vm_case_abs.c diff --git a/src/vm_case_add.inc b/src/vm_case_add.c similarity index 100% rename from src/vm_case_add.inc rename to src/vm_case_add.c diff --git a/src/vm_case_and.inc b/src/vm_case_and.c similarity index 100% rename from src/vm_case_and.inc rename to src/vm_case_and.c diff --git a/src/vm_case_arr_insert.inc b/src/vm_case_arr_insert.c similarity index 100% rename from src/vm_case_arr_insert.inc rename to src/vm_case_arr_insert.c diff --git a/src/vm_case_arr_pop.inc b/src/vm_case_arr_pop.c similarity index 100% rename from src/vm_case_arr_pop.inc rename to src/vm_case_arr_pop.c diff --git a/src/vm_case_arr_push.inc b/src/vm_case_arr_push.c similarity index 100% rename from src/vm_case_arr_push.inc rename to src/vm_case_arr_push.c diff --git a/src/vm_case_arr_remove.inc b/src/vm_case_arr_remove.c similarity index 100% rename from src/vm_case_arr_remove.inc rename to src/vm_case_arr_remove.c diff --git a/src/vm_case_arr_set.inc b/src/vm_case_arr_set.c similarity index 100% rename from src/vm_case_arr_set.inc rename to src/vm_case_arr_set.c diff --git a/src/vm_case_call.inc b/src/vm_case_call.c similarity index 100% rename from src/vm_case_call.inc rename to src/vm_case_call.c diff --git a/src/vm_case_clamp.inc b/src/vm_case_clamp.c similarity index 100% rename from src/vm_case_clamp.inc rename to src/vm_case_clamp.c diff --git a/src/vm_case_clear.inc b/src/vm_case_clear.c similarity index 100% rename from src/vm_case_clear.inc rename to src/vm_case_clear.c diff --git a/src/vm_case_contains.inc b/src/vm_case_contains.c similarity index 100% rename from src/vm_case_contains.inc rename to src/vm_case_contains.c diff --git a/src/vm_case_div.inc b/src/vm_case_div.c similarity index 100% rename from src/vm_case_div.inc rename to src/vm_case_div.c diff --git a/src/vm_case_dup.inc b/src/vm_case_dup.c similarity index 100% rename from src/vm_case_dup.inc rename to src/vm_case_dup.c diff --git a/src/vm_case_enumerate.inc b/src/vm_case_enumerate.c similarity index 100% rename from src/vm_case_enumerate.inc rename to src/vm_case_enumerate.c diff --git a/src/vm_case_eq.inc b/src/vm_case_eq.c similarity index 100% rename from src/vm_case_eq.inc rename to src/vm_case_eq.c diff --git a/src/vm_case_find.inc b/src/vm_case_find.c similarity index 100% rename from src/vm_case_find.inc rename to src/vm_case_find.c diff --git a/src/vm_case_gt.inc b/src/vm_case_gt.c similarity index 100% rename from src/vm_case_gt.inc rename to src/vm_case_gt.c diff --git a/src/vm_case_gte.inc b/src/vm_case_gte.c similarity index 100% rename from src/vm_case_gte.inc rename to src/vm_case_gte.c diff --git a/src/vm_case_halt.inc b/src/vm_case_halt.c similarity index 100% rename from src/vm_case_halt.inc rename to src/vm_case_halt.c diff --git a/src/vm_case_has_key.inc b/src/vm_case_has_key.c similarity index 100% rename from src/vm_case_has_key.inc rename to src/vm_case_has_key.c diff --git a/src/vm_case_index_get.inc b/src/vm_case_index_get.c similarity index 100% rename from src/vm_case_index_get.inc rename to src/vm_case_index_get.c diff --git a/src/vm_case_index_of.inc b/src/vm_case_index_of.c similarity index 100% rename from src/vm_case_index_of.inc rename to src/vm_case_index_of.c diff --git a/src/vm_case_index_set.inc b/src/vm_case_index_set.c similarity index 100% rename from src/vm_case_index_set.inc rename to src/vm_case_index_set.c diff --git a/src/vm_case_join.inc b/src/vm_case_join.c similarity index 100% rename from src/vm_case_join.inc rename to src/vm_case_join.c diff --git a/src/vm_case_jump.inc b/src/vm_case_jump.c similarity index 100% rename from src/vm_case_jump.inc rename to src/vm_case_jump.c diff --git a/src/vm_case_jump_if_false.inc b/src/vm_case_jump_if_false.c similarity index 100% rename from src/vm_case_jump_if_false.inc rename to src/vm_case_jump_if_false.c diff --git a/src/vm_case_keys.inc b/src/vm_case_keys.c similarity index 100% rename from src/vm_case_keys.inc rename to src/vm_case_keys.c diff --git a/src/vm_case_len.inc b/src/vm_case_len.c similarity index 100% rename from src/vm_case_len.inc rename to src/vm_case_len.c diff --git a/src/vm_case_load_const.inc b/src/vm_case_load_const.c similarity index 100% rename from src/vm_case_load_const.inc rename to src/vm_case_load_const.c diff --git a/src/vm_case_load_global.inc b/src/vm_case_load_global.c similarity index 100% rename from src/vm_case_load_global.inc rename to src/vm_case_load_global.c diff --git a/src/vm_case_load_local.inc b/src/vm_case_load_local.c similarity index 100% rename from src/vm_case_load_local.inc rename to src/vm_case_load_local.c diff --git a/src/vm_case_lt.inc b/src/vm_case_lt.c similarity index 100% rename from src/vm_case_lt.inc rename to src/vm_case_lt.c diff --git a/src/vm_case_lte.inc b/src/vm_case_lte.c similarity index 100% rename from src/vm_case_lte.inc rename to src/vm_case_lte.c diff --git a/src/vm_case_make_array.inc b/src/vm_case_make_array.c similarity index 100% rename from src/vm_case_make_array.inc rename to src/vm_case_make_array.c diff --git a/src/vm_case_make_map.inc b/src/vm_case_make_map.c similarity index 100% rename from src/vm_case_make_map.inc rename to src/vm_case_make_map.c diff --git a/src/vm_case_max.inc b/src/vm_case_max.c similarity index 100% rename from src/vm_case_max.inc rename to src/vm_case_max.c diff --git a/src/vm_case_min.inc b/src/vm_case_min.c similarity index 100% rename from src/vm_case_min.inc rename to src/vm_case_min.c diff --git a/src/vm_case_mod.inc b/src/vm_case_mod.c similarity index 100% rename from src/vm_case_mod.inc rename to src/vm_case_mod.c diff --git a/src/vm_case_mul.inc b/src/vm_case_mul.c similarity index 100% rename from src/vm_case_mul.inc rename to src/vm_case_mul.c diff --git a/src/vm_case_neq.inc b/src/vm_case_neq.c similarity index 100% rename from src/vm_case_neq.inc rename to src/vm_case_neq.c diff --git a/src/vm_case_nop.inc b/src/vm_case_nop.c similarity index 100% rename from src/vm_case_nop.inc rename to src/vm_case_nop.c diff --git a/src/vm_case_not.inc b/src/vm_case_not.c similarity index 100% rename from src/vm_case_not.inc rename to src/vm_case_not.c diff --git a/src/vm_case_or.inc b/src/vm_case_or.c similarity index 100% rename from src/vm_case_or.inc rename to src/vm_case_or.c diff --git a/src/vm_case_pop.inc b/src/vm_case_pop.c similarity index 100% rename from src/vm_case_pop.inc rename to src/vm_case_pop.c diff --git a/src/vm_case_pow.inc b/src/vm_case_pow.c similarity index 100% rename from src/vm_case_pow.inc rename to src/vm_case_pow.c diff --git a/src/vm_case_print.inc b/src/vm_case_print.c similarity index 100% rename from src/vm_case_print.inc rename to src/vm_case_print.c diff --git a/src/vm_case_random_int.inc b/src/vm_case_random_int.c similarity index 100% rename from src/vm_case_random_int.inc rename to src/vm_case_random_int.c diff --git a/src/vm_case_random_seed.inc b/src/vm_case_random_seed.c similarity index 100% rename from src/vm_case_random_seed.inc rename to src/vm_case_random_seed.c diff --git a/src/vm_case_read_file.inc b/src/vm_case_read_file.c similarity index 100% rename from src/vm_case_read_file.inc rename to src/vm_case_read_file.c diff --git a/src/vm_case_return.inc b/src/vm_case_return.c similarity index 100% rename from src/vm_case_return.inc rename to src/vm_case_return.c diff --git a/src/vm_case_slice.inc b/src/vm_case_slice.c similarity index 100% rename from src/vm_case_slice.inc rename to src/vm_case_slice.c diff --git a/src/vm_case_split.inc b/src/vm_case_split.c similarity index 100% rename from src/vm_case_split.inc rename to src/vm_case_split.c diff --git a/src/vm_case_store_global.inc b/src/vm_case_store_global.c similarity index 100% rename from src/vm_case_store_global.inc rename to src/vm_case_store_global.c diff --git a/src/vm_case_store_local.inc b/src/vm_case_store_local.c similarity index 100% rename from src/vm_case_store_local.inc rename to src/vm_case_store_local.c diff --git a/src/vm_case_sub.inc b/src/vm_case_sub.c similarity index 100% rename from src/vm_case_sub.inc rename to src/vm_case_sub.c diff --git a/src/vm_case_substr.inc b/src/vm_case_substr.c similarity index 100% rename from src/vm_case_substr.inc rename to src/vm_case_substr.c diff --git a/src/vm_case_swap.inc b/src/vm_case_swap.c similarity index 100% rename from src/vm_case_swap.inc rename to src/vm_case_swap.c diff --git a/src/vm_case_to_number.inc b/src/vm_case_to_number.c similarity index 100% rename from src/vm_case_to_number.inc rename to src/vm_case_to_number.c diff --git a/src/vm_case_to_string.inc b/src/vm_case_to_string.c similarity index 100% rename from src/vm_case_to_string.inc rename to src/vm_case_to_string.c diff --git a/src/vm_case_values.inc b/src/vm_case_values.c similarity index 100% rename from src/vm_case_values.inc rename to src/vm_case_values.c diff --git a/src/vm_case_write_file.inc b/src/vm_case_write_file.c similarity index 100% rename from src/vm_case_write_file.inc rename to src/vm_case_write_file.c diff --git a/src/vm_case_zip.inc b/src/vm_case_zip.c similarity index 100% rename from src/vm_case_zip.inc rename to src/vm_case_zip.c