Mercurial > hg > truffle
diff truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java @ 21985:4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
author | Andreas Woess <andreas.woess@oracle.com> |
---|---|
date | Fri, 26 Jun 2015 16:25:41 +0200 |
parents | 9c8c0937da41 |
children | dc83cc1f94f2 |
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java Fri Jun 26 16:04:15 2015 +0200 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java Fri Jun 26 16:25:41 2015 +0200 @@ -159,7 +159,7 @@ NodeFieldAccessor field = nodeFields[i]; if (field.getKind() == NodeFieldKind.DATA) { Class<?> fieldClass = field.getType(); - long offset = field.getOffset(); + long offset = getFieldOffset(field); // source sections are not serialized // TODO add support for source sections @@ -241,7 +241,7 @@ for (int i = nodeFields.length - 1; i >= 0; i--) { NodeFieldAccessor field = nodeFields[i]; if (field.getKind() == NodeFieldKind.CHILD) { - unsafe.putObject(parent, field.getOffset(), popNode(parent, field.getType())); + unsafe.putObject(parent, getFieldOffset(field), popNode(parent, field.getType())); } } } @@ -250,7 +250,7 @@ for (int i = nodeFields.length - 1; i >= 0; i--) { NodeFieldAccessor field = nodeFields[i]; if (field.getKind() == NodeFieldKind.CHILDREN) { - unsafe.putObject(parent, field.getOffset(), popArray(parent, field.getType())); + unsafe.putObject(parent, getFieldOffset(field), popArray(parent, field.getType())); } } } @@ -264,6 +264,19 @@ return child; } + static long getFieldOffset(NodeFieldAccessor field) { + if (field instanceof NodeFieldAccessor.AbstractUnsafeNodeFieldAccessor) { + return ((NodeFieldAccessor.AbstractUnsafeNodeFieldAccessor) field).getOffset(); + } else { + try { + Field reflectionField = field.getDeclaringClass().getDeclaredField(field.getName()); + return unsafe.objectFieldOffset(reflectionField); + } catch (NoSuchFieldException | SecurityException e) { + throw new RuntimeException(e); + } + } + } + private static Unsafe loadUnsafe() { try { return Unsafe.getUnsafe();