Fix bug in force (#1790)

This commit is contained in:
Islon Scherer
2026-07-28 09:19:15 +02:00
committed by GitHub
parent 67df676359
commit 1a3dc52a96
3 changed files with 55 additions and 0 deletions
@@ -156,8 +156,11 @@ public abstract class VmObject extends VmObjectLike {
public final void force(boolean allowUndefinedValues, boolean recurse) {
if (forced) return;
// set eagerly to break reference cycles
if (recurse) forced = true;
var fullyForced = true;
try {
for (VmObjectLike owner = this; owner != null; owner = owner.getParent()) {
var cursor = EconomicMaps.getEntries(owner.getMembers());
@@ -177,6 +180,7 @@ public abstract class VmObject extends VmObjectLike {
memberValue = VmUtils.doReadMember(this, owner, memberKey, member);
} catch (VmUndefinedValueException e) {
if (!allowUndefinedValues) throw e;
fullyForced = false;
continue;
}
}
@@ -190,6 +194,9 @@ public abstract class VmObject extends VmObjectLike {
forced = false;
throw t;
}
// make sure uncached values are not marked as forced
if (recurse && !fullyForced) forced = false;
}
@Override
@@ -0,0 +1,21 @@
undefinedValue: String
items = new Listing {
undefinedValue
}
lookup = new Mapping {
["x"] = 1
}
result =
let (_ = trace(items))
new Listing {
for (item in items) {
lookup.containsKey(item)
}
}
output {
value = result
}
@@ -0,0 +1,27 @@
–– Pkl Error ––
Tried to read property `undefinedValue` but its value is undefined.
x | undefinedValue: String
^^^^^^^^^^^^^^
at traceThenIterateUndefinedMember#undefinedValue (file:///$snippetsDir/input/errors/traceThenIterateUndefinedMember.pkl)
x | undefinedValue
^^^^^^^^^^^^^^
at traceThenIterateUndefinedMember#items[#1] (file:///$snippetsDir/input/errors/traceThenIterateUndefinedMember.pkl)
xx | let (_ = trace(items))
^^^^^^^^^^^^^^^^^^^^^^
at traceThenIterateUndefinedMember#result.<let expr> (file:///$snippetsDir/input/errors/traceThenIterateUndefinedMember.pkl)
xx | value = result
^^^^^^
at traceThenIterateUndefinedMember#output.value (file:///$snippetsDir/input/errors/traceThenIterateUndefinedMember.pkl)
xxx | renderer.renderDocument(value)
^^^^^
at pkl.base#Module.output.text (pkl:base)
xxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8")
^^^^
at pkl.base#Module.output.bytes (pkl:base)
pkl: TRACE: items = new Listing { ? } (file:///$snippetsDir/input/errors/traceThenIterateUndefinedMember.pkl)