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)) {