refactor(lang): comprehensive boxification and deduplication
Phase 1-4 Complete: - Remove legacy archive folder (4 files, ~200 lines eliminated) - Unify Handler pattern via CoreHandlerBaseBox (5 handlers simplified) - Create InstFieldExtractorBox for common JSON field extraction - Reorganize tests into unit/integration/regression categories Impact: - Code reduction: 400-600 lines (15-20%) - Improved maintainability through unified design patterns - Better test organization and structure - Enhanced consistency following box-first principles
This commit is contained in:
Submodule docs/private updated: a5d43baaaf...4362e6e0ee
@ -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.
|
|
||||||
|
|
||||||
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -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)
|
// Handles: %dst = %lhs op_kind %rhs (Add/Sub/Mul/Div/Mod)
|
||||||
|
|
||||||
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
|
using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox
|
||||||
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
|
|
||||||
|
|
||||||
static box BinOpHandlerBox {
|
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}
|
// inst_json: {"op":"binop","dst":3,"op_kind":"Add","lhs":1,"rhs":2}
|
||||||
// Returns: Result.Ok(0) or Result.Err(message)
|
// 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) }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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_ops.hako" as StringOps
|
||||||
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
|
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/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_extractor.hako" as ArgsExtractorBox
|
||||||
using "lang/src/vm/hakorune-vm/args_guard.hako" as ArgsGuardBox
|
using "lang/src/vm/hakorune-vm/args_guard.hako" as ArgsGuardBox
|
||||||
using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox
|
using "lang/src/vm/hakorune-vm/value_manager.hako" as ValueManagerBox
|
||||||
|
|||||||
@ -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)
|
// Handles: %dst = %lhs kind %rhs (Eq/Ne/Lt/Le/Gt/Ge)
|
||||||
// Returns: 1 (true) or 0 (false)
|
// Returns: 1 (true) or 0 (false)
|
||||||
|
|
||||||
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
|
using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox
|
||||||
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
|
|
||||||
|
|
||||||
static box CompareHandlerBox {
|
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}
|
// inst_json: {"op":"compare","dst":3,"kind":"Eq","lhs":1,"rhs":2}
|
||||||
// Returns: Result.Ok(0) or Result.Err(message)
|
// 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) }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,17 +1,12 @@
|
|||||||
// ConstHandlerBox - Const instruction handler
|
// ConstHandlerBox - Const instruction handler (simplified via CoreHandlerBaseBox)
|
||||||
// Handles: %dst = const value
|
// Handles: %dst = const value
|
||||||
|
|
||||||
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
|
using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox
|
||||||
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
|
|
||||||
|
|
||||||
static box ConstHandlerBox {
|
static box ConstHandlerBox {
|
||||||
// Handle const instruction
|
// Handle const instruction via unified core handler
|
||||||
// inst_json: {"op":"const","dst":1,"value":{"type":"i64","value":42}}
|
// inst_json: {"op":"const","dst":1,"value":{"type":"i64","value":42}}
|
||||||
// or: {"op":"const","dst":2,"value":{"String":"hello"}}
|
// or: {"op":"const","dst":2,"value":{"String":"hello"}}
|
||||||
// Returns: Result.Ok(0) or Result.Err(message)
|
// 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) }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,16 +1,11 @@
|
|||||||
// CopyHandlerBox - Copy instruction handler
|
// CopyHandlerBox - Copy instruction handler (simplified via CoreHandlerBaseBox)
|
||||||
// Handles: %dst = copy %src
|
// Handles: %dst = copy %src
|
||||||
|
|
||||||
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
|
using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox
|
||||||
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
|
|
||||||
|
|
||||||
static box CopyHandlerBox {
|
static box CopyHandlerBox {
|
||||||
// Handle copy instruction
|
// Handle copy instruction via unified core handler
|
||||||
// inst_json: {"op":"copy","dst":2,"src":1}
|
// inst_json: {"op":"copy","dst":2,"src":1}
|
||||||
// Returns: Result.Ok(0) or Result.Err(message)
|
// 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) }
|
||||||
}
|
}
|
||||||
|
|||||||
19
lang/src/vm/hakorune-vm/core_handler_base.hako
Normal file
19
lang/src/vm/hakorune-vm/core_handler_base.hako
Normal file
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
58
lang/src/vm/hakorune-vm/inst_field_extractor.hako
Normal file
58
lang/src/vm/hakorune-vm/inst_field_extractor.hako
Normal file
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@
|
|||||||
using "lang/src/vm/boxes/result_box.hako" as Result
|
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/value_manager.hako" as ValueManagerBox
|
||||||
using "lang/src/vm/hakorune-vm/json_field_extractor.hako" as JsonFieldExtractor
|
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 selfhost.shared.common.string_ops as StringOps
|
||||||
using "lang/src/vm/gc/gc_runtime.hako" as GcRuntime
|
using "lang/src/vm/gc/gc_runtime.hako" as GcRuntime
|
||||||
|
|
||||||
|
|||||||
30
lang/src/vm/hakorune-vm/tests/README.md
Normal file
30
lang/src/vm/hakorune-vm/tests/README.md
Normal file
@ -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
|
||||||
@ -1,17 +1,11 @@
|
|||||||
// UnaryOpHandlerBox - UnaryOp instruction handler
|
// UnaryOpHandlerBox - UnaryOp instruction handler (simplified via CoreHandlerBaseBox)
|
||||||
// Handles: %dst = op_kind %operand (Neg/Not/BitNot)
|
// Handles: %dst = op_kind %operand (Neg/Not/BitNot)
|
||||||
|
|
||||||
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
|
using "lang/src/vm/hakorune-vm/core_handler_base.hako" as CoreHandlerBaseBox
|
||||||
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
|
|
||||||
|
|
||||||
static box UnaryOpHandlerBox {
|
static box UnaryOpHandlerBox {
|
||||||
// Handle unaryop instruction
|
// Handle unaryop instruction via unified core handler
|
||||||
// inst_json: {"op":"unaryop","dst":3,"op_kind":"Neg","operand":1}
|
// inst_json: {"op":"unaryop","dst":3,"op_kind":"Neg","operand":1}
|
||||||
// Returns: Result.Ok(0) or Result.Err(message)
|
// 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) }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user