• R/O
  • SSH

kink: Commit

Kink runtime


Commit MetaInfo

Révision8c12cf7d41523a520fd0e339b24ae217a2cea37d (tree)
l'heure2020-10-25 21:03:32
Auteurmiyakawataku
Commitermiyakawataku

Message de Log

translate using JumpIfNeInsn

Change Summary

Modification

diff -r 13c7732d0e4b -r 8c12cf7d4152 src/main/java/org/kink_lang/kink/internal/program/i2w/TranslationSession.java
--- a/src/main/java/org/kink_lang/kink/internal/program/i2w/TranslationSession.java Sun Oct 25 19:47:26 2020 +0900
+++ b/src/main/java/org/kink_lang/kink/internal/program/i2w/TranslationSession.java Sun Oct 25 21:03:32 2020 +0900
@@ -559,13 +559,9 @@
559559 for (int arity = mandatorySyms.size(); arity <= maxArity - 1; ++ arity) {
560560 // { e1 e2 ,,, en #N } => { e1 e2 ,,, en #N #N }
561561 insns.add(new DupInsn(pos));
562- // => { e1 e2 ,,, en #N #N arity }
563- insns.add(new KonstInsn(intHolder.of(arity), pos));
564- // => { e1 e2 ,,, en #N }
565- insns.add(new IfEqInsn(pos));
566562 // => { e1 e2 ,,, en #N }
567563 String notArity = makeLabel(String.format(Locale.ROOT, "not-arity-%d", arity));
568- insns.add(new GotoInsn(notArity, pos));
564+ insns.add(new JumpIfNeInsn(intHolder.of(arity), notArity, pos));
569565 // => { e1 e2 ,,, eArity }
570566 insns.add(new RemoveInsn(pos));
571567 for (int i = optSyms.size() - 1; i >= arity - mandatorySyms.size(); -- i) {
@@ -585,13 +581,9 @@
585581
586582 // { e1 e2 ,,, en #N } => { e1 e2 ,,, en #N #N }
587583 insns.add(new DupInsn(pos));
588- // => { e1 e2 ,,, en #N #N maxArity }
589- insns.add(new KonstInsn(intHolder.of(maxArity), pos));
590- // => { e1 e2 ,,, en #N }
591- insns.add(new IfEqInsn(pos));
592584 // => { e1 e2 ,,, en #N }
593585 String wrongNumberOfArgs = makeLabel("wrong-number-of-args");
594- insns.add(new GotoInsn(wrongNumberOfArgs, pos));
586+ insns.add(new JumpIfNeInsn(intHolder.of(maxArity), wrongNumberOfArgs, pos));
595587 // => { e1 e2 ,,, en }
596588 insns.add(new RemoveInsn(pos));
597589 // => { e1 e2 ,,, en }
@@ -720,14 +712,9 @@
720712 ++ arity) {
721713 // => { e1 e2 ,,, en #N #N }
722714 insns.add(new DupInsn(pos));
723- // => { e1 e2 ,,, en #N #N arity }
724- insns.add(new KonstInsn(intHolder.of(arity), pos));
725- // => { e1 e2 ,,, en #N }
726- insns.add(new IfEqInsn(pos));
727-
728715 // => { e1 e2 ,,, en #N }
729716 String moreThanArity = makeLabel("more-than-" + arity);
730- insns.add(new GotoInsn(moreThanArity, pos));
717+ insns.add(new JumpIfNeInsn(intHolder.of(arity), moreThanArity, pos));
731718
732719 // => { e1 e2 ,,, eArity }
733720 insns.add(new RemoveInsn(pos));
@@ -913,14 +900,9 @@
913900 insns.add(new SpreadInsn(pos));
914901 // => { o1 o2 ,,, om r1 r2 ,,, rn #N #N }
915902 insns.add(new DupInsn(pos));
916- // => { o1 o2 ,,, om r1 r2 ,,, rn #N #N #params }
917- insns.add(new KonstInsn(intHolder.of(params.size()), pos));
918- // => { o1 o2 ,,, om r1 r2 ,,, rn #N }
919- insns.add(new IfEqInsn(pos));
920-
921903 // => { o1 o2 ,,, om r1 r2 ,,, rn #N }
922904 String wrongNumberOfRhs = makeLabel("wrong-number-of-rhs");
923- insns.add(new GotoInsn(wrongNumberOfRhs, pos));
905+ insns.add(new JumpIfNeInsn(intHolder.of(params.size()), wrongNumberOfRhs, pos));
924906
925907 // => { o1 o2 ,,, om r1 r2 ,,, rn #N }
926908 String validArgs = makeLabel("valid-args");
@@ -1150,13 +1132,9 @@
11501132 insns.add(new SpreadInsn(pos));
11511133 // => { e1 e2 ,,, en #N #N }
11521134 insns.add(new DupInsn(pos));
1153- // => { e1 e2 ,,, en #N #N #arity }
1154- insns.add(new KonstInsn(intHolder.of(syms.size()), pos));
1155- // => { e1 e2 ,,, en #N }
1156- insns.add(new IfEqInsn(pos));
11571135 // => { e1 e2 ,,, en #N }
11581136 String wrongNumberOfTupleElems = makeLabel("wrong-number-of-tuple-elems");
1159- insns.add(new GotoInsn(wrongNumberOfTupleElems, pos));
1137+ insns.add(new JumpIfNeInsn(intHolder.of(syms.size()), wrongNumberOfTupleElems, pos));
11601138 // => { e1 e2 ,,, en #N }
11611139 String startAssignment = makeLabel("start-assignment");
11621140 insns.add(new GotoInsn(startAssignment, pos));
@@ -1298,14 +1276,10 @@
12981276
12991277 // => { $new_val }
13001278 insns.add(localDeref("new_val", pos));
1301- // => { $new_val CORE$new_val }
1302- Val coreNewVal = vm.binding.newBinding().getVar(vm.sym.getHandle("new_val"));
1303- insns.add(new KonstInsn(coreNewVal, itree.getPos()));
13041279 // => {}
1305- insns.add(new IfEqInsn(pos));
1306- // => {}
1280+ Val coreNewVal = vm.binding.newBinding().getVar(vm.sym.getHandle("new_val"));
13071281 String alternative = makeLabel("alternative");
1308- insns.add(new GotoInsn(alternative, pos));
1282+ insns.add(new JumpIfNeInsn(coreNewVal, alternative, pos));
13091283 // => { nada }
13101284 insns.add(new NadaInsn(pos));
13111285
@@ -1387,14 +1361,10 @@
13871361 insns.addAll(toInsns(itree.getTrait(), TailContext.NOT_TAIL));
13881362 // => {$new_val expectedTrait $new_val}
13891363 insns.add(new LiftInsn(2, itree.getPos()));
1390- // => {$new_val expectedTrait $new_val CORE$new_val}
1391- Val coreNewVal = vm.binding.newBinding().getVar(vm.sym.getHandle("new_val"));
1392- insns.add(new KonstInsn(coreNewVal, itree.getPos()));
13931364 // => {$new_val expectedTrait}
1394- insns.add(new IfEqInsn(itree.getPos()));
1395- // => {$new_val expectedTrait}
1365+ Val coreNewVal = vm.binding.newBinding().getVar(vm.sym.getHandle("new_val"));
13961366 String alternative = makeLabel("alternative");
1397- insns.add(new GotoInsn(alternative, itree.getPos()));
1367+ insns.add(new JumpIfNeInsn(coreNewVal, alternative, itree.getPos()));
13981368 // => {$new_val trait} or {$new_val notTrait}
13991369 insns.add(new TryTraitInsn(itree.getPos()));
14001370 // => {$new_val notTrait}
@@ -1510,13 +1480,9 @@
15101480 insns.add(new DerefInsn("if_else", pos));
15111481 // => { cond $if_else $if_else }
15121482 insns.add(new DupInsn(pos));
1513- // => { cond $if_else $if_else true$if_else }
1514- insns.add(new KonstInsn(getOrigTrueIfElse(), pos));
1515- // => { cond $if_else }
1516- insns.add(new IfEqInsn(pos));
15171483 // => { cond $if_else }
15181484 String notTrue = makeLabel("not-true-if_else");
1519- insns.add(new GotoInsn(notTrue, pos));
1485+ insns.add(new JumpIfNeInsn(getOrigTrueIfElse(), notTrue, pos));
15201486 // => { cond }
15211487 insns.add(new RemoveInsn(pos));
15221488 // => {}
@@ -1528,17 +1494,9 @@
15281494 insns.addAll(toInsns(trueClause, TailContext.TAIL));
15291495 // => { cond $if_else }
15301496 insns.add(new LabelPseudoInsn(notTrue));
1531- // => { cond $if_else $if_else }
1532- insns.add(new DupInsn(pos));
1533- // => { cond $if_else $if_else false$if_else }
1534- insns.add(new KonstInsn(getOrigFalseIfElse(), pos));
1535- // => { cond $if_else }
1536- insns.add(new IfEqInsn(pos));
1537- // => { cond $if_else }
1497+ // => { cond }
15381498 String notBool = makeLabel("not-bool-if_else");
1539- insns.add(new GotoInsn(notBool, pos));
1540- // => { cond }
1541- insns.add(new RemoveInsn(pos));
1499+ insns.add(new JumpIfNeInsn(getOrigFalseIfElse(), notBool, pos));
15421500 // => {}
15431501 insns.add(new RemoveInsn(pos));
15441502 // => {}
@@ -1546,8 +1504,13 @@
15461504 // => bye
15471505 Itree falseClause = ifElse.getFalseFun().getBody();
15481506 insns.addAll(toInsns(falseClause, TailContext.TAIL));
1507+
1508+ // { cond }
1509+ insns.add(new LabelPseudoInsn(notBool));
1510+ // => { cond cond }
1511+ insns.add(new DupInsn(pos));
15491512 // => { cond $if_else }
1550- insns.add(new LabelPseudoInsn(notBool));
1513+ insns.add(new DerefInsn("if_else", pos));
15511514 // => { $if_else cond }
15521515 insns.add(new FlipInsn(pos));
15531516 // => { $if_else cond trueFun }
@@ -1572,14 +1535,10 @@
15721535 List<Insn> insns = new ArrayList<>();
15731536 // => { $branch }
15741537 insns.add(new IderefInsn("branch", pos));
1575- // => { $branch CORE$branch }
1576- Val coreBranch = vm.binding.newBinding().getVar(vm.sym.getHandle("branch"));
1577- insns.add(new KonstInsn(coreBranch, pos));
15781538 // => {}
1579- insns.add(new IfEqInsn(pos));
1580- // => {}
1539+ Val coreBranch = vm.binding.newBinding().getVar(vm.sym.getHandle("branch"));
15811540 String slowpath = makeLabel("slowpath");
1582- insns.add(new GotoInsn(slowpath, pos));
1541+ insns.add(new JumpIfNeInsn(coreBranch, slowpath, pos));
15831542 // => {}
15841543 insns.add(new OnTraceInsn(makeTrace("branch", pos), pos));
15851544
@@ -1590,13 +1549,9 @@
15901549 insns.addAll(toInsns(cond, TailContext.NOT_TAIL));
15911550 // => { cond cond }
15921551 insns.add(new DupInsn(pos));
1593- // => { cond cond true }
1594- insns.add(new KonstInsn(vm.bool.trueVal, pos));
1595- // => { cond }
1596- insns.add(new IfEqInsn(pos));
15971552 // => { cond }
15981553 String notTrue = makeLabel("cond-not-true");
1599- insns.add(new GotoInsn(notTrue, pos));
1554+ insns.add(new JumpIfNeInsn(vm.bool.trueVal, notTrue, pos));
16001555
16011556 // { true } => {}
16021557 insns.add(new RemoveInsn(pos));
@@ -1607,13 +1562,9 @@
16071562 insns.add(new LabelPseudoInsn(notTrue));
16081563 // => { cond cond }
16091564 insns.add(new DupInsn(pos));
1610- // => { cond cond false }
1611- insns.add(new KonstInsn(vm.bool.falseVal, pos));
1612- // => { cond }
1613- insns.add(new IfEqInsn(pos));
16141565 // => { cond }
16151566 String notBool = makeLabel("cond-not-bool");
1616- insns.add(new GotoInsn(notBool, pos));
1567+ insns.add(new JumpIfNeInsn(vm.bool.falseVal, notBool, pos));
16171568 // => { false }
16181569 String condFalse = makeLabel("cond-false");
16191570 insns.add(new GotoInsn(condFalse, pos));
@@ -1683,23 +1634,15 @@
16831634
16841635 // => { $branch }
16851636 insns.add(new IderefInsn("branch", pos));
1686- // => { $branch CORE$branch }
1687- Val coreBranch = vm.binding.newBinding().getVar(vm.sym.getHandle("branch"));
1688- insns.add(new KonstInsn(coreBranch, pos));
16891637 // => {}
1690- insns.add(new IfEqInsn(pos));
1691- // => {}
1638+ Val coreBranch = vm.binding.newBinding().getVar(vm.sym.getHandle("branch"));
16921639 String slowpath = makeLabel("slowpath");
1693- insns.add(new GotoInsn(slowpath, pos));
1640+ insns.add(new JumpIfNeInsn(coreBranch, slowpath, pos));
16941641 // => { $true }
16951642 insns.add(new IderefInsn("true", pos));
1696- // => { $true CORE$true }
1643+ // => {}
16971644 Val coreTrue = vm.binding.newBinding().getVar(vm.sym.getHandle("true"));
1698- insns.add(new KonstInsn(coreTrue, pos));
1699- // => {}
1700- insns.add(new IfEqInsn(pos));
1701- // => {}
1702- insns.add(new GotoInsn(slowpath, pos));
1645+ insns.add(new JumpIfNeInsn(coreTrue, slowpath, pos));
17031646
17041647 // => {}
17051648 insns.add(new OnTraceInsn(makeTrace("branch", pos), pos));
@@ -1711,13 +1654,9 @@
17111654 insns.addAll(toInsns(cond, TailContext.NOT_TAIL));
17121655 // => { cond cond }
17131656 insns.add(new DupInsn(pos));
1714- // => { cond cond true }
1715- insns.add(new KonstInsn(vm.bool.trueVal, pos));
1716- // => { cond }
1717- insns.add(new IfEqInsn(pos));
17181657 // => { cond }
17191658 String notTrue = makeLabel("cond-not-true");
1720- insns.add(new GotoInsn(notTrue, pos));
1659+ insns.add(new JumpIfNeInsn(vm.bool.trueVal, notTrue, pos));
17211660 // => {}
17221661 insns.add(new RemoveInsn(pos));
17231662 // => bye
@@ -1727,13 +1666,9 @@
17271666 insns.add(new LabelPseudoInsn(notTrue));
17281667 // => { cond cond }
17291668 insns.add(new DupInsn(pos));
1730- // => { cond cond false }
1731- insns.add(new KonstInsn(vm.bool.falseVal, pos));
1732- // => { cond }
1733- insns.add(new IfEqInsn(pos));
17341669 // => { cond }
17351670 String notBool = makeLabel("cond-not-bool");
1736- insns.add(new GotoInsn(notBool, pos));
1671+ insns.add(new JumpIfNeInsn(vm.bool.falseVal, notBool, pos));
17371672 // => { false }
17381673 String condFalse = makeLabel("cond-false");
17391674 insns.add(new GotoInsn(condFalse, pos));
diff -r 13c7732d0e4b -r 8c12cf7d4152 src/test/java/org/kink_lang/kink/internal/program/i2w/TranslationSessionTest.java
--- a/src/test/java/org/kink_lang/kink/internal/program/i2w/TranslationSessionTest.java Sun Oct 25 19:47:26 2020 +0900
+++ b/src/test/java/org/kink_lang/kink/internal/program/i2w/TranslationSessionTest.java Sun Oct 25 21:03:32 2020 +0900
@@ -11,6 +11,7 @@
1111
1212 import org.kink_lang.kink.FunVal;
1313 import org.kink_lang.kink.StrVal;
14+import org.kink_lang.kink.Val;
1415 import org.kink_lang.kink.Vm;
1516 import org.kink_lang.kink.function.Function3;
1617 import org.kink_lang.kink.internal.callstack.Location;
@@ -36,6 +37,16 @@
3637
3738 private static final String TEXT = "10 + 20";
3839
40+ private final Val newValFun = vm.binding.newBinding().getVar(vm.sym.getHandle("new_val"));
41+
42+ private final Val trueIfElseFun = vm.bool.trueVal.getVar(vm.sym.getHandle("if_else"));
43+
44+ private final Val falseIfElseFun = vm.bool.falseVal.getVar(vm.sym.getHandle("if_else"));
45+
46+ private final Val branchFun = vm.binding.newBinding().getVar(vm.sym.getHandle("branch"));
47+
48+ private final Val trueFun = vm.binding.newBinding().getVar(vm.sym.getHandle("true"));
49+
3950 private final Function3<Wire, Integer, Integer, FunVal> w2c = (wire, start, end) -> {
4051 Wire optWire = WireOptimizers.getOptimizer().apply(wire);
4152 WireToQblockTranslator w2q = new WireToQblockTranslator(vm, NAME, TEXT, start, end);
@@ -1078,6 +1089,7 @@
10781089 }
10791090
10801091 // }}}1
1092+
10811093 // opt-assignment {{{1
10821094
10831095 // [:A :B :C :D.opt :E.opt] <- xxx {{{2
@@ -1123,12 +1135,8 @@
11231135 new SpreadInsn(99),
11241136 // => { e1 e2 ,,, en #N #N }
11251137 new DupInsn(99),
1126- // => { e1 e2 ,,, en #N #N 3 }
1127- new KonstInsn(intHolder.of(3), 99),
11281138 // => { e1 e2 ,,, en #N }
1129- new IfEqInsn(99),
1130- // => { e1 e2 ,,, en #N }
1131- new GotoInsn("5-not-arity-3", 99),
1139+ new JumpIfNeInsn(intHolder.of(3), "5-not-arity-3", 99),
11321140 // { e1 e2 e3 3 } => { e1 e2 e3 }
11331141 new RemoveInsn(99),
11341142 // => { e1 e2 e3 0 }
@@ -1150,12 +1158,8 @@
11501158 new LabelPseudoInsn("5-not-arity-3"),
11511159 // => { e1 e2 ,,, en #N #N }
11521160 new DupInsn(99),
1153- // => { e1 e2 ,,, en #N #N 4 }
1154- new KonstInsn(intHolder.of(4), 99),
11551161 // => { e1 e2 ,,, en #N }
1156- new IfEqInsn(99),
1157- // => { e1 e2 ,,, en #N }
1158- new GotoInsn("6-not-arity-4", 99),
1162+ new JumpIfNeInsn(intHolder.of(4), "6-not-arity-4", 99),
11591163 // { e1 e2 e3 e4 4 } => { e1 e2 e3 e4 }
11601164 new RemoveInsn(99),
11611165 // => { e1 e2 e3 e4 0 }
@@ -1171,12 +1175,8 @@
11711175 new LabelPseudoInsn("6-not-arity-4"),
11721176 // => { e1 e2 ,,, en #N #N }
11731177 new DupInsn(99),
1174- // => { e1 e2 ,,, en #N #N 5 }
1175- new KonstInsn(intHolder.of(5), 99),
11761178 // => { e1 e2 ,,, en #N }
1177- new IfEqInsn(99),
1178- // => { e1 e2 ,,, en #N }
1179- new GotoInsn("7-wrong-number-of-args", 99),
1179+ new JumpIfNeInsn(intHolder.of(5), "7-wrong-number-of-args", 99),
11801180 // { e1 e2 e3 e4 e5 5 } => { e1 e2 e3 e4 e5 }
11811181 new RemoveInsn(99),
11821182 // => { e1 e2 e3 e4 e5 }
@@ -1276,12 +1276,8 @@
12761276 new SpreadInsn(99),
12771277 // => { e1 e2 ,,, en #N #N }
12781278 new DupInsn(99),
1279- // => { e1 e2 ,,, en #N #N 3 }
1280- new KonstInsn(intHolder.of(3), 99),
12811279 // => { e1 e2 ,,, en #N }
1282- new IfEqInsn(99),
1283- // => { e1 e2 ,,, en #N }
1284- new GotoInsn("5-not-arity-3", 99),
1280+ new JumpIfNeInsn(intHolder.of(3), "5-not-arity-3", 99),
12851281 // { e1 e2 e3 3 } => { e1 e2 e3 }
12861282 new RemoveInsn(99),
12871283 // => { e1 e2 e3 0 }
@@ -1303,12 +1299,8 @@
13031299 new LabelPseudoInsn("5-not-arity-3"),
13041300 // => { e1 e2 ,,, en #N #N }
13051301 new DupInsn(99),
1306- // => { e1 e2 ,,, en #N #N 4 }
1307- new KonstInsn(intHolder.of(4), 99),
13081302 // => { e1 e2 ,,, en #N }
1309- new IfEqInsn(99),
1310- // => { e1 e2 ,,, en #N }
1311- new GotoInsn("6-not-arity-4", 99),
1303+ new JumpIfNeInsn(intHolder.of(4), "6-not-arity-4", 99),
13121304 // { e1 e2 e3 e4 4 } => { e1 e2 e3 e4 }
13131305 new RemoveInsn(99),
13141306 // => { e1 e2 e3 e4 0 }
@@ -1324,12 +1316,8 @@
13241316 new LabelPseudoInsn("6-not-arity-4"),
13251317 // => { e1 e2 ,,, en #N #N }
13261318 new DupInsn(99),
1327- // => { e1 e2 ,,, en #N #N 5 }
1328- new KonstInsn(intHolder.of(5), 99),
13291319 // => { e1 e2 ,,, en #N }
1330- new IfEqInsn(99),
1331- // => { e1 e2 ,,, en #N }
1332- new GotoInsn("7-wrong-number-of-args", 99),
1320+ new JumpIfNeInsn(intHolder.of(5), "7-wrong-number-of-args", 99),
13331321 // { e1 e2 e3 e4 e5 5 } => { e1 e2 e3 e4 e5 }
13341322 new RemoveInsn(99),
13351323 // => { e1 e2 e3 e4 e5 }
@@ -1431,15 +1419,11 @@
14311419 new SpreadInsn(99),
14321420 // => { e1 e2 ,,, en #N #N }
14331421 new DupInsn(99),
1434- // => { e1 e2 ,,, en #N #N 3 }
1435- new KonstInsn(intHolder.of(3), 99),
14361422 // => { e1 e2 ,,, en #N }
1437- new IfEqInsn(99),
1438- // => { e1 e2 ,,, en #N }
1439- new GotoInsn("5-not-arity-3", 99),
1423+ new JumpIfNeInsn(intHolder.of(3), "5-not-arity-3", 99),
14401424 // { e1 e2 e3 3 } => { e1 e2 e3 }
14411425 new RemoveInsn(99),
1442- // => { e1 e2 e3 #here }
1426+ // => { e1 e2 e3 0 }
14431427 new KonstInsn(intHolder.of(0), 99),
14441428 // => { e1 e2 e3 [] }
14451429 new VecInsn(99),
@@ -1452,12 +1436,8 @@
14521436 new LabelPseudoInsn("5-not-arity-3"),
14531437 // => { e1 e2 ,,, en #N #N }
14541438 new DupInsn(99),
1455- // => { e1 e2 ,,, en #N #N 4 }
1456- new KonstInsn(intHolder.of(4), 99),
14571439 // => { e1 e2 ,,, en #N }
1458- new IfEqInsn(99),
1459- // => { e1 e2 ,,, en #N }
1460- new GotoInsn("6-not-arity-4", 99),
1440+ new JumpIfNeInsn(intHolder.of(4), "6-not-arity-4", 99),
14611441 // { e1 e2 e3 e4 4 } => { e1 e2 e3 e4 }
14621442 new RemoveInsn(99),
14631443 // => { e1 e2 e3 e4 0 }
@@ -1473,12 +1453,8 @@
14731453 new LabelPseudoInsn("6-not-arity-4"),
14741454 // => { e1 e2 ,,, en #N #N }
14751455 new DupInsn(99),
1476- // => { e1 e2 ,,, en #N #N 5 }
1477- new KonstInsn(intHolder.of(5), 99),
14781456 // => { e1 e2 ,,, en #N }
1479- new IfEqInsn(99),
1480- // => { e1 e2 ,,, en #N }
1481- new GotoInsn("7-wrong-number-of-args", 99),
1457+ new JumpIfNeInsn(intHolder.of(5), "7-wrong-number-of-args", 99),
14821458 // { e1 e2 e3 e4 e5 5 } => { e1 e2 e3 e4 e5 }
14831459 new RemoveInsn(99),
14841460 // => { e1 e2 e3 e4 e5 }
@@ -1574,12 +1550,8 @@
15741550 new SpreadInsn(99),
15751551 // => { e1 e2 ,,, en #N #N }
15761552 new DupInsn(99),
1577- // => { e1 e2 ,,, en #N #N 3 }
1578- new KonstInsn(intHolder.of(3), 99),
15791553 // => { e1 e2 ,,, en #N }
1580- new IfEqInsn(99),
1581- // => { e1 e2 ,,, en #N }
1582- new GotoInsn("3-wrong-number-of-args", 99),
1554+ new JumpIfNeInsn(intHolder.of(3), "3-wrong-number-of-args", 99),
15831555 // { e1 e2 e3 3 } => { e1 e2 e3 }
15841556 new RemoveInsn(99),
15851557 // => { e1 e2 e3 }
@@ -1661,12 +1633,8 @@
16611633 new SpreadInsn(99),
16621634 // => { e1 e2 ,,, en #N #N }
16631635 new DupInsn(99),
1664- // => { e1 e2 ,,, en #N #N 0 }
1665- new KonstInsn(intHolder.of(0), 99),
16661636 // => { e1 e2 ,,, en #N }
1667- new IfEqInsn(99),
1668- // => { e1 e2 ,,, en #N }
1669- new GotoInsn("5-not-arity-0", 99),
1637+ new JumpIfNeInsn(intHolder.of(0), "5-not-arity-0", 99),
16701638 // { 0 } => {}
16711639 new RemoveInsn(99),
16721640 // => { 0 }
@@ -1688,12 +1656,8 @@
16881656 new LabelPseudoInsn("5-not-arity-0"),
16891657 // => { e1 e2 ,,, en #N #N }
16901658 new DupInsn(99),
1691- // => { e1 e2 ,,, en #N #N 1 }
1692- new KonstInsn(intHolder.of(1), 99),
16931659 // => { e1 e2 ,,, en #N }
1694- new IfEqInsn(99),
1695- // => { e1 e2 ,,, en #N }
1696- new GotoInsn("6-not-arity-1", 99),
1660+ new JumpIfNeInsn(intHolder.of(1), "6-not-arity-1", 99),
16971661 // { e1 1 } => { e1 }
16981662 new RemoveInsn(99),
16991663 // => { e1 0 }
@@ -1709,12 +1673,8 @@
17091673 new LabelPseudoInsn("6-not-arity-1"),
17101674 // => { e1 e2 ,,, en #N #N }
17111675 new DupInsn(99),
1712- // => { e1 e2 ,,, en #N #N 2 }
1713- new KonstInsn(intHolder.of(2), 99),
17141676 // => { e1 e2 ,,, en #N }
1715- new IfEqInsn(99),
1716- // => { e1 e2 ,,, en #N }
1717- new GotoInsn("7-wrong-number-of-args", 99),
1677+ new JumpIfNeInsn(intHolder.of(2), "7-wrong-number-of-args", 99),
17181678 // { e1 e2 2 } => { e1 e2 }
17191679 new RemoveInsn(99),
17201680 // => { e1 e2 }
@@ -1821,12 +1781,8 @@
18211781 new SpreadInsn(99),
18221782 // => { e1 e2 ,,, en #N #N }
18231783 new DupInsn(99),
1824- // => { e1 e2 ,,, en #N #N 3 }
1825- new KonstInsn(intHolder.of(3), 99),
18261784 // => { e1 e2 ,,, en #N }
1827- new IfEqInsn(99),
1828- // => { e1 e2 ,,, en #N }
1829- new GotoInsn("5-not-arity-3", 99),
1785+ new JumpIfNeInsn(intHolder.of(3), "5-not-arity-3", 99),
18301786 // { e1 e2 e3 3 } => { e1 e2 e3 }
18311787 new RemoveInsn(99),
18321788 // => { e1 e2 e3 0 }
@@ -1848,12 +1804,8 @@
18481804 new LabelPseudoInsn("5-not-arity-3"),
18491805 // => { e1 e2 ,,, en #N #N }
18501806 new DupInsn(99),
1851- // => { e1 e2 ,,, en #N #N 4 }
1852- new KonstInsn(intHolder.of(4), 99),
18531807 // => { e1 e2 ,,, en #N }
1854- new IfEqInsn(99),
1855- // => { e1 e2 ,,, en #N }
1856- new GotoInsn("6-not-arity-4", 99),
1808+ new JumpIfNeInsn(intHolder.of(4), "6-not-arity-4", 99),
18571809 // { e1 e2 e3 e4 4 } => { e1 e2 e3 e4 }
18581810 new RemoveInsn(99),
18591811 // => { e1 e2 e3 e4 0 }
@@ -1869,12 +1821,8 @@
18691821 new LabelPseudoInsn("6-not-arity-4"),
18701822 // => { e1 e2 ,,, en #N #N }
18711823 new DupInsn(99),
1872- // => { e1 e2 ,,, en #N #N 5 }
1873- new KonstInsn(intHolder.of(5), 99),
18741824 // => { e1 e2 ,,, en #N }
1875- new IfEqInsn(99),
1876- // => { e1 e2 ,,, en #N }
1877- new GotoInsn("7-wrong-number-of-args", 99),
1825+ new JumpIfNeInsn(intHolder.of(5), "7-wrong-number-of-args", 99),
18781826 // { e1 e2 e3 e4 e5 5 } => { e1 e2 e3 e4 e5 }
18791827 new RemoveInsn(99),
18801828 // => { e1 e2 e3 e4 e5 }
@@ -1983,12 +1931,8 @@
19831931 new SpreadInsn(99),
19841932 // => { e1 e2 ,,, en #N #N }
19851933 new DupInsn(99),
1986- // => { e1 e2 ,,, en #N #N 3 }
1987- new KonstInsn(intHolder.of(3), 99),
19881934 // => { e1 e2 ,,, en #N }
1989- new IfEqInsn(99),
1990- // => { e1 e2 ,,, en #N }
1991- new GotoInsn("5-not-arity-3", 99),
1935+ new JumpIfNeInsn(intHolder.of(3), "5-not-arity-3", 99),
19921936 // { e1 e2 e3 3 } => { e1 e2 e3 }
19931937 new RemoveInsn(99),
19941938 // => { e1 e2 e3 0 }
@@ -2004,12 +1948,8 @@
20041948 new LabelPseudoInsn("5-not-arity-3"),
20051949 // => { e1 e2 ,,, en #N #N }
20061950 new DupInsn(99),
2007- // => { e1 e2 ,,, en #N #N 4 }
2008- new KonstInsn(intHolder.of(4), 99),
20091951 // => { e1 e2 ,,, en #N }
2010- new IfEqInsn(99),
2011- // => { e1 e2 ,,, en #N }
2012- new GotoInsn("6-not-arity-4", 99),
1952+ new JumpIfNeInsn(intHolder.of(4), "6-not-arity-4", 99),
20131953 // { e1 e2 e3 e4 4 } => { e1 e2 e3 e4 }
20141954 new RemoveInsn(99),
20151955 // => { e1 e2 e3 e4 }
@@ -2019,12 +1959,8 @@
20191959 new LabelPseudoInsn("6-not-arity-4"),
20201960 // => { e1 e2 ,,, en #N #N }
20211961 new DupInsn(99),
2022- // => { e1 e2 ,,, en #N #N 5 }
2023- new KonstInsn(intHolder.of(5), 99),
20241962 // => { e1 e2 ,,, en #N }
2025- new IfEqInsn(99),
2026- // => { e1 e2 ,,, en #N }
2027- new GotoInsn("7-wrong-number-of-args", 99),
1963+ new JumpIfNeInsn(intHolder.of(5), "7-wrong-number-of-args", 99),
20281964 // { e1 e2 e3 e4 e5 5 } => { e1 e2 e3 e4 e5 }
20291965 new RemoveInsn(99),
20301966 // => { e1 e2 e3 e4 e5 }
@@ -2128,12 +2064,8 @@
21282064 new SpreadInsn(99),
21292065 // => { e1 e2 ,,, en #N #N }
21302066 new DupInsn(99),
2131- // => { e1 e2 ,,, en #N #N 3 }
2132- new KonstInsn(intHolder.of(3), 99),
21332067 // => { e1 e2 ,,, en #N }
2134- new IfEqInsn(99),
2135- // => { e1 e2 ,,, en #N }
2136- new GotoInsn("5-not-arity-3", 99),
2068+ new JumpIfNeInsn(intHolder.of(3), "5-not-arity-3", 99),
21372069 // { e1 e2 e3 3 } => { e1 e2 e3 }
21382070 new RemoveInsn(99),
21392071 // => { e1 e2 e3 0 }
@@ -2155,12 +2087,8 @@
21552087 new LabelPseudoInsn("5-not-arity-3"),
21562088 // => { e1 e2 ,,, en #N #N }
21572089 new DupInsn(99),
2158- // => { e1 e2 ,,, en #N #N 4 }
2159- new KonstInsn(intHolder.of(4), 99),
21602090 // => { e1 e2 ,,, en #N }
2161- new IfEqInsn(99),
2162- // => { e1 e2 ,,, en #N }
2163- new GotoInsn("6-not-arity-4", 99),
2091+ new JumpIfNeInsn(intHolder.of(4), "6-not-arity-4", 99),
21642092 // { e1 e2 e3 e4 4 } => { e1 e2 e3 e4 }
21652093 new RemoveInsn(99),
21662094 // => { e1 e2 e3 e4 0 }
@@ -2176,12 +2104,8 @@
21762104 new LabelPseudoInsn("6-not-arity-4"),
21772105 // => { e1 e2 ,,, en #N #N }
21782106 new DupInsn(99),
2179- // => { e1 e2 ,,, en #N #N 5 }
2180- new KonstInsn(intHolder.of(5), 99),
21812107 // => { e1 e2 ,,, en #N }
2182- new IfEqInsn(99),
2183- // => { e1 e2 ,,, en #N }
2184- new GotoInsn("7-wrong-number-of-args", 99),
2108+ new JumpIfNeInsn(intHolder.of(5), "7-wrong-number-of-args", 99),
21852109 // { e1 e2 e3 e4 e5 5 } => { e1 e2 e3 e4 e5 }
21862110 new RemoveInsn(99),
21872111 // => { e1 e2 e3 e4 e5 }
@@ -2240,6 +2164,7 @@
22402164 // }}}2
22412165
22422166 // }}}1
2167+
22432168 // opt-rest-vec-assignment {{{1
22442169
22452170 @Test
@@ -2311,12 +2236,8 @@
23112236 new LabelPseudoInsn("2-valid-args"),
23122237 // => { e1 e2 ,,, en #N #N }
23132238 new DupInsn(99),
2314- // => { e1 e2 ,,, en #N #N 2 }
2315- new KonstInsn(intHolder.of(2), 99),
23162239 // => { e1 e2 ,,, en #N }
2317- new IfEqInsn(99),
2318- // => { e1 e2 ,,, en #N }
2319- new GotoInsn("5-more-than-2", 99),
2240+ new JumpIfNeInsn(intHolder.of(2), "5-more-than-2", 99),
23202241
23212242 // { e1 e2 2 } => { e1 e2 }
23222243 new RemoveInsn(99),
@@ -2345,12 +2266,8 @@
23452266 new LabelPseudoInsn("5-more-than-2"),
23462267 // => { e1 e2 ,,, en #N #N }
23472268 new DupInsn(99),
2348- // => { e1 e2 ,,, en #N #N 3 }
2349- new KonstInsn(intHolder.of(3), 99),
23502269 // => { e1 e2 ,,, en #N }
2351- new IfEqInsn(99),
2352- // => { e1 e2 ,,, en #N }
2353- new GotoInsn("6-more-than-3", 99),
2270+ new JumpIfNeInsn(intHolder.of(3), "6-more-than-3", 99),
23542271
23552272 // => { e1 e2 e3 3 } => { e1 e2 e3 }
23562273 new RemoveInsn(99),
@@ -2448,12 +2365,8 @@
24482365 new SpreadInsn(99),
24492366 // => { ,,, en #N #N }
24502367 new DupInsn(99),
2451- // => { ,,, en #N #N 0 }
2452- new KonstInsn(intHolder.of(0), 99),
24532368 // => { ,,, en #N }
2454- new IfEqInsn(99),
2455- // => { ,,, en #N }
2456- new GotoInsn("4-more-than-0", 99),
2369+ new JumpIfNeInsn(intHolder.of(0), "4-more-than-0", 99),
24572370
24582371 // { 0 } => {}
24592372 new RemoveInsn(99),
@@ -2482,12 +2395,8 @@
24822395 new LabelPseudoInsn("4-more-than-0"),
24832396 // => { ,,, en #N #N }
24842397 new DupInsn(99),
2485- // => { ,,, en #N #N 1 }
2486- new KonstInsn(intHolder.of(1), 99),
24872398 // => { ,,, en #N }
2488- new IfEqInsn(99),
2489- // => { ,,, en #N }
2490- new GotoInsn("5-more-than-1", 99),
2399+ new JumpIfNeInsn(intHolder.of(1), "5-more-than-1", 99),
24912400
24922401 // => { e1 1 } => { e1 }
24932402 new RemoveInsn(99),
@@ -2691,12 +2600,8 @@
26912600 new LabelPseudoInsn("2-valid-args"),
26922601 // => { e1 e2 ,,, en #N #N }
26932602 new DupInsn(99),
2694- // => { e1 e2 ,,, en #N #N 2 }
2695- new KonstInsn(intHolder.of(2), 99),
26962603 // => { e1 e2 ,,, en #N }
2697- new IfEqInsn(99),
2698- // => { e1 e2 ,,, en #N }
2699- new GotoInsn("5-more-than-2", 99),
2604+ new JumpIfNeInsn(intHolder.of(2), "5-more-than-2", 99),
27002605
27012606 // { e1 e2 2 } => { e1 e2 }
27022607 new RemoveInsn(99),
@@ -2725,12 +2630,8 @@
27252630 new LabelPseudoInsn("5-more-than-2"),
27262631 // => { e1 e2 ,,, en #N #N }
27272632 new DupInsn(99),
2728- // => { e1 e2 ,,, en #N #N 3 }
2729- new KonstInsn(intHolder.of(3), 99),
27302633 // => { e1 e2 ,,, en #N }
2731- new IfEqInsn(99),
2732- // => { e1 e2 ,,, en #N }
2733- new GotoInsn("6-more-than-3", 99),
2634+ new JumpIfNeInsn(intHolder.of(3), "6-more-than-3", 99),
27342635
27352636 // => { e1 e2 e3 3 } => { e1 e2 e3 }
27362637 new RemoveInsn(99),
@@ -2856,12 +2757,8 @@
28562757 new LabelPseudoInsn("2-valid-args"),
28572758 // => { e1 e2 ,,, en #N #N }
28582759 new DupInsn(99),
2859- // => { e1 e2 ,,, en #N #N 2 }
2860- new KonstInsn(intHolder.of(2), 99),
28612760 // => { e1 e2 ,,, en #N }
2862- new IfEqInsn(99),
2863- // => { e1 e2 ,,, en #N }
2864- new GotoInsn("6-more-than-2", 99),
2761+ new JumpIfNeInsn(intHolder.of(2), "6-more-than-2", 99),
28652762
28662763 // { e1 e2 2 } => { e1 e2 }
28672764 new RemoveInsn(99),
@@ -2884,12 +2781,8 @@
28842781 new LabelPseudoInsn("6-more-than-2"),
28852782 // => { e1 e2 ,,, en #N #N }
28862783 new DupInsn(99),
2887- // => { e1 e2 ,,, en #N #N 3 }
2888- new KonstInsn(intHolder.of(3), 99),
28892784 // => { e1 e2 ,,, en #N }
2890- new IfEqInsn(99),
2891- // => { e1 e2 ,,, en #N }
2892- new GotoInsn("7-more-than-3", 99),
2785+ new JumpIfNeInsn(intHolder.of(3), "7-more-than-3", 99),
28932786
28942787 // => { e1 e2 e3 3 } => { e1 e2 e3 }
28952788 new RemoveInsn(99),
@@ -2912,12 +2805,8 @@
29122805 new LabelPseudoInsn("7-more-than-3"),
29132806 // => { e1 e2 ,,, en #N #N }
29142807 new DupInsn(99),
2915- // => { e1 e2 ,,, en #N #N 4 }
2916- new KonstInsn(intHolder.of(4), 99),
29172808 // => { e1 e2 ,,, en #N }
2918- new IfEqInsn(99),
2919- // => { e1 e2 ,,, en #N }
2920- new GotoInsn("8-more-than-4", 99),
2809+ new JumpIfNeInsn(intHolder.of(4), "8-more-than-4", 99),
29212810
29222811 // => { e1 e2 e3 e4 4 } => { e1 e2 e3 e4 }
29232812 new RemoveInsn(99),
@@ -3034,12 +2923,8 @@
30342923 new LabelPseudoInsn("2-valid-args"),
30352924 // => { e1 e2 ,,, en #N #N }
30362925 new DupInsn(99),
3037- // => { e1 e2 ,,, en #N #N 4 }
3038- new KonstInsn(intHolder.of(4), 99),
30392926 // => { e1 e2 ,,, en #N }
3040- new IfEqInsn(99),
3041- // => { e1 e2 ,,, en #N }
3042- new GotoInsn("5-more-than-4", 99),
2927+ new JumpIfNeInsn(intHolder.of(4), "5-more-than-4", 99),
30432928
30442929 // { e1 e2 e3 e4 4 } => { e1 e2 e3 e4 }
30452930 new RemoveInsn(99),
@@ -3068,12 +2953,8 @@
30682953 new LabelPseudoInsn("5-more-than-4"),
30692954 // => { e1 e2 ,,, en #N #N }
30702955 new DupInsn(99),
3071- // => { e1 e2 ,,, en #N #N 3 }
3072- new KonstInsn(intHolder.of(5), 99),
30732956 // => { e1 e2 ,,, en #N }
3074- new IfEqInsn(99),
3075- // => { e1 e2 ,,, en #N }
3076- new GotoInsn("6-more-than-5", 99),
2957+ new JumpIfNeInsn(intHolder.of(5), "6-more-than-5", 99),
30772958
30782959 // => { e1 e2 e3 e4 e5 3 } => { e1 e2 e3 e4 e5 }
30792960 new RemoveInsn(99),
@@ -3214,12 +3095,8 @@
32143095 new LabelPseudoInsn("2-valid-args"),
32153096 // => { e1 e2 ,,, en #N #N }
32163097 new DupInsn(99),
3217- // => { e1 e2 ,,, en #N #N 2 }
3218- new KonstInsn(intHolder.of(2), 99),
32193098 // => { e1 e2 ,,, en #N }
3220- new IfEqInsn(99),
3221- // => { e1 e2 ,,, en #N }
3222- new GotoInsn("5-more-than-2", 99),
3099+ new JumpIfNeInsn(intHolder.of(2), "5-more-than-2", 99),
32233100
32243101 // { e1 e2 2 } => { e1 e2 }
32253102 new RemoveInsn(99),
@@ -3248,12 +3125,8 @@
32483125 new LabelPseudoInsn("5-more-than-2"),
32493126 // => { e1 e2 ,,, en #N #N }
32503127 new DupInsn(99),
3251- // => { e1 e2 ,,, en #N #N 3 }
3252- new KonstInsn(intHolder.of(3), 99),
32533128 // => { e1 e2 ,,, en #N }
3254- new IfEqInsn(99),
3255- // => { e1 e2 ,,, en #N }
3256- new GotoInsn("6-more-than-3", 99),
3129+ new JumpIfNeInsn(intHolder.of(3), "6-more-than-3", 99),
32573130
32583131 // => { e1 e2 e3 3 } => { e1 e2 e3 }
32593132 new RemoveInsn(99),
@@ -3390,12 +3263,8 @@
33903263 new LabelPseudoInsn("2-valid-args"),
33913264 // => { e1 e2 ,,, en #N #N }
33923265 new DupInsn(99),
3393- // => { e1 e2 ,,, en #N #N 2 }
3394- new KonstInsn(intHolder.of(2), 99),
33953266 // => { e1 e2 ,,, en #N }
3396- new IfEqInsn(99),
3397- // => { e1 e2 ,,, en #N }
3398- new GotoInsn("5-more-than-2", 99),
3267+ new JumpIfNeInsn(intHolder.of(2), "5-more-than-2", 99),
33993268
34003269 // { e1 e2 2 } => { e1 e2 }
34013270 new RemoveInsn(99),
@@ -3418,12 +3287,8 @@
34183287 new LabelPseudoInsn("5-more-than-2"),
34193288 // => { e1 e2 ,,, en #N #N }
34203289 new DupInsn(99),
3421- // => { e1 e2 ,,, en #N #N 3 }
3422- new KonstInsn(intHolder.of(3), 99),
34233290 // => { e1 e2 ,,, en #N }
3424- new IfEqInsn(99),
3425- // => { e1 e2 ,,, en #N }
3426- new GotoInsn("6-more-than-3", 99),
3291+ new JumpIfNeInsn(intHolder.of(3), "6-more-than-3", 99),
34273292
34283293 // => { e1 e2 e3 3 } => { e1 e2 e3 }
34293294 new RemoveInsn(99),
@@ -3554,12 +3419,8 @@
35543419 new LabelPseudoInsn("2-valid-args"),
35553420 // => { e1 e2 ,,, en #N #N }
35563421 new DupInsn(99),
3557- // => { e1 e2 ,,, en #N #N 2 }
3558- new KonstInsn(intHolder.of(2), 99),
35593422 // => { e1 e2 ,,, en #N }
3560- new IfEqInsn(99),
3561- // => { e1 e2 ,,, en #N }
3562- new GotoInsn("5-more-than-2", 99),
3423+ new JumpIfNeInsn(intHolder.of(2), "5-more-than-2", 99),
35633424
35643425 // { e1 e2 2 } => { e1 e2 }
35653426 new RemoveInsn(99),
@@ -3582,12 +3443,8 @@
35823443 new LabelPseudoInsn("5-more-than-2"),
35833444 // => { e1 e2 ,,, en #N #N }
35843445 new DupInsn(99),
3585- // => { e1 e2 ,,, en #N #N 3 }
3586- new KonstInsn(intHolder.of(3), 99),
35873446 // => { e1 e2 ,,, en #N }
3588- new IfEqInsn(99),
3589- // => { e1 e2 ,,, en #N }
3590- new GotoInsn("6-more-than-3", 99),
3447+ new JumpIfNeInsn(intHolder.of(3), "6-more-than-3", 99),
35913448
35923449 // => { e1 e2 e3 3 } => { e1 e2 e3 }
35933450 new RemoveInsn(99),
@@ -3714,12 +3571,8 @@
37143571 new LabelPseudoInsn("2-valid-args"),
37153572 // => { e1 e2 ,,, en #N #N }
37163573 new DupInsn(99),
3717- // => { e1 e2 ,,, en #N #N 2 }
3718- new KonstInsn(intHolder.of(2), 99),
37193574 // => { e1 e2 ,,, en #N }
3720- new IfEqInsn(99),
3721- // => { e1 e2 ,,, en #N }
3722- new GotoInsn("5-more-than-2", 99),
3575+ new JumpIfNeInsn(intHolder.of(2), "5-more-than-2", 99),
37233576
37243577 // { e1 e2 2 } => { e1 e2 }
37253578 new RemoveInsn(99),
@@ -3748,12 +3601,8 @@
37483601 new LabelPseudoInsn("5-more-than-2"),
37493602 // => { e1 e2 ,,, en #N #N }
37503603 new DupInsn(99),
3751- // => { e1 e2 ,,, en #N #N 3 }
3752- new KonstInsn(intHolder.of(3), 99),
37533604 // => { e1 e2 ,,, en #N }
3754- new IfEqInsn(99),
3755- // => { e1 e2 ,,, en #N }
3756- new GotoInsn("6-more-than-3", 99),
3605+ new JumpIfNeInsn(intHolder.of(3), "6-more-than-3", 99),
37573606
37583607 // => { e1 e2 e3 3 } => { e1 e2 e3 }
37593608 new RemoveInsn(99),
@@ -4052,12 +3901,8 @@
40523901 new SpreadInsn(42),
40533902 // => { \1 \2 e1 e2 ,,, en #N #N }
40543903 new DupInsn(42),
4055- // => { \1 \2 e1 e2 ,,, en #N #N 3 }
4056- new KonstInsn(intHolder.of(3), 42),
40573904 // => { \1 \2 e1 e2 ,,, en #N }
4058- new IfEqInsn(42),
4059- // => { \1 \2 e1 e2 ,,, en #N }
4060- new GotoInsn("2-wrong-number-of-rhs", 42),
3905+ new JumpIfNeInsn(intHolder.of(3), "2-wrong-number-of-rhs", 42),
40613906 // => { \1 \2 e1 e2 e3 3 }
40623907 new GotoInsn("3-valid-args", 42),
40633908
@@ -4173,12 +4018,8 @@
41734018 new SpreadInsn(42),
41744019 // => { \1 \2 e1 e2 ,,, en #N #N }
41754020 new DupInsn(42),
4176- // => { \1 \2 e1 e2 ,,, en #N #N 3 }
4177- new KonstInsn(intHolder.of(3), 42),
41784021 // => { \1 \2 e1 e2 ,,, en #N }
4179- new IfEqInsn(42),
4180- // => { \1 \2 e1 e2 ,,, en #N }
4181- new GotoInsn("2-wrong-number-of-rhs", 42),
4022+ new JumpIfNeInsn(intHolder.of(3), "2-wrong-number-of-rhs", 42),
41824023 // => { \1 \2 e1 e2 e3 3 }
41834024 new GotoInsn("3-valid-args", 42),
41844025
@@ -4300,12 +4141,8 @@
43004141 new SpreadInsn(42),
43014142 // => { \1 \2 e1 e2 ,,, en #N #N }
43024143 new DupInsn(42),
4303- // => { \1 \2 e1 e2 ,,, en #N #N 3 }
4304- new KonstInsn(intHolder.of(3), 42),
43054144 // => { \1 \2 e1 e2 ,,, en #N }
4306- new IfEqInsn(42),
4307- // => { \1 \2 e1 e2 ,,, en #N }
4308- new GotoInsn("2-wrong-number-of-rhs", 42),
4145+ new JumpIfNeInsn(intHolder.of(3), "2-wrong-number-of-rhs", 42),
43094146 // => { \1 \2 e1 e2 e3 3 }
43104147 new GotoInsn("3-valid-args", 42),
43114148
@@ -4425,12 +4262,8 @@
44254262 new SpreadInsn(42),
44264263 // => { \1 \2 e1 e2 ,,, en #N #N }
44274264 new DupInsn(42),
4428- // => { \1 \2 e1 e2 ,,, en #N #N 3 }
4429- new KonstInsn(intHolder.of(3), 42),
44304265 // => { \1 \2 e1 e2 ,,, en #N }
4431- new IfEqInsn(42),
4432- // => { \1 \2 e1 e2 ,,, en #N }
4433- new GotoInsn("2-wrong-number-of-rhs", 42),
4266+ new JumpIfNeInsn(intHolder.of(3), "2-wrong-number-of-rhs", 42),
44344267 // => { \1 \2 e1 e2 e3 3 }
44354268 new GotoInsn("3-valid-args", 42),
44364269
@@ -4852,12 +4685,8 @@
48524685 new SpreadInsn(99),
48534686 // => { e1 e2 ,,, en #N #N }
48544687 new DupInsn(99),
4855- // => { e1 e2 ,,, en #N #N 3 }
4856- new KonstInsn(intHolder.of(3), 99),
48574688 // => { e1 e2 ,,, en #N }
4858- new IfEqInsn(99),
4859- // => { e1 e2 ,,, en #N }
4860- new GotoInsn("3-wrong-number-of-tuple-elems", 99),
4689+ new JumpIfNeInsn(intHolder.of(3), "3-wrong-number-of-tuple-elems", 99),
48614690 // => { e1 e2 e3 3+1 }
48624691 new GotoInsn("4-start-assignment", 99),
48634692
@@ -4967,12 +4796,8 @@
49674796 new SpreadInsn(99),
49684797 // => { e1 e2 ,,, en #N #N }
49694798 new DupInsn(99),
4970- // => { e1 e2 ,,, en #N #N 3 }
4971- new KonstInsn(intHolder.of(3), 99),
49724799 // => { e1 e2 ,,, en #N }
4973- new IfEqInsn(99),
4974- // => { e1 e2 ,,, en #N }
4975- new GotoInsn("3-wrong-number-of-tuple-elems", 99),
4800+ new JumpIfNeInsn(intHolder.of(3), "3-wrong-number-of-tuple-elems", 99),
49764801 // => { e1 e2 e3 3+1 }
49774802 new GotoInsn("4-start-assignment", 99),
49784803
@@ -5079,12 +4904,8 @@
50794904 new SpreadInsn(99),
50804905 // => { e1 e2 ,,, en #N #N }
50814906 new DupInsn(99),
5082- // => { e1 e2 ,,, en #N #N 3 }
5083- new KonstInsn(intHolder.of(3), 99),
50844907 // => { e1 e2 ,,, en #N }
5085- new IfEqInsn(99),
5086- // => { e1 e2 ,,, en #N }
5087- new GotoInsn("3-wrong-number-of-tuple-elems", 99),
4908+ new JumpIfNeInsn(intHolder.of(3), "3-wrong-number-of-tuple-elems", 99),
50884909 // => { e1 e2 e3 3 }
50894910 new GotoInsn("4-start-assignment", 99),
50904911
@@ -5193,12 +5014,8 @@
51935014 new SpreadInsn(99),
51945015 // => { e1 e2 ,,, en #N #N }
51955016 new DupInsn(99),
5196- // => { e1 e2 ,,, en #N #N 3 }
5197- new KonstInsn(intHolder.of(3), 99),
51985017 // => { e1 e2 ,,, en #N }
5199- new IfEqInsn(99),
5200- // => { e1 e2 ,,, en #N }
5201- new GotoInsn("3-wrong-number-of-tuple-elems", 99),
5018+ new JumpIfNeInsn(intHolder.of(3), "3-wrong-number-of-tuple-elems", 99),
52025019 // => { e1 e2 e3 3+1 }
52035020 new GotoInsn("4-start-assignment", 99),
52045021
@@ -5444,14 +5261,8 @@
54445261 // => { $new_val }
54455262 new LderefInsn("new_val", 99),
54465263
5447- // => { $new_val CORE$new_val }
5448- new KonstInsn(vm.binding.newBinding().getVar(vm.sym.getHandle("new_val")), 99),
5449-
54505264 // => {}
5451- new IfEqInsn(99),
5452-
5453- // => {}
5454- new GotoInsn("0-alternative", 99),
5265+ new JumpIfNeInsn(newValFun, "0-alternative", 99),
54555266
54565267 // => { nada }
54575268 new NadaInsn(99),
@@ -5549,14 +5360,8 @@
55495360 // => { $new_val }
55505361 new LderefInsn("new_val", 99),
55515362
5552- // => { $new_val CORE$new_val }
5553- new KonstInsn(vm.binding.newBinding().getVar(vm.sym.getHandle("new_val")), 99),
5554-
55555363 // => {}
5556- new IfEqInsn(99),
5557-
5558- // => {}
5559- new GotoInsn("0-alternative", 99),
5364+ new JumpIfNeInsn(newValFun, "0-alternative", 99),
55605365
55615366 // => { nada }
55625367 new NadaInsn(99),
@@ -5661,14 +5466,8 @@
56615466 // => {$new_val \0 $new_val}
56625467 new LiftInsn(2, 99),
56635468
5664- // => {$new_val \0 $new_val CORE$new_val}
5665- new KonstInsn(vm.binding.newBinding().getVar(vm.sym.getHandle("new_val")), 99),
5666-
56675469 // => {$new_val \0}
5668- new IfEqInsn(99),
5669-
5670- // => {$new_val \0}
5671- new GotoInsn("0-alternative", 99),
5470+ new JumpIfNeInsn(newValFun, "0-alternative", 99),
56725471
56735472 // => {$new_val trait} or {$new_val notTrait}
56745473 new TryTraitInsn(99),
@@ -5801,14 +5600,8 @@
58015600 // => {$new_val \0 $new_val}
58025601 new LiftInsn(2, 99),
58035602
5804- // => {$new_val \0 $new_val CORE$new_val}
5805- new KonstInsn(vm.binding.newBinding().getVar(vm.sym.getHandle("new_val")), 99),
5806-
58075603 // => {$new_val \0}
5808- new IfEqInsn(99),
5809-
5810- // => {$new_val \0}
5811- new GotoInsn("0-alternative", 99),
5604+ new JumpIfNeInsn(newValFun, "0-alternative", 99),
58125605
58135606 // => {$new_val trait} or {$new_val notTrait}
58145607 new TryTraitInsn(99),
@@ -5937,14 +5730,8 @@
59375730 // => {$new_val \0 $new_val}
59385731 new LiftInsn(2, 99),
59395732
5940- // => {$new_val \0 $new_val CORE$new_val}
5941- new KonstInsn(vm.binding.newBinding().getVar(vm.sym.getHandle("new_val")), 99),
5942-
59435733 // => {$new_val \0}
5944- new IfEqInsn(99),
5945-
5946- // => {$new_val \0}
5947- new GotoInsn("0-alternative", 99),
5734+ new JumpIfNeInsn(newValFun, "0-alternative", 99),
59485735
59495736 // => {$new_val trait} or {$new_val notTrait}
59505737 new TryTraitInsn(99),
@@ -6063,14 +5850,8 @@
60635850 // => {$new_val x $new_val}
60645851 new LiftInsn(2, 99),
60655852
6066- // => {$new_val x $new_val CORE$new_val}
6067- new KonstInsn(vm.binding.newBinding().getVar(vm.sym.getHandle("new_val")), 99),
6068-
60695853 // => {$new_val x}
6070- new IfEqInsn(99),
6071-
6072- // => {$new_val x}
6073- new GotoInsn("0-alternative", 99),
5854+ new JumpIfNeInsn(newValFun, "0-alternative", 99),
60745855
60755856 // => {$new_val trait} or {$new_val notTrait}
60765857 new TryTraitInsn(99),
@@ -6139,12 +5920,8 @@
61395920 new DerefInsn("if_else", 107),
61405921 // => { \0 $if_else $if_else }
61415922 new DupInsn(107),
6142- // => { \0 $if_else $if_else true$if_else }
6143- new KonstInsn(vm.bool.trueVal.getVar(vm.sym.getHandle("if_else")), 107),
61445923 // => { \0 $if_else }
6145- new IfEqInsn(107),
6146- // => { \0 $if_else }
6147- new GotoInsn("0-not-true-if_else", 107),
5924+ new JumpIfNeInsn(trueIfElseFun, "0-not-true-if_else", 107),
61485925 // => { \0 }
61495926 new RemoveInsn(107),
61505927 // => {}
@@ -6157,16 +5934,8 @@
61575934 new RetInsn(101),
61585935 // => { \0 $if_else }
61595936 new LabelPseudoInsn("0-not-true-if_else"),
6160- // => { \0 $if_else $if_else }
6161- new DupInsn(107),
6162- // => { \0 $if_else $if_else false$if_else }
6163- new KonstInsn(vm.bool.falseVal.getVar(vm.sym.getHandle("if_else")), 107),
6164- // => { \0 $if_else }
6165- new IfEqInsn(107),
6166- // => { \0 $if_else }
6167- new GotoInsn("1-not-bool-if_else", 107),
61685937 // => { \0 }
6169- new RemoveInsn(107),
5938+ new JumpIfNeInsn(falseIfElseFun, "1-not-bool-if_else", 107),
61705939 // => {}
61715940 new RemoveInsn(107),
61725941 // => {}
@@ -6175,8 +5944,12 @@
61755944 new IderefInsn("F", 102),
61765945 // => bye
61775946 new RetInsn(102),
5947+ // => { \0 }
5948+ new LabelPseudoInsn("1-not-bool-if_else"),
5949+ // => { \0 \0 }
5950+ new DupInsn(107),
61785951 // => { \0 $if_else }
6179- new LabelPseudoInsn("1-not-bool-if_else"),
5952+ new DerefInsn("if_else", 107),
61805953 // => { $if_else \0 }
61815954 new FlipInsn(107),
61825955 // => { $if_else \0 { T } }
@@ -6249,12 +6022,8 @@
62496022 assertThat(indSession.toInsns(branch, TAIL)).containsExactly(
62506023 // => { $branch }
62516024 new IderefInsn("branch", pos),
6252- // => { $branch CORE$branch }
6253- new KonstInsn(vm.binding.newBinding().getVar(vm.sym.getHandle("branch")), pos),
62546025 // => {}
6255- new IfEqInsn(pos),
6256- // => {}
6257- new GotoInsn("0-slowpath", pos),
6026+ new JumpIfNeInsn(branchFun, "0-slowpath", pos),
62586027
62596028 // => {}
62606029 new OnTraceInsn(makeTrace("branch", pos), pos),
@@ -6263,12 +6032,8 @@
62636032 new IderefInsn("C1", 101),
62646033 // => { C1 C1 }
62656034 new DupInsn(pos),
6266- // => { C1 C1 true }
6267- new KonstInsn(vm.bool.trueVal, pos),
62686035 // => { C1 }
6269- new IfEqInsn(pos),
6270- // => { C1 }
6271- new GotoInsn("1-cond-not-true", pos),
6036+ new JumpIfNeInsn(vm.bool.trueVal, "1-cond-not-true", pos),
62726037
62736038 // => {}
62746039 new RemoveInsn(pos),
@@ -6281,12 +6046,8 @@
62816046 new LabelPseudoInsn("1-cond-not-true"),
62826047 // => { C1 C1 }
62836048 new DupInsn(pos),
6284- // => { C1 C1 false }
6285- new KonstInsn(vm.bool.falseVal, pos),
62866049 // => { C1 }
6287- new IfEqInsn(pos),
6288- // => { C1 }
6289- new GotoInsn("2-cond-not-bool", pos),
6050+ new JumpIfNeInsn(vm.bool.falseVal, "2-cond-not-bool", pos),
62906051 // => { false }
62916052 new GotoInsn("3-cond-false", pos),
62926053
@@ -6314,12 +6075,8 @@
63146075 new IderefInsn("C2", 104),
63156076 // => { C2 C2 }
63166077 new DupInsn(pos),
6317- // => { C2 C2 true }
6318- new KonstInsn(vm.bool.trueVal, pos),
63196078 // => { C2 }
6320- new IfEqInsn(pos),
6321- // => { C2 }
6322- new GotoInsn("4-cond-not-true", pos),
6079+ new JumpIfNeInsn(vm.bool.trueVal, "4-cond-not-true", pos),
63236080 // => {}
63246081 new RemoveInsn(pos),
63256082 // => { BF2 }
@@ -6331,12 +6088,8 @@
63316088 new LabelPseudoInsn("4-cond-not-true"),
63326089 // => { C2 C2 }
63336090 new DupInsn(pos),
6334- // => { C2 C2 false }
6335- new KonstInsn(vm.bool.falseVal, pos),
63366091 // => { C2 }
6337- new IfEqInsn(pos),
6338- // => { C2 }
6339- new GotoInsn("5-cond-not-bool", pos),
6092+ new JumpIfNeInsn(vm.bool.falseVal, "5-cond-not-bool", pos),
63406093 // => { false }
63416094 new GotoInsn("6-cond-false", pos),
63426095
@@ -6472,20 +6225,12 @@
64726225 assertThat(indSession.toInsns(branch, TAIL)).containsExactly(
64736226 // => { $branch }
64746227 new IderefInsn("branch", pos),
6475- // => { $branch CORE$branch }
6476- new KonstInsn(vm.binding.newBinding().getVar(vm.sym.getHandle("branch")), pos),
64776228 // => {}
6478- new IfEqInsn(pos),
6479- // => {}
6480- new GotoInsn("0-slowpath", pos),
6229+ new JumpIfNeInsn(branchFun, "0-slowpath", pos),
64816230 // => { $true }
64826231 new IderefInsn("true", pos),
6483- // => { $true CORE$true }
6484- new KonstInsn(vm.binding.newBinding().getVar(vm.sym.getHandle("true")), pos),
64856232 // => {}
6486- new IfEqInsn(pos),
6487- // => {}
6488- new GotoInsn("0-slowpath", pos),
6233+ new JumpIfNeInsn(trueFun, "0-slowpath", pos),
64896234
64906235 // => {}
64916236 new OnTraceInsn(makeTrace("branch", pos), pos),
@@ -6494,12 +6239,8 @@
64946239 new IderefInsn("C1", 101),
64956240 // => { C1 C1 }
64966241 new DupInsn(pos),
6497- // => { C1 C1 true }
6498- new KonstInsn(vm.bool.trueVal, pos),
64996242 // => { C1 }
6500- new IfEqInsn(pos),
6501- // => { C1 }
6502- new GotoInsn("1-cond-not-true", pos),
6243+ new JumpIfNeInsn(vm.bool.trueVal, "1-cond-not-true", pos),
65036244 // => {}
65046245 new RemoveInsn(pos),
65056246 // => { BF1 }
@@ -6511,12 +6252,8 @@
65116252 new LabelPseudoInsn("1-cond-not-true"),
65126253 // => { C1 C1 }
65136254 new DupInsn(pos),
6514- // => { C1 C1 false }
6515- new KonstInsn(vm.bool.falseVal, pos),
65166255 // => { C1 }
6517- new IfEqInsn(pos),
6518- // => { C1 }
6519- new GotoInsn("2-cond-not-bool", pos),
6256+ new JumpIfNeInsn(vm.bool.falseVal, "2-cond-not-bool", pos),
65206257 // => { false }
65216258 new GotoInsn("3-cond-false", pos),
65226259
@@ -6544,12 +6281,8 @@
65446281 new IderefInsn("C2", 104),
65456282 // => { C2 C2 }
65466283 new DupInsn(pos),
6547- // => { C2 C2 true }
6548- new KonstInsn(vm.bool.trueVal, pos),
65496284 // => { C2 }
6550- new IfEqInsn(pos),
6551- // => { C2 }
6552- new GotoInsn("4-cond-not-true", pos),
6285+ new JumpIfNeInsn(vm.bool.trueVal, "4-cond-not-true", pos),
65536286 // => {}
65546287 new RemoveInsn(pos),
65556288 // => { BF2 }
@@ -6561,12 +6294,8 @@
65616294 new LabelPseudoInsn("4-cond-not-true"),
65626295 // => { C2 C2 }
65636296 new DupInsn(pos),
6564- // => { C2 C2 false }
6565- new KonstInsn(vm.bool.falseVal, pos),
65666297 // => { C2 }
6567- new IfEqInsn(pos),
6568- // => { C2 }
6569- new GotoInsn("5-cond-not-bool", pos),
6298+ new JumpIfNeInsn(vm.bool.falseVal, "5-cond-not-bool", pos),
65706299 // => { false }
65716300 new GotoInsn("6-cond-false", pos),
65726301
diff -r 13c7732d0e4b -r 8c12cf7d4152 src/test/kink/stack_machine_test.kn
--- a/src/test/kink/stack_machine_test.kn Sun Oct 25 19:47:26 2020 +0900
+++ b/src/test/kink/stack_machine_test.kn Sun Oct 25 21:03:32 2020 +0900
@@ -263,4 +263,22 @@
263263
264264 # }}}1
265265
266+TEST.group('slow path for if_else'){ # {{{
267+ TEST.test('my true'){
268+ :My_true = new_val(
269+ 'if_else' {(:when_true :when_false) when_true }
270+ )
271+ :Result = My_true.if_else({ 'ok' } { raise('boo') })
272+ Result == 'ok' || raise('got {}'.format(Result.repr))
273+ }
274+
275+ TEST.test('my false'){
276+ :My_false = new_val(
277+ 'if_else' {(:when_true :when_false) when_false }
278+ )
279+ :Result = My_false.if_else({ raise('boo') } { 'ok' })
280+ Result == 'ok' || raise('got {}'.format(Result.repr))
281+ }
282+} # }}}
283+
266284 # vim: et sw=2 sts=2 fdm=marker
Afficher sur ancien navigateur de dépôt.