changeset 21985:4858c5e074e9

clean up NodeFieldAccessor (remove #getOffset())
author Andreas Woess <andreas.woess@oracle.com>
date Fri, 26 Jun 2015 16:25:41 +0200
parents de52ea7de779
children 67ea94a23074
files truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderSerializer.java
diffstat 3 files changed, 34 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java	Fri Jun 26 16:04:15 2015 +0200
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java	Fri Jun 26 16:25:41 2015 +0200
@@ -56,15 +56,12 @@
     private final Class<?> declaringClass;
     private final String name;
     protected final Class<?> type;
-    /* TODO: This field should be moved to UnsafeNodeField. */
-    protected final long offset;
 
-    protected NodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type, long offset) {
+    protected NodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) {
         this.kind = kind;
         this.declaringClass = declaringClass;
         this.name = name;
         this.type = type;
-        this.offset = offset;
     }
 
     protected static NodeFieldAccessor create(NodeFieldKind kind, Field field) {
@@ -91,14 +88,6 @@
         return name;
     }
 
-    /*
-     * TODO: This method should be removed from here. It should be an abstract method in
-     * AbstractUnsafeNodeFieldAccessor, and implemented in UnsafeNodeField.
-     */
-    public long getOffset() {
-        return offset;
-    }
-
     public abstract void putObject(Node receiver, Object value);
 
     public abstract Object getObject(Node receiver);
@@ -142,11 +131,11 @@
 
     public abstract static class AbstractUnsafeNodeFieldAccessor extends NodeFieldAccessor {
 
-        protected AbstractUnsafeNodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClas, String name, Class<?> type, long offset) {
-            super(kind, declaringClas, name, type, offset);
+        protected AbstractUnsafeNodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) {
+            super(kind, declaringClass, name, type);
         }
 
-        /* TODO abstract long getOffset() should be defined here. */
+        public abstract long getOffset();
 
         @Override
         public void putObject(Node receiver, Object value) {
@@ -191,10 +180,16 @@
     }
 
     private static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor {
-        /* TODO the offset field should be here, not in NodeFieldAccessor. */
+        private final long offset;
 
         protected UnsafeNodeField(NodeFieldKind kind, Field field) {
-            super(kind, field.getDeclaringClass(), field.getName(), field.getType(), unsafeFieldOffsetProvider.objectFieldOffset(field));
+            super(kind, field.getDeclaringClass(), field.getName(), field.getType());
+            this.offset = unsafeFieldOffsetProvider.objectFieldOffset(field);
+        }
+
+        @Override
+        public long getOffset() {
+            return offset;
         }
     }
 
@@ -202,7 +197,7 @@
         private final Field field;
 
         protected ReflectionNodeField(NodeFieldKind kind, Field field) {
-            super(kind, field.getDeclaringClass(), field.getName(), field.getType(), unsafeFieldOffsetProvider.objectFieldOffset(field));
+            super(kind, field.getDeclaringClass(), field.getName(), field.getType());
             this.field = field;
             field.setAccessible(true);
         }
--- 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();
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderSerializer.java	Fri Jun 26 16:04:15 2015 +0200
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderSerializer.java	Fri Jun 26 16:25:41 2015 +0200
@@ -24,6 +24,8 @@
  */
 package com.oracle.truffle.api.nodes.serial;
 
+import static com.oracle.truffle.api.nodes.serial.PostOrderDeserializer.*;
+
 import java.lang.reflect.*;
 import java.nio.*;
 
@@ -89,7 +91,7 @@
             NodeFieldAccessor field = nodeFields[i];
             if (field.getKind() == NodeFieldKind.DATA) {
                 Class<?> fieldClass = field.getType();
-                long offset = field.getOffset();
+                long offset = getFieldOffset(field);
                 int cpi;
 
                 if (field.getType().isAssignableFrom(SourceSection.class)) {
@@ -150,7 +152,7 @@
         for (int i = 0; i < nodeFields.length; i++) {
             NodeFieldAccessor field = nodeFields[i];
             if (field.getKind() == NodeFieldKind.CHILDREN) {
-                Object childArrayObject = unsafe.getObject(nodeInstance, field.getOffset());
+                Object childArrayObject = unsafe.getObject(nodeInstance, getFieldOffset(field));
                 if (childArrayObject != null && !(childArrayObject instanceof Node[])) {
                     throw new AssertionError("Node children must be instanceof Node[]");
                 }
@@ -175,7 +177,7 @@
         for (int i = 0; i < nodeFields.length; i++) {
             NodeFieldAccessor field = nodeFields[i];
             if (field.getKind() == NodeFieldKind.CHILD) {
-                Object childObject = unsafe.getObject(nodeInstance, field.getOffset());
+                Object childObject = unsafe.getObject(nodeInstance, getFieldOffset(field));
                 if (childObject != null && !(childObject instanceof Node)) {
                     throw new AssertionError("Node children must be instanceof Node");
                 }