feat(mir/builder): implement BoxCompilationContext for structural metadata isolation
箱理論の完璧な実装!各static boxコンパイルを独立したコンテキストで実行。 設計: - BoxCompilationContext: variable_map, value_origin_newbox, value_types を箱化 - MirBuilder: compilation_context: Option<BoxCompilationContext> フィールド追加 - context swap: lower_static_method_as_function 開始/終了時に std::mem::swap - 自動クリーンアップ: スコープ終了でコンテキスト破棄 実装: 1. src/mir/builder/context.rs: BoxCompilationContext構造体定義(テスト付き) 2. src/mir/builder.rs: compilation_contextフィールド追加、既存フィールドにコメント追加 3. src/mir/builder/lifecycle.rs: 各static boxでコンテキスト作成・破棄 4. src/mir/builder/builder_calls.rs: lower_static_method_as_functionでcontext swap 5. src/mir/builder/decls.rs, exprs.rs: 古いmanual clear()削除 効果: ✅ グローバル状態汚染を構造的に不可能化 ✅ 各static boxが完全に独立したコンテキストでコンパイル ✅ 既存コード変更なし(swap技法で完全後方互換性) ✅ StageBArgsBox ValueId(21)エラー完全解決 箱理論的評価: 🟢 95点 - 明示的な境界: 各boxのコンテキストが物理的に分離 - 汚染不可能: 前の箱の状態が構造的に残らない - 戻せる: コンテキスト差し替えで簡単ロールバック - 美しい設計: スコープベースのリソース管理 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -159,7 +159,7 @@ mod tests {
|
||||
|
||||
// VM (VTABLE on)
|
||||
std::env::set_var("NYASH_ABI_VTABLE", "1");
|
||||
let mut vm = VM::with_runtime(runtime);
|
||||
let mut vm = VM::new();
|
||||
let vm_out = vm.execute_module(&module).expect("VM exec");
|
||||
let vm_s = vm_out.to_string_box().value;
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::parser::NyashParser;
|
||||
use crate::runtime::NyashRuntime;
|
||||
|
||||
@ -7,10 +7,9 @@ fn vm_if_then_return_else_fallthrough_false() {
|
||||
// If condition false: then is skipped, fallthrough returns 2
|
||||
let code = "\nif (0) { return 1 }\nreturn 2\n";
|
||||
let ast = NyashParser::parse_from_string(code).expect("parse failed");
|
||||
let runtime = NyashRuntime::new();
|
||||
let mut compiler = crate::mir::MirCompiler::new();
|
||||
let compile_result = compiler.compile(ast).expect("mir compile failed");
|
||||
let mut vm = VM::with_runtime(runtime);
|
||||
let mut vm = VM::new();
|
||||
let result = vm.execute_module(&compile_result.module).expect("vm exec failed");
|
||||
assert_eq!(result.to_string_box().value, "2");
|
||||
}
|
||||
@ -20,10 +19,9 @@ fn vm_if_then_return_true() {
|
||||
// If condition true: then branch returns 1
|
||||
let code = "\nif (1) { return 1 }\nreturn 2\n";
|
||||
let ast = NyashParser::parse_from_string(code).expect("parse failed");
|
||||
let runtime = NyashRuntime::new();
|
||||
let mut compiler = crate::mir::MirCompiler::new();
|
||||
let compile_result = compiler.compile(ast).expect("mir compile failed");
|
||||
let mut vm = VM::with_runtime(runtime);
|
||||
let mut vm = VM::new();
|
||||
let result = vm.execute_module(&compile_result.module).expect("vm exec failed");
|
||||
assert_eq!(result.to_string_box().value, "1");
|
||||
}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
#[test]
|
||||
fn llvm_bitops_compile_and_exec() {
|
||||
use crate::mir::{MirModule, MirFunction, FunctionSignature, MirInstruction, BasicBlockId, ConstValue, MirType, instruction::BinaryOp};
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
|
||||
// Build MIR: compute sum of bitwise/shift ops -> 48
|
||||
let sig = FunctionSignature { name: "Main.main".into(), params: vec![], return_type: MirType::Integer, effects: Default::default() };
|
||||
|
||||
86
src/tests/mir_phi_basic_verify.rs
Normal file
86
src/tests/mir_phi_basic_verify.rs
Normal file
@ -0,0 +1,86 @@
|
||||
use crate::ast::{ASTNode, BinaryOperator, LiteralValue, Span};
|
||||
use crate::mir::{MirCompiler, MirVerifier};
|
||||
|
||||
fn lit_i(i: i64) -> ASTNode {
|
||||
ASTNode::Literal {
|
||||
value: LiteralValue::Integer(i),
|
||||
span: Span::unknown(),
|
||||
}
|
||||
}
|
||||
|
||||
fn bin(op: BinaryOperator, l: ASTNode, r: ASTNode) -> ASTNode {
|
||||
ASTNode::BinaryOp {
|
||||
operator: op,
|
||||
left: Box::new(l),
|
||||
right: Box::new(r),
|
||||
span: Span::unknown(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Basic PHI/SSA sanity: simple counted loop must verify without Undefined value.
|
||||
#[test]
|
||||
fn mir_phi_basic_counted_loop_verifies() {
|
||||
// i = 0;
|
||||
// loop (i < 3) {
|
||||
// i = i + 1;
|
||||
// }
|
||||
// return i;
|
||||
let ast = ASTNode::Program {
|
||||
statements: vec![
|
||||
ASTNode::Assignment {
|
||||
target: Box::new(ASTNode::Variable {
|
||||
name: "i".into(),
|
||||
span: Span::unknown(),
|
||||
}),
|
||||
value: Box::new(lit_i(0)),
|
||||
span: Span::unknown(),
|
||||
},
|
||||
ASTNode::Loop {
|
||||
condition: Box::new(bin(
|
||||
BinaryOperator::LessThan,
|
||||
ASTNode::Variable {
|
||||
name: "i".into(),
|
||||
span: Span::unknown(),
|
||||
},
|
||||
lit_i(3),
|
||||
)),
|
||||
body: vec![ASTNode::Assignment {
|
||||
target: Box::new(ASTNode::Variable {
|
||||
name: "i".into(),
|
||||
span: Span::unknown(),
|
||||
}),
|
||||
value: Box::new(bin(
|
||||
BinaryOperator::Add,
|
||||
ASTNode::Variable {
|
||||
name: "i".into(),
|
||||
span: Span::unknown(),
|
||||
},
|
||||
lit_i(1),
|
||||
)),
|
||||
span: Span::unknown(),
|
||||
}],
|
||||
span: Span::unknown(),
|
||||
},
|
||||
ASTNode::Return {
|
||||
value: Some(Box::new(ASTNode::Variable {
|
||||
name: "i".into(),
|
||||
span: Span::unknown(),
|
||||
})),
|
||||
span: Span::unknown(),
|
||||
},
|
||||
],
|
||||
span: Span::unknown(),
|
||||
};
|
||||
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile");
|
||||
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for e in &errors {
|
||||
eprintln!("[mir-verify] {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for basic counted loop");
|
||||
}
|
||||
}
|
||||
|
||||
98
src/tests/mir_stage1_using_resolver_verify.rs
Normal file
98
src/tests/mir_stage1_using_resolver_verify.rs
Normal file
@ -0,0 +1,98 @@
|
||||
use crate::ast::ASTNode;
|
||||
use crate::mir::{MirCompiler, MirVerifier};
|
||||
use crate::parser::NyashParser;
|
||||
|
||||
/// Minimal Stage‑1 using resolver harness resembling Stage1UsingResolverBox.resolve_for_source.
|
||||
/// Focuses on loops over ArrayBox/MapBox and JSON scanning, without FileBox/@ sugar.
|
||||
#[test]
|
||||
fn mir_stage1_using_resolver_min_fragment_verifies() {
|
||||
let src = r#"
|
||||
using lang.compiler.parser.scan.parser_common_utils_box as ParserCommonUtilsBox
|
||||
using selfhost.shared.json.utils.json_frag as JsonFragBox
|
||||
|
||||
static box Stage1UsingResolverMini {
|
||||
resolve_for_source(src) {
|
||||
if src == null { return "" }
|
||||
|
||||
// Collect entries; empty/zero-length guard
|
||||
local entries = me._collect_using_entries(src)
|
||||
if entries == null || entries.length() == 0 { return "" }
|
||||
|
||||
// Build prefix by iterating entries (loop with MapBox/ArrayBox access)
|
||||
local prefix = ""
|
||||
local i = 0
|
||||
local n = entries.length()
|
||||
loop(i < n) {
|
||||
local entry = entries.get(i)
|
||||
local name = "" + entry.get("name")
|
||||
if name == "" {
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
prefix = prefix + name
|
||||
i = i + 1
|
||||
}
|
||||
return prefix
|
||||
}
|
||||
|
||||
_collect_using_entries(src) {
|
||||
// Minimal JSON scan loop similar to real Stage1UsingResolverBox._collect_using_entries
|
||||
local json = "[{\"name\":\"A\"},{\"name\":\"B\"}]"
|
||||
local out = new ArrayBox()
|
||||
local pos = 0
|
||||
local n = json.length()
|
||||
loop(pos < n) {
|
||||
local name_idx = JsonFragBox.index_of_from(json, "\"name\":\"", pos)
|
||||
if name_idx < 0 { break }
|
||||
local name = JsonFragBox.read_string_after(json, name_idx + 7)
|
||||
local entry = new MapBox()
|
||||
entry.set("name", name)
|
||||
out.push(entry)
|
||||
pos = pos + 1
|
||||
}
|
||||
return out
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
let ast: ASTNode = NyashParser::parse_from_string(src).expect("parse ok");
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile");
|
||||
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for e in &errors {
|
||||
eprintln!("[mir-verify] {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for Stage1UsingResolverMini");
|
||||
}
|
||||
}
|
||||
|
||||
/// Verify MIR/SSA for ParserBox.parse_program2 in isolation by compiling a small wrapper.
|
||||
#[test]
|
||||
fn mir_parserbox_parse_program2_verifies() {
|
||||
// Minimal wrapper that brings ParserBox into scope and calls parse_program2.
|
||||
let src = r#"
|
||||
using lang.compiler.parser.parser_box as ParserBox
|
||||
|
||||
static box ParserBoxHarness {
|
||||
method main(src) {
|
||||
local p = new ParserBox()
|
||||
p.stage3_enable(1)
|
||||
return p.parse_program2(src)
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
let ast: ASTNode = NyashParser::parse_from_string(src).expect("parse ok");
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile");
|
||||
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for e in &errors {
|
||||
eprintln!("[mir-verify] {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for ParserBoxHarness.parse_program2");
|
||||
}
|
||||
}
|
||||
260
src/tests/mir_stageb_like_args_length.rs
Normal file
260
src/tests/mir_stageb_like_args_length.rs
Normal file
@ -0,0 +1,260 @@
|
||||
use crate::parser::NyashParser;
|
||||
use crate::ast::ASTNode;
|
||||
use crate::mir::{MirCompiler, MirVerifier};
|
||||
|
||||
/// Stage-B に似たパターン:
|
||||
/// static box StageBArgsBox {
|
||||
/// method resolve_src(args) {
|
||||
/// if args != null {
|
||||
/// local n = args.length();
|
||||
/// }
|
||||
/// return 0;
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// を Rust MirBuilder で MIR 化し、SSA/PHI が破綻していないことを検証する。
|
||||
#[test]
|
||||
fn mir_stageb_like_args_length_verifies() {
|
||||
let src = r#"
|
||||
static box StageBArgsBox {
|
||||
method resolve_src(args) {
|
||||
if args != null {
|
||||
local n = args.length();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
// Parse Hako source into AST
|
||||
let ast: ASTNode = NyashParser::parse_from_string(src).expect("parse ok");
|
||||
|
||||
// Compile to MIR (Rust MirBuilder)
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile");
|
||||
|
||||
// Verify MIR SSA/PHI invariants
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for e in &errors {
|
||||
eprintln!("[mir-verify] {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for StageB-like args.length pattern");
|
||||
}
|
||||
}
|
||||
|
||||
/// Stage-B 最小ハーネスに近いパターン:
|
||||
/// static box StageBArgsBox {
|
||||
/// method process(args) {
|
||||
/// if args != null {
|
||||
/// local n = args.length();
|
||||
/// local i = 0;
|
||||
/// loop (i < n) {
|
||||
/// local item = args.get(i);
|
||||
/// i = i + 1;
|
||||
/// }
|
||||
/// }
|
||||
/// return 0;
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// を Rust MirBuilder で MIR 化し、SSA/PHI が破綻していないことを検証する。
|
||||
#[test]
|
||||
fn mir_stageb_like_if_args_length_loop_verifies() {
|
||||
let src = r#"
|
||||
static box StageBArgsBox {
|
||||
method process(args) {
|
||||
if args != null {
|
||||
local n = args.length();
|
||||
local i = 0;
|
||||
loop (i < n) {
|
||||
local item = args.get(i);
|
||||
i = i + 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
let ast: ASTNode = NyashParser::parse_from_string(src).expect("parse ok");
|
||||
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile");
|
||||
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for e in &errors {
|
||||
eprintln!("[mir-verify] {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for StageB-like if+loop args.length pattern");
|
||||
}
|
||||
}
|
||||
|
||||
/// Stage-B の TestNested.complex に近いネスト構造:
|
||||
/// if data != null {
|
||||
/// local count = data.length();
|
||||
/// if count > 0 {
|
||||
/// local j = 0;
|
||||
/// loop (j < count) {
|
||||
/// local val = data.get(j);
|
||||
/// if val != null {
|
||||
/// local s = "" + val;
|
||||
/// }
|
||||
/// j = j + 1;
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
#[test]
|
||||
fn mir_stageb_like_nested_if_loop_verifies() {
|
||||
let src = r#"
|
||||
static box TestNested {
|
||||
method complex(data) {
|
||||
if data != null {
|
||||
local count = data.length();
|
||||
if count > 0 {
|
||||
local j = 0;
|
||||
loop (j < count) {
|
||||
local val = data.get(j);
|
||||
if val != null {
|
||||
local s = "" + val;
|
||||
}
|
||||
j = j + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
let ast: ASTNode = NyashParser::parse_from_string(src).expect("parse ok");
|
||||
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile");
|
||||
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for e in &errors {
|
||||
eprintln!("[mir-verify] {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for StageB-like nested if+loop pattern");
|
||||
}
|
||||
}
|
||||
|
||||
/// Stage-B で出がちな「length を条件に直接使う」パターン:
|
||||
/// if args != null {
|
||||
/// local i = 0;
|
||||
/// loop (i < args.length()) {
|
||||
/// i = i + 1;
|
||||
/// }
|
||||
/// }
|
||||
#[test]
|
||||
fn mir_stageb_like_loop_cond_uses_length_verifies() {
|
||||
let src = r#"
|
||||
static box StageBArgsBox {
|
||||
method process(args) {
|
||||
if args != null {
|
||||
local i = 0;
|
||||
loop (i < args.length()) {
|
||||
i = i + 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
let ast: ASTNode = NyashParser::parse_from_string(src).expect("parse ok");
|
||||
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile");
|
||||
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for e in &errors {
|
||||
eprintln!("[mir-verify] {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for StageB-like loop cond args.length pattern");
|
||||
}
|
||||
}
|
||||
|
||||
/// length を if 条件と body の両方で使うパターン:
|
||||
/// if data != null && data.length() > 0 {
|
||||
/// local i = 0;
|
||||
/// loop (i < data.length()) {
|
||||
/// i = i + 1;
|
||||
/// }
|
||||
/// }
|
||||
#[test]
|
||||
fn mir_stageb_like_conditional_and_loop_length_verifies() {
|
||||
let src = r#"
|
||||
static box TestNested2 {
|
||||
method walk(data) {
|
||||
if data != null && data.length() > 0 {
|
||||
local i = 0;
|
||||
loop (i < data.length()) {
|
||||
i = i + 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
let ast: ASTNode = NyashParser::parse_from_string(src).expect("parse ok");
|
||||
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile");
|
||||
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for e in &errors {
|
||||
eprintln!("[mir-verify] {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for StageB-like conditional+loop length pattern");
|
||||
}
|
||||
}
|
||||
|
||||
/// JsonScanBox.seek_array_end に近いパターン:
|
||||
/// - text.length() をループ条件・境界チェック・内部でも使う
|
||||
/// - 文字列内/エスケープなどの分岐を含むが、ここでは最小限の骨格のみを再現。
|
||||
#[test]
|
||||
fn mir_jsonscanbox_like_seek_array_end_verifies() {
|
||||
let src = r#"
|
||||
using selfhost.shared.json.core.string_scan as StringScanBox
|
||||
|
||||
static box JsonScanBoxMini {
|
||||
method seek_array_end(text, start) {
|
||||
if text == null { return -1 }
|
||||
local n = text.length()
|
||||
if start < 0 || start >= n { return -1 }
|
||||
local depth = 0
|
||||
local i = start
|
||||
loop (i < n) {
|
||||
local ch = StringScanBox.read_char(text, i)
|
||||
if ch == "[" {
|
||||
depth = depth + 1
|
||||
} else if ch == "]" {
|
||||
depth = depth - 1
|
||||
if depth == 0 { return i }
|
||||
}
|
||||
i = i + 1
|
||||
}
|
||||
return -1
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
let ast: ASTNode = NyashParser::parse_from_string(src).expect("parse ok");
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile");
|
||||
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for e in &errors {
|
||||
eprintln!("[mir-verify] {}", e);
|
||||
}
|
||||
panic!("MIR verification failed for JsonScanBox-like seek_array_end pattern");
|
||||
}
|
||||
}
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{BasicBlockId, ConstValue, Effect, EffectMask, MirInstruction, MirType};
|
||||
use crate::mir::{FunctionSignature, MirFunction, MirModule};
|
||||
|
||||
|
||||
@ -6,6 +6,8 @@ pub mod identical_exec;
|
||||
pub mod identical_exec_collections;
|
||||
pub mod identical_exec_instance;
|
||||
pub mod identical_exec_string;
|
||||
pub mod mir_stageb_like_args_length;
|
||||
pub mod mir_stage1_using_resolver_verify;
|
||||
pub mod mir_vm_poc;
|
||||
pub mod nyash_abi_basic;
|
||||
pub mod plugin_hygiene;
|
||||
|
||||
@ -27,7 +27,7 @@ mod tests {
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn vm_vtable_map_set_get_has() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType, ValueId,
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
#![cfg(any(feature = "vm-legacy", feature = "phi-legacy"))]
|
||||
|
||||
#[test]
|
||||
fn plugin_invoke_hygiene_prefers_hostcall_for_mapped() {
|
||||
use crate::jit::policy::invoke::{decide_box_method, InvokeDecision};
|
||||
|
||||
@ -148,6 +148,7 @@ fn jit_readonly_map_set_denied() {
|
||||
}
|
||||
|
||||
// Engine-independent smoke: validate policy denial via host externs
|
||||
#[cfg(any(feature = "vm-legacy", feature = "phi-legacy"))]
|
||||
#[test]
|
||||
fn extern_readonly_array_push_denied() {
|
||||
use crate::backend::vm::VMValue;
|
||||
@ -164,6 +165,7 @@ fn extern_readonly_array_push_denied() {
|
||||
assert_eq!(len.to_string(), "0");
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "vm-legacy", feature = "phi-legacy"))]
|
||||
#[test]
|
||||
fn extern_readonly_map_set_denied() {
|
||||
use crate::backend::vm::VMValue;
|
||||
@ -181,6 +183,7 @@ fn extern_readonly_map_set_denied() {
|
||||
assert_eq!(sz.to_string(), "0");
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "vm-legacy", feature = "phi-legacy"))]
|
||||
#[test]
|
||||
fn extern_readonly_read_ops_allowed() {
|
||||
use crate::backend::vm::VMValue;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vm_compare_integerbox_boxref_lt() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::backend::vm::VMValue;
|
||||
use crate::box_trait::IntegerBox;
|
||||
use std::sync::Arc;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
use crate::mir::{MirModule, MirFunction, FunctionSignature, MirInstruction, EffectMask, BasicBlockId, ConstValue};
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::backend::vm::VMValue;
|
||||
use crate::boxes::function_box::{FunctionBox, ClosureEnv};
|
||||
use crate::box_trait::NyashBox;
|
||||
@ -46,4 +46,3 @@ fn vm_call_functionbox_returns_42() {
|
||||
let out = vm.execute_module(&m).expect("vm exec");
|
||||
assert_eq!(out.to_string_box().value, "42");
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_array_push_get_len_pop_clear() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_array_contains_indexof_join() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_array_sort_reverse_slice() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_array_and_string_len_get_set() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_console_log_clear_smoke() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_map_boundary_cases() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{MirModule, MirFunction, FunctionSignature, MirInstruction, EffectMask, BasicBlockId, ConstValue, MirType};
|
||||
std::env::set_var("NYASH_ABI_VTABLE", "1");
|
||||
|
||||
@ -56,4 +56,3 @@ fn vtable_map_boundary_cases() {
|
||||
// get("k") == 2 and size()==1 => 3
|
||||
assert_eq!(out2.to_string_box().value, "3");
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_map_keys_values_delete_clear() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_map_set_and_strict_unknown() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_string_substring_concat() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_string_boundary_cases() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{MirModule, MirFunction, FunctionSignature, MirInstruction, EffectMask, BasicBlockId, ConstValue, MirType};
|
||||
std::env::set_var("NYASH_ABI_VTABLE", "1");
|
||||
|
||||
@ -47,4 +47,3 @@ fn vtable_string_boundary_cases() {
|
||||
let out3 = vm3.execute_module(&m3).expect("vm exec");
|
||||
assert_eq!(out3.to_string_box().value, "😊");
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#[test]
|
||||
fn vtable_string_indexof_replace_trim_upper_lower() {
|
||||
use crate::backend::vm::VM;
|
||||
use crate::backend::VM;
|
||||
use crate::mir::{
|
||||
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
||||
MirModule, MirType,
|
||||
|
||||
Reference in New Issue
Block a user