Mercurial > hg > truffle
comparison truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeFieldAccessor.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 | 08db96a633b9 |
children | dc83cc1f94f2 |
comparison
equal
deleted
inserted
replaced
21984:de52ea7de779 | 21985:4858c5e074e9 |
---|---|
54 | 54 |
55 private final NodeFieldKind kind; | 55 private final NodeFieldKind kind; |
56 private final Class<?> declaringClass; | 56 private final Class<?> declaringClass; |
57 private final String name; | 57 private final String name; |
58 protected final Class<?> type; | 58 protected final Class<?> type; |
59 /* TODO: This field should be moved to UnsafeNodeField. */ | 59 |
60 protected final long offset; | 60 protected NodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) { |
61 | |
62 protected NodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type, long offset) { | |
63 this.kind = kind; | 61 this.kind = kind; |
64 this.declaringClass = declaringClass; | 62 this.declaringClass = declaringClass; |
65 this.name = name; | 63 this.name = name; |
66 this.type = type; | 64 this.type = type; |
67 this.offset = offset; | |
68 } | 65 } |
69 | 66 |
70 protected static NodeFieldAccessor create(NodeFieldKind kind, Field field) { | 67 protected static NodeFieldAccessor create(NodeFieldKind kind, Field field) { |
71 if (USE_UNSAFE) { | 68 if (USE_UNSAFE) { |
72 return new UnsafeNodeField(kind, field); | 69 return new UnsafeNodeField(kind, field); |
87 return declaringClass; | 84 return declaringClass; |
88 } | 85 } |
89 | 86 |
90 public String getName() { | 87 public String getName() { |
91 return name; | 88 return name; |
92 } | |
93 | |
94 /* | |
95 * TODO: This method should be removed from here. It should be an abstract method in | |
96 * AbstractUnsafeNodeFieldAccessor, and implemented in UnsafeNodeField. | |
97 */ | |
98 public long getOffset() { | |
99 return offset; | |
100 } | 89 } |
101 | 90 |
102 public abstract void putObject(Node receiver, Object value); | 91 public abstract void putObject(Node receiver, Object value); |
103 | 92 |
104 public abstract Object getObject(Node receiver); | 93 public abstract Object getObject(Node receiver); |
140 } | 129 } |
141 }; | 130 }; |
142 | 131 |
143 public abstract static class AbstractUnsafeNodeFieldAccessor extends NodeFieldAccessor { | 132 public abstract static class AbstractUnsafeNodeFieldAccessor extends NodeFieldAccessor { |
144 | 133 |
145 protected AbstractUnsafeNodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClas, String name, Class<?> type, long offset) { | 134 protected AbstractUnsafeNodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) { |
146 super(kind, declaringClas, name, type, offset); | 135 super(kind, declaringClass, name, type); |
147 } | 136 } |
148 | 137 |
149 /* TODO abstract long getOffset() should be defined here. */ | 138 public abstract long getOffset(); |
150 | 139 |
151 @Override | 140 @Override |
152 public void putObject(Node receiver, Object value) { | 141 public void putObject(Node receiver, Object value) { |
153 if (!type.isPrimitive() && value == null || type.isInstance(value)) { | 142 if (!type.isPrimitive() && value == null || type.isInstance(value)) { |
154 unsafe.putObject(receiver, getOffset(), value); | 143 unsafe.putObject(receiver, getOffset(), value); |
189 } | 178 } |
190 } | 179 } |
191 } | 180 } |
192 | 181 |
193 private static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor { | 182 private static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor { |
194 /* TODO the offset field should be here, not in NodeFieldAccessor. */ | 183 private final long offset; |
195 | 184 |
196 protected UnsafeNodeField(NodeFieldKind kind, Field field) { | 185 protected UnsafeNodeField(NodeFieldKind kind, Field field) { |
197 super(kind, field.getDeclaringClass(), field.getName(), field.getType(), unsafeFieldOffsetProvider.objectFieldOffset(field)); | 186 super(kind, field.getDeclaringClass(), field.getName(), field.getType()); |
187 this.offset = unsafeFieldOffsetProvider.objectFieldOffset(field); | |
188 } | |
189 | |
190 @Override | |
191 public long getOffset() { | |
192 return offset; | |
198 } | 193 } |
199 } | 194 } |
200 | 195 |
201 private static final class ReflectionNodeField extends NodeFieldAccessor { | 196 private static final class ReflectionNodeField extends NodeFieldAccessor { |
202 private final Field field; | 197 private final Field field; |
203 | 198 |
204 protected ReflectionNodeField(NodeFieldKind kind, Field field) { | 199 protected ReflectionNodeField(NodeFieldKind kind, Field field) { |
205 super(kind, field.getDeclaringClass(), field.getName(), field.getType(), unsafeFieldOffsetProvider.objectFieldOffset(field)); | 200 super(kind, field.getDeclaringClass(), field.getName(), field.getType()); |
206 this.field = field; | 201 this.field = field; |
207 field.setAccessible(true); | 202 field.setAccessible(true); |
208 } | 203 } |
209 | 204 |
210 @Override | 205 @Override |