mirror of
https://github.com/apple/pkl.git
synced 2026-04-24 17:28:37 +02:00
Use VmObjectBuilder in Listing.distinct(By) implementations (#760)
This commit is contained in:
@@ -26,6 +26,10 @@ public final class VmObjectBuilder {
|
|||||||
private final EconomicMap<Object, ObjectMember> members;
|
private final EconomicMap<Object, ObjectMember> members;
|
||||||
private int elementCount = 0;
|
private int elementCount = 0;
|
||||||
|
|
||||||
|
public VmObjectBuilder() {
|
||||||
|
members = EconomicMaps.create();
|
||||||
|
}
|
||||||
|
|
||||||
public VmObjectBuilder(int initialSize) {
|
public VmObjectBuilder(int initialSize) {
|
||||||
members = EconomicMaps.create(initialSize);
|
members = EconomicMaps.create(initialSize);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import com.oracle.truffle.api.dsl.Specialization;
|
|||||||
import com.oracle.truffle.api.nodes.LoopNode;
|
import com.oracle.truffle.api.nodes.LoopNode;
|
||||||
import org.pkl.core.ast.PklNode;
|
import org.pkl.core.ast.PklNode;
|
||||||
import org.pkl.core.ast.lambda.*;
|
import org.pkl.core.ast.lambda.*;
|
||||||
import org.pkl.core.ast.member.ObjectMember;
|
|
||||||
import org.pkl.core.runtime.*;
|
import org.pkl.core.runtime.*;
|
||||||
import org.pkl.core.stdlib.ExternalMethod0Node;
|
import org.pkl.core.stdlib.ExternalMethod0Node;
|
||||||
import org.pkl.core.stdlib.ExternalMethod1Node;
|
import org.pkl.core.stdlib.ExternalMethod1Node;
|
||||||
@@ -87,24 +86,17 @@ public final class ListingNodes {
|
|||||||
@Specialization
|
@Specialization
|
||||||
protected VmListing eval(VmListing self) {
|
protected VmListing eval(VmListing self) {
|
||||||
var visitedValues = CollectionUtils.newHashSet();
|
var visitedValues = CollectionUtils.newHashSet();
|
||||||
var newMembers = EconomicMaps.<Object, ObjectMember>create();
|
var builder = new VmObjectBuilder();
|
||||||
var index = new MutableLong(0);
|
|
||||||
|
|
||||||
self.forceAndIterateMemberValues(
|
self.forceAndIterateMemberValues(
|
||||||
(key, member, value) -> {
|
(key, member, value) -> {
|
||||||
if (visitedValues.add(value)) {
|
if (visitedValues.add(value)) {
|
||||||
newMembers.put(
|
builder.addElement(value);
|
||||||
index.getAndIncrement(),
|
|
||||||
VmUtils.createSyntheticObjectElement(member.getQualifiedName(), value));
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
return new VmListing(
|
return builder.toListing();
|
||||||
VmUtils.createEmptyMaterializedFrame(),
|
|
||||||
BaseModule.getListingClass().getPrototype(),
|
|
||||||
newMembers,
|
|
||||||
newMembers.size());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,24 +158,17 @@ public final class ListingNodes {
|
|||||||
@Specialization
|
@Specialization
|
||||||
protected VmListing eval(VmListing self, VmFunction selector) {
|
protected VmListing eval(VmListing self, VmFunction selector) {
|
||||||
var visitedValues = CollectionUtils.newHashSet();
|
var visitedValues = CollectionUtils.newHashSet();
|
||||||
var newMembers = EconomicMaps.<Object, ObjectMember>create();
|
var builder = new VmObjectBuilder();
|
||||||
var index = new MutableLong(0);
|
|
||||||
|
|
||||||
self.forceAndIterateMemberValues(
|
self.forceAndIterateMemberValues(
|
||||||
(key, member, value) -> {
|
(key, member, value) -> {
|
||||||
if (visitedValues.add(applyNode.execute(selector, value))) {
|
if (visitedValues.add(applyNode.execute(selector, value))) {
|
||||||
newMembers.put(
|
builder.addElement(value);
|
||||||
index.getAndIncrement(),
|
|
||||||
VmUtils.createSyntheticObjectElement(member.getQualifiedName(), value));
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
return new VmListing(
|
return builder.toListing();
|
||||||
VmUtils.createEmptyMaterializedFrame(),
|
|
||||||
BaseModule.getListingClass().getPrototype(),
|
|
||||||
newMembers,
|
|
||||||
newMembers.size());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user