From 651b36a791f22b55b999292dd05ffc0cdbaa744d Mon Sep 17 00:00:00 2001 From: Julian Garn Date: Fri, 9 Sep 2022 14:25:07 +0200 Subject: [PATCH] Added optimizations back --- .../js/builtins/IteratorFunctionBuiltins.java | 2 +- .../js/nodes/access/IteratorToArrayNode.java | 21 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/IteratorFunctionBuiltins.java b/graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/IteratorFunctionBuiltins.java index 1cb987cc980..a4358f6d443 100644 --- a/graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/IteratorFunctionBuiltins.java +++ b/graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/IteratorFunctionBuiltins.java @@ -100,7 +100,7 @@ public abstract static class JSIteratorFromNode extends JSBuiltinNode { @Child private GetIteratorDirectNode getIteratorDirectNode; @Child private OrdinaryHasInstanceNode ordinaryHasInstanceNode; - private ConditionProfile usingIteratorProfile = ConditionProfile.createBinaryProfile(); + private final ConditionProfile usingIteratorProfile = ConditionProfile.createBinaryProfile(); public JSIteratorFromNode(JSContext context, JSBuiltin builtin) { super(context, builtin); diff --git a/graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/access/IteratorToArrayNode.java b/graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/access/IteratorToArrayNode.java index 0c165cc97b1..11ea4c81ec9 100644 --- a/graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/access/IteratorToArrayNode.java +++ b/graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/access/IteratorToArrayNode.java @@ -42,6 +42,7 @@ import java.util.Set; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Executed; import com.oracle.truffle.api.dsl.Specialization; @@ -62,6 +63,10 @@ public abstract class IteratorToArrayNode extends JavaScriptNode { @Child @Executed JavaScriptNode iteratorNode; @Child private IteratorGetNextValueNode iteratorStepNode; + @CompilerDirectives.CompilationFinal private int capacity = 0; + @CompilerDirectives.CompilationFinal private boolean first = true; + + protected IteratorToArrayNode(JSContext context, JavaScriptNode iteratorNode, IteratorGetNextValueNode iteratorStepNode) { this.context = context; this.iteratorNode = iteratorNode; @@ -75,12 +80,24 @@ public static IteratorToArrayNode create(JSContext context, JavaScriptNode itera @Specialization(guards = "!iteratorRecord.isDone()") protected Object doIterator(VirtualFrame frame, IteratorRecord iteratorRecord, + @Cached BranchProfile firstGrowProfile, @Cached BranchProfile growProfile) { - SimpleArrayList elements = new SimpleArrayList<>(); + SimpleArrayList elements = new SimpleArrayList<>(capacity); Object value; while ((value = iteratorStepNode.execute(frame, iteratorRecord)) != null) { - elements.add(value, growProfile); + elements.add(value, first ? firstGrowProfile : growProfile); } + + if (CompilerDirectives.inInterpreter()) { + if (first) { + capacity = elements.size(); + first = false; + } else if (capacity != elements.size()) { + //Capacity is changing even though we are still in interpreter. Assume fluctuating capacity values. + capacity = 0; + } + } + return JSArray.createZeroBasedObjectArray(context, getRealm(), elements.toArray()); }