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<>();