Mercurial > hg > truffle
annotate 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 |
rev | line source |
---|---|
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
1 /* |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
2 * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
4 * |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. Oracle designates this |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
8 * particular file as subject to the "Classpath" exception as provided |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
9 * by Oracle in the LICENSE file that accompanied this code. |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
10 * |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
11 * This code is distributed in the hope that it will be useful, but WITHOUT |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
14 * version 2 for more details (a copy is included in the LICENSE file that |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
15 * accompanied this code). |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
16 * |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU General Public License version |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
18 * 2 along with this work; if not, write to the Free Software Foundation, |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
20 * |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
22 * or visit www.oracle.com if you need additional information or have any |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
23 * questions. |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
24 */ |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
25 package com.oracle.truffle.api.nodes; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
26 |
22176
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
27 import java.lang.reflect.Field; |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
28 |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
29 import sun.misc.Unsafe; |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
30 |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
31 import com.oracle.truffle.api.nodes.Node.Child; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
32 import com.oracle.truffle.api.nodes.Node.Children; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
33 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
34 /** |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
35 * Information about a field in a {@link Node} class. |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
36 */ |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
37 public abstract class NodeFieldAccessor { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
38 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
39 public static enum NodeFieldKind { |
20130
8dc73c226c63
Truffle: cache NodeClass lookup in Node.
Christian Humer <christian.humer@gmail.com>
parents:
20129
diff
changeset
|
40 /** The reference to the {@link NodeClass}. */ |
8dc73c226c63
Truffle: cache NodeClass lookup in Node.
Christian Humer <christian.humer@gmail.com>
parents:
20129
diff
changeset
|
41 NODE_CLASS, |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
42 /** The single {@link Node#getParent() parent} field. */ |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
43 PARENT, |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
44 /** A field annotated with {@link Child}. */ |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
45 CHILD, |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
46 /** A field annotated with {@link Children}. */ |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
47 CHILDREN, |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
48 /** A normal non-child data field of the node. */ |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
49 DATA |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
50 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
51 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
52 private static final boolean USE_UNSAFE = Boolean.getBoolean("truffle.unsafe"); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
53 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
54 private final NodeFieldKind kind; |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
55 private final Class<?> declaringClass; |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
56 private final String name; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
57 protected final Class<?> type; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
58 |
21985
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
59 protected NodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) { |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
60 this.kind = kind; |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
61 this.declaringClass = declaringClass; |
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
62 this.name = name; |
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
63 this.type = type; |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
64 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
65 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
66 protected static NodeFieldAccessor create(NodeFieldKind kind, Field field) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
67 if (USE_UNSAFE) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
68 return new UnsafeNodeField(kind, field); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
69 } else { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
70 return new ReflectionNodeField(kind, field); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
71 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
72 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
73 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
74 public NodeFieldKind getKind() { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
75 return kind; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
76 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
77 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
78 public Class<?> getType() { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
79 return type; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
80 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
81 |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
82 public Class<?> getDeclaringClass() { |
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
83 return declaringClass; |
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
84 } |
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
85 |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
86 public String getName() { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
87 return name; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
88 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
89 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
90 public abstract void putObject(Node receiver, Object value); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
91 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
92 public abstract Object getObject(Node receiver); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
93 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
94 public abstract Object loadValue(Node node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
95 |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
96 public abstract static class AbstractUnsafeNodeFieldAccessor extends NodeFieldAccessor { |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
97 |
21985
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
98 protected AbstractUnsafeNodeFieldAccessor(NodeFieldKind kind, Class<?> declaringClass, String name, Class<?> type) { |
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
99 super(kind, declaringClass, name, type); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
100 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
101 |
21985
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
102 public abstract long getOffset(); |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
103 |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
104 @Override |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
105 public void putObject(Node receiver, Object value) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
106 if (!type.isPrimitive() && value == null || type.isInstance(value)) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
107 unsafe.putObject(receiver, getOffset(), value); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
108 } else { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
109 throw new IllegalArgumentException(); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
110 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
111 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
112 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
113 @Override |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
114 public Object getObject(Node receiver) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
115 if (!type.isPrimitive()) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
116 return unsafe.getObject(receiver, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
117 } else { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
118 throw new IllegalArgumentException(); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
119 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
120 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
121 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
122 @Override |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
123 public Object loadValue(Node node) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
124 if (type == boolean.class) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
125 return unsafe.getBoolean(node, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
126 } else if (type == byte.class) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
127 return unsafe.getByte(node, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
128 } else if (type == short.class) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
129 return unsafe.getShort(node, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
130 } else if (type == char.class) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
131 return unsafe.getChar(node, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
132 } else if (type == int.class) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
133 return unsafe.getInt(node, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
134 } else if (type == long.class) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
135 return unsafe.getLong(node, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
136 } else if (type == float.class) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
137 return unsafe.getFloat(node, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
138 } else if (type == double.class) { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
139 return unsafe.getDouble(node, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
140 } else { |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
141 return unsafe.getObject(node, getOffset()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
142 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
143 } |
22176
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
144 |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
145 private static final Unsafe unsafe = getUnsafe(); |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
146 |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
147 private static Unsafe getUnsafe() { |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
148 try { |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
149 return Unsafe.getUnsafe(); |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
150 } catch (SecurityException e) { |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
151 } |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
152 try { |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
153 Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe"); |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
154 theUnsafeInstance.setAccessible(true); |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
155 return (Unsafe) theUnsafeInstance.get(Unsafe.class); |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
156 } catch (Exception e) { |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
157 throw new RuntimeException("exception while trying to get Unsafe.theUnsafe via reflection:", e); |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
158 } |
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
159 } |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
160 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
161 |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
162 private static final class UnsafeNodeField extends AbstractUnsafeNodeFieldAccessor { |
21985
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
163 private final long offset; |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
164 |
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
165 protected UnsafeNodeField(NodeFieldKind kind, Field field) { |
21985
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
166 super(kind, field.getDeclaringClass(), field.getName(), field.getType()); |
22176
cd7ee4a382e4
Remove obsolete unsafeFieldOffsetProvider from NodeFieldAccessor
Andreas Woess <andreas.woess@oracle.com>
parents:
22157
diff
changeset
|
167 this.offset = AbstractUnsafeNodeFieldAccessor.unsafe.objectFieldOffset(field); |
21985
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
168 } |
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
169 |
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
170 @Override |
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
171 public long getOffset() { |
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
172 return offset; |
21965
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
173 } |
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
174 } |
0103d237f6c3
Make NodeFieldAccessor more flexible
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21951
diff
changeset
|
175 |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
176 private static final class ReflectionNodeField extends NodeFieldAccessor { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
177 private final Field field; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
178 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
179 protected ReflectionNodeField(NodeFieldKind kind, Field field) { |
21985
4858c5e074e9
clean up NodeFieldAccessor (remove #getOffset())
Andreas Woess <andreas.woess@oracle.com>
parents:
21967
diff
changeset
|
180 super(kind, field.getDeclaringClass(), field.getName(), field.getType()); |
20129
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
181 this.field = field; |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
182 field.setAccessible(true); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
183 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
184 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
185 @Override |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
186 public void putObject(Node receiver, Object value) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
187 assert !type.isPrimitive() && value == null || type.isInstance(value); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
188 try { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
189 field.set(receiver, value); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
190 } catch (IllegalAccessException e) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
191 throw new AssertionError(e); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
192 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
193 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
194 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
195 @Override |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
196 public Object getObject(Node receiver) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
197 assert !type.isPrimitive(); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
198 try { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
199 return field.get(receiver); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
200 } catch (IllegalAccessException e) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
201 throw new AssertionError(e); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
202 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
203 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
204 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
205 @Override |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
206 public Object loadValue(Node node) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
207 try { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
208 if (type == boolean.class) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
209 return field.getBoolean(node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
210 } else if (type == byte.class) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
211 return field.getByte(node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
212 } else if (type == short.class) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
213 return field.getShort(node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
214 } else if (type == char.class) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
215 return field.getChar(node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
216 } else if (type == int.class) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
217 return field.getInt(node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
218 } else if (type == long.class) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
219 return field.getLong(node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
220 } else if (type == float.class) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
221 return field.getFloat(node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
222 } else if (type == double.class) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
223 return field.getDouble(node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
224 } else { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
225 return field.get(node); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
226 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
227 } catch (IllegalAccessException e) { |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
228 throw new AssertionError(e); |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
229 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
230 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
231 } |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
232 |
5b7db8941fd7
Truffle: make NodeClass and NodeField a top-level class.
Christian Humer <christian.humer@gmail.com>
parents:
diff
changeset
|
233 } |