#1866·pkl

Attempting to `trace()` values that can't be evaluated causes a NullPointerException

Author: rohan-datarCreated Sep 18, 2026Updated Sep 18, 2026

I first noticed this when I tried to use trace() to debug a stack overflow error in a Mapping object. A very simple reproduction of what I was working with:

pkl
m = new Mapping { ["b"] = y }
x = trace(m)
y = m.toMap().filter((k, v) -> true).length

Trying to evaluate this results in a NullPointerException:

stack trace
java.lang.NullPointerException

–– Pkl Error ––
None (cause has no message)

3620 | external function filter(predicate: (Key, Value) -> Boolean): Map<Key, Value>
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Map.filter (https://github.com/apple/pkl/blob/0.32.1/stdlib/base.pkl#L3620)

3 | y = m.toMap().filter((k, v) -> true).length
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at crash#y (file:///home/rdatar/test/pkl/imports/crash.pkl, line 3)

1 | m = new Mapping { ["b"] = y }
                              ^
at crash#m["b"] (file:///home/rdatar/test/pkl/imports/crash.pkl, line 1)

131 | renderer.renderDocument(value)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.32.1/stdlib/base.pkl#L131)

135 | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8")
                                                                         ^^^^
at pkl.base#Module.output.bytes (https://github.com/apple/pkl/blob/0.32.1/stdlib/base.pkl#L135)

Pkl 0.32.1 (Linux 6.17.0-1020-azure, native)

java.lang.NullPointerException
        at [email protected]/java.util.Objects.requireNonNull(Objects.java:220)
        at [email protected]/java.util.KeyValueHolder.<init>(KeyValueHolder.java:62)
        at [email protected]/java.util.Map.entry(Map.java:1719)
        at org.pkl.core.runtime.VmMap$1.next(VmMap.java:103)
        at org.pkl.core.runtime.VmMap$1.next(VmMap.java:88)
        at org.pkl.core.stdlib.base.MapNodes$filter.eval(MapNodes.java:117)
        at org.pkl.core.stdlib.base.MapNodesFactory$filterNodeGen.executeAndSpecialize(MapNodesFactory.java:957)
        at org.pkl.core.stdlib.base.MapNodesFactory$filterNodeGen.executeGeneric(MapNodesFactory.java:946)
        at org.pkl.core.ast.member.FunctionNode.executeImpl(FunctionNode.java:116)
        at org.pkl.core.ast.PklRootNode.execute(PklRootNode.java:46)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:830)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:754)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:678)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:124)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:233)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:106)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:610)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:94)
        at org.pkl.core.ast.expression.member.InvokeMethodVirtualNode.evalCached(InvokeMethodVirtualNode.java:137)
        at org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen.executeAndSpecialize(InvokeMethodVirtualNodeGen.java:268)
        at org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen.executeGeneric(InvokeMethodVirtualNodeGen.java:189)
        at org.pkl.core.ast.expression.member.ReadPropertyNodeGen.executeGeneric(ReadPropertyNodeGen.java:76)
        at org.pkl.core.ast.member.TypeCheckedPropertyNode.evalTypedObjectCached(TypeCheckedPropertyNode.java:54)
        at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.executeAndSpecialize(TypeCheckedPropertyNodeGen.java:132)
        at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.executeImpl(TypeCheckedPropertyNodeGen.java:97)
        at org.pkl.core.ast.PklRootNode.execute(PklRootNode.java:46)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:830)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:754)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:678)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:124)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:233)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:106)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:610)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedIndirectCallNode.call(OptimizedIndirectCallNode.java:68)
        at org.pkl.core.runtime.VmUtils.doReadMember(VmUtils.java:402)
        at org.pkl.core.runtime.VmUtils.readMemberOrNull(VmUtils.java:331)
        at org.pkl.core.ast.expression.member.ReadPropertyNode.evalObject(ReadPropertyNode.java:112)
        at org.pkl.core.ast.expression.member.ReadPropertyNodeGen.executeAndSpecialize(ReadPropertyNodeGen.java:142)
        at org.pkl.core.ast.expression.member.ReadPropertyNodeGen.executeGeneric(ReadPropertyNodeGen.java:104)
        at org.pkl.core.ast.member.ElementOrEntryNode.evalMapping(ElementOrEntryNode.java:63)
        at org.pkl.core.ast.member.ElementOrEntryNodeGen.executeAndSpecialize(ElementOrEntryNodeGen.java:125)
        at org.pkl.core.ast.member.ElementOrEntryNodeGen.executeImpl(ElementOrEntryNodeGen.java:82)
        at org.pkl.core.ast.PklRootNode.execute(PklRootNode.java:46)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:830)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:754)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:678)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:124)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:233)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:106)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:610)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.call(OptimizedCallTarget.java:556)
        at org.graalvm.truffle/com.oracle.truffle.api.nodes.IndirectCallNode$1.call(IndirectCallNode.java:96)
        at org.pkl.core.runtime.VmUtils.doReadMember(VmUtils.java:402)
        at org.pkl.core.runtime.VmUtils.doReadMember(VmUtils.java:304)
        at org.pkl.core.runtime.VmObject.force(VmObject.java:177)
        at org.pkl.core.runtime.VmObject.force(VmObject.java:197)
        at org.pkl.core.runtime.VmValue.force(VmValue.java:67)
        at org.pkl.core.ast.expression.unary.TraceNode.doTrace(TraceNode.java:48)
        at org.pkl.core.ast.expression.unary.TraceNode.executeGeneric(TraceNode.java:42)
        at org.pkl.core.ast.member.TypeCheckedPropertyNode.evalTypedObjectCached(TypeCheckedPropertyNode.java:54)
        at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.executeAndSpecialize(TypeCheckedPropertyNodeGen.java:132)
        at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.executeImpl(TypeCheckedPropertyNodeGen.java:97)
        at org.pkl.core.ast.PklRootNode.execute(PklRootNode.java:46)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:830)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:754)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:678)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:124)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:233)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:106)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:610)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.call(OptimizedCallTarget.java:556)
        at org.graalvm.truffle/com.oracle.truffle.api.nodes.IndirectCallNode$1.call(IndirectCallNode.java:96)
        at org.pkl.core.runtime.VmUtils.doReadMember(VmUtils.java:402)
        at org.pkl.core.runtime.VmUtils.doReadMember(VmUtils.java:304)
        at org.pkl.core.runtime.VmObject.force(VmObject.java:177)
        at org.pkl.core.stdlib.AbstractRenderer.visitTyped(AbstractRenderer.java:189)
        at org.pkl.core.stdlib.base.PcfRenderer.visitTyped(PcfRenderer.java:74)
        at org.pkl.core.runtime.VmTyped.accept(VmTyped.java:180)
        at org.pkl.core.runtime.VmValueVisitor.visit(VmValueVisitor.java:69)
        at org.pkl.core.stdlib.AbstractRenderer.visit(AbstractRenderer.java:119)
        at org.pkl.core.stdlib.base.PcfRenderer.visitDocument(PcfRenderer.java:159)
        at org.pkl.core.stdlib.AbstractRenderer.renderDocument(AbstractRenderer.java:94)
        at org.pkl.core.stdlib.base.PcfRendererNodes$renderDocument.eval(PcfRendererNodes.java:32)
        at org.pkl.core.stdlib.base.PcfRendererNodesFactory$renderDocumentNodeGen.executeGeneric(PcfRendererNodesFactory.java:72)
        at org.pkl.core.ast.member.FunctionNode.executeImpl(FunctionNode.java:116)
        at org.pkl.core.ast.PklRootNode.execute(PklRootNode.java:46)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:830)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:754)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:678)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:124)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:233)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:106)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:610)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:94)
        at org.pkl.core.ast.expression.member.InvokeMethodVirtualNode.evalCached(InvokeMethodVirtualNode.java:137)
        at org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen.executeGeneric(InvokeMethodVirtualNodeGen.java:173)
        at org.pkl.core.ast.expression.ternary.IfElseNode.executeGeneric(IfElseNode.java:48)
        at org.pkl.core.ast.member.TypeCheckedPropertyNode.evalTypedObjectCached(TypeCheckedPropertyNode.java:54)
        at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.executeImpl(TypeCheckedPropertyNodeGen.java:75)
        at org.pkl.core.ast.PklRootNode.execute(PklRootNode.java:46)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:830)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:754)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:678)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:124)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:233)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:106)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:610)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedIndirectCallNode.call(OptimizedIndirectCallNode.java:68)
        at org.pkl.core.runtime.VmUtils.doReadMember(VmUtils.java:402)
        at org.pkl.core.runtime.VmUtils.readMemberOrNull(VmUtils.java:331)
        at org.pkl.core.ast.expression.member.ReadPropertyNode.evalObject(ReadPropertyNode.java:112)
        at org.pkl.core.ast.expression.member.ReadPropertyNodeGen.executeGeneric(ReadPropertyNodeGen.java:87)
        at org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen.executeGeneric(InvokeMethodVirtualNodeGen.java:143)
        at org.pkl.core.ast.expression.ternary.IfElseNode.executeGeneric(IfElseNode.java:49)
        at org.pkl.core.ast.member.TypeCheckedPropertyNode.evalTypedObjectCached(TypeCheckedPropertyNode.java:54)
        at org.pkl.core.ast.member.TypeCheckedPropertyNodeGen.executeImpl(TypeCheckedPropertyNodeGen.java:75)
        at org.pkl.core.ast.PklRootNode.execute(PklRootNode.java:46)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:830)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:754)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:678)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.invokeCallBoundary(SubstrateOptimizedCallTarget.java:124)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTargetInstalledCode.doInvoke(SubstrateOptimizedCallTargetInstalledCode.java:233)
        at org.graalvm.truffle.runtime.svm/com.oracle.svm.truffle.api.SubstrateOptimizedCallTarget.doInvoke(SubstrateOptimizedCallTarget.java:106)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:610)
        at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.OptimizedCallTarget.call(OptimizedCallTarget.java:556)
        at org.graalvm.truffle/com.oracle.truffle.api.nodes.IndirectCallNode$1.call(IndirectCallNode.java:96)
        at org.pkl.core.runtime.VmUtils.doReadMember(VmUtils.java:402)
        at org.pkl.core.runtime.VmUtils.readMemberOrNull(VmUtils.java:331)
        at org.pkl.core.runtime.VmUtils.readMemberOrNull(VmUtils.java:294)
        at org.pkl.core.runtime.VmUtils.readMember(VmUtils.java:274)
        at org.pkl.core.runtime.VmUtils.readBytesProperty(VmUtils.java:226)
        at org.pkl.core.EvaluatorImpl.lambda$evaluateOutputBytes$0(EvaluatorImpl.java:171)
        at org.pkl.core.EvaluatorImpl.lambda$doEvaluate$0(EvaluatorImpl.java:470)
        at org.pkl.core.EvaluatorImpl.doEvaluate(EvaluatorImpl.java:388)
        at org.pkl.core.EvaluatorImpl.doEvaluate(EvaluatorImpl.java:466)
        at org.pkl.core.EvaluatorImpl.evaluateOutputBytes(EvaluatorImpl.java:167)
        at org.pkl.cli.CliEvaluator.writeOutput(CliEvaluator.kt:205)
        at org.pkl.cli.CliEvaluator.doRun(CliEvaluator.kt:105)
        at org.pkl.commons.cli.CliCommand.run(CliCommand.kt:48)
        at org.pkl.cli.commands.EvalCommand.run(EvalCommand.kt:100)
        at com.github.ajalt.clikt.core.CoreCliktCommandKt.parse(CoreCliktCommand.kt:107)
        at com.github.ajalt.clikt.core.CoreCliktCommandKt.main(CoreCliktCommand.kt:78)
        at com.github.ajalt.clikt.core.CoreCliktCommandKt.main(CoreCliktCommand.kt:90)
        at org.pkl.cli.Main.main$lambda$0(Main.kt:26)
        at org.pkl.commons.cli.CliMainKt.cliMain(CliMain.kt:33)
        at org.pkl.cli.Main.main(Main.kt:26)
        at [email protected]/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)

