annotate c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/ReplacingStreams.java @ 2288:8c426c2891c8

client/server: new interface Remote marks classes that should not be serialized, but called remotely
author Lukas Stadler <lukas.stadler@jku.at>
date Mon, 11 Apr 2011 10:37:24 +0200
parents 762de4b26788
children 160aacf936ad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
1 /*
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
2 * Copyright (c) 2011 Sun Microsystems, Inc. All rights reserved.
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
3 *
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
4 * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
5 * that is described in this document. In particular, and without limitation, these intellectual property
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
6 * rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
7 * more additional patents or pending patent applications in the U.S. and in other countries.
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
8 *
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
9 * U.S. Government Rights - Commercial software. Government users are subject to the Sun
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
10 * Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
11 * supplements.
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
12 *
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
13 * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
14 * registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
15 * are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
16 * U.S. and other countries.
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
17 *
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
18 * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
19 * Company, Ltd.
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
20 */
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
21 package com.sun.hotspot.c1x.server;
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
22
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
23 import java.io.*;
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
24 import java.lang.reflect.*;
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
25 import java.util.*;
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
26
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
27 import com.sun.cri.ci.*;
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
28 import com.sun.hotspot.c1x.*;
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
29 import com.sun.hotspot.c1x.Compiler;
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
30
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
31 public class ReplacingStreams {
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
32
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
33 private IdentityHashMap<Object, Placeholder> objectMap = new IdentityHashMap<Object, Placeholder>();
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
34 private ArrayList<Object> objectList = new ArrayList<Object>();
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
35
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
36 private ReplacingOutputStream output;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
37 private ReplacingInputStream input;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
38
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
39 private InvocationSocket invocation;
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
40
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
41 public ReplacingStreams(OutputStream outputStream, InputStream inputStream) throws IOException {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
42 output = new ReplacingOutputStream(new BufferedOutputStream(outputStream));
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
43 // required, because creating an ObjectOutputStream writes a header, but doesn't flush the stream
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
44 output.flush();
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
45 input = new ReplacingInputStream(new BufferedInputStream(inputStream));
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
46 invocation = new InvocationSocket(output, input);
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
47
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
48 addStaticObject(CiValue.IllegalValue);
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
49 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
50
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
51 public void setInvocationSocket(InvocationSocket invocation) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
52 this.invocation = invocation;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
53 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
54
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
55 public ReplacingOutputStream getOutput() {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
56 return output;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
57 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
58
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
59 public ReplacingInputStream getInput() {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
60 return input;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
61 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
62
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
63 public InvocationSocket getInvocation() {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
64 return invocation;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
65 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
66
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
67 private void addStaticObject(Object obj) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
68 int id = objectList.size();
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
69 objectList.add(obj);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
70 objectMap.put(obj, new Placeholder(id));
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
71 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
72
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
73 public static class Placeholder implements Serializable {
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
74
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
75 public final int id;
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
76
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
77 public Placeholder(int id) {
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
78 this.id = id;
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
79 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
80
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
81 @Override
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
82 public String toString() {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
83 return "#<" + id + ">";
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
84 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
85 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
86
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
87 public static class NewRemoteCallPlaceholder implements Serializable {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
88
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
89 public final Class<?>[] interfaces;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
90
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
91 public NewRemoteCallPlaceholder(Class<?>[] interfaces) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
92 this.interfaces = interfaces;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
93 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
94 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
95
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
96 public static class NewDummyPlaceholder implements Serializable {
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
97 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
98
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
99 /**
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
100 * Replaces certain cir objects that cannot easily be made Serializable.
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
101 */
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
102 public class ReplacingInputStream extends ObjectInputStream {
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
103
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
104 private Compiler compiler;
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
105
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
106 public ReplacingInputStream(InputStream in) throws IOException {
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
107 super(in);
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
108 enableResolveObject(true);
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
109 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
110
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
111 public void setCompiler(Compiler compiler) {
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
112 this.compiler = compiler;
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
113 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
114
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
115 @Override
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
116 protected Object resolveObject(Object obj) throws IOException {
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
117 // see ReplacingInputStream.replaceObject for details on when these types of objects are created
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
118
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
119 if (obj instanceof Placeholder) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
120 Placeholder placeholder = (Placeholder) obj;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
121 obj = objectList.get(placeholder.id);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
122 return obj;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
123 }
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
124
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
125 if (obj instanceof NewRemoteCallPlaceholder) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
126 NewRemoteCallPlaceholder newPlaceholder = (NewRemoteCallPlaceholder) obj;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
127 Placeholder placeholder = new Placeholder(objectList.size());
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
128 obj = Proxy.newProxyInstance(getClass().getClassLoader(), newPlaceholder.interfaces, invocation.new Handler(placeholder));
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
129 objectMap.put(obj, placeholder);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
130 objectList.add(obj);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
131 return obj;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
132 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
133
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
134 if (obj instanceof NewDummyPlaceholder) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
135 obj = new Placeholder(objectList.size());
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
136 objectMap.put(obj, (Placeholder) obj);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
137 objectList.add(obj);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
138 return obj;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
139 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
140
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
141 return obj;
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
142 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
143 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
144
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
145 /**
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
146 * Replaces certain cir objects that cannot easily be made Serializable.
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
147 */
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
148 public class ReplacingOutputStream extends ObjectOutputStream {
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
149
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
150 public ReplacingOutputStream(OutputStream out) throws IOException {
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
151 super(out);
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
152 enableReplaceObject(true);
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
153 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
154
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
155 @Override
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
156 protected Object replaceObject(Object obj) throws IOException {
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
157 // is the object a known instance?
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
158 Placeholder placeholder = objectMap.get(obj);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
159 if (placeholder != null) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
160 return placeholder;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
161 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
162
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
163 // is the object an instance of a class that will always be executed remotely?
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
164 if (obj instanceof Remote) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
165 return createRemoteCallPlaceholder(obj);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
166 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
167
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
168 // is the object a constant of object type?
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
169 if (obj.getClass() == CiConstant.class) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
170 System.out.println("CiConstant " + obj);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
171 CiConstant constant = (CiConstant) obj;
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
172 // don't replace if the object already is a placeholder
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
173 if (constant.kind == CiKind.Object && !(constant.asObject() instanceof Placeholder) && constant.asObject() != null) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
174 return CiConstant.forObject(createDummyPlaceholder(constant.asObject()));
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
175 }
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
176 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
177 return obj;
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
178 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
179 }
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
180
2288
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
181 public static Class<?>[] getAllInterfaces(Class<?> clazz) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
182 HashSet<Class< ? >> interfaces = new HashSet<Class<?>>();
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
183 getAllInterfaces(clazz, interfaces);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
184 return interfaces.toArray(new Class<?>[interfaces.size()]);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
185 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
186
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
187 private static void getAllInterfaces(Class<?> clazz, HashSet<Class<?>> interfaces) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
188 for (Class< ? > iface : clazz.getInterfaces()) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
189 if (!interfaces.contains(iface)) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
190 interfaces.add(iface);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
191 getAllInterfaces(iface, interfaces);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
192 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
193 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
194 if (clazz.getSuperclass() != null) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
195 getAllInterfaces(clazz.getSuperclass(), interfaces);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
196 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
197 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
198
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
199 private Object createRemoteCallPlaceholder(Object obj) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
200 // collect all interfaces that this object's class implements (proxies only support interfaces)
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
201 objectMap.put(obj, new Placeholder(objectList.size()));
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
202 objectList.add(obj);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
203 return new NewRemoteCallPlaceholder(getAllInterfaces(obj.getClass()));
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
204 }
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
205
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
206 public Object createDummyPlaceholder(Object obj) {
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
207 objectMap.put(obj, new Placeholder(objectList.size()));
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
208 objectList.add(obj);
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
209 return new NewDummyPlaceholder();
8c426c2891c8 client/server: new interface Remote marks classes that should not be serialized, but called remotely
Lukas Stadler <lukas.stadler@jku.at>
parents: 2285
diff changeset
210 }
2285
762de4b26788 turn Compiler and HotSpotTypeResolved into interfaces
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
211 }