correct latest out of bounds panic, use first argument indexing in maplists/{2..9}

This commit is contained in:
Mark Thom
2019-10-12 01:20:42 -06:00
parent f898b98b06
commit 5893ff4231
2 changed files with 63 additions and 32 deletions

View File

@@ -50,42 +50,58 @@ reverse([], [], YsRev, YsRev).
reverse([X1|Xs], [Y1|Ys], YsPreludeRev, Xss) :- reverse([X1|Xs], [Y1|Ys], YsPreludeRev, Xss) :-
reverse(Xs, Ys, [Y1|YsPreludeRev], Xss). reverse(Xs, Ys, [Y1|YsPreludeRev], Xss).
maplist(_, []). maplist_([], _).
maplist(Cont1, [E1|E1s]) :- maplist_([E1|E1s], Cont) :-
call(Cont1, E1), call(Cont, E1),
maplist(Cont1, E1s). maplist_(E1s, Cont).
maplist(_, [], []). maplist(Cont, Es) :- maplist_(Es, Cont).
maplist(Cont2, [E1|E1s], [E2|E2s]) :-
call(Cont2, E1, E2),
maplist(Cont2, E1s, E2s).
maplist(_, [], [], []). maplist_([], _, []).
maplist(Cont3, [E1|E1s], [E2|E2s], [E3|E3s]) :- maplist_([E1|E1s], Cont, [E2|E2s]) :-
call(Cont3, E1, E2, E3), call(Cont, E1, E2),
maplist(Cont3, E1s, E2s, E3s). maplist_(E1s, Cont, E2s).
maplist(_, [], [], [], []). maplist(Cont, Es1, Es2) :- maplist_(Es1, Cont, Es2).
maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s]) :-
maplist_([], Cont, [], []).
maplist_([E1|E1s], Cont, [E2|E2s], [E3|E3s]) :-
call(Cont, E1, E2, E3),
maplist_(E1s, Cont, E2s, E3s).
maplist(Cont, Es1, Es2, Es3) :- maplist_(Es1, Cont, Es2, Es3).
maplist_([], _, [], [], []).
maplist_([E1|E1s], Cont, [E2|E2s], [E3|E3s], [E4|E4s]) :-
call(Cont, E1, E2, E3, E4), call(Cont, E1, E2, E3, E4),
maplist(Cont, E1s, E2s, E3s, E4s). maplist_(E1s, Cont, E2s, E3s, E4s).
maplist(_, [], [], [], [], []). maplist(Cont, Es1, Es2, Es3, Es4) :- maplist_(Es1, Cont, Es2, Es3, Es4).
maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s]) :-
maplist_([], _, [], [], [], []).
maplist_([E1|E1s], Cont, [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s]) :-
call(Cont, E1, E2, E3, E4, E5), call(Cont, E1, E2, E3, E4, E5),
maplist(Cont, E1s, E2s, E3s, E4s, E5s). maplist_(E1s, Cont, E2s, E3s, E4s, E5s).
maplist(_, [], [], [], [], [], []). maplist(Cont, Es1, Es2, Es3, Es4, Es5) :- maplist_(Es1, Cont, Es2, Es3, Es4, Es5).
maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s]) :-
maplist_([], _, [], [], [], [], []).
maplist_([E1|E1s], Cont, [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s]) :-
call(Cont, E1, E2, E3, E4, E5, E6), call(Cont, E1, E2, E3, E4, E5, E6),
maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s). maplist_(E1s, Cont, E2s, E3s, E4s, E5s, E6s).
maplist(_, [], [], [], [], [], [], []). maplist(Cont, Es1, Es2, Es3, Es4, Es5, Es6) :- maplist_(Es1, Cont, Es2, Es3, Es4, Es6, Es6).
maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7s]) :-
call(Cont, E1, E2, E3, E4, E5, E6, E7),
maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s, E7s).
maplist(_, [], [], [], [], [], [], [], []). maplist_([], _, [], [], [], [], [], []).
maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7s], [E8|E8s]) :- maplist_([E1|E1s], Cont, [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7s]) :-
call(Cont, E1, E2, E3, E4, E5, E6, E7), call(Cont, E1, E2, E3, E4, E5, E6, E7),
maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s, E7s, E8s). maplist_(E1s, Cont, E2s, E3s, E4s, E5s, E6s, E7s).
maplist(Cont, Es1, Es2, Es3, Es4, Es5, Es6, Es7) :- maplist_(Es1, Cont, Es2, Es3, Es4, Es6, Es6, Es7).
maplist_([], _, [], [], [], [], [], [], []).
maplist_([E1|E1s], Cont, [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7s], [E8|E8s]) :-
call(Cont, E1, E2, E3, E4, E5, E6, E7, E8),
maplist_(E1s, Cont, E2s, E3s, E4s, E5s, E6s, E7s, E8s).
maplist(Cont, Es1, Es2, Es3, Es4, Es5, Es6, Es7, Es8) :- maplist_(Es1, Cont, Es2, Es3, Es4, Es6, Es6, Es7, Es8).

View File

@@ -972,9 +972,17 @@ impl MachineState {
if let Addr::Lis(l1) = ls0 { if let Addr::Lis(l1) = ls0 {
if let Addr::Lis(l2) = self.store(self.deref(Addr::HeapCell(l1 + 1))) { if let Addr::Lis(l2) = self.store(self.deref(Addr::HeapCell(l1 + 1))) {
let addr = self.heap[l1 + 1].as_addr(l1 + 1); let old_addr = self.heap[l1 + 1].as_addr(l1 + 1);
self.heap[l1 + 1] = HeapCellValue::Addr(Addr::HeapCell(l2 + 1));
self.trail(TrailRef::AttrVarLink(l1 + 1, addr)); let tail = self.store(self.deref(Addr::HeapCell(l2 + 1)));
let tail = if tail.is_ref() {
Addr::HeapCell(l1 + 1)
} else {
tail
};
self.heap[l1 + 1] = HeapCellValue::Addr(tail);
self.trail(TrailRef::AttrVarLink(l1 + 1, old_addr));
} }
} }
} }
@@ -988,7 +996,14 @@ impl MachineState {
match addr { match addr {
Addr::Lis(l) => { Addr::Lis(l) => {
self.heap[h + 1] = HeapCellValue::Addr(Addr::HeapCell(l + 1)); let tail = self.store(self.deref(Addr::HeapCell(l + 1)));
let tail = if tail.is_ref() {
Addr::HeapCell(h + 1)
} else {
tail
};
self.heap[h + 1] = HeapCellValue::Addr(tail);
self.trail(TrailRef::AttrVarLink(h + 1, Addr::Lis(l))); self.trail(TrailRef::AttrVarLink(h + 1, Addr::Lis(l)));
} }
_ => unreachable!(), _ => unreachable!(),