comparison truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.java @ 22176:cd7ee4a382e4

Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
author Andreas Woess <andreas.woess@oracle.com>
date Fri, 18 Sep 2015 17:07:55 +0200
parents dc83cc1f94f2
children 0d4b0e4263ee
comparison
equal deleted inserted replaced
22175:5d2a12c9aae1 22176:cd7ee4a382e4
22 * or visit www.oracle.com if you need additional information or have any 22 * or visit www.oracle.com if you need additional information or have any
23 * questions. 23 * questions.
24 */ 24 */
25 package com.oracle.truffle.api.nodes; 25 package com.oracle.truffle.api.nodes;
26 26
27 import java.lang.reflect.Field;
28
29 import sun.misc.Unsafe;
30
27 import com.oracle.truffle.api.nodes.Node.Child; 31 import com.oracle.truffle.api.nodes.Node.Child;
28 import com.oracle.truffle.api.nodes.Node.Children; 32 import com.oracle.truffle.api.nodes.Node.Children;
29 import com.oracle.truffle.api.nodes.NodeUtil.FieldOffsetProvider;
30 import java.lang.reflect.Field;
31 import sun.misc.Unsafe;
32 33
33 /** 34 /**
34 * Information about a field in a {@link Node} class. 35 * Information about a field in a {@link Node} class.
35 */ 36 */
36 public abstract class NodeFieldAccessor { 37 public abstract class NodeFieldAccessor {
89 public abstract void putObject(Node receiver, Object value); 90 public abstract void putObject(Node receiver, Object value);
90 91
91 public abstract Object getObject(Node receiver); 92 public abstract Object getObject(Node receiver);
92 93
93 public abstract Object loadValue(Node node); 94 public abstract Object loadValue(Node node);
94
95 private static final Unsafe unsafe = getUnsafe();
96
97 private static Unsafe getUnsafe() {
98 try {
99 return Unsafe.getUnsafe();
100 } catch (SecurityException e) {
101 }
102 try {
103 Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
104 theUnsafeInstance.setAccessible(true);
105 return (Unsafe) theUnsafeInstance.get(Unsafe.class);
106 } catch (Exception e) {
107 throw new RuntimeException("exception while trying to get Unsafe.theUnsafe via reflection:", e);
108 }
109 }
110
111 private static final FieldOffsetProvider unsafeFieldOffsetProvider = new FieldOffsetProvider() {
112
113 @Override
114 public long objectFieldOffset(Field field) {
115 return unsafe.objectFieldOffset(field);
116 }
117
118 @Override
119 public int getTypeSize(Class<?> clazz) {
120 if (!clazz.isPrimitive()) {
121 return Unsafe.ARRAY_OBJECT_INDEX_SCALE;
122 } else if (clazz == int.class) {
123 return Unsafe.ARRAY_INT_INDEX_SCALE;
124 } else {
125 throw new UnsupportedOperationException("unsupported field type: " + clazz);
126 }
127 }
128 };
129 95
130 public abstract static class AbstractUnsafeNodeFieldAccessor extends NodeFieldAccessor { 96 public abstract static class AbstractUnsafeNodeFieldAccessor extends NodeFieldAccessor {
131 97
132 protected AbstractUnsafeNodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) { 98 protected AbstractUnsafeNodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) {
133 super(kind, declaringClass, name, type); 99 super(kind, declaringClass, name, type);
173 return unsafe.getDouble(node, getOffset()); 139 return unsafe.getDouble(node, getOffset());
174 } else { 140 } else {
175 return unsafe.getObject(node, getOffset()); 141 return unsafe.getObject(node, getOffset());
176 } 142 }
177 } 143 }
144
145 private static final Unsafe unsafe = getUnsafe();
146
147 private static Unsafe getUnsafe() {
148 try {
149 return Unsafe.getUnsafe();
150 } catch (SecurityException e) {
151 }
152 try {
153 Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
154 theUnsafeInstance.setAccessible(true);
155 return (Unsafe) theUnsafeInstance.get(Unsafe.class);
156 } catch (Exception e) {
157 throw new RuntimeException("exception while trying to get Unsafe.theUnsafe via reflection:", e);
158 }
159 }
178 } 160 }
179 161
180 private static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor { 162 private static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor {
181 private final long offset; 163 private final long offset;
182 164
183 protected UnsafeNodeField(NodeFieldKind kind, Field field) { 165 protected UnsafeNodeField(NodeFieldKind kind, Field field) {
184 super(kind, field.getDeclaringClass(), field.getName(), field.getType()); 166 super(kind, field.getDeclaringClass(), field.getName(), field.getType());
185 this.offset = unsafeFieldOffsetProvider.objectFieldOffset(field); 167 this.offset = AbstractUnsafeNodeFieldAccessor.unsafe.objectFieldOffset(field);
186 } 168 }
187 169
188 @Override 170 @Override
189 public long getOffset() { 171 public long getOffset() {
190 return offset; 172 return offset;