annotate graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java @ 16751:4f589fa69b9c

Truffle-DSL: added shared code required for the new generation layout.
author Christian Humer <christian.humer@gmail.com>
date Mon, 11 Aug 2014 15:53:05 +0200
parents
children e6d15134ca86
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16751
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1 package com.oracle.truffle.api.dsl.internal;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
3 import java.util.*;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
4
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
5 import com.oracle.truffle.api.nodes.*;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
6
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
7 /** Contains utility classes shared across generated DSLNode implementations. */
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
8 public class DSLShare {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
9
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
10 public static boolean isExcluded(Node currentNode, DSLMetadata otherMetadata) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
11 assert otherMetadata.getExcludedBy().length > 0 : "At least one exclude must be defined for isIncluded.";
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
12 Node cur = findRoot(currentNode);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
13 while (cur != null) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
14 Class<?> curClass = cur.getClass();
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
15 if (curClass == otherMetadata.getSpecializationClass()) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
16 return true;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
17 } else if (containsClass(otherMetadata.getExcludedBy(), cur)) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
18 return true;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
19 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
20 cur = getNext(cur);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
21 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
22 return false;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
23 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
24
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
25 private static boolean includes(Node oldNode, DSLNode newNode) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
26 return containsClass(newNode.getMetadata0().getIncludes(), oldNode);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
27 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
28
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
29 public static <T extends Node & DSLNode> T rewrite(Node thisNode, T newNode, String message) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
30 assert newNode != null;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
31 if (getNext(thisNode) != null || getPrevious(thisNode) != null) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
32 // already polymorphic -> append
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
33 return appendPolymorphic(findUninitialized(thisNode), newNode);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
34 } else if (includes(thisNode, newNode)) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
35 // included -> remains monomorphic
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
36 newNode.adoptChildren0(thisNode, null);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
37 return thisNode.replace(newNode, message);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
38 } else {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
39 // goto polymorphic
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
40 return null;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
41 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
42 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
43
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
44 @SuppressWarnings("unchecked")
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
45 public static <T extends Node> T findRoot(T node) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
46 Node prev = node;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
47 Node cur;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
48 do {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
49 cur = prev;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
50 prev = getPrevious(cur);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
51 } while (prev != null);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
52 return (T) cur;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
53 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
54
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
55 private static Node findUninitialized(Node node) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
56 Node next = node;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
57 Node cur;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
58 do {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
59 cur = next;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
60 next = getNext(cur);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
61 } while (next != null);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
62 return cur;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
63 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
64
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
65 public static <T extends Node & DSLNode> T rewriteUninitialized(Node uninitialized, T newNode) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
66 Node prev = getPrevious(uninitialized);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
67 if (prev == null) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
68 newNode.adoptChildren0(uninitialized, null);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
69 return uninitialized.replace(newNode, "Uninitialized monomorphic");
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
70 } else {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
71 return appendPolymorphic(uninitialized, newNode);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
72 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
73 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
74
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
75 public static <T extends Node & DSLNode> T rewriteToPolymorphic(Node oldNode, DSLNode uninitialized, T polymorphic, DSLNode currentCopy, DSLNode newNode, String message) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
76 assert getNext(oldNode) == null;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
77 assert getPrevious(oldNode) == null;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
78
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
79 polymorphic.adoptChildren0(oldNode, (Node) currentCopy);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
80
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
81 if (newNode == null) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
82 // fallback
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
83 currentCopy.adoptChildren0(null, (Node) uninitialized);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
84 } else {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
85 // new specialization
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
86 newNode.adoptChildren0(null, (Node) uninitialized);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
87 currentCopy.adoptChildren0(null, (Node) newNode);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
88 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
89
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
90 oldNode.replace(polymorphic, message);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
91
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
92 assert polymorphic.getNext0() == currentCopy;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
93 assert newNode != null ? currentCopy.getNext0() == newNode : currentCopy.getNext0() == uninitialized;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
94 assert uninitialized.getNext0() == null;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
95 return polymorphic;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
96 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
97
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
98 private static Class<?>[] mergeTypes(DSLNode node, Class<?>[] types) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
99 Class<?>[] specializedTypes = node.getMetadata0().getSpecializedTypes();
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
100 if (specializedTypes.length == 0) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
101 return null;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
102 } else if (types == null) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
103 return Arrays.copyOf(specializedTypes, specializedTypes.length);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
104 } else {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
105 for (int i = 0; i < specializedTypes.length; i++) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
106 if (specializedTypes[i] != types[i]) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
107 types[i] = Object.class;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
108 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
109 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
110 return types;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
111 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
112 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
113
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
114 private static <T extends Node & DSLNode> T appendPolymorphic(Node uninitialized, T newNode) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
115 Class<?>[] includes = newNode.getMetadata0().getIncludes();
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
116 Node cur = getPrevious(uninitialized);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
117 Node prev = uninitialized;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
118 int depth = 0;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
119 Class<?>[] types = null;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
120 while (cur != null) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
121 if (containsClass(includes, cur)) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
122 cur.replace(prev, "Included in other specialization");
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
123 cur = prev;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
124 } else {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
125 depth++;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
126 types = mergeTypes((DSLNode) cur, types);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
127 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
128 prev = cur;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
129 cur = getPrevious(cur);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
130 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
131 assert prev.getCost() == NodeCost.POLYMORPHIC;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
132
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
133 if (depth == 0) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
134 newNode.adoptChildren0(prev, null);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
135 return prev.replace(newNode, "Polymorphic to monomorphic.");
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
136 } else {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
137 newNode.adoptChildren0(null, uninitialized);
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
138 ((DSLNode) prev).updateTypes0(mergeTypes(newNode, types));
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
139 return uninitialized.replace(newNode, "Appended polymorphic");
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
140 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
141 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
142
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
143 private static boolean containsClass(Class<?>[] classList, Node node) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
144 Class<?> nodeClass = node.getClass();
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
145 for (Class<?> toCheck : classList) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
146 if (nodeClass == toCheck) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
147 if (node.getCost() == NodeCost.UNINITIALIZED) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
148 /*
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
149 * In case a specialization is excluded by the fallback specialization the
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
150 * uninitialized class is used as exclusion class. Because the fallback field in
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
151 * the uninitialized specialization is not accessible we use the costs to check
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
152 * if the fallback was reached or not. In case the fallback was reached in the
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
153 * uninitialized version the cost is MONOMORPHIC, otherwise it is UNINITIALIZED.
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
154 */
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
155 continue;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
156 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
157 return true;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
158 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
159 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
160 return false;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
161 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
162
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
163 private static Node getNext(Node node) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
164 return ((DSLNode) node).getNext0();
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
165 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
166
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
167 private static Node getPrevious(Node node) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
168 Node parent = node.getParent();
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
169 if (parent instanceof DSLNode && getNext(parent) == node) {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
170 return parent;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
171 } else {
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
172 return null;
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
173 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
174 }
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
175
4f589fa69b9c Truffle-DSL: added shared code required for the new generation layout.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
176 }