diff --git a/docs/private b/docs/private index a5d43baa..4362e6e0 160000 --- a/docs/private +++ b/docs/private @@ -1 +1 @@ -Subproject commit a5d43baaaf5f7b40c240c29a44756689b5dc7c2f +Subproject commit 4362e6e0ee204b560a20ddf12034d1a5629d75e4 diff --git a/lang/src/vm/hakorune-vm/archive/README.md b/lang/src/vm/hakorune-vm/archive/README.md deleted file mode 100644 index 73de69d0..00000000 --- a/lang/src/vm/hakorune-vm/archive/README.md +++ /dev/null @@ -1,7 +0,0 @@ -This directory stores legacy implementations preserved during the Core re-export migration. - -Policy -- Read-only snapshots of pre-migration handlers; kept for reference and potential rollback. -- Do not import from production code. New code should call Core via core_bridge_ops.hako. -- Remove after Core parity stabilizes and negative smokes are green across profiles. - diff --git a/lang/src/vm/hakorune-vm/archive/binop_handler.legacy.hako b/lang/src/vm/hakorune-vm/archive/binop_handler.legacy.hako deleted file mode 100644 index 7c247eac..00000000 --- a/lang/src/vm/hakorune-vm/archive/binop_handler.legacy.hako +++ /dev/null @@ -1,48 +0,0 @@ -// Snapshot of legacy binop_handler.hako (pre Core delegation) -// DO NOT import from production. See archive/README.md. - -using "lang/src/shared/common/string_helpers.hako" as StringHelpers -using "lang/src/shared/common/string_ops.hako" as StringOps -using "lang/src/vm/boxes/result_box.hako" as Result -using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox -using "lang/src/vm/hakorune-vm/reg_guard.hako" as RegGuardBox -using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor - -static box BinOpHandlerBoxLegacy { - handle(inst_json, regs) { - local dst = JsonFieldExtractor.extract_int(inst_json, "dst") - if dst == null { return Result.Err("binop: dst field not found") } - local lhs_id = JsonFieldExtractor.extract_int(inst_json, "lhs") - if lhs_id == null { return Result.Err("binop: lhs field not found") } - local rhs_id = JsonFieldExtractor.extract_int(inst_json, "rhs") - if rhs_id == null { return Result.Err("binop: rhs field not found") } - local kind = JsonFieldExtractor.extract_string(inst_json, "operation") - if kind != null { - if kind == "+" { kind = "Add" } - else if kind == "-" { kind = "Sub" } - else if kind == "*" { kind = "Mul" } - else if kind == "/" { kind = "Div" } - else if kind == "%" { kind = "Mod" } - else { return Result.Err("binop: unsupported operation: " + kind) } - } else { - kind = JsonFieldExtractor.extract_string(inst_json, "op_kind") - if kind == null { return Result.Err("binop: operation/op_kind not found") } - } - local g_lhs = RegGuardBox.require_set(regs, lhs_id, "binop: lhs") - if g_lhs.is_Err() { return g_lhs } - local lhs_val = g_lhs.as_Ok() - local g_rhs = RegGuardBox.require_set(regs, rhs_id, "binop: rhs") - if g_rhs.is_Err() { return g_rhs } - local rhs_val = g_rhs.as_Ok() - local result_val = 0 - if kind == "Add" { result_val = lhs_val + rhs_val } - else if kind == "Sub" { result_val = lhs_val - rhs_val } - else if kind == "Mul" { result_val = lhs_val * rhs_val } - else if kind == "Div" { if rhs_val == 0 { return Result.Err("binop: division by zero") } result_val = lhs_val / rhs_val } - else if kind == "Mod" { if rhs_val == 0 { return Result.Err("binop: modulo by zero") } result_val = lhs_val % rhs_val } - else { return Result.Err("binop: unsupported op_kind: " + kind) } - ValueManagerBox.set(regs, dst, result_val) - return Result.Ok(0) - } -} - diff --git a/lang/src/vm/hakorune-vm/archive/compare_handler.legacy.hako b/lang/src/vm/hakorune-vm/archive/compare_handler.legacy.hako deleted file mode 100644 index 25c8c49e..00000000 --- a/lang/src/vm/hakorune-vm/archive/compare_handler.legacy.hako +++ /dev/null @@ -1,36 +0,0 @@ -// Snapshot of legacy compare_handler.hako (pre Core delegation) -// DO NOT import from production. See archive/README.md. - -using "lang/src/shared/common/string_helpers.hako" as StringHelpers -using "lang/src/vm/boxes/result_box.hako" as Result -using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox -using "lang/src/vm/hakorune-vm/reg_guard.hako" as RegGuardBox -using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor - -static box CompareHandlerBoxLegacy { - handle(inst_json, regs) { - local dst = JsonFieldExtractor.extract_int(inst_json, "dst") - if dst == null { return Result.Err("compare: dst field not found") } - local lhs_id = JsonFieldExtractor.extract_int(inst_json, "lhs") - if lhs_id == null { return Result.Err("compare: lhs field not found") } - local rhs_id = JsonFieldExtractor.extract_int(inst_json, "rhs") - if rhs_id == null { return Result.Err("compare: rhs field not found") } - local kind = JsonFieldExtractor.extract_string(inst_json, "kind") - if kind == null { return Result.Err("compare: kind field not found") } - local lhs_val = ValueManagerBox.get(regs, lhs_id) - if lhs_val == null { return Result.Err("compare: lhs v%" + StringHelpers.int_to_str(lhs_id) + " is unset") } - local rhs_val = ValueManagerBox.get(regs, rhs_id) - if rhs_val == null { return Result.Err("compare: rhs v%" + StringHelpers.int_to_str(rhs_id) + " is unset") } - local result_val = 0 - if kind == "Eq" { if lhs_val == rhs_val { result_val = 1 } } - else if kind == "Ne" { if lhs_val != rhs_val { result_val = 1 } } - else if kind == "Lt" { if lhs_val < rhs_val { result_val = 1 } } - else if kind == "Le" { if lhs_val <= rhs_val { result_val = 1 } } - else if kind == "Gt" { if lhs_val > rhs_val { result_val = 1 } } - else if kind == "Ge" { if lhs_val >= rhs_val { result_val = 1 } } - else { return Result.Err("compare: unsupported kind: " + kind) } - ValueManagerBox.set(regs, dst, result_val) - return Result.Ok(0) - } -} - diff --git a/lang/src/vm/hakorune-vm/archive/const_handler.legacy.hako b/lang/src/vm/hakorune-vm/archive/const_handler.legacy.hako deleted file mode 100644 index 32c29784..00000000 --- a/lang/src/vm/hakorune-vm/archive/const_handler.legacy.hako +++ /dev/null @@ -1,59 +0,0 @@ -// Snapshot of legacy const_handler.hako (pre Core delegation) -// DO NOT import from production. See archive/README.md. - -using "lang/src/shared/common/string_helpers.hako" as StringHelpers -using "lang/src/shared/common/string_ops.hako" as StringOps -using "lang/src/vm/boxes/result_box.hako" as Result -using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox -using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor - -static box ConstHandlerBoxLegacy { - handle(inst_json, regs) { - local dst = JsonFieldExtractor.extract_int(inst_json, "dst") - if dst == null { return Result.Err("const: dst field not found") } - local key_i64 = "\"value\":{\"type\":\"i64\",\"value\":" - local val_i64_start = inst_json.indexOf(key_i64) - if val_i64_start >= 0 { - val_i64_start = val_i64_start + key_i64.length() - local digits = StringHelpers.read_digits(inst_json, val_i64_start) - if digits == "" { return Result.Err("const: invalid i64 value") } - local value = StringHelpers.to_i64(digits) - ValueManagerBox.set(regs, dst, value) - return Result.Ok(0) - } - local key_int = "\"value\":{\"Integer\":" - local val_int_start = inst_json.indexOf(key_int) - if val_int_start >= 0 { - val_int_start = val_int_start + key_int.length() - local digits = StringHelpers.read_digits(inst_json, val_int_start) - if digits == "" { return Result.Err("const: invalid Integer value") } - local value = StringHelpers.to_i64(digits) - ValueManagerBox.set(regs, dst, value) - return Result.Ok(0) - } - local key_str = "\"value\":{\"String\":\"" - local val_str_start = inst_json.indexOf(key_str) - if val_str_start >= 0 { - val_str_start = val_str_start + key_str.length() - local val_str_end = StringOps.index_of_from(inst_json, "\"}", val_str_start) - if val_str_end < 0 { return Result.Err("const: invalid String value") } - local str_value = inst_json.substring(val_str_start, val_str_end) - ValueManagerBox.set(regs, dst, str_value) - return Result.Ok(0) - } - { - local key_s2 = "\"value\":{\"type\":\"string\",\"value\":\"" - local p2 = inst_json.indexOf(key_s2) - if p2 >= 0 { - p2 = p2 + key_s2.length() - local end2 = StringOps.index_of_from(inst_json, "\"}", p2) - if end2 < 0 { return Result.Err("const: invalid string (type string)") } - local s2 = inst_json.substring(p2, end2) - ValueManagerBox.set(regs, dst, s2) - return Result.Ok(0) - } - } - return Result.Err("const: unsupported value type") - } -} - diff --git a/lang/src/vm/hakorune-vm/binop_handler.hako b/lang/src/vm/hakorune-vm/binop_handler.hako index f342186b..56205217 100644 --- a/lang/src/vm/hakorune-vm/binop_handler.hako +++ b/lang/src/vm/hakorune-vm/binop_handler.hako @@ -1,17 +1,11 @@ -// BinOpHandlerBox - BinOp instruction handler +// BinOpHandlerBox - BinOp instruction handler (simplified via CoreHandlerBaseBox) // Handles: %dst = %lhs op_kind %rhs (Add/Sub/Mul/Div/Mod) -using "lang/src/shared/common/string_helpers.hako" as StringHelpers -using selfhost.shared.common.string_ops as StringOps -using "lang/src/vm/boxes/result_box.hako" as Result -using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox -using "lang/src/vm/hakorune-vm/reg_guard.hako" as RegGuardBox -using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor -using "lang/src/vm/hakorune-vm/core_bridge_ops.hako" as CoreBridgeOps +using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox static box BinOpHandlerBox { - // Handle binop instruction + // Handle binop instruction via unified core handler // inst_json: {"op":"binop","dst":3,"op_kind":"Add","lhs":1,"rhs":2} // Returns: Result.Ok(0) or Result.Err(message) - handle(inst_json, regs) { return CoreBridgeOps.apply_binop(inst_json, regs) } + handle(inst_json, regs) { return CoreHandlerBaseBox.handle_core_op("binop", inst_json, regs) } } diff --git a/lang/src/vm/hakorune-vm/boxcall_handler.hako b/lang/src/vm/hakorune-vm/boxcall_handler.hako index 153758fe..d1f436bd 100644 --- a/lang/src/vm/hakorune-vm/boxcall_handler.hako +++ b/lang/src/vm/hakorune-vm/boxcall_handler.hako @@ -5,6 +5,7 @@ using "lang/src/vm/boxes/result_box.hako" as Result using "lang/src/shared/common/string_ops.hako" as StringOps using "lang/src/shared/common/string_helpers.hako" as StringHelpers using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor +using "lang/src/vm/hakorune-vm/inst_field_extractor.hako" as InstFieldExtractor using "lang/src/vm/hakorune-vm/args_extractor.hako" as ArgsExtractorBox using "lang/src/vm/hakorune-vm/args_guard.hako" as ArgsGuardBox using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox diff --git a/lang/src/vm/hakorune-vm/compare_handler.hako b/lang/src/vm/hakorune-vm/compare_handler.hako index 326e196a..87ead045 100644 --- a/lang/src/vm/hakorune-vm/compare_handler.hako +++ b/lang/src/vm/hakorune-vm/compare_handler.hako @@ -1,17 +1,12 @@ -// CompareHandlerBox - Compare instruction handler +// CompareHandlerBox - Compare instruction handler (simplified via CoreHandlerBaseBox) // Handles: %dst = %lhs kind %rhs (Eq/Ne/Lt/Le/Gt/Ge) // Returns: 1 (true) or 0 (false) -using "lang/src/shared/common/string_helpers.hako" as StringHelpers -using "lang/src/vm/boxes/result_box.hako" as Result -using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox -using "lang/src/vm/hakorune-vm/reg_guard.hako" as RegGuardBox -using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor -using "lang/src/vm/hakorune-vm/core_bridge_ops.hako" as CoreBridgeOps +using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox static box CompareHandlerBox { - // Handle compare instruction + // Handle compare instruction via unified core handler // inst_json: {"op":"compare","dst":3,"kind":"Eq","lhs":1,"rhs":2} // Returns: Result.Ok(0) or Result.Err(message) - handle(inst_json, regs) { return CoreBridgeOps.apply_compare(inst_json, regs) } + handle(inst_json, regs) { return CoreHandlerBaseBox.handle_core_op("compare", inst_json, regs) } } diff --git a/lang/src/vm/hakorune-vm/const_handler.hako b/lang/src/vm/hakorune-vm/const_handler.hako index c56d7531..5e02243e 100644 --- a/lang/src/vm/hakorune-vm/const_handler.hako +++ b/lang/src/vm/hakorune-vm/const_handler.hako @@ -1,17 +1,12 @@ -// ConstHandlerBox - Const instruction handler +// ConstHandlerBox - Const instruction handler (simplified via CoreHandlerBaseBox) // Handles: %dst = const value -using "lang/src/shared/common/string_helpers.hako" as StringHelpers -using selfhost.shared.common.string_ops as StringOps -using "lang/src/vm/boxes/result_box.hako" as Result -using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox -using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor -using "lang/src/vm/hakorune-vm/core_bridge_ops.hako" as CoreBridgeOps +using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox static box ConstHandlerBox { - // Handle const instruction + // Handle const instruction via unified core handler // inst_json: {"op":"const","dst":1,"value":{"type":"i64","value":42}} // or: {"op":"const","dst":2,"value":{"String":"hello"}} // Returns: Result.Ok(0) or Result.Err(message) - handle(inst_json, regs) { return CoreBridgeOps.apply_const(inst_json, regs) } + handle(inst_json, regs) { return CoreHandlerBaseBox.handle_core_op("const", inst_json, regs) } } diff --git a/lang/src/vm/hakorune-vm/copy_handler.hako b/lang/src/vm/hakorune-vm/copy_handler.hako index cd4f225e..7c620e71 100644 --- a/lang/src/vm/hakorune-vm/copy_handler.hako +++ b/lang/src/vm/hakorune-vm/copy_handler.hako @@ -1,16 +1,11 @@ -// CopyHandlerBox - Copy instruction handler +// CopyHandlerBox - Copy instruction handler (simplified via CoreHandlerBaseBox) // Handles: %dst = copy %src -using "lang/src/shared/common/string_helpers.hako" as StringHelpers -using "lang/src/vm/boxes/result_box.hako" as Result -using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox -using "lang/src/vm/hakorune-vm/reg_guard.hako" as RegGuardBox -using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor -using "lang/src/vm/hakorune-vm/core_bridge_ops.hako" as CoreBridgeOps +using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox static box CopyHandlerBox { - // Handle copy instruction + // Handle copy instruction via unified core handler // inst_json: {"op":"copy","dst":2,"src":1} // Returns: Result.Ok(0) or Result.Err(message) - handle(inst_json, regs) { return CoreBridgeOps.apply_copy(inst_json, regs) } + handle(inst_json, regs) { return CoreHandlerBaseBox.handle_core_op("copy", inst_json, regs) } } diff --git a/lang/src/vm/hakorune-vm/core_handler_base.hako b/lang/src/vm/hakorune-vm/core_handler_base.hako new file mode 100644 index 00000000..b7f0cdf8 --- /dev/null +++ b/lang/src/vm/hakorune-vm/core_handler_base.hako @@ -0,0 +1,19 @@ +// CoreHandlerBaseBox - Unified core operation handler base +// Eliminates thin wrapper pattern for all core-delegated handlers + +using "lang/src/vm/boxes/result_box.hako" as Result +using "lang/src/vm/hakorune-vm/core_bridge_ops.hako" as CoreBridgeOps + +static box CoreHandlerBaseBox { + // Unified handler for all core-delegated operations + // Maps operation types to CoreBridgeOps methods + static handle_core_op(op_type, inst_json, regs) { + if op_type == "const" { return CoreBridgeOps.apply_const(inst_json, regs) } + if op_type == "binop" { return CoreBridgeOps.apply_binop(inst_json, regs) } + if op_type == "compare" { return CoreBridgeOps.apply_compare(inst_json, regs) } + if op_type == "unary" { return CoreBridgeOps.apply_unary(inst_json, regs) } + if op_type == "copy" { return CoreBridgeOps.apply_copy(inst_json, regs) } + if op_type == "phi" { return CoreBridgeOps.apply_phi(inst_json, regs, 0) } // placeholder predecessor + return Result.Err("unknown core op type: " + op_type) + } +} diff --git a/lang/src/vm/hakorune-vm/inst_field_extractor.hako b/lang/src/vm/hakorune-vm/inst_field_extractor.hako new file mode 100644 index 00000000..8d5444f5 --- /dev/null +++ b/lang/src/vm/hakorune-vm/inst_field_extractor.hako @@ -0,0 +1,58 @@ +// InstFieldExtractorBox - Common instruction field extraction utilities +// Eliminates repetitive JsonFieldExtractor.extract_ calls across handlers + +using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor +using "lang/src/vm/boxes/result_box.hako" as Result + +static box InstFieldExtractorBox { + // Extract dst register (most common pattern) + static extract_dst(inst_json) { + return JsonFieldExtractor.extract_int(inst_json, "dst") + } + + // Extract binary operation fields (lhs, rhs, operation) + static extract_binary_ops(inst_json) { + local result = {} + result.lhs = JsonFieldExtractor.extract_int(inst_json, "lhs") + result.rhs = JsonFieldExtractor.extract_int(inst_json, "rhs") + result.operation = JsonFieldExtractor.extract_string(inst_json, "operation") + // Handle alternative op_kind field + if result.operation == null { + result.operation = JsonFieldExtractor.extract_string(inst_json, "op_kind") + } + return result + } + + // Extract comparison fields (lhs, rhs, kind) + static extract_compare_ops(inst_json) { + local result = {} + result.lhs = JsonFieldExtractor.extract_int(inst_json, "lhs") + result.rhs = JsonFieldExtractor.extract_int(inst_json, "rhs") + result.kind = JsonFieldExtractor.extract_string(inst_json, "kind") + return result + } + + // Extract unary operation fields (operand, op_kind) + static extract_unary_ops(inst_json) { + local result = {} + result.operand = JsonFieldExtractor.extract_int(inst_json, "operand") + result.op_kind = JsonFieldExtractor.extract_string(inst_json, "op_kind") + return result + } + + // Extract copy operation fields (src) + static extract_copy_ops(inst_json) { + local result = {} + result.src = JsonFieldExtractor.extract_int(inst_json, "src") + return result + } + + // Extract box call fields (box, method, args_count) + static extract_boxcall_ops(inst_json) { + local result = {} + result.box_id = JsonFieldExtractor.extract_int(inst_json, "box") + result.method_name = JsonFieldExtractor.extract_string(inst_json, "method") + result.args_count = JsonFieldExtractor.extract_int(inst_json, "args_count") + return result + } +} diff --git a/lang/src/vm/hakorune-vm/newbox_handler.hako b/lang/src/vm/hakorune-vm/newbox_handler.hako index cf204160..121f0202 100644 --- a/lang/src/vm/hakorune-vm/newbox_handler.hako +++ b/lang/src/vm/hakorune-vm/newbox_handler.hako @@ -4,6 +4,7 @@ using "lang/src/vm/boxes/result_box.hako" as Result using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor +using "lang/src/vm/hakorune-vm/inst_field_extractor.hako" as InstFieldExtractor using selfhost.shared.common.string_ops as StringOps using "lang/src/vm/gc/gc_runtime.hako" as GcRuntime diff --git a/lang/src/vm/hakorune-vm/tests/README.md b/lang/src/vm/hakorune-vm/tests/README.md new file mode 100644 index 00000000..7f79dece --- /dev/null +++ b/lang/src/vm/hakorune-vm/tests/README.md @@ -0,0 +1,30 @@ +# Tests Organization + +This directory contains organized test files for the hakorune-vm. + +## Structure + +### `unit/` +- Unit tests for individual components +- Core operations, handlers, and utilities + +### `integration/` +- Integration tests across multiple components +- End-to-end functionality verification + +### `regression/` +- Regression tests for known bugs +- Prevent reintroduction of fixed issues + +### `performance/` +- Performance benchmarks and validation +- Memory usage, execution time tests + +## Migration Notes + +Previously, all tests were in this directory. They have been organized as: + +- **Unit Tests**: Core operation tests (const, binop, compare, etc.) +- **Integration Tests**: Complex scenarios (mircall phases, boxcall, etc.) +- **Regression Tests**: Bug-specific tests (compare_bug, mapbox_fix, etc.) +- **Performance Tests**: Performance-critical scenarios diff --git a/lang/src/vm/hakorune-vm/tests/test_array_map_isempty_size.hako b/lang/src/vm/hakorune-vm/tests/integration/test_array_map_isempty_size.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_array_map_isempty_size.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_array_map_isempty_size.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_barrier.hako b/lang/src/vm/hakorune-vm/tests/integration/test_barrier.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_barrier.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_barrier.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_boxcall.hako b/lang/src/vm/hakorune-vm/tests/integration/test_boxcall.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_boxcall.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_boxcall.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_mircall_phase1.hako b/lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase1.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_mircall_phase1.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase1.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_mircall_phase2_closure.hako b/lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase2_closure.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_mircall_phase2_closure.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase2_closure.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_mircall_phase2_constructor.hako b/lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase2_constructor.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_mircall_phase2_constructor.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase2_constructor.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_mircall_phase2_method.hako b/lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase2_method.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_mircall_phase2_method.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase2_method.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_mircall_phase2_module.hako b/lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase2_module.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_mircall_phase2_module.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_mircall_phase2_module.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_nop_safepoint.hako b/lang/src/vm/hakorune-vm/tests/integration/test_nop_safepoint.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_nop_safepoint.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_nop_safepoint.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_phase2_day4.hako b/lang/src/vm/hakorune-vm/tests/integration/test_phase2_day4.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_phase2_day4.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_phase2_day4.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_phase2_day5.hako b/lang/src/vm/hakorune-vm/tests/integration/test_phase2_day5.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_phase2_day5.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_phase2_day5.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_typeop.hako b/lang/src/vm/hakorune-vm/tests/integration/test_typeop.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_typeop.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_typeop.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_vm_return_compare.hako b/lang/src/vm/hakorune-vm/tests/integration/test_vm_return_compare.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_vm_return_compare.hako rename to lang/src/vm/hakorune-vm/tests/integration/test_vm_return_compare.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_compare_bug.hako b/lang/src/vm/hakorune-vm/tests/regression/test_compare_bug.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_compare_bug.hako rename to lang/src/vm/hakorune-vm/tests/regression/test_compare_bug.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_mapbox_fix_verification.hako b/lang/src/vm/hakorune-vm/tests/regression/test_mapbox_fix_verification.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_mapbox_fix_verification.hako rename to lang/src/vm/hakorune-vm/tests/regression/test_mapbox_fix_verification.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_mapbox_get_behavior.hako b/lang/src/vm/hakorune-vm/tests/regression/test_mapbox_get_behavior.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_mapbox_get_behavior.hako rename to lang/src/vm/hakorune-vm/tests/regression/test_mapbox_get_behavior.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_mapbox_get_null_gate.hako b/lang/src/vm/hakorune-vm/tests/regression/test_mapbox_get_null_gate.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_mapbox_get_null_gate.hako rename to lang/src/vm/hakorune-vm/tests/regression/test_mapbox_get_null_gate.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_callable.hako b/lang/src/vm/hakorune-vm/tests/unit/test_callable.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_callable.hako rename to lang/src/vm/hakorune-vm/tests/unit/test_callable.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_null_vs_zero.hako b/lang/src/vm/hakorune-vm/tests/unit/test_null_vs_zero.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_null_vs_zero.hako rename to lang/src/vm/hakorune-vm/tests/unit/test_null_vs_zero.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_phase1_day3.hako b/lang/src/vm/hakorune-vm/tests/unit/test_phase1_day3.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_phase1_day3.hako rename to lang/src/vm/hakorune-vm/tests/unit/test_phase1_day3.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_phase1_minimal.hako b/lang/src/vm/hakorune-vm/tests/unit/test_phase1_minimal.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_phase1_minimal.hako rename to lang/src/vm/hakorune-vm/tests/unit/test_phase1_minimal.hako diff --git a/lang/src/vm/hakorune-vm/tests/test_string_size_char_isempty.hako b/lang/src/vm/hakorune-vm/tests/unit/test_string_size_char_isempty.hako similarity index 100% rename from lang/src/vm/hakorune-vm/tests/test_string_size_char_isempty.hako rename to lang/src/vm/hakorune-vm/tests/unit/test_string_size_char_isempty.hako diff --git a/lang/src/vm/hakorune-vm/unaryop_handler.hako b/lang/src/vm/hakorune-vm/unaryop_handler.hako index f5ea9962..246f9fb4 100644 --- a/lang/src/vm/hakorune-vm/unaryop_handler.hako +++ b/lang/src/vm/hakorune-vm/unaryop_handler.hako @@ -1,17 +1,11 @@ -// UnaryOpHandlerBox - UnaryOp instruction handler +// UnaryOpHandlerBox - UnaryOp instruction handler (simplified via CoreHandlerBaseBox) // Handles: %dst = op_kind %operand (Neg/Not/BitNot) -using "lang/src/shared/common/string_helpers.hako" as StringHelpers -using selfhost.shared.common.string_ops as StringOps -using "lang/src/vm/boxes/result_box.hako" as Result -using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox -using "lang/src/vm/hakorune-vm/reg_guard.hako" as RegGuardBox -using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor -using "lang/src/vm/hakorune-vm/core_bridge_ops.hako" as CoreBridgeOps +using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox static box UnaryOpHandlerBox { - // Handle unaryop instruction + // Handle unaryop instruction via unified core handler // inst_json: {"op":"unaryop","dst":3,"op_kind":"Neg","operand":1} // Returns: Result.Ok(0) or Result.Err(message) - handle(inst_json, regs) { return CoreBridgeOps.apply_unary(inst_json, regs) } + handle(inst_json, regs) { return CoreHandlerBaseBox.handle_core_op("unary", inst_json, regs) } }