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