Skip to content

Commit 76914ec

Browse files
committed
Merge pull request #227 from kennytm/top-level-pack-with-repl
Fix bug with PackWithReplacements when replacing top-level object with complex values.
2 parents bdeaf6c + 6a3936f commit 76914ec

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

platform-test/base/pickle.oz

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import
2626
%BootPickle(pack:Pack unpack:Unpack) at 'x-oz://boot/Pickle'
2727
Pickle(pack:Pack unpack:Unpack packWithReplacements:PackWithReplacements)
2828
BootName(newUnique:NewUniqueName newNamed:NewNamedName) at 'x-oz://boot/Name'
29-
System
3029
export
3130
Return
3231
define
@@ -140,5 +139,16 @@ define
140139
true = (A \= B)
141140
end
142141
)
142+
143+
packWithReplacementsTopLevel(
144+
proc {$}
145+
A = {NewCell 1}
146+
VBS = {PackWithReplacements A [A#(a(b))]}
147+
U = {Unpack VBS}
148+
in
149+
true = {IsCell A}
150+
U = a(b)
151+
end
152+
)
143153
])
144154
end

vm/vm/main/pickler.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,6 @@ void Pickler::pickle(RichNode value, RichNode temporaryReplacement) {
7575
auto typesRecord = RichNode(*vm->getPickleTypesRecord()).as<Record>();
7676
auto statelessTypes = RichNode(*typesRecord.getArity()).as<Arity>();
7777

78-
SerializationCallback cb(vm);
79-
UnstableNode topLevelIndex = OptVar::build(vm);
80-
cb.copy(topLevelIndex, value);
81-
8278
bool futures = false;
8379
nativeint count = 0;
8480
VMAllocatedList<NodeBackup> nodeBackups;
@@ -104,10 +100,15 @@ void Pickler::pickle(RichNode value, RichNode temporaryReplacement) {
104100
nodeReplacementBackups.push_front(vm, replacement.first.makeBackup());
105101
replacement.first.reinit(vm, replacement.second);
106102
}
103+
value.update();
107104

108105
replacements.clear(vm);
109106
}
110107

108+
SerializationCallback cb(vm);
109+
UnstableNode topLevelIndex = OptVar::build(vm);
110+
cb.copy(topLevelIndex, value);
111+
111112
// Replace serialized nodes by Serialized(index)
112113
// and add them to the nodes list
113114
while (!cb.todoFrom.empty()) {

0 commit comments

Comments
 (0)