From 375b88f53e81cf29799dbc8aa38b51b5d1e2e8f8 Mon Sep 17 00:00:00 2001 From: luuvish Date: Tue, 9 Apr 2024 08:28:14 +0000 Subject: [PATCH] Fix the sequence length in the YAML parser The initialSize in EconomicsMaps.create() is not the actual stored size, hence the accurate size is not determined until ObjectMembers are added after addMembers() called. Since the size set during the creation of VmListing cannot be changed afterwards, the size of node.getValue() is used instead of members' size. --- .../java/org/pkl/core/stdlib/yaml/ParserNodes.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pkl-core/src/main/java/org/pkl/core/stdlib/yaml/ParserNodes.java b/pkl-core/src/main/java/org/pkl/core/stdlib/yaml/ParserNodes.java index d0c7cceb..35bc8c34 100644 --- a/pkl-core/src/main/java/org/pkl/core/stdlib/yaml/ParserNodes.java +++ b/pkl-core/src/main/java/org/pkl/core/stdlib/yaml/ParserNodes.java @@ -345,14 +345,15 @@ public final class ParserNodes { @Override public VmListing construct(Node node) { var sequenceNode = (SequenceNode) node; - var members = EconomicMaps.create(sequenceNode.getValue().size()); + var size = sequenceNode.getValue().size(); + var members = EconomicMaps.create(size); var result = new VmListing( VmUtils.createEmptyMaterializedFrame(), BaseModule.getListingClass().getPrototype(), members, - EconomicMaps.size(members)); + size); if (!node.isRecursive()) { addMembers(sequenceNode, result); @@ -390,14 +391,15 @@ public final class ParserNodes { @Override public VmListing construct(Node node) { var mappingNode = (MappingNode) node; - var members = EconomicMaps.create(mappingNode.getValue().size()); + var size = mappingNode.getValue().size(); + var members = EconomicMaps.create(size); var result = new VmListing( VmUtils.createEmptyMaterializedFrame(), BaseModule.getListingClass().getPrototype(), members, - EconomicMaps.size(members)); + size); if (!node.isRecursive()) { addMembers(mappingNode, result); @@ -437,7 +439,8 @@ public final class ParserNodes { @Override public VmObject construct(Node node) { var mappingNode = (MappingNode) node; - var members = EconomicMaps.create(mappingNode.getValue().size()); + var size = mappingNode.getValue().size(); + var members = EconomicMaps.create(size); VmObject result; if (useMapping) {