Mercurial > hg > truffle
comparison truffle/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java @ 22508:a619835e6709
SpecializationNode refactoring: update root field through generated setter
author | Andreas Woess <andreas.woess@oracle.com> |
---|---|
date | Thu, 17 Dec 2015 16:16:10 +0100 |
parents | 23bdb1a46d0c |
children | 53d05fc21834 |
comparison
equal
deleted
inserted
replaced
22507:23bdb1a46d0c | 22508:a619835e6709 |
---|---|
22 * or visit www.oracle.com if you need additional information or have any | 22 * or visit www.oracle.com if you need additional information or have any |
23 * questions. | 23 * questions. |
24 */ | 24 */ |
25 package com.oracle.truffle.api.dsl.internal; | 25 package com.oracle.truffle.api.dsl.internal; |
26 | 26 |
27 import java.lang.reflect.Field; | |
28 import java.lang.reflect.Modifier; | |
29 import java.util.Arrays; | |
30 import java.util.concurrent.Callable; | |
31 | |
27 import com.oracle.truffle.api.Assumption; | 32 import com.oracle.truffle.api.Assumption; |
28 import com.oracle.truffle.api.CompilerAsserts; | 33 import com.oracle.truffle.api.CompilerAsserts; |
29 import com.oracle.truffle.api.CompilerDirectives; | 34 import com.oracle.truffle.api.CompilerDirectives; |
30 import com.oracle.truffle.api.dsl.UnsupportedSpecializationException; | 35 import com.oracle.truffle.api.dsl.UnsupportedSpecializationException; |
31 import com.oracle.truffle.api.dsl.internal.SlowPathEvent.SlowPathEvent0; | 36 import com.oracle.truffle.api.dsl.internal.SlowPathEvent.SlowPathEvent0; |
37 import com.oracle.truffle.api.dsl.internal.SlowPathEvent.SlowPathEventN; | 42 import com.oracle.truffle.api.dsl.internal.SlowPathEvent.SlowPathEventN; |
38 import com.oracle.truffle.api.frame.Frame; | 43 import com.oracle.truffle.api.frame.Frame; |
39 import com.oracle.truffle.api.nodes.ExplodeLoop; | 44 import com.oracle.truffle.api.nodes.ExplodeLoop; |
40 import com.oracle.truffle.api.nodes.InvalidAssumptionException; | 45 import com.oracle.truffle.api.nodes.InvalidAssumptionException; |
41 import com.oracle.truffle.api.nodes.Node; | 46 import com.oracle.truffle.api.nodes.Node; |
42 import com.oracle.truffle.api.nodes.NodeClass; | |
43 import com.oracle.truffle.api.nodes.NodeCost; | 47 import com.oracle.truffle.api.nodes.NodeCost; |
44 import com.oracle.truffle.api.nodes.NodeFieldAccessor; | |
45 import com.oracle.truffle.api.nodes.NodeInfo; | 48 import com.oracle.truffle.api.nodes.NodeInfo; |
46 import com.oracle.truffle.api.nodes.NodeUtil; | 49 import com.oracle.truffle.api.nodes.NodeUtil; |
47 import java.lang.reflect.Field; | |
48 import java.lang.reflect.Modifier; | |
49 import java.util.Arrays; | |
50 import java.util.concurrent.Callable; | |
51 | 50 |
52 /** | 51 /** |
53 * Internal implementation dependent base class for generated specialized nodes. | 52 * Internal implementation dependent base class for generated specialized nodes. |
54 */ | 53 */ |
55 @NodeInfo(cost = NodeCost.NONE) | 54 @NodeInfo(cost = NodeCost.NONE) |
81 updateRootImpl(((SpecializedNode) node).getSpecializationNode(), node); | 80 updateRootImpl(((SpecializedNode) node).getSpecializationNode(), node); |
82 return node; | 81 return node; |
83 } | 82 } |
84 | 83 |
85 private static void updateRootImpl(SpecializationNode start, Node node) { | 84 private static void updateRootImpl(SpecializationNode start, Node node) { |
86 NodeFieldAccessor[] fields = NodeClass.get(start).getFields(); | 85 start.setRoot(node); |
87 for (int i = fields.length - 1; i >= 0; i--) { | |
88 NodeFieldAccessor f = fields[i]; | |
89 if (f.getName().equals("root")) { | |
90 f.putObject(start, node); | |
91 break; | |
92 } | |
93 } | |
94 if (start.next != null) { | 86 if (start.next != null) { |
95 updateRootImpl(start.next, node); | 87 updateRootImpl(start.next, node); |
96 } | 88 } |
97 } | 89 } |
98 | 90 |
112 return NodeCost.MONOMORPHIC; | 104 return NodeCost.MONOMORPHIC; |
113 default: | 105 default: |
114 return NodeCost.POLYMORPHIC; | 106 return NodeCost.POLYMORPHIC; |
115 } | 107 } |
116 } | 108 } |
109 | |
110 protected abstract void setRoot(Node root); | |
117 | 111 |
118 protected abstract Node[] getSuppliedChildren(); | 112 protected abstract Node[] getSuppliedChildren(); |
119 | 113 |
120 protected SpecializationNode merge(SpecializationNode newNode, Frame frame) { | 114 protected SpecializationNode merge(SpecializationNode newNode, Frame frame) { |
121 if (isIdentical(newNode, frame)) { | 115 if (isIdentical(newNode, frame)) { |