Use VmObjectBuilder in Listing.distinct(By) implementations (#760)

This commit is contained in:
translatenix
2024-10-31 13:28:04 -07:00
committed by GitHub
parent cc72f9d160
commit 1be1fe4863
2 changed files with 10 additions and 21 deletions

View File

@@ -26,6 +26,10 @@ public final class VmObjectBuilder {
private final EconomicMap<Object, ObjectMember> members;
private int elementCount = 0;
public VmObjectBuilder() {
members = EconomicMaps.create();
}
public VmObjectBuilder(int initialSize) {
members = EconomicMaps.create(initialSize);
}

View File

@@ -21,7 +21,6 @@ import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.nodes.LoopNode;
import org.pkl.core.ast.PklNode;
import org.pkl.core.ast.lambda.*;
import org.pkl.core.ast.member.ObjectMember;
import org.pkl.core.runtime.*;
import org.pkl.core.stdlib.ExternalMethod0Node;
import org.pkl.core.stdlib.ExternalMethod1Node;
@@ -87,24 +86,17 @@ public final class ListingNodes {
@Specialization
protected VmListing eval(VmListing self) {
var visitedValues = CollectionUtils.newHashSet();
var newMembers = EconomicMaps.<Object, ObjectMember>create();
var index = new MutableLong(0);
var builder = new VmObjectBuilder();
self.forceAndIterateMemberValues(
(key, member, value) -> {
if (visitedValues.add(value)) {
newMembers.put(
index.getAndIncrement(),
VmUtils.createSyntheticObjectElement(member.getQualifiedName(), value));
builder.addElement(value);
}
return true;
});
return new VmListing(
VmUtils.createEmptyMaterializedFrame(),
BaseModule.getListingClass().getPrototype(),
newMembers,
newMembers.size());
return builder.toListing();
}
}
@@ -166,24 +158,17 @@ public final class ListingNodes {
@Specialization
protected VmListing eval(VmListing self, VmFunction selector) {
var visitedValues = CollectionUtils.newHashSet();
var newMembers = EconomicMaps.<Object, ObjectMember>create();
var index = new MutableLong(0);
var builder = new VmObjectBuilder();
self.forceAndIterateMemberValues(
(key, member, value) -> {
if (visitedValues.add(applyNode.execute(selector, value))) {
newMembers.put(
index.getAndIncrement(),
VmUtils.createSyntheticObjectElement(member.getQualifiedName(), value));
builder.addElement(value);
}
return true;
});
return new VmListing(
VmUtils.createEmptyMaterializedFrame(),
BaseModule.getListingClass().getPrototype(),
newMembers,
newMembers.size());
return builder.toListing();
}
}