refactor test
This commit is contained in:
+2
-8
@@ -430,10 +430,7 @@ impl<'a, Ctx: BytecodeContext> BytecodeEmitter<'a, Ctx> {
|
||||
.enumerate()
|
||||
.map(|(i, &id)| (id, thunk_base + i as u32))
|
||||
.collect();
|
||||
self.scope_stack.push(ScopeInfo {
|
||||
depth,
|
||||
thunk_map,
|
||||
});
|
||||
self.scope_stack.push(ScopeInfo { depth, thunk_map });
|
||||
}
|
||||
|
||||
fn pop_scope(&mut self) {
|
||||
@@ -577,10 +574,7 @@ impl<'a, Ctx: BytecodeContext> BytecodeEmitter<'a, Ctx> {
|
||||
self.emit_u32(span_id);
|
||||
}
|
||||
&Ir::Arg { layer } => {
|
||||
self.emit_load(
|
||||
layer.try_into().expect("scope too deep!"),
|
||||
0,
|
||||
);
|
||||
self.emit_load(layer.try_into().expect("scope too deep!"), 0);
|
||||
}
|
||||
&Ir::TopLevel { body, ref thunks } => {
|
||||
self.emit_toplevel_inner(body, thunks);
|
||||
|
||||
+11
-3
@@ -140,15 +140,23 @@ impl<'a, Ctx: DisassemblerContext> Disassembler<'a, Ctx> {
|
||||
temp
|
||||
};
|
||||
|
||||
let extra_width = if start_pos > 0 { start_pos.ilog2() >> 4 } else { 0 };
|
||||
let extra_width = if start_pos > 0 {
|
||||
start_pos.ilog2() >> 4
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
if color {
|
||||
let _ = write!(out, " ");
|
||||
for _ in 0..extra_width { let _ = write!(out, " "); }
|
||||
for _ in 0..extra_width {
|
||||
let _ = write!(out, " ");
|
||||
}
|
||||
let _ = writeln!(out, " {:<14} |", bytes_str.green());
|
||||
} else {
|
||||
let _ = write!(out, " ");
|
||||
for _ in 0..extra_width { let _ = write!(out, " "); }
|
||||
for _ in 0..extra_width {
|
||||
let _ = write!(out, " ");
|
||||
}
|
||||
let _ = writeln!(out, " {:<14} |", bytes_str);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -394,8 +394,7 @@ impl<'id: 'ir, 'ir, Ctx: DowngradeContext<'id, 'ir>> Downgrade<'id, 'ir, Ctx> fo
|
||||
let param_sym = ctx.new_sym(id.to_string());
|
||||
param = None;
|
||||
|
||||
body = ctx
|
||||
.with_param_scope(param_sym, |ctx| body_ast.downgrade(ctx))?;
|
||||
body = ctx.with_param_scope(param_sym, |ctx| body_ast.downgrade(ctx))?;
|
||||
}
|
||||
ast::Param::Pattern(pattern) => {
|
||||
let alias = pattern
|
||||
@@ -992,7 +991,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
let arg= ctx.new_expr(Ir::Arg { layer: 0 });
|
||||
let arg = ctx.new_expr(Ir::Arg { layer: 0 });
|
||||
ctx.with_let_scope(&keys, |ctx| {
|
||||
let vals = params
|
||||
.into_iter()
|
||||
|
||||
+3
-1
@@ -128,7 +128,9 @@ pub enum Ir<'ir, Ref> {
|
||||
param: Option<Param<'ir>>,
|
||||
thunks: Vec<'ir, (ThunkId, Ref)>,
|
||||
},
|
||||
Arg { layer: usize },
|
||||
Arg {
|
||||
layer: usize,
|
||||
},
|
||||
Call {
|
||||
func: Ref,
|
||||
arg: Ref,
|
||||
|
||||
+27
-12
@@ -94,6 +94,7 @@ impl<'gc> GcRoot<'gc> {
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
#[track_caller]
|
||||
pub(super) fn pop_stack_forced(&mut self) -> StrictValue<'gc> {
|
||||
self.stack
|
||||
.pop()
|
||||
@@ -1282,7 +1283,10 @@ impl Runtime {
|
||||
|
||||
let (is_list, is_attrs) = self.arena.mutate_root(|_, root| {
|
||||
let tos = *root.stack.tos().expect("stack underflow");
|
||||
(tos.as_gc::<List<'_>>().is_some(), tos.as_gc::<AttrSet<'_>>().is_some())
|
||||
(
|
||||
tos.as_gc::<List<'_>>().is_some(),
|
||||
tos.as_gc::<AttrSet<'_>>().is_some(),
|
||||
)
|
||||
});
|
||||
|
||||
if is_list {
|
||||
@@ -1303,7 +1307,8 @@ impl Runtime {
|
||||
});
|
||||
|
||||
if let err @ Action::Done(Err(_)) = self.force_tos() {
|
||||
self.arena.mutate_root(|_, root| root.temp_stack.truncate(eval_base - len));
|
||||
self.arena
|
||||
.mutate_root(|_, root| root.temp_stack.truncate(eval_base - len));
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1314,14 +1319,16 @@ impl Runtime {
|
||||
}
|
||||
|
||||
self.arena.mutate_root(|mc, root| {
|
||||
let items: SmallVec<[Value; 4]> = root.temp_stack[eval_base - len..eval_base].iter().copied().collect();
|
||||
let items: SmallVec<[Value; 4]> = root.temp_stack[eval_base - len..eval_base]
|
||||
.iter()
|
||||
.copied()
|
||||
.collect();
|
||||
root.temp_stack.truncate(eval_base - len);
|
||||
|
||||
|
||||
// Reconstruct List
|
||||
let new_list = Gc::new(mc, List { inner: items });
|
||||
root.push_stack(Value::new_gc(new_list));
|
||||
});
|
||||
|
||||
} else if is_attrs {
|
||||
let len = self.arena.mutate_root(|_, root| {
|
||||
let attrs = root.pop_stack().as_gc::<AttrSet<'_>>().unwrap();
|
||||
@@ -1341,7 +1348,8 @@ impl Runtime {
|
||||
});
|
||||
|
||||
if let err @ Action::Done(Err(_)) = self.force_tos() {
|
||||
self.arena.mutate_root(|_, root| root.temp_stack.truncate(eval_base - len * 2));
|
||||
self.arena
|
||||
.mutate_root(|_, root| root.temp_stack.truncate(eval_base - len * 2));
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1362,7 +1370,7 @@ impl Runtime {
|
||||
}
|
||||
kv.sort_by_key(|(k, _)| *k);
|
||||
root.temp_stack.truncate(eval_base - len * 2);
|
||||
|
||||
|
||||
let new_attrs = Gc::new(mc, unsafe { AttrSet::from_sorted_unchecked(kv) });
|
||||
root.push_stack(Value::new_gc(new_attrs));
|
||||
});
|
||||
@@ -1378,7 +1386,10 @@ impl Runtime {
|
||||
|
||||
let (is_list, is_attrs) = self.arena.mutate_root(|_, root| {
|
||||
let tos = *root.stack.tos().expect("stack underflow");
|
||||
(tos.as_gc::<List<'_>>().is_some(), tos.as_gc::<AttrSet<'_>>().is_some())
|
||||
(
|
||||
tos.as_gc::<List<'_>>().is_some(),
|
||||
tos.as_gc::<AttrSet<'_>>().is_some(),
|
||||
)
|
||||
});
|
||||
|
||||
if is_list {
|
||||
@@ -1399,7 +1410,8 @@ impl Runtime {
|
||||
});
|
||||
|
||||
if let err @ Action::Done(Err(_)) = self.force_tos_deep() {
|
||||
self.arena.mutate_root(|_, root| root.temp_stack.truncate(eval_base - len));
|
||||
self.arena
|
||||
.mutate_root(|_, root| root.temp_stack.truncate(eval_base - len));
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1410,12 +1422,14 @@ impl Runtime {
|
||||
}
|
||||
|
||||
self.arena.mutate_root(|mc, root| {
|
||||
let items: SmallVec<[Value; 4]> = root.temp_stack[eval_base - len..eval_base].iter().copied().collect();
|
||||
let items: SmallVec<[Value; 4]> = root.temp_stack[eval_base - len..eval_base]
|
||||
.iter()
|
||||
.copied()
|
||||
.collect();
|
||||
root.temp_stack.truncate(eval_base - len);
|
||||
let new_list = Gc::new(mc, List { inner: items });
|
||||
root.push_stack(Value::new_gc(new_list));
|
||||
});
|
||||
|
||||
} else if is_attrs {
|
||||
let len = self.arena.mutate_root(|_, root| {
|
||||
let attrs = root.pop_stack().as_gc::<AttrSet<'_>>().unwrap();
|
||||
@@ -1435,7 +1449,8 @@ impl Runtime {
|
||||
});
|
||||
|
||||
if let err @ Action::Done(Err(_)) = self.force_tos_deep() {
|
||||
self.arena.mutate_root(|_, root| root.temp_stack.truncate(eval_base - len * 2));
|
||||
self.arena
|
||||
.mutate_root(|_, root| root.temp_stack.truncate(eval_base - len * 2));
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user