Without trace() this produces a pkl stack overflow error:

–– Pkl Error ––
A stack overflow occurred.

┌─ 3592 repetitions of:
│ 1 | m = new Mapping { ["b"] = y }
│                               ^
│ at crash#m["b"] (file:///home/rdatar/test/pkl/imports/crash.pkl, line 1)
│
│ 3 | y = m.toMap().filter((k, v) -> true).length
│         ^^^^^^^^^
│ at crash#y (file:///home/rdatar/test/pkl/imports/crash.pkl, line 3)
└─

131 | renderer.renderDocument(value)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.32.1/stdlib/base.pkl#L131)

135 | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8")
                                                                         ^^^^
at pkl.base#Module.output.bytes (https://github.com/apple/pkl/blob/0.32.1/stdlib/base.pkl#L135)

This also seems to apply to any traced value that can't be properly evaluated. For example:

pkl
class C {
  v: Int
}
c = new C {}
x = trace(c)

Also results in a NPE

stack trace
pkl: TRACE: c = new C { v = ? } (file:///home/rdatar/test/pkl/imports/crash2.pkl, line 7)
An unexpected error has occurred. Would you mind filing a bug report?
Cmd+Double-click the link below to open an issue.
Please copy and paste the entire error output into the issue's description.

https://github.com/apple/pkl/issues/new

java.lang.IllegalArgumentException%3A%20Cannot%20convert%20VM%20value%20with%20unexpected%20type%3A%20null

–– Pkl Error ––
Cannot convert VM value with unexpected type: null

471 | external function renderDocument(value: Any): String
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#PcfRenderer.renderDocument (https://github.com/apple/pkl/blob/0.32.1/stdlib/base.pkl#L471)

131 | renderer.renderDocument(value)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.32.1/stdlib/base.pkl#L131)

135 | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes("UTF-8")
                                                                         ^^^^
at pkl.base#Module.output.bytes (https://github.com/apple/pkl/blob/0.32.1/stdlib/base.pkl#L135)

Pkl 0.32.1 (Linux 6.17.0-1020-azure, native)

java.lang.IllegalArgumentException: Cannot convert VM value with unexpected type: null
        at org.pkl.core.runtime.VmValueConverter.convert(VmValueConverter.java:110)
        at org.pkl.core.stdlib.AbstractRenderer.doVisitProperty(AbstractRenderer.java:350)
        at org.pkl.core.stdlib.Abstract