Mercurial > hg > graal-jvmci-8
comparison graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java @ 16466:d41922beb512
Truffle: use ClassValue for NodeClass
author | Andreas Woess <andreas.woess@jku.at> |
---|---|
date | Thu, 10 Jul 2014 18:08:29 +0200 |
parents | 456abab80eb5 |
children | 17f7331dcc4f |
comparison
equal
deleted
inserted
replaced
16465:456abab80eb5 | 16466:d41922beb512 |
---|---|
155 /** | 155 /** |
156 * Information about a {@link Node} class. A single instance of this class is allocated for | 156 * Information about a {@link Node} class. A single instance of this class is allocated for |
157 * every subclass of {@link Node} that is used. | 157 * every subclass of {@link Node} that is used. |
158 */ | 158 */ |
159 public static final class NodeClass { | 159 public static final class NodeClass { |
160 | 160 private static final ClassValue<NodeClass> nodeClasses = new ClassValue<NodeClass>() { |
161 private static final Map<Class<?>, NodeClass> nodeClasses = new IdentityHashMap<>(); | 161 @SuppressWarnings("unchecked") |
162 @Override | |
163 protected NodeClass computeValue(Class<?> clazz) { | |
164 assert Node.class.isAssignableFrom(clazz); | |
165 return new NodeClass((Class<? extends Node>) clazz, unsafeFieldOffsetProvider); | |
166 } | |
167 }; | |
162 | 168 |
163 // The comprehensive list of all fields. | 169 // The comprehensive list of all fields. |
164 private final NodeField[] fields; | 170 private final NodeField[] fields; |
165 // Separate arrays for the frequently accessed field offsets. | 171 // Separate arrays for the frequently accessed field offsets. |
166 private final long parentOffset; | 172 private final long parentOffset; |
167 private final long[] childOffsets; | 173 private final long[] childOffsets; |
168 private final long[] childrenOffsets; | 174 private final long[] childrenOffsets; |
169 | 175 |
170 public static NodeClass get(Class<? extends Node> clazz) { | 176 public static NodeClass get(Class<? extends Node> clazz) { |
171 NodeClass nodeClass = nodeClasses.get(clazz); | 177 return nodeClasses.get(clazz); |
172 if (nodeClass == null) { | |
173 nodeClass = new NodeClass(clazz, unsafeFieldOffsetProvider); | |
174 nodeClasses.put(clazz, nodeClass); | |
175 } | |
176 return nodeClass; | |
177 } | 178 } |
178 | 179 |
179 public NodeClass(Class<? extends Node> clazz, FieldOffsetProvider fieldOffsetProvider) { | 180 public NodeClass(Class<? extends Node> clazz, FieldOffsetProvider fieldOffsetProvider) { |
180 List<NodeField> fieldsList = new ArrayList<>(); | 181 List<NodeField> fieldsList = new ArrayList<>(); |
181 List<Long> parentOffsetsList = new ArrayList<>(); | 182 List<Long> parentOffsetsList = new ArrayList<>(); |