comparison truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java @ 22368:0d4b0e4263ee

Convert NodeClass and NodeFieldAccessor to interfaces
author Christian Wimmer <christian.wimmer@oracle.com>
date Fri, 13 Nov 2015 10:29:52 -0800
parents dc83cc1f94f2
children
comparison
equal deleted inserted replaced
22367:1b48778cee21 22368:0d4b0e4263ee
146 throw new RuntimeException("Class is not a truffle node " + nodeClass); 146 throw new RuntimeException("Class is not a truffle node " + nodeClass);
147 } 147 }
148 148
149 Node node = (Node) object; 149 Node node = (Node) object;
150 150
151 NodeFieldAccessor[] nodeFields = NodeClass.get(nodeClass).getFields(); 151 NodeFieldAccessor[] nodeFields = NodeClass.Lookup.get(nodeClass).getFields();
152 deserializeChildrenFields(node, nodeFields); 152 deserializeChildrenFields(node, nodeFields);
153 deserializeChildFields(node, nodeFields); 153 deserializeChildFields(node, nodeFields);
154 deserializeDataFields(buffer, node, nodeFields); 154 deserializeDataFields(buffer, node, nodeFields);
155 155
156 return node; 156 return node;
158 158
159 private void deserializeDataFields(VariableLengthIntBuffer buffer, Node nodeInstance, NodeFieldAccessor[] nodeFields) throws UnsupportedConstantPoolTypeException { 159 private void deserializeDataFields(VariableLengthIntBuffer buffer, Node nodeInstance, NodeFieldAccessor[] nodeFields) throws UnsupportedConstantPoolTypeException {
160 for (int i = 0; i < nodeFields.length; i++) { 160 for (int i = 0; i < nodeFields.length; i++) {
161 NodeFieldAccessor field = nodeFields[i]; 161 NodeFieldAccessor field = nodeFields[i];
162 if (field.getKind() == NodeFieldKind.DATA) { 162 if (field.getKind() == NodeFieldKind.DATA) {
163 Class<?> fieldClass = field.getType(); 163 Class<?> fieldClass = field.getFieldType();
164 long offset = getFieldOffset(field); 164 long offset = getFieldOffset(field);
165 165
166 // source sections are not serialized 166 // source sections are not serialized
167 // TODO add support for source sections 167 // TODO add support for source sections
168 if (field.getType().isAssignableFrom(SourceSection.class)) { 168 if (field.getFieldType().isAssignableFrom(SourceSection.class)) {
169 continue; 169 continue;
170 } 170 }
171 171
172 int cpi = buffer.get(); 172 int cpi = buffer.get();
173 if (cpi == VariableLengthIntBuffer.NULL) { 173 if (cpi == VariableLengthIntBuffer.NULL) {
241 241
242 private void deserializeChildFields(Node parent, NodeFieldAccessor[] nodeFields) { 242 private void deserializeChildFields(Node parent, NodeFieldAccessor[] nodeFields) {
243 for (int i = nodeFields.length - 1; i >= 0; i--) { 243 for (int i = nodeFields.length - 1; i >= 0; i--) {
244 NodeFieldAccessor field = nodeFields[i]; 244 NodeFieldAccessor field = nodeFields[i];
245 if (field.getKind() == NodeFieldKind.CHILD) { 245 if (field.getKind() == NodeFieldKind.CHILD) {
246 unsafe.putObject(parent, getFieldOffset(field), popNode(parent, field.getType())); 246 unsafe.putObject(parent, getFieldOffset(field), popNode(parent, field.getFieldType()));
247 } 247 }
248 } 248 }
249 } 249 }
250 250
251 private void deserializeChildrenFields(Node parent, NodeFieldAccessor[] nodeFields) { 251 private void deserializeChildrenFields(Node parent, NodeFieldAccessor[] nodeFields) {
252 for (int i = nodeFields.length - 1; i >= 0; i--) { 252 for (int i = nodeFields.length - 1; i >= 0; i--) {
253 NodeFieldAccessor field = nodeFields[i]; 253 NodeFieldAccessor field = nodeFields[i];
254 if (field.getKind() == NodeFieldKind.CHILDREN) { 254 if (field.getKind() == NodeFieldKind.CHILDREN) {
255 unsafe.putObject(parent, getFieldOffset(field), popArray(parent, field.getType())); 255 unsafe.putObject(parent, getFieldOffset(field), popArray(parent, field.getFieldType()));
256 } 256 }
257 } 257 }
258 } 258 }
259 259
260 private static Node updateParent(Node parent, Node child) { 260 private static Node updateParent(Node parent, Node child) {
261 if (child != null) { 261 if (child != null) {
262 NodeClass nodeClass = NodeClass.get(child.getClass()); 262 NodeClass nodeClass = NodeClass.Lookup.get(child.getClass());
263 nodeClass.getNodeClassField().putObject(child, nodeClass); 263 nodeClass.getNodeClassField().putObject(child, nodeClass);
264 nodeClass.getParentField().putObject(child, parent); 264 nodeClass.getParentField().putObject(child, parent);
265 } 265 }
266 return child; 266 return child;
267 } 267 }
269 static long getFieldOffset(NodeFieldAccessor field) { 269 static long getFieldOffset(NodeFieldAccessor field) {
270 if (field instanceof NodeFieldAccessor.AbstractUnsafeNodeFieldAccessor) { 270 if (field instanceof NodeFieldAccessor.AbstractUnsafeNodeFieldAccessor) {
271 return ((NodeFieldAccessor.AbstractUnsafeNodeFieldAccessor) field).getOffset(); 271 return ((NodeFieldAccessor.AbstractUnsafeNodeFieldAccessor) field).getOffset();
272 } else { 272 } else {
273 try { 273 try {
274 Field reflectionField = field.getDeclaringClass().getDeclaredField(field.getName()); 274 Field reflectionField = field.getFieldDeclaringClass().getDeclaredField(field.getName());
275 return unsafe.objectFieldOffset(reflectionField); 275 return unsafe.objectFieldOffset(reflectionField);
276 } catch (NoSuchFieldException | SecurityException e) { 276 } catch (NoSuchFieldException | SecurityException e) {
277 throw new RuntimeException(e); 277 throw new RuntimeException(e);
278 } 278 }
279 } 279 }