Mercurial > hg > truffle
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 } |