# HG changeset patch # User Andreas Woess # Date 1435328741 -7200 # Node ID 4858c5e074e9005075e89cf5b1c2347ee73a5d31 # Parent de52ea7de779b650aac4314cc4a2dedeb5fc9814 clean up NodeFieldAccessor (remove #getOffset()) diff -r de52ea7de779 -r 4858c5e074e9 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java --- 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); } diff -r de52ea7de779 -r 4858c5e074e9 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java --- 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(); diff -r de52ea7de779 -r 4858c5e074e9 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderSerializer.java --- 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"); }