From 5cb5d41a44fd689de71b62f2e306d410f8446abb Mon Sep 17 00:00:00 2001 From: Daniel Chao Date: Fri, 30 Oct 2026 14:45:36 -0700 Subject: [PATCH] Fix VmDynamicCursor (#1948) This fixes an issue where it fails to iterate over this entry: `new Dynamic { [-1] = 2 }` --- .../java/org/pkl/core/runtime/VmDynamicCursors.java | 12 ++++++------ .../files/LanguageSnippetTests/input/api/map.pkl | 6 ++++++ .../files/LanguageSnippetTests/output/api/map.pcf | 5 +++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pkl-core/src/main/java/org/pkl/core/runtime/VmDynamicCursors.java b/pkl-core/src/main/java/org/pkl/core/runtime/VmDynamicCursors.java index 5e1c42856..1dee6df2c 100644 --- a/pkl-core/src/main/java/org/pkl/core/runtime/VmDynamicCursors.java +++ b/pkl-core/src/main/java/org/pkl/core/runtime/VmDynamicCursors.java @@ -102,7 +102,7 @@ final class VmDynamicCursors { @Override protected boolean shouldVisit(Object key) { - return key instanceof Long l && l < iteratee.getLength(); + return key instanceof Long l && l >= 0 && l < iteratee.getLength(); } @Override @@ -121,7 +121,7 @@ final class VmDynamicCursors { if (member.isProp()) { return false; } - return !(key() instanceof Long l) || l >= iteratee.getLength(); + return !(key() instanceof Long l) || l < 0 || l >= iteratee.getLength(); } @Override @@ -140,7 +140,7 @@ final class VmDynamicCursors { if (member.isProp()) { return false; } - return !(key() instanceof Long l) || l >= iteratee.getLength(); + return !(key() instanceof Long l) || l < 0 || l >= iteratee.getLength(); } @Override @@ -157,7 +157,7 @@ final class VmDynamicCursors { @Override protected boolean shouldVisit(Object key) { if (key instanceof Identifier) return false; - if (key instanceof Long l) return l >= iteratee.getLength(); + if (key instanceof Long l) return l < 0 || l >= iteratee.getLength(); return true; } @@ -184,7 +184,7 @@ final class VmDynamicCursors { @Override public boolean isElement() { - return key() instanceof Long l && l < iteratee.getLength(); + return key() instanceof Long l && l >= 0 && l < iteratee.getLength(); } @Override @@ -210,7 +210,7 @@ final class VmDynamicCursors { @Override public boolean isElement() { - return key() instanceof Long l && l < iteratee.getLength(); + return key() instanceof Long l && l >= 0 && l < iteratee.getLength(); } @Override diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/api/map.pkl b/pkl-core/src/test/files/LanguageSnippetTests/input/api/map.pkl index 4a178cb1a..b56fedea7 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/api/map.pkl +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/api/map.pkl @@ -115,6 +115,12 @@ examples { map1.toDynamic() } + ["toDynamic() round-trip"] { + Map(-1, 2).toDynamic().toMap() + Map(0, 2).toDynamic().toMap() + Map(1, 2).toDynamic().toMap() + } + ["toMapping()"] { Map().toMapping() map1.toMapping() diff --git a/pkl-core/src/test/files/LanguageSnippetTests/output/api/map.pcf b/pkl-core/src/test/files/LanguageSnippetTests/output/api/map.pcf index 785937863..59fe43198 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/output/api/map.pcf +++ b/pkl-core/src/test/files/LanguageSnippetTests/output/api/map.pcf @@ -96,6 +96,11 @@ examples { three = 3 } } + ["toDynamic() round-trip"] { + Map(-1, 2) + Map(0, 2) + Map(1, 2) + } ["toMapping()"] { new {} new {