Fix VmDynamicCursor (#1948)

This fixes an issue where it fails to iterate over this entry:
`new Dynamic { [-1] = 2 }`
This commit is contained in:
Daniel Chao authored and GitHub committed 2026-10-30 21:45:36 +00:00
1 parent b1b36b09ac
commit 5cb5d41a44
3 files changed
+17 -6

No files matched your search

@@ -102,7 +102,7 @@ final class VmDynamicCursors {
@Override @Override
protected boolean shouldVisit(Object key) { protected boolean shouldVisit(Object key) {
return key instanceof Long l && l < iteratee.getLength(); return key instanceof Long l && l >= 0 && l < iteratee.getLength();
} }
@Override @Override
@@ -121,7 +121,7 @@ final class VmDynamicCursors {
if (member.isProp()) { if (member.isProp()) {
return false; return false;
} }
return !(key() instanceof Long l) || l >= iteratee.getLength(); return !(key() instanceof Long l) || l < 0 || l >= iteratee.getLength();
} }
@Override @Override
@@ -140,7 +140,7 @@ final class VmDynamicCursors {
if (member.isProp()) { if (member.isProp()) {
return false; return false;
} }
return !(key() instanceof Long l) || l >= iteratee.getLength(); return !(key() instanceof Long l) || l < 0 || l >= iteratee.getLength();
} }
@Override @Override
@@ -157,7 +157,7 @@ final class VmDynamicCursors {
@Override @Override
protected boolean shouldVisit(Object key) { protected boolean shouldVisit(Object key) {
if (key instanceof Identifier) return false; 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; return true;
} }
@@ -184,7 +184,7 @@ final class VmDynamicCursors {
@Override @Override
public boolean isElement() { public boolean isElement() {
return key() instanceof Long l && l < iteratee.getLength(); return key() instanceof Long l && l >= 0 && l < iteratee.getLength();
} }
@Override @Override
@@ -210,7 +210,7 @@ final class VmDynamicCursors {
@Override @Override
public boolean isElement() { public boolean isElement() {
return key() instanceof Long l && l < iteratee.getLength(); return key() instanceof Long l && l >= 0 && l < iteratee.getLength();
} }
@Override @Override
@@ -115,6 +115,12 @@ examples {
map1.toDynamic() map1.toDynamic()
} }
["toDynamic() round-trip"] {
Map(-1, 2).toDynamic().toMap()
Map(0, 2).toDynamic().toMap()
Map(1, 2).toDynamic().toMap()
}
["toMapping()"] { ["toMapping()"] {
Map().toMapping() Map().toMapping()
map1.toMapping() map1.toMapping()
@@ -96,6 +96,11 @@ examples {
three = 3 three = 3
} }
} }
["toDynamic() round-trip"] {
Map(-1, 2)
Map(0, 2)
Map(1, 2)
}
["toMapping()"] { ["toMapping()"] {
new {} new {}
new { new {