Skip to content

Commit 2215933

Browse files
committed
use new dip optimization in more places
1 parent 6c674c5 commit 2215933

File tree

2 files changed

+26
-31
lines changed

2 files changed

+26
-31
lines changed

src/compile/modifier.rs

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -806,9 +806,7 @@ impl Compiler {
806806
Node::from_iter(repeat_n(Node::Prim(Dup, span), n - 1))
807807
};
808808
if side.side == SubSide::Right && n < sig.args() {
809-
for _ in 0..sig.args() - n {
810-
dups = Node::Mod(Dip, eco_vec![dups.sig_node().unwrap()], span);
811-
}
809+
dups = dups.sig_node().unwrap().dipped(sig.args() - n, span).node;
812810
}
813811
node.prepend(dups);
814812
return Ok(Some(node));
@@ -840,9 +838,9 @@ impl Compiler {
840838
let span = self.add_span(modified.modifier.span.clone());
841839
let mut flip = Node::Prim(Flip, span);
842840
if side.value == SubSide::Right {
843-
for _ in 0..sig.args().saturating_sub(2) {
844-
flip = Node::Mod(Dip, eco_vec![flip.sig_node().unwrap()], span);
845-
}
841+
flip = (flip.sig_node().unwrap())
842+
.dipped(sig.args().saturating_sub(2), span)
843+
.node;
846844
}
847845
node.prepend(flip);
848846
} else {
@@ -1127,14 +1125,9 @@ impl Compiler {
11271125
if tried.sig.args() + 1 < handler.sig.args() {
11281126
// Tried must pop arguments that are only for the handler
11291127
let arg_diff = handler.sig.args() - tried.sig.args() - 1;
1130-
let mut pre =
1131-
SigNode::new((arg_diff, 0), eco_vec![Node::Prim(Pop, span); arg_diff]);
1132-
for _ in 0..tried.sig.args() {
1133-
pre = SigNode::new(
1134-
(pre.sig.args() + 1, pre.sig.outputs() + 1),
1135-
Node::Mod(Dip, eco_vec![pre], span),
1136-
);
1137-
}
1128+
let pre =
1129+
SigNode::new((arg_diff, 0), eco_vec![Node::Prim(Pop, span); arg_diff])
1130+
.dipped(tried.sig.args(), span);
11381131
tried.sig.update_args(|a| a + arg_diff);
11391132
tried.node.prepend(pre.node);
11401133
} else if tried.sig.outputs() < handler.sig.outputs() {
@@ -1149,16 +1142,11 @@ impl Compiler {
11491142
let diff_diff = arg_diff.saturating_sub(output_diff);
11501143
if diff_diff > 0 {
11511144
// Handler must pop arguments that are only for the tried
1152-
let mut pre = SigNode::new(
1145+
let pre = SigNode::new(
11531146
(diff_diff, 0),
11541147
eco_vec![Node::Prim(Pop, span); diff_diff],
1155-
);
1156-
for _ in 0..handler.sig.args() + arg_diff - diff_diff {
1157-
pre = SigNode::new(
1158-
(pre.sig.args() + 1, pre.sig.outputs() + 1),
1159-
Node::Mod(Dip, eco_vec![pre], span),
1160-
);
1161-
}
1148+
)
1149+
.dipped(handler.sig.args() + arg_diff - diff_diff, span);
11621150
(handler.sig)
11631151
.update_args_outputs(|a, o| (a + arg_diff, o + output_diff));
11641152
handler.node.prepend(pre.node);
@@ -1292,15 +1280,11 @@ impl Compiler {
12921280
0 => Node::empty(),
12931281
1 => Node::Prim(Fix, sub_span),
12941282
n => {
1295-
let mut node = Node::Prim(Fix, sub_span);
1296-
for _ in 1..n {
1297-
node = Node::Mod(
1298-
Dip,
1299-
eco_vec![node.sig_node().unwrap()],
1300-
sub_span,
1301-
);
1302-
}
1303-
node
1283+
Node::Prim(Fix, sub_span)
1284+
.sig_node()
1285+
.unwrap()
1286+
.dipped(n.saturating_sub(1), sub_span)
1287+
.node
13041288
}
13051289
},
13061290
};

src/tree.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,17 @@ impl SigNode {
165165
};
166166
SigNode::new(sig, node)
167167
}
168+
/// Dip before calling this node
169+
pub fn dipped(self, depth: usize, span: usize) -> SigNode {
170+
let mut sig = self.sig;
171+
sig.update_args_outputs(|a, o| (a + depth, o + depth));
172+
let node = match depth {
173+
0 => self.node,
174+
1 => Node::Mod(Primitive::Dip, eco_vec![self], span),
175+
n => Node::ImplMod(ImplPrimitive::DipN(n), eco_vec![self], span),
176+
};
177+
SigNode::new(sig, node)
178+
}
168179
}
169180

170181
impl From<SigNode> for Node {

0 commit comments

Comments
 (0)