Skip to content

Commit a0cb02b

Browse files
committed
Remove genaral getWrappedNodeRecursive and replace with concrete unwrapping mechanism in order not to cause problems for partial evaluation.
1 parent 9fc9aba commit a0cb02b

File tree

3 files changed

+45
-40
lines changed

3 files changed

+45
-40
lines changed

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/JSNodeUtil.java

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -148,47 +148,27 @@ public static boolean isWrapperNode(JavaScriptNode node) {
148148
}
149149

150150
/**
151-
* Convenience method for {@link JSNodeUtil#getWrappedNodeRecursive(JavaScriptNode, int)} with
152-
* maxDepth == 1.
151+
* Helper to retrieve the node wrapped by a given JavaScript node.
153152
*
154-
*/
155-
public static JavaScriptNode getWrappedNode(JavaScriptNode node) {
156-
return getWrappedNodeRecursive(node, 1);
157-
}
158-
159-
/**
160-
* Helper to retrieve the node wrapped by an instrumentation wrapper and/or JavaScript wrapper
161-
* node(s).
162-
*
163-
* @param node a JavaScript node that is possibly a wrapper or an instrumentation wrapper
164-
* wrapping a JavaScript node.
153+
* @param node a JavaScript node that is possibly a wrapper
165154
* @return the (delegate) node that is wrapped by the parameter <code>node</code>, or
166-
* <code>node</code> itself if it is not a wrapper that can be stripped. This method
167-
* proceeds recursively until a node that is not a wrapper is found or maxDepth is
168-
* reached.
155+
* <code>node</code> itself if it is not a wrapper that can be stripped
169156
*/
170-
public static JavaScriptNode getWrappedNodeRecursive(JavaScriptNode node, int maxDepth) {
171-
assert maxDepth > 0 : "maxDepth for getWrappedNodeRecursive must be at least 1!";
172-
JavaScriptNode wrapped;
157+
public static JavaScriptNode getWrappedNode(JavaScriptNode node) {
173158
JavaScriptNode unwrapped = node;
174-
int depth = 0;
175-
do {
176-
wrapped = unwrapped;
177-
if (wrapped instanceof WrapperNode) {
178-
WrapperNode wrapper = (WrapperNode) wrapped;
179-
// JavaScriptNode wrappers have a JavaScriptNode as delegate
180-
unwrapped = (JavaScriptNode) wrapper.getDelegateNode();
181-
} else if (wrapped instanceof GlobalScopeVarWrapperNode) {
182-
unwrapped = ((GlobalScopeVarWrapperNode) wrapped).getDelegateNode();
183-
} else if (wrapped instanceof JSInputGeneratingNodeWrapper) {
184-
unwrapped = ((JSInputGeneratingNodeWrapper) wrapped).getDelegateNode();
185-
} else if (wrapped instanceof JSTaggedExecutionNode) {
186-
unwrapped = ((JSTaggedExecutionNode) wrapped).getDelegateNode();
187-
} else if (wrapped instanceof JSTargetableWrapperNode) {
188-
unwrapped = ((JSTargetableWrapperNode) wrapped).getDelegate();
189-
}
190-
depth++;
191-
} while (unwrapped != wrapped && depth < maxDepth);
159+
if (node instanceof WrapperNode) {
160+
WrapperNode wrapper = (WrapperNode) node;
161+
// JavaScriptNode wrappers have a JavaScriptNode as delegate
162+
unwrapped = (JavaScriptNode) wrapper.getDelegateNode();
163+
} else if (node instanceof GlobalScopeVarWrapperNode) {
164+
unwrapped = ((GlobalScopeVarWrapperNode) node).getDelegateNode();
165+
} else if (node instanceof JSInputGeneratingNodeWrapper) {
166+
unwrapped = ((JSInputGeneratingNodeWrapper) node).getDelegateNode();
167+
} else if (node instanceof JSTaggedExecutionNode) {
168+
unwrapped = ((JSTaggedExecutionNode) node).getDelegateNode();
169+
} else if (node instanceof JSTargetableWrapperNode) {
170+
unwrapped = ((JSTargetableWrapperNode) node).getDelegate();
171+
}
192172
assert !isWrapperNode(unwrapped);
193173
return unwrapped;
194174
}

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/access/SuperPropertyReferenceNode.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,17 @@
4141
package com.oracle.truffle.js.nodes.access;
4242

4343
import com.oracle.truffle.api.frame.VirtualFrame;
44+
import com.oracle.truffle.api.instrumentation.GenerateWrapper;
45+
import com.oracle.truffle.api.instrumentation.ProbeNode;
4446
import com.oracle.truffle.api.instrumentation.Tag;
4547
import com.oracle.truffle.js.nodes.JavaScriptNode;
4648
import com.oracle.truffle.js.nodes.RepeatableNode;
4749
import com.oracle.truffle.js.nodes.access.RequireObjectCoercibleNode.RequireObjectCoercibleWrapperNode;
4850

4951
import java.util.Set;
5052

51-
public final class SuperPropertyReferenceNode extends JSTargetableNode implements RepeatableNode {
53+
@GenerateWrapper
54+
public class SuperPropertyReferenceNode extends JSTargetableNode implements RepeatableNode {
5255

5356
@Child private JavaScriptNode baseValueNode;
5457
@Child private JavaScriptNode thisValueNode;
@@ -58,6 +61,11 @@ private SuperPropertyReferenceNode(JavaScriptNode baseNode, JavaScriptNode thisV
5861
this.thisValueNode = thisValueNode;
5962
}
6063

64+
SuperPropertyReferenceNode(SuperPropertyReferenceNode copy) {
65+
this.baseValueNode = copy.baseValueNode;
66+
this.thisValueNode = copy.thisValueNode;
67+
}
68+
6169
public static JSTargetableNode create(JavaScriptNode baseNode, JavaScriptNode thisValueNode) {
6270
assert baseNode instanceof RepeatableNode && thisValueNode instanceof RepeatableNode;
6371
return new SuperPropertyReferenceNode(RequireObjectCoercibleWrapperNode.create(baseNode), thisValueNode);
@@ -93,6 +101,11 @@ public JavaScriptNode getTarget() {
93101
return thisValueNode;
94102
}
95103

104+
@Override
105+
public WrapperNode createWrapper(ProbeNode probe) {
106+
return new SuperPropertyReferenceNodeWrapper(this, this, probe);
107+
}
108+
96109
@Override
97110
protected JavaScriptNode copyUninitialized(Set<Class<? extends Tag>> materializedTags) {
98111
return new SuperPropertyReferenceNode(cloneUninitialized(baseValueNode, materializedTags), cloneUninitialized(thisValueNode, materializedTags));

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/function/JSFunctionCallNode.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@
7474
import com.oracle.truffle.api.profiles.ValueProfile;
7575
import com.oracle.truffle.js.lang.JavaScriptLanguage;
7676
import com.oracle.truffle.js.nodes.JSGuards;
77-
import com.oracle.truffle.js.nodes.JSNodeUtil;
7877
import com.oracle.truffle.js.nodes.JavaScriptBaseNode;
7978
import com.oracle.truffle.js.nodes.JavaScriptNode;
8079
import com.oracle.truffle.js.nodes.access.JSConstantNode.JSConstantUndefinedNode;
@@ -85,6 +84,7 @@
8584
import com.oracle.truffle.js.nodes.access.SuperPropertyReferenceNode;
8685
import com.oracle.truffle.js.nodes.instrumentation.JSInputGeneratingNodeWrapper;
8786
import com.oracle.truffle.js.nodes.instrumentation.JSMaterializedInvokeTargetableNode;
87+
import com.oracle.truffle.js.nodes.instrumentation.JSTaggedExecutionNode;
8888
import com.oracle.truffle.js.nodes.instrumentation.JSTags;
8989
import com.oracle.truffle.js.nodes.instrumentation.JSTags.FunctionCallTag;
9090
import com.oracle.truffle.js.nodes.instrumentation.JSTags.ReadElementTag;
@@ -446,7 +446,19 @@ public NodeCost getCost() {
446446
public abstract JavaScriptNode getTarget();
447447

448448
protected final Object evaluateReceiver(VirtualFrame frame, Object target) {
449-
JavaScriptNode targetNode = JSNodeUtil.getWrappedNodeRecursive(getTarget(), Integer.MAX_VALUE);
449+
Node targetNode = getTarget();
450+
/*
451+
* SuperPropertyReferenceNode's instrumentation wrapper is an instance of
452+
* SuperPropertyReferenceNode. So, normally we wouldn't need to unwrap it. However, it can
453+
* be wrapped by JSTaggedExecutionNode and that could be wrapped by an instrumentation
454+
* wrapper. If that's the case, we have to unwrap twice.
455+
*/
456+
if (targetNode instanceof WrapperNode) {
457+
targetNode = ((WrapperNode) targetNode).getDelegateNode();
458+
}
459+
if (targetNode instanceof JSTaggedExecutionNode) {
460+
targetNode = ((JSTaggedExecutionNode) targetNode).getDelegateNode();
461+
}
450462
if (targetNode instanceof SuperPropertyReferenceNode) {
451463
return ((SuperPropertyReferenceNode) targetNode).evaluateTarget(frame);
452464
}

0 commit comments

Comments
 (0)