annotate graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java @ 19141:67d9e635102f

Truffle/Instrumentation: refine checks for safe node replacement
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Tue, 03 Feb 2015 11:48:25 -0800
parents c7e57dffc5ad
children 128586040207
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1 /*
18985
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
2 * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
4 *
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
11279
494b818b527c Adding "Classpath" exception to the classes in the com.oracle.truffle.api and the com.oracle.truffle.api.dsl package.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 10862
diff changeset
7 * published by the Free Software Foundation. Oracle designates this
494b818b527c Adding "Classpath" exception to the classes in the com.oracle.truffle.api and the com.oracle.truffle.api.dsl package.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 10862
diff changeset
8 * particular file as subject to the "Classpath" exception as provided
494b818b527c Adding "Classpath" exception to the classes in the com.oracle.truffle.api and the com.oracle.truffle.api.dsl package.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 10862
diff changeset
9 * by Oracle in the LICENSE file that accompanied this code.
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
10 *
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
11 * This code is distributed in the hope that it will be useful, but WITHOUT
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
14 * version 2 for more details (a copy is included in the LICENSE file that
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
15 * accompanied this code).
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
16 *
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License version
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
18 * 2 along with this work; if not, write to the Free Software Foundation,
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
20 *
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
22 * or visit www.oracle.com if you need additional information or have any
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
23 * questions.
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
24 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
25 package com.oracle.truffle.api.nodes;
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
26
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
27 import java.lang.annotation.*;
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
28 import java.util.*;
14629
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
29 import java.util.concurrent.*;
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
30
9254
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
31 import com.oracle.truffle.api.*;
17382
e1da729b3e4e make Truffle Node source section @CompilationFinal
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16912
diff changeset
32 import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
18985
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
33 import com.oracle.truffle.api.instrument.*;
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
34 import com.oracle.truffle.api.instrument.ProbeNode.WrapperNode;
16067
915ebb306fcc Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 15775
diff changeset
35 import com.oracle.truffle.api.source.*;
16151
76895499bc88 Add facility to create JSON dump of AST creation/rewriting
Christian Wirth <christian.wirth@oracle.com>
parents: 16067
diff changeset
36 import com.oracle.truffle.api.utilities.*;
9254
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
37
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
38 /**
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
39 * Abstract base class for all Truffle nodes.
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
40 */
18332
65a160d9d259 Truffle: add NodeInterface and require that all child fields be of this type
Andreas Woess <andreas.woess@jku.at>
parents: 17389
diff changeset
41 public abstract class Node implements NodeInterface, Cloneable {
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
42
17389
763a34f283f9 make Truffle Node parent @CompilationFinal, let getEncapsulatingSourceSection evaluate at compile time
Lukas Stadler <lukas.stadler@oracle.com>
parents: 17382
diff changeset
43 @CompilationFinal private Node parent;
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
44
17382
e1da729b3e4e make Truffle Node source section @CompilationFinal
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16912
diff changeset
45 @CompilationFinal private SourceSection sourceSection;
9254
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
46
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
47 /**
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
48 * Marks array fields that are children of this node.
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
49 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
50 @Retention(RetentionPolicy.RUNTIME)
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
51 @Target({ElementType.FIELD})
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
52 public @interface Children {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
53 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
54
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
55 /**
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
56 * Marks fields that represent child nodes of this node.
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
57 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
58 @Retention(RetentionPolicy.RUNTIME)
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
59 @Target({ElementType.FIELD})
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
60 public @interface Child {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
61 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
62
10481
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
63 protected Node() {
16151
76895499bc88 Add facility to create JSON dump of AST creation/rewriting
Christian Wirth <christian.wirth@oracle.com>
parents: 16067
diff changeset
64 this(null);
10481
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
65 }
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
66
11535
8f0fb0ade839 Truffle: add alternate Node/RootNode constructors with SourceSection argument.
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 11279
diff changeset
67 protected Node(SourceSection sourceSection) {
8f0fb0ade839 Truffle: add alternate Node/RootNode constructors with SourceSection argument.
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 11279
diff changeset
68 CompilerAsserts.neverPartOfCompilation();
8f0fb0ade839 Truffle: add alternate Node/RootNode constructors with SourceSection argument.
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 11279
diff changeset
69 this.sourceSection = sourceSection;
16151
76895499bc88 Add facility to create JSON dump of AST creation/rewriting
Christian Wirth <christian.wirth@oracle.com>
parents: 16067
diff changeset
70 if (TruffleOptions.TraceASTJSON) {
76895499bc88 Add facility to create JSON dump of AST creation/rewriting
Christian Wirth <christian.wirth@oracle.com>
parents: 16067
diff changeset
71 JSONHelper.dumpNewNode(this);
76895499bc88 Add facility to create JSON dump of AST creation/rewriting
Christian Wirth <christian.wirth@oracle.com>
parents: 16067
diff changeset
72 }
11535
8f0fb0ade839 Truffle: add alternate Node/RootNode constructors with SourceSection argument.
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 11279
diff changeset
73 }
8f0fb0ade839 Truffle: add alternate Node/RootNode constructors with SourceSection argument.
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 11279
diff changeset
74
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
75 /**
9254
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
76 * Assigns a link to a guest language source section to this node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
77 *
9254
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
78 * @param section the object representing a section in guest language source code
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
79 */
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
80 public final void assignSourceSection(SourceSection section) {
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
81 if (sourceSection != null) {
11610
5f532ea846fb applied changes to basic-graal that were made in a downstream repo
Doug Simon <doug.simon@oracle.com>
parents: 11535
diff changeset
82 // Patch this test during the transition to constructor-based
5f532ea846fb applied changes to basic-graal that were made in a downstream repo
Doug Simon <doug.simon@oracle.com>
parents: 11535
diff changeset
83 // source attribution, which would otherwise trigger this
5f532ea846fb applied changes to basic-graal that were made in a downstream repo
Doug Simon <doug.simon@oracle.com>
parents: 11535
diff changeset
84 // exception. This method will eventually be deprecated.
5f532ea846fb applied changes to basic-graal that were made in a downstream repo
Doug Simon <doug.simon@oracle.com>
parents: 11535
diff changeset
85 if (getSourceSection() != section) {
11648
4ab1f371adc8 Do not assign new source section if replacing node already has source section assigned.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 11610
diff changeset
86 throw new IllegalStateException("Source section is already assigned. Old: " + getSourceSection() + ", new: " + section);
11610
5f532ea846fb applied changes to basic-graal that were made in a downstream repo
Doug Simon <doug.simon@oracle.com>
parents: 11535
diff changeset
87 }
9254
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
88 }
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
89 this.sourceSection = section;
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
90 }
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
91
14566
6681b9eb3f4c Truffle: API cleanup and javadoc for CallNodes.
Christian Humer <christian.humer@gmail.com>
parents: 14564
diff changeset
92 /**
6681b9eb3f4c Truffle: API cleanup and javadoc for CallNodes.
Christian Humer <christian.humer@gmail.com>
parents: 14564
diff changeset
93 * Returns a rough estimate for the cost of this {@link Node}. This estimate can be used by
6681b9eb3f4c Truffle: API cleanup and javadoc for CallNodes.
Christian Humer <christian.humer@gmail.com>
parents: 14564
diff changeset
94 * runtime systems or guest languages to implement heuristics based on Truffle ASTs. This method
6681b9eb3f4c Truffle: API cleanup and javadoc for CallNodes.
Christian Humer <christian.humer@gmail.com>
parents: 14564
diff changeset
95 * is intended to be overridden by subclasses. The default implementation returns the value of
6681b9eb3f4c Truffle: API cleanup and javadoc for CallNodes.
Christian Humer <christian.humer@gmail.com>
parents: 14564
diff changeset
96 * {@link NodeInfo#cost()} of the {@link NodeInfo} annotation declared at the subclass. If no
6681b9eb3f4c Truffle: API cleanup and javadoc for CallNodes.
Christian Humer <christian.humer@gmail.com>
parents: 14564
diff changeset
97 * {@link NodeInfo} annotation is declared the method returns {@link NodeCost#MONOMORPHIC} as a
6681b9eb3f4c Truffle: API cleanup and javadoc for CallNodes.
Christian Humer <christian.humer@gmail.com>
parents: 14564
diff changeset
98 * default value.
6681b9eb3f4c Truffle: API cleanup and javadoc for CallNodes.
Christian Humer <christian.humer@gmail.com>
parents: 14564
diff changeset
99 */
14564
5d1308c78ddc Truffle: Introduced NodeCost as a replacement for NodeInfo.Kind.
Christian Humer <christian.humer@gmail.com>
parents: 14073
diff changeset
100 public NodeCost getCost() {
13994
989f58d6a0ca Truffle: Added API for Node.getKind().
Christian Humer <christian.humer@gmail.com>
parents: 13983
diff changeset
101 NodeInfo info = getClass().getAnnotation(NodeInfo.class);
989f58d6a0ca Truffle: Added API for Node.getKind().
Christian Humer <christian.humer@gmail.com>
parents: 13983
diff changeset
102 if (info != null) {
14564
5d1308c78ddc Truffle: Introduced NodeCost as a replacement for NodeInfo.Kind.
Christian Humer <christian.humer@gmail.com>
parents: 14073
diff changeset
103 return info.cost();
13994
989f58d6a0ca Truffle: Added API for Node.getKind().
Christian Humer <christian.humer@gmail.com>
parents: 13983
diff changeset
104 }
14564
5d1308c78ddc Truffle: Introduced NodeCost as a replacement for NodeInfo.Kind.
Christian Humer <christian.humer@gmail.com>
parents: 14073
diff changeset
105 return NodeCost.MONOMORPHIC;
13994
989f58d6a0ca Truffle: Added API for Node.getKind().
Christian Humer <christian.humer@gmail.com>
parents: 13983
diff changeset
106 }
989f58d6a0ca Truffle: Added API for Node.getKind().
Christian Humer <christian.humer@gmail.com>
parents: 13983
diff changeset
107
9254
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
108 /**
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
109 * Clears any previously assigned guest language source code from this node.
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
110 */
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
111 public final void clearSourceSection() {
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
112 this.sourceSection = null;
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
113 }
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
114
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
115 /**
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
116 * Retrieves the guest language source code section that is currently assigned to this node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
117 *
9254
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
118 * @return the assigned source code section
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
119 */
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
120 public final SourceSection getSourceSection() {
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
121 return sourceSection;
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
122 }
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
123
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
124 /**
10481
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
125 * Retrieves the guest language source code section that is currently assigned to this node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
126 *
10481
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
127 * @return the assigned source code section
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
128 */
17389
763a34f283f9 make Truffle Node parent @CompilationFinal, let getEncapsulatingSourceSection evaluate at compile time
Lukas Stadler <lukas.stadler@oracle.com>
parents: 17382
diff changeset
129 @ExplodeLoop
10481
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
130 public final SourceSection getEncapsulatingSourceSection() {
17389
763a34f283f9 make Truffle Node parent @CompilationFinal, let getEncapsulatingSourceSection evaluate at compile time
Lukas Stadler <lukas.stadler@oracle.com>
parents: 17382
diff changeset
131 Node current = this;
763a34f283f9 make Truffle Node parent @CompilationFinal, let getEncapsulatingSourceSection evaluate at compile time
Lukas Stadler <lukas.stadler@oracle.com>
parents: 17382
diff changeset
132 while (current != null) {
763a34f283f9 make Truffle Node parent @CompilationFinal, let getEncapsulatingSourceSection evaluate at compile time
Lukas Stadler <lukas.stadler@oracle.com>
parents: 17382
diff changeset
133 if (current.sourceSection != null) {
763a34f283f9 make Truffle Node parent @CompilationFinal, let getEncapsulatingSourceSection evaluate at compile time
Lukas Stadler <lukas.stadler@oracle.com>
parents: 17382
diff changeset
134 return current.sourceSection;
763a34f283f9 make Truffle Node parent @CompilationFinal, let getEncapsulatingSourceSection evaluate at compile time
Lukas Stadler <lukas.stadler@oracle.com>
parents: 17382
diff changeset
135 }
763a34f283f9 make Truffle Node parent @CompilationFinal, let getEncapsulatingSourceSection evaluate at compile time
Lukas Stadler <lukas.stadler@oracle.com>
parents: 17382
diff changeset
136 current = current.parent;
10481
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
137 }
17389
763a34f283f9 make Truffle Node parent @CompilationFinal, let getEncapsulatingSourceSection evaluate at compile time
Lukas Stadler <lukas.stadler@oracle.com>
parents: 17382
diff changeset
138 return null;
10481
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
139 }
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
140
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
141 /**
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7267
diff changeset
142 * Method that updates the link to the parent in the array of specified new child nodes to this
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7267
diff changeset
143 * node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
144 *
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
145 * @param newChildren the array of new children whose parent should be updated
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
146 * @return the array of new children
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
147 */
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
148 protected final <T extends Node> T[] insert(final T[] newChildren) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
149 CompilerDirectives.transferToInterpreterAndInvalidate();
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
150 assert newChildren != null;
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
151 for (Node newChild : newChildren) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
152 adoptHelper(newChild);
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
153 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
154 return newChildren;
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
155 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
156
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
157 /**
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
158 * Method that updates the link to the parent in the specified new child node to this node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
159 *
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
160 * @param newChild the new child whose parent should be updated
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
161 * @return the new child
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
162 */
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
163 protected final <T extends Node> T insert(final T newChild) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
164 CompilerDirectives.transferToInterpreterAndInvalidate();
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
165 assert newChild != null;
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
166 adoptHelper(newChild);
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
167 return newChild;
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
168 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
169
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
170 public final void adoptChildren() {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
171 CompilerDirectives.transferToInterpreterAndInvalidate();
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
172 adoptHelper();
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
173 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
174
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
175 private void adoptHelper(final Node newChild) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
176 assert newChild != null;
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
177 if (newChild == this) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
178 throw new IllegalStateException("The parent of a node can never be the node itself.");
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
179 }
15346
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
180 boolean isInserted = newChild.parent == null;
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
181 newChild.parent = this;
16151
76895499bc88 Add facility to create JSON dump of AST creation/rewriting
Christian Wirth <christian.wirth@oracle.com>
parents: 16067
diff changeset
182 if (TruffleOptions.TraceASTJSON) {
76895499bc88 Add facility to create JSON dump of AST creation/rewriting
Christian Wirth <christian.wirth@oracle.com>
parents: 16067
diff changeset
183 JSONHelper.dumpNewChild(this, newChild);
76895499bc88 Add facility to create JSON dump of AST creation/rewriting
Christian Wirth <christian.wirth@oracle.com>
parents: 16067
diff changeset
184 }
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
185 newChild.adoptHelper();
15346
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
186 if (isInserted) {
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
187 newChild.onAdopt();
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
188 }
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
189 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
190
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
191 private void adoptHelper() {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
192 Iterable<Node> children = this.getChildren();
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
193 for (Node child : children) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
194 if (child != null && child.getParent() != this) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
195 this.adoptHelper(child);
10481
29e9a5d18c70 Clean up.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9782
diff changeset
196 }
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
197 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
198 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
199
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
200 private void adoptUnadoptedHelper(final Node newChild) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
201 assert newChild != null;
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
202 if (newChild == this) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
203 throw new IllegalStateException("The parent of a node can never be the node itself.");
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
204 }
15346
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
205 boolean isInserted = newChild.parent == null;
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
206 newChild.parent = this;
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
207 newChild.adoptUnadoptedHelper();
15346
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
208 if (isInserted) {
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
209 newChild.onAdopt();
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
210 }
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
211 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
212
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
213 private void adoptUnadoptedHelper() {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
214 Iterable<Node> children = this.getChildren();
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
215 for (Node child : children) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
216 if (child != null && child.getParent() == null) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
217 this.adoptUnadoptedHelper(child);
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
218 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
219 }
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
220 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
221
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
222 /**
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7267
diff changeset
223 * Returns properties of this node interesting for debugging and can be overwritten by
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7267
diff changeset
224 * subclasses to add their own custom properties.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
225 *
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
226 * @return the properties as a key/value hash map
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
227 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
228 public Map<String, Object> getDebugProperties() {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
229 Map<String, Object> properties = new HashMap<>();
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
230 return properties;
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
231 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
232
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
233 /**
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
234 * The current parent node of this node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
235 *
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
236 * @return the parent node
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
237 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
238 public final Node getParent() {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
239 return parent;
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
240 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
241
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
242 /**
9256
9640bb930327 Preserve the source section during node rewrites.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9255
diff changeset
243 * Replaces this node with another node. If there is a source section (see
9640bb930327 Preserve the source section during node rewrites.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9255
diff changeset
244 * {@link #getSourceSection()}) associated with this node, it is transferred to the new node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
245 *
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
246 * @param newNode the new node that is the replacement
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
247 * @param reason a description of the reason for the replacement
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
248 * @return the new node
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
249 */
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
250 public final <T extends Node> T replace(final T newNode, final CharSequence reason) {
13915
d6b340b757a2 Truffle: refactorings
Andreas Woess <andreas.woess@jku.at>
parents: 13811
diff changeset
251 CompilerDirectives.transferToInterpreterAndInvalidate();
14629
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
252 atomic(new Runnable() {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
253 public void run() {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
254 replaceHelper(newNode, reason);
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
255 }
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
256 });
12494
57b8a41c0e18 Truffle: fix possible node rewrite failures after recursive calls.
Andreas Woess <andreas.woess@jku.at>
parents: 11951
diff changeset
257 return newNode;
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
258 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
259
12494
57b8a41c0e18 Truffle: fix possible node rewrite failures after recursive calls.
Andreas Woess <andreas.woess@jku.at>
parents: 11951
diff changeset
260 /**
9256
9640bb930327 Preserve the source section during node rewrites.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9255
diff changeset
261 * Replaces this node with another node. If there is a source section (see
9640bb930327 Preserve the source section during node rewrites.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9255
diff changeset
262 * {@link #getSourceSection()}) associated with this node, it is transferred to the new node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
263 *
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
264 * @param newNode the new node that is the replacement
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
265 * @return the new node
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
266 */
9254
4497235516df New API for representing Source objects and SourceSection objects. SourceSection objects can be associated with Truffle interpreter nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7530
diff changeset
267 public final <T extends Node> T replace(T newNode) {
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
268 return replace(newNode, "");
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
269 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
270
14628
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
271 private void replaceHelper(Node newNode, CharSequence reason) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
272 CompilerAsserts.neverPartOfCompilation();
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
273 if (this.getParent() == null) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
274 throw new IllegalStateException("This node cannot be replaced, because it does not yet have a parent.");
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
275 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
276 if (sourceSection != null && newNode.getSourceSection() == null) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
277 // Pass on the source section to the new node.
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
278 newNode.assignSourceSection(sourceSection);
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
279 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
280 // (aw) need to set parent *before* replace, so that (unsynchronized) getRootNode()
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
281 // will always find the root node
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
282 newNode.parent = this.parent;
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
283 if (NodeUtil.replaceChild(this.parent, this, newNode)) {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
284 this.parent.adoptHelper(newNode);
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
285 } else {
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
286 this.parent.adoptUnadoptedHelper(newNode);
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
287 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
288 reportReplace(this, newNode, reason);
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
289 onReplace(newNode, reason);
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
290 }
a08b8694f556 Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents: 14584
diff changeset
291
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
292 /**
19141
67d9e635102f Truffle/Instrumentation: refine checks for safe node replacement
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 19038
diff changeset
293 * Checks if this node can be replaced by another node: tree structure & type.
18985
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
294 */
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
295 public final boolean isSafelyReplaceableBy(Node newNode) {
19141
67d9e635102f Truffle/Instrumentation: refine checks for safe node replacement
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 19038
diff changeset
296 return NodeUtil.isReplacementSafe(getParent(), this, newNode);
18985
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
297 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
298
14584
6189c1983cd3 Truffle: make Node#replace accept any CharSequence as reason
Andreas Woess <andreas.woess@jku.at>
parents: 14566
diff changeset
299 private void reportReplace(Node oldNode, Node newNode, CharSequence reason) {
16912
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
300 Node node = this;
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
301 while (node != null) {
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
302 if (node instanceof ReplaceObserver) {
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
303 ((ReplaceObserver) node).nodeReplaced(oldNode, newNode, reason);
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
304 } else if (node instanceof RootNode) {
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
305 CallTarget target = ((RootNode) node).getCallTarget();
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
306 if (target instanceof ReplaceObserver) {
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
307 ((ReplaceObserver) target).nodeReplaced(oldNode, newNode, reason);
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
308 }
12692
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
309 }
16912
f8998c828bed Truffle: replaces are now reported to all ReplaceObservers in the node hierarchy.
Christian Humer <christian.humer@gmail.com>
parents: 16467
diff changeset
310 node = node.getParent();
12692
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
311 }
16464
76081918079d Truffle: move TraceRewrites code to NodeUtil
Andreas Woess <andreas.woess@jku.at>
parents: 16151
diff changeset
312 if (TruffleOptions.TraceRewrites) {
76081918079d Truffle: move TraceRewrites code to NodeUtil
Andreas Woess <andreas.woess@jku.at>
parents: 16151
diff changeset
313 NodeUtil.traceRewrite(this, newNode, reason);
76081918079d Truffle: move TraceRewrites code to NodeUtil
Andreas Woess <andreas.woess@jku.at>
parents: 16151
diff changeset
314 }
76081918079d Truffle: move TraceRewrites code to NodeUtil
Andreas Woess <andreas.woess@jku.at>
parents: 16151
diff changeset
315 if (TruffleOptions.TraceASTJSON) {
76081918079d Truffle: move TraceRewrites code to NodeUtil
Andreas Woess <andreas.woess@jku.at>
parents: 16151
diff changeset
316 JSONHelper.dumpReplaceChild(this, newNode, reason);
76081918079d Truffle: move TraceRewrites code to NodeUtil
Andreas Woess <andreas.woess@jku.at>
parents: 16151
diff changeset
317 }
12692
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
318 }
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
319
10846
e87d56a51047 Truffle: add Node.isReplaceable()
Andreas Woess <andreas.woess@jku.at>
parents: 10843
diff changeset
320 /**
9782
ba02d19dd3cc Added an onReplace method to Node to provide a way for a guest language implementation to use replace tracing.
Christian Humer <christian.humer@gmail.com>
parents: 9256
diff changeset
321 * Intended to be implemented by subclasses of {@link Node} to receive a notification when the
ba02d19dd3cc Added an onReplace method to Node to provide a way for a guest language implementation to use replace tracing.
Christian Humer <christian.humer@gmail.com>
parents: 9256
diff changeset
322 * node is rewritten. This method is invoked before the actual replace has happened.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
323 *
9782
ba02d19dd3cc Added an onReplace method to Node to provide a way for a guest language implementation to use replace tracing.
Christian Humer <christian.humer@gmail.com>
parents: 9256
diff changeset
324 * @param newNode the replacement node
ba02d19dd3cc Added an onReplace method to Node to provide a way for a guest language implementation to use replace tracing.
Christian Humer <christian.humer@gmail.com>
parents: 9256
diff changeset
325 * @param reason the reason the replace supplied
ba02d19dd3cc Added an onReplace method to Node to provide a way for a guest language implementation to use replace tracing.
Christian Humer <christian.humer@gmail.com>
parents: 9256
diff changeset
326 */
14584
6189c1983cd3 Truffle: make Node#replace accept any CharSequence as reason
Andreas Woess <andreas.woess@jku.at>
parents: 14566
diff changeset
327 protected void onReplace(Node newNode, CharSequence reason) {
16464
76081918079d Truffle: move TraceRewrites code to NodeUtil
Andreas Woess <andreas.woess@jku.at>
parents: 16151
diff changeset
328 // empty default
10590
6eb8d63cea34 Added a feature to trace rewrites of truffle nodes.
Christian Humer <christian.humer@gmail.com>
parents: 10481
diff changeset
329 }
6eb8d63cea34 Added a feature to trace rewrites of truffle nodes.
Christian Humer <christian.humer@gmail.com>
parents: 10481
diff changeset
330
15346
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
331 /**
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
332 * Subclasses of {@link Node} can implement this method to execute extra functionality when a
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
333 * node is effectively inserted into the AST. The {@code onAdopt} callback is called after the
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
334 * node has been effectively inserted, and it is guaranteed to be called only once for any given
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
335 * node.
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
336 */
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
337 protected void onAdopt() {
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
338 // empty default
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
339 }
1cd02b4d90d1 onAdopt callback for ASTs
Michael Haupt <michael.haupt@oracle.com>
parents: 14991
diff changeset
340
9782
ba02d19dd3cc Added an onReplace method to Node to provide a way for a guest language implementation to use replace tracing.
Christian Humer <christian.humer@gmail.com>
parents: 9256
diff changeset
341 /**
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7267
diff changeset
342 * Invokes the {@link NodeVisitor#visit(Node)} method for this node and recursively also for all
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7267
diff changeset
343 * child nodes.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
344 *
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
345 * @param nodeVisitor the visitor
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
346 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
347 public final void accept(NodeVisitor nodeVisitor) {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
348 if (nodeVisitor.visit(this)) {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
349 for (Node child : this.getChildren()) {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
350 if (child != null) {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
351 child.accept(nodeVisitor);
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
352 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
353 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
354 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
355 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
356
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
357 /**
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
358 * Iterator over the children of this node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
359 *
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
360 * @return the iterator
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
361 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
362 public final Iterable<Node> getChildren() {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
363 return new Iterable<Node>() {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
364 public Iterator<Node> iterator() {
16467
17f7331dcc4f Truffle: move iterator to NodeClass
Andreas Woess <andreas.woess@jku.at>
parents: 16464
diff changeset
365 return NodeUtil.makeIterator(Node.this);
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
366 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
367 };
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
368 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
369
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
370 /**
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
371 * Creates a shallow copy of this node.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
372 *
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
373 * @return the new copy
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
374 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
375 public Node copy() {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
376 try {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
377 return (Node) super.clone();
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
378 } catch (CloneNotSupportedException e) {
18509
7bf2965140de Truffle: Node#clone(): throw assertion error on CloneNotSupportedException
Andreas Woess <andreas.woess@jku.at>
parents: 18332
diff changeset
379 throw new AssertionError(e);
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
380 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
381 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
382
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
383 /**
18750
8a758dce7d80 Truffle: added new deepCopy method to Node.
Christian Humer <christian.humer@gmail.com>
parents: 18509
diff changeset
384 * Creates a deep copy of this node.
8a758dce7d80 Truffle: added new deepCopy method to Node.
Christian Humer <christian.humer@gmail.com>
parents: 18509
diff changeset
385 *
8a758dce7d80 Truffle: added new deepCopy method to Node.
Christian Humer <christian.humer@gmail.com>
parents: 18509
diff changeset
386 * @return the new deep copy
8a758dce7d80 Truffle: added new deepCopy method to Node.
Christian Humer <christian.humer@gmail.com>
parents: 18509
diff changeset
387 */
8a758dce7d80 Truffle: added new deepCopy method to Node.
Christian Humer <christian.humer@gmail.com>
parents: 18509
diff changeset
388 public Node deepCopy() {
8a758dce7d80 Truffle: added new deepCopy method to Node.
Christian Humer <christian.humer@gmail.com>
parents: 18509
diff changeset
389 return NodeUtil.deepCopyImpl(this);
8a758dce7d80 Truffle: added new deepCopy method to Node.
Christian Humer <christian.humer@gmail.com>
parents: 18509
diff changeset
390 }
8a758dce7d80 Truffle: added new deepCopy method to Node.
Christian Humer <christian.humer@gmail.com>
parents: 18509
diff changeset
391
8a758dce7d80 Truffle: added new deepCopy method to Node.
Christian Humer <christian.humer@gmail.com>
parents: 18509
diff changeset
392 /**
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7267
diff changeset
393 * This method must never be called. It enforces that {@link Object#clone} is not directly
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7267
diff changeset
394 * called by subclasses. Use the {@link #copy()} method instead.
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
395 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
396 @Override
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
397 @Deprecated
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
398 protected final Object clone() throws CloneNotSupportedException {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
399 throw new IllegalStateException("This method should never be called, use the copy method instead!");
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
400 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
401
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
402 /**
12692
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
403 * Get the root node of the tree a node belongs to.
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14629
diff changeset
404 *
12692
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
405 * @return the {@link RootNode} or {@code null} if there is none.
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
406 */
13983
f46cab39a9a2 Truffle: Updated inlining API. Pushed inlining implementation to the Truffle runtime.
Christian Humer <christian.humer@gmail.com>
parents: 13915
diff changeset
407 public final RootNode getRootNode() {
12692
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
408 Node rootNode = this;
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
409 while (rootNode.getParent() != null) {
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
410 assert !(rootNode instanceof RootNode) : "root node must not have a parent";
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
411 rootNode = rootNode.getParent();
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
412 }
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
413 if (rootNode instanceof RootNode) {
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
414 return (RootNode) rootNode;
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
415 }
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
416 return null;
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
417 }
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
418
ffd4b6b4ae68 Truffle Node class refactoring.
Andreas Woess <andreas.woess@jku.at>
parents: 12495
diff changeset
419 /**
18985
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
420 * Any node for which this is {@code true} can be "instrumented" by installing a {@link Probe}
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
421 * that intercepts execution events at the node and routes them to any {@link Instrument}s that
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
422 * have been attached to the {@link Probe}. Only one {@link Probe} may be installed at each
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
423 * node; subsequent calls return the one already installed.
19038
c7e57dffc5ad Truffle/Instrumentation: comments and minor code cleanup post-review
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18985
diff changeset
424 * <p>
c7e57dffc5ad Truffle/Instrumentation: comments and minor code cleanup post-review
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18985
diff changeset
425 * <b>Note:</b> instrumentation requires a appropriate {@link WrapperNode}, which must be
c7e57dffc5ad Truffle/Instrumentation: comments and minor code cleanup post-review
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18985
diff changeset
426 * provided by {@link #createWrapperNode()}.
18985
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
427 *
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
428 * @see Instrument
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
429 */
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
430 public boolean isInstrumentable() {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
431 return false;
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
432 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
433
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
434 /**
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
435 * For any node that {@link #isInstrumentable()}, this method must return a {@link Node} that:
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
436 * <ol>
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
437 * <li>implements {@link WrapperNode}</li>
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
438 * <li>has {@code this} as it's child, and</li>
19038
c7e57dffc5ad Truffle/Instrumentation: comments and minor code cleanup post-review
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18985
diff changeset
439 * <li>whose type is safe for replacement of {@code this} in the parent.</li>
18985
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
440 * </ol>
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
441 *
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
442 * @return an appropriately typed {@link WrapperNode} if {@link #isInstrumentable()}.
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
443 */
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
444 public WrapperNode createWrapperNode() {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
445 return null;
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
446 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
447
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
448 /**
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
449 * Enables {@linkplain Instrument instrumentation} of a node, where the node is presumed to be
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
450 * part of a well-formed Truffle AST that is not being executed. If this node has not already
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
451 * been probed, modifies the AST by inserting a {@linkplain WrapperNode wrapper node} between
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
452 * the node and its parent; the wrapper node must be provided by implementations of
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
453 * {@link #createWrapperNode()}. No more than one {@link Probe} may be associated with a node,
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
454 * so a {@linkplain WrapperNode wrapper} may not wrap another {@linkplain WrapperNode wrapper}.
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
455 *
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
456 * @return a (possibly newly created) {@link Probe} associated with this node.
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
457 * @throws ProbeException (unchecked) when a probe cannot be created, leaving the AST unchanged
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
458 */
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
459 public final Probe probe() {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
460
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
461 if (this instanceof WrapperNode) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
462 throw new ProbeException(ProbeFailure.Reason.WRAPPER_NODE, null, this, null);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
463 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
464
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
465 if (parent == null) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
466 throw new ProbeException(ProbeFailure.Reason.NO_PARENT, null, this, null);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
467 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
468
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
469 if (parent instanceof WrapperNode) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
470 return ((WrapperNode) parent).getProbe();
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
471 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
472
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
473 if (!isInstrumentable()) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
474 throw new ProbeException(ProbeFailure.Reason.NOT_INSTRUMENTABLE, parent, this, null);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
475 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
476
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
477 // Create a new wrapper/probe with this node as its child.
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
478 final WrapperNode wrapper = createWrapperNode();
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
479
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
480 if (wrapper == null || !(wrapper instanceof Node)) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
481 throw new ProbeException(ProbeFailure.Reason.NO_WRAPPER, parent, this, wrapper);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
482 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
483
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
484 final Node wrapperNode = (Node) wrapper;
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
485
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
486 if (!this.isSafelyReplaceableBy(wrapperNode)) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
487 throw new ProbeException(ProbeFailure.Reason.WRAPPER_TYPE, parent, this, wrapper);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
488 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
489
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
490 // Connect it to a Probe
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
491 final Probe probe = ProbeNode.insertProbe(wrapper);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
492
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
493 // Replace this node in the AST with the wrapper
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
494 this.replace(wrapperNode);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
495
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
496 return probe;
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
497 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
498
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
499 /**
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
500 * Enables "one-shot", unmodifiable {@linkplain Instrument instrumentation} of a node, where the
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
501 * node is presumed to be part of a well-formed Truffle AST that is not being executed.
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
502 * <p>
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
503 * Modifies the AST by inserting a {@linkplain WrapperNode wrapper node} between the node and
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
504 * its parent; the wrapper node must be provided by implementations of
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
505 * {@link #createWrapperNode()}.
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
506 * <p>
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
507 * Unlike {@link #probe()}, once {@link #probeLite(TruffleEventReceiver)} is called at a node,
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
508 * no additional probing can be added and no additional instrumentation can be attached.
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
509 * <p>
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
510 * This restricted form of instrumentation is intended for special cases where only one kind of
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
511 * instrumentation is desired, and for which performance is a concern
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
512 *
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
513 * @param eventReceiver
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
514 * @throws ProbeException (unchecked) when a probe cannot be created, leaving the AST unchanged
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
515 */
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
516 public final void probeLite(TruffleEventReceiver eventReceiver) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
517
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
518 if (this instanceof WrapperNode) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
519 throw new ProbeException(ProbeFailure.Reason.WRAPPER_NODE, null, this, null);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
520 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
521
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
522 if (parent == null) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
523 throw new ProbeException(ProbeFailure.Reason.NO_PARENT, null, this, null);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
524 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
525
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
526 if (parent instanceof WrapperNode) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
527 throw new ProbeException(ProbeFailure.Reason.LITE_VIOLATION, null, this, null);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
528 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
529
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
530 if (!isInstrumentable()) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
531 throw new ProbeException(ProbeFailure.Reason.NOT_INSTRUMENTABLE, parent, this, null);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
532 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
533
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
534 // Create a new wrapper/probe with this node as its child.
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
535 final WrapperNode wrapper = createWrapperNode();
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
536
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
537 if (wrapper == null || !(wrapper instanceof Node)) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
538 throw new ProbeException(ProbeFailure.Reason.NO_WRAPPER, parent, this, wrapper);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
539 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
540
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
541 final Node wrapperNode = (Node) wrapper;
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
542
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
543 if (!this.isSafelyReplaceableBy(wrapperNode)) {
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
544 throw new ProbeException(ProbeFailure.Reason.WRAPPER_TYPE, parent, this, wrapper);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
545 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
546
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
547 // Connect it to a Probe
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
548 ProbeNode.insertProbeLite(wrapper, eventReceiver);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
549
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
550 // Replace this node in the AST with the wrapper
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
551 this.replace(wrapperNode);
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
552 }
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
553
867058575979 Truffle: Improved support for "probing" AST nodes:
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 18750
diff changeset
554 /**
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
555 * Converts this node to a textual representation useful for debugging.
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
556 */
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
557 @Override
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
558 public String toString() {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
559 StringBuilder sb = new StringBuilder(getClass().getSimpleName());
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
560 Map<String, Object> properties = getDebugProperties();
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
561 boolean hasProperties = false;
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
562 for (Map.Entry<String, Object> entry : properties.entrySet()) {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
563 sb.append(hasProperties ? "," : "<");
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
564 hasProperties = true;
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
565 sb.append(entry.getKey()).append("=").append(entry.getValue());
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
566 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
567 if (hasProperties) {
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
568 sb.append(">");
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
569 }
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
570 sb.append("@").append(Integer.toHexString(hashCode()));
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
571 return sb.toString();
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
572 }
14629
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
573
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
574 public final void atomic(Runnable closure) {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
575 RootNode rootNode = getRootNode();
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
576 if (rootNode != null) {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
577 synchronized (rootNode) {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
578 closure.run();
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
579 }
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
580 } else {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
581 closure.run();
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
582 }
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
583 }
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
584
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
585 public final <T> T atomic(Callable<T> closure) {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
586 try {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
587 RootNode rootNode = getRootNode();
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
588 if (rootNode != null) {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
589 synchronized (rootNode) {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
590 return closure.call();
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
591 }
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
592 } else {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
593 return closure.call();
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
594 }
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
595 } catch (RuntimeException e) {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
596 throw e;
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
597 } catch (Exception e) {
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
598 throw new RuntimeException(e);
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
599 }
ba52fbec5b6c Truffle: atomic node rewriting
Andreas Woess <andreas.woess@jku.at>
parents: 14628
diff changeset
600 }
15775
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
601
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
602 /**
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
603 * Returns a user-readable description of the purpose of the Node, or "" if no description is
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
604 * available.
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
605 */
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
606 public String getDescription() {
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
607 NodeInfo info = getClass().getAnnotation(NodeInfo.class);
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
608 if (info != null) {
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
609 return info.description();
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
610 }
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
611 return "";
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
612 }
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
613
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
614 /**
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
615 * Returns a string representing the language this node has been implemented for. If the
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
616 * language is unknown, returns "".
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
617 */
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
618 public String getLanguage() {
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
619 NodeInfo info = getClass().getAnnotation(NodeInfo.class);
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
620 if (info != null && info.language() != null && info.language().length() > 0) {
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
621 return info.language();
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
622 }
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
623 if (parent != null) {
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
624 return parent.getLanguage();
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
625 }
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
626 return "";
4293efaaab76 Add description and language to the NodeInfo annotation
Christian Wirth <christian.wirth@oracle.com>
parents: 15474
diff changeset
627 }
7267
a4b84ba6dc2e Introduction of the Truffle API for efficient implementation of dynamic languages on top of the Graal VM. New projects com.oracle.truffle.api for the API definition and com.oracle.truffle.api.test for API tests and documentation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
628 }