annotate graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/serial/PostOrderDeserializer.java @ 16067:915ebb306fcc

Truffle/Source: major API revision - All source-related classes now in com.oracle.truffle.api.source - SourceFactory replaced with factory methods on Source - Revision, renaming, and documentation to methods on Source and SourceSection - NullSourceSection is now a utility class
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Fri, 06 Jun 2014 17:51:47 -0700
parents 64dcb92ee75a
children 45fff0246a43
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12388
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1 /*
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
4 *
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
7 * published by the Free Software Foundation. Oracle designates this
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
8 * particular file as subject to the "Classpath" exception as provided
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
9 * by Oracle in the LICENSE file that accompanied this code.
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
10 *
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
11 * This code is distributed in the hope that it will be useful, but WITHOUT
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
14 * version 2 for more details (a copy is included in the LICENSE file that
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
15 * accompanied this code).
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
16 *
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License version
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
18 * 2 along with this work; if not, write to the Free Software Foundation,
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
20 *
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
22 * or visit www.oracle.com if you need additional information or have any
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
23 * questions.
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
24 */
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
25 package com.oracle.truffle.api.nodes.serial;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
26
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
27 import java.lang.reflect.*;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
28 import java.util.*;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
29
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
30 import sun.misc.*;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
31
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
32 import com.oracle.truffle.api.nodes.*;
14991
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 12388
diff changeset
33 import com.oracle.truffle.api.nodes.NodeUtil.NodeClass;
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 12388
diff changeset
34 import com.oracle.truffle.api.nodes.NodeUtil.NodeField;
64dcb92ee75a Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 12388
diff changeset
35 import com.oracle.truffle.api.nodes.NodeUtil.NodeFieldKind;
16067
915ebb306fcc Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 14991
diff changeset
36 import com.oracle.truffle.api.source.*;
12388
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
37
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
38 /**
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
39 * Experimental API. May change without notice.
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
40 */
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
41 public final class PostOrderDeserializer {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
42
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
43 private static final Unsafe unsafe = loadUnsafe();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
44
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
45 private final SerializerConstantPool cp;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
46
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
47 private final HierarchicalStack stack = new HierarchicalStack();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
48
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
49 /**
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
50 * Constructs a new serializer using a custom {@link SerializerConstantPool} implementation. For
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
51 * the {@link SerializerConstantPool} implementation at least the following methods must be
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
52 * implemented:
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
53 * <ul>
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
54 * <li>{@link SerializerConstantPool#getInt(int)}</li>
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
55 * <li>{@link SerializerConstantPool#getClass(int)}</li>
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
56 * </ul>
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
57 */
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
58 public PostOrderDeserializer(SerializerConstantPool cp) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
59 this.cp = cp;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
60 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
61
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
62 /**
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
63 * Deserializes the byte stream and returns the deserialized Truffle AST node.
16067
915ebb306fcc Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 14991
diff changeset
64 *
12388
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
65 * @param bytes the trimmed byte array containing the serialized data
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
66 * @param expectedType the expected root node type. Throws an exception if the root node is not
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
67 * assignable from this type.
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
68 * @return the deserialized Truffle AST represented by the root Node.
16067
915ebb306fcc Truffle/Source: major API revision
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 14991
diff changeset
69 *
12388
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
70 * @throws UnsupportedConstantPoolTypeException thrown if a type is encountered that is not
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
71 * supported by the constant pool implementation.
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
72 */
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
73 @SuppressWarnings("unchecked")
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
74 public <T extends Node> T deserialize(byte[] bytes, Class<T> expectedType) throws UnsupportedConstantPoolTypeException {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
75 VariableLengthIntBuffer buffer = new VariableLengthIntBuffer(bytes);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
76
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
77 while (buffer.hasRemaining()) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
78 int classCPI = buffer.get();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
79 if (classCPI == VariableLengthIntBuffer.NULL) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
80 pushNode(null);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
81 } else {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
82 Class<?> clazz = cp.getClass(classCPI);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
83 if (clazz.isArray()) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
84 int lengthCPI = buffer.get();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
85 if (lengthCPI == VariableLengthIntBuffer.NULL) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
86 pushArray(null);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
87 } else {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
88 pushArray((Node[]) Array.newInstance(clazz.getComponentType(), cp.getInt(lengthCPI)));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
89 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
90 } else {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
91 pushNode(invokeDeserialize(buffer, clazz.asSubclass(Node.class)));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
92 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
93 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
94 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
95 T returnNode = (T) popNode(null, expectedType);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
96
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
97 assert stack.dynamicStack.isEmpty();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
98
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
99 return returnNode;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
100 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
101
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
102 private void pushNode(Node node) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
103 stack.push(node);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
104 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
105
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
106 private void pushArray(Node[] array) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
107 stack.pushStack(array);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
108 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
109
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
110 private Node[] popArray(Node parent, Class<?> expectedType) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
111 Node[] array = (Node[]) stack.popStack();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
112 if (array != null) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
113 assertType(array, expectedType);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
114 for (int i = 0; i < array.length; i++) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
115 updateParent(parent, array[i]);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
116 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
117 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
118 return array;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
119 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
120
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
121 private Node popNode(Node parent, Class<?> expectedType) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
122 Object o = stack.pop();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
123 assertType(o, expectedType);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
124 updateParent(parent, (Node) o);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
125 return (Node) o;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
126 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
127
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
128 private static void assertType(Object o, Class<?> expectedType) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
129 if (o != null && !expectedType.isAssignableFrom(o.getClass())) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
130 throw new AssertionError("Expected element type '" + expectedType.getName() + "' but was '" + o.getClass().getName() + "'.");
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
131 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
132 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
133
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
134 private Node invokeDeserialize(VariableLengthIntBuffer buffer, Class<? extends Node> nodeClass) throws UnsupportedConstantPoolTypeException {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
135 if (nodeClass == null) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
136 return null;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
137 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
138
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
139 Object object;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
140 try {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
141 object = unsafe.allocateInstance(nodeClass);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
142 } catch (InstantiationException e) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
143 throw new RuntimeException("Unable to allocate truffle node " + nodeClass, e);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
144 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
145 if (!(object instanceof Node)) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
146 throw new RuntimeException("Class is not a truffle node " + nodeClass);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
147 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
148
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
149 Node node = (Node) object;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
150
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
151 NodeField[] nodeFields = NodeClass.get(nodeClass).getFields();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
152 deserializeChildrenFields(node, nodeFields);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
153 deserializeChildFields(node, nodeFields);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
154 deserializeDataFields(buffer, node, nodeFields);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
155
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
156 return node;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
157 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
158
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
159 private void deserializeDataFields(VariableLengthIntBuffer buffer, Node nodeInstance, NodeField[] nodeFields) throws UnsupportedConstantPoolTypeException {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
160 for (int i = 0; i < nodeFields.length; i++) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
161 NodeField field = nodeFields[i];
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
162 if (field.getKind() == NodeFieldKind.DATA) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
163 Class<?> fieldClass = field.getType();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
164 long offset = field.getOffset();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
165
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
166 // source sections are not serialized
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
167 // TODO add support for source sections
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
168 if (field.getType().isAssignableFrom(SourceSection.class)) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
169 continue;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
170 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
171
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
172 int cpi = buffer.get();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
173 if (cpi == VariableLengthIntBuffer.NULL) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
174 if (fieldClass == int.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
175 unsafe.putInt(nodeInstance, offset, 0);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
176 } else if (fieldClass == long.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
177 unsafe.putLong(nodeInstance, offset, 0L);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
178 } else if (fieldClass == float.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
179 unsafe.putFloat(nodeInstance, offset, 0.0F);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
180 } else if (fieldClass == double.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
181 unsafe.putDouble(nodeInstance, offset, 0.0D);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
182 } else if (fieldClass == byte.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
183 unsafe.putByte(nodeInstance, offset, (byte) 0);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
184 } else if (fieldClass == short.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
185 unsafe.putShort(nodeInstance, offset, (short) 0);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
186 } else if (fieldClass == char.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
187 unsafe.putChar(nodeInstance, offset, (char) 0);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
188 } else if (fieldClass == boolean.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
189 unsafe.putBoolean(nodeInstance, offset, false);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
190 } else {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
191 unsafe.putObject(nodeInstance, offset, null);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
192 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
193 } else {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
194 if (fieldClass == int.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
195 unsafe.putInt(nodeInstance, offset, cp.getInt(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
196 } else if (fieldClass == long.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
197 unsafe.putLong(nodeInstance, offset, cp.getLong(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
198 } else if (fieldClass == float.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
199 unsafe.putFloat(nodeInstance, offset, cp.getFloat(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
200 } else if (fieldClass == double.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
201 unsafe.putDouble(nodeInstance, offset, cp.getDouble(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
202 } else if (fieldClass == byte.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
203 unsafe.putByte(nodeInstance, offset, (byte) cp.getInt(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
204 } else if (fieldClass == short.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
205 unsafe.putShort(nodeInstance, offset, (short) cp.getInt(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
206 } else if (fieldClass == char.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
207 unsafe.putChar(nodeInstance, offset, (char) cp.getInt(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
208 } else if (fieldClass == boolean.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
209 unsafe.putBoolean(nodeInstance, offset, cp.getInt(cpi) == 1 ? true : false);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
210 } else if (fieldClass == Integer.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
211 unsafe.putObject(nodeInstance, offset, cp.getInt(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
212 } else if (fieldClass == Long.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
213 unsafe.putObject(nodeInstance, offset, cp.getLong(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
214 } else if (fieldClass == Float.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
215 unsafe.putObject(nodeInstance, offset, cp.getFloat(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
216 } else if (fieldClass == Double.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
217 unsafe.putObject(nodeInstance, offset, cp.getDouble(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
218 } else if (fieldClass == Byte.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
219 unsafe.putObject(nodeInstance, offset, (byte) cp.getInt(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
220 } else if (fieldClass == Short.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
221 unsafe.putObject(nodeInstance, offset, (short) cp.getInt(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
222 } else if (fieldClass == Character.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
223 unsafe.putObject(nodeInstance, offset, (char) cp.getInt(cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
224 } else if (fieldClass == Boolean.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
225 unsafe.putObject(nodeInstance, offset, cp.getInt(cpi) == 1 ? Boolean.TRUE : Boolean.FALSE);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
226 } else {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
227 unsafe.putObject(nodeInstance, offset, cp.getObject(fieldClass, cpi));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
228 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
229 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
230 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
231 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
232 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
233
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
234 private void deserializeChildFields(Node parent, NodeField[] nodeFields) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
235 for (int i = nodeFields.length - 1; i >= 0; i--) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
236 NodeField field = nodeFields[i];
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
237 if (field.getKind() == NodeFieldKind.CHILD) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
238 unsafe.putObject(parent, field.getOffset(), popNode(parent, field.getType()));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
239 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
240 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
241 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
242
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
243 private void deserializeChildrenFields(Node parent, NodeField[] nodeFields) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
244 for (int i = nodeFields.length - 1; i >= 0; i--) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
245 NodeField field = nodeFields[i];
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
246 if (field.getKind() == NodeFieldKind.CHILDREN) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
247 unsafe.putObject(parent, field.getOffset(), popArray(parent, field.getType()));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
248 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
249 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
250 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
251
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
252 private static Node updateParent(Node parent, Node child) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
253 if (child != null) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
254 long parentOffset = NodeClass.get(child.getClass()).getParentOffset();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
255 unsafe.putObject(child, parentOffset, parent);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
256 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
257 return child;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
258 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
259
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
260 private static Unsafe loadUnsafe() {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
261 try {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
262 return Unsafe.getUnsafe();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
263 } catch (SecurityException e) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
264 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
265 try {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
266 Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
267 theUnsafeInstance.setAccessible(true);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
268 return (Unsafe) theUnsafeInstance.get(Unsafe.class);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
269 } catch (Exception e) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
270 throw new RuntimeException("exception while trying to get Unsafe.theUnsafe via reflection:", e);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
271 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
272 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
273
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
274 private static class HierarchicalStack {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
275
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
276 private static final Object NULL_STACK = new Object();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
277
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
278 private final List<Object> dynamicStack = new ArrayList<>();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
279
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
280 void pushStack(Object[] array) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
281 if (array == null) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
282 dynamicStack.add(NULL_STACK);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
283 } else {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
284 dynamicStack.add(new FixedSizeNodeStack(array));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
285 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
286 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
287
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
288 private FixedSizeNodeStack getTosStack() {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
289 if (dynamicStack.isEmpty()) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
290 return null;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
291 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
292 Object peekTos = dynamicStack.get(dynamicStack.size() - 1);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
293 if (peekTos != null && peekTos.getClass() == FixedSizeNodeStack.class) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
294 return (FixedSizeNodeStack) peekTos;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
295 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
296 return null;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
297 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
298
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
299 Object[] popStack() {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
300 Object tos = dynamicStack.remove(dynamicStack.size() - 1);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
301 if (tos == NULL_STACK) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
302 return null;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
303 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
304 return ((FixedSizeNodeStack) tos).getArray();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
305 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
306
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
307 void push(Object o) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
308 FixedSizeNodeStack tosStack = getTosStack();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
309 if (tosStack != null && !tosStack.isFull()) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
310 tosStack.push(o);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
311 } else {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
312 dynamicStack.add(o);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
313 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
314 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
315
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
316 Object pop() {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
317 FixedSizeNodeStack tosStack = getTosStack();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
318 Object value;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
319 if (tosStack != null) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
320 assert !tosStack.isEmpty();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
321 value = tosStack.pop();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
322 } else {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
323 value = dynamicStack.remove(dynamicStack.size() - 1);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
324 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
325 assert value != NULL_STACK;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
326 return value;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
327 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
328
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
329 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
330
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
331 private static class FixedSizeNodeStack {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
332
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
333 private final Object[] array;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
334
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
335 private int tos;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
336
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
337 FixedSizeNodeStack(Object[] array) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
338 this.array = array;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
339 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
340
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
341 boolean isFull() {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
342 return tos == array.length;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
343 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
344
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
345 boolean isEmpty() {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
346 return tos == 0;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
347 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
348
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
349 private void push(Object node) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
350 if (tos >= array.length) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
351 throw new ArrayIndexOutOfBoundsException();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
352 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
353 unsafe.putObject(array, Unsafe.ARRAY_OBJECT_BASE_OFFSET + Unsafe.ARRAY_OBJECT_INDEX_SCALE * (long) (tos++), node);
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
354 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
355
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
356 private Object pop() {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
357 if (tos <= 0) {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
358 throw new ArrayIndexOutOfBoundsException();
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
359 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
360 return unsafe.getObject(array, Unsafe.ARRAY_OBJECT_BASE_OFFSET + Unsafe.ARRAY_OBJECT_INDEX_SCALE * (long) (--tos));
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
361 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
362
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
363 private Object[] getArray() {
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
364 return array;
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
365 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
366 }
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
367
96c1d057a5ed Truffle: Added experimental serialization API.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
368 }