Mercurial > hg > truffle
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; |