apple / apple/pkl

Provide proper error message when rendering cyclical objects

Open
#117 1 comment 1 reaction 0 assignees View on GitHub
Dominant language
Java
Stars
11.5k
Forks
402
Avg merge
1d 15h
Merged PRs (30d)
20

Description

## Problem

The `pkl` executable does not properly handle recursive objects.

## Context
### What are/were you trying to achieve?
Trying out pkl
### What’s the impact of this bug/feature?
User Experience for the pkl binary is impacted

## output of `pkl --version`

```
Pkl 0.25.2 (macOS 14.1, native)
```

## Steps to reproduce

- Create a file `recursive.pkl` with the following contents:
```pkl
rec {
rec
}
```
- run `pkl eval recursive.pkl`

## Expected Behavior

A user-friendly error to be displayed

## Actual Behavior

```
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, provided you can share it.

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

java.lang.StackOverflowError

–– Pkl Error ––
Stack overflow

Pkl 0.25.2 (macOS 14.1, native)

java.lang.StackOverflowError
at com.oracle.svm.core.graal.snippets.StackOverflowCheckImpl.newStackOverflowError0(StackOverflowCheckImpl.java:333)
at com.oracle.svm.core.graal.snippets.StackOverflowCheckImpl.newStackOverflowError(StackOverflowCheckImpl.java:329)
at com.oracle.svm.core.graal.snippets.StackOverflowCheckImpl.throwNewStackOverflowError(StackOverflowCheckImpl.java:309)
at com.oracle.svm.core.graal.jdk.SubstrateArraycopySnippets.doArraycopy(SubstrateArraycopySnippets.java:81)
at java.base@11.0.18/java.lang.String.getBytes(String.java:3192)
at java.base@11.0.18/java.lang.AbstractStringBuilder.putStringAt(AbstractStringBuilder.java:1667)
at java.base@11.0.18/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:539)
at java.base@11.0.18/java.lang.StringBuilder.append(StringBuilder.java:178)
at org.pkl.core.stdlib.AbstractRenderer.increaseIndent(AbstractRenderer.java:419)
at org.pkl.core.stdlib.base.PcfRenderer.startObject(PcfRenderer.java:314)
at org.pkl.core.stdlib.base.PcfRenderer.startDynamic(PcfRenderer.java:172)
at org.pkl.core.stdlib.AbstractRenderer.visitDynamic(AbstractRenderer.java:266)
at org.pkl.core.runtime.VmDynamic.accept(VmDynamic.java:92)
at org.pkl.core.runtime.VmValueVisitor.visit(VmValueVisitor.java:65)
at org.pkl.core.stdlib.AbstractRenderer.visit(AbstractRenderer.java:126)
at org.pkl.core.stdlib.base.PcfRenderer.visitStandaloneValue(PcfRenderer.java:227)
at org.pkl.core.stdlib.base.PcfRenderer.visitElement(PcfRenderer.java:213)
at org.pkl.core.stdlib.AbstractRenderer.doVisitElement(AbstractRenderer.java:234)
at org.pkl.core.stdlib.AbstractRenderer.lambda$visitDynamic$1(AbstractRenderer.java:283)
at org.pkl.core.runtime.VmObject.lambda$iterateAlreadyForcedMemberValues$1(VmObject.java:132)
at org.pkl.core.runtime.VmObject.iterateMembers(VmObject.java:148)
[...]
at org.pkl.core.runtime.VmObject.iterateAlreadyForcedMemberValues(VmObject.java:124)
at org.pkl.core.runtime.VmObject.forceAndIterateMemberValues(VmObject.java:117)
at org.pkl.core.stdlib.AbstractRenderer.visitDynamic(AbstractRenderer.java:273)
at org.pkl.core.runtime.VmDynamic.accept(VmDynamic.java:92)
at org.pkl.core.runtime.VmValueVisitor.visit(VmValueVisitor.java:65)
at org.pkl.core.stdlib.AbstractRenderer.visit(AbstractRenderer.java:126)
at org.pkl.core.stdlib.base.PcfRenderer.visitStandaloneValue(PcfRenderer.java:227)
at org.pkl.core.stdlib.base.PcfRenderer.visitElement(PcfRenderer.java:213)
at org.pkl.core.stdlib.AbstractRenderer.doVisitElement(AbstractRenderer.java:234)
at org.pkl.core.stdlib.AbstractRenderer.lambda$visitDynamic$1(AbstractRenderer.java:283)
at org.pkl.core.runtime.VmObject.lambda$iterateAlreadyForcedMemberValues$1(VmObject.java:132)
at org.pkl.core.runtime.VmObject.iterateMembers(VmObject.java:148)
at org.pkl.core.runtime.VmObject.iterateAlreadyForcedMemberValues(VmObject.java:124)
at org.pkl.core.runtime.VmObject.forceAndIterateMemberValues(VmObject.java:117)
at org.pkl.core.stdlib.AbstractRenderer.visitDynamic(AbstractRenderer.java:273)
at org.pkl.core.runtime.VmDynamic.accept(VmDynamic.java:92)
at org.pkl.core.runtime.VmValueVisitor.visit(VmValueVisitor.java:65)
at org.pkl.core.stdlib.AbstractRenderer.visit(AbstractRenderer.java:126)
at org.pkl.core.stdlib.base.PcfRenderer.visitStandaloneValue(PcfRenderer.java:227)
```

(Error Message is abbreviated as the actual backtrace is 1039 lines long)

Contributor guide

Open the contributing guide

Research direction

Start by running `pkl eval recursive.pkl` with the recursive object from the report and inspect the renderer stack trace, especially `AbstractRenderer` and `PcfRenderer`. Trace how `VmObject` and `VmDynamic` revisit the object, then verify that the command reports a user-friendly error instead of `StackOverflowError` and the long unexpected-error output.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
compilers
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.