annotate test/runtime/testlibrary/GeneratedClassLoader.java @ 12690:c3bdd186e6cf

fix possible NPE in TruffleCompiler with TraceTruffleCompilation and background compilation enabled. With background compilation, the installed code can already be invalidated when compiledMethod.getCode() is called, in which case it returns null.
author Andreas Woess <andreas.woess@jku.at>
date Wed, 06 Nov 2013 13:31:28 +0100
parents 699d9df07e59
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10344
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
1 /*
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
4 *
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
7 * published by the Free Software Foundation.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
8 *
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
13 * accompanied this code).
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
14 *
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
18 *
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
21 * questions.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
22 */
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
23
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
24 import java.io.DataInputStream;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
25 import java.io.File;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
26 import java.io.FileInputStream;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
27 import java.io.FileWriter;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
28 import java.io.IOException;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
29 import java.io.PrintWriter;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
30 import javax.tools.JavaCompiler;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
31 import javax.tools.ToolProvider;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
32
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
33 /**
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
34 * A class loader that generates new classes.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
35 * The generated classes are made by first emitting java sources with nested
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
36 * static classes, these are then compiled and the class files are read back.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
37 * Some efforts are made to make the class instances unique and of not insignificant
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
38 * size.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
39 */
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
40 public class GeneratedClassLoader extends ClassLoader {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
41 /**
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
42 * Holds a pair of class bytecodes and class name (for use with defineClass).
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
43 */
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
44 private static class GeneratedClass {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
45 public byte[] bytes;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
46 public String name;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
47 public GeneratedClass(byte[] bytes, String name) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
48 this.bytes = bytes; this.name = name;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
49 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
50 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
51
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
52 /**
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
53 * Used to uniquely name every class generated.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
54 */
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
55 private static int count = 0;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
56 /**
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
57 * Used to enable/disable keeping the class files and java sources for
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
58 * the generated classes.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
59 */
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
60 private static boolean deleteFiles = Boolean.parseBoolean(
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
61 System.getProperty("GeneratedClassLoader.deleteFiles", "true"));
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
62
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
63 private static String bigstr =
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
64 "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
65 + "In facilisis scelerisque vehicula. Donec congue nisi a "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
66 + "leo posuere placerat lobortis felis ultrices. Pellentesque "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
67 + "habitant morbi tristique senectus et netus et malesuada "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
68 + "fames ac turpis egestas. Nam tristique velit at felis "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
69 + "iaculis at tempor sem vestibulum. Sed adipiscing lectus "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
70 + "non mi molestie sagittis. Morbi eu purus urna. Nam tempor "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
71 + "tristique massa eget semper. Mauris cursus, nulla et ornare "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
72 + "vehicula, leo dolor scelerisque metus, sit amet rutrum erat "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
73 + "sapien quis dui. Nullam eleifend risus et velit accumsan sed "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
74 + "suscipit felis pulvinar. Nullam faucibus suscipit gravida. "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
75 + "Pellentesque habitant morbi tristique senectus et netus et "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
76 + "malesuada fames ac turpis egestas. Nullam ut massa augue, "
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
77 + "nec viverra mauris.";
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
78
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
79 private static int getNextCount() {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
80 return count++;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
81 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
82
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
83 ////// end statics
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
84
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
85 private JavaCompiler javac;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
86 private String nameBase;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
87
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
88 public GeneratedClassLoader() {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
89 javac = ToolProvider.getSystemJavaCompiler();
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
90 nameBase = "TestSimpleClass";
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
91 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
92
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
93 private long getBigValue(int which) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
94 // > 65536 is too large to encode in the bytecode
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
95 // so this will force us to emit a constant pool entry for this int
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
96 return (long)which + 65537;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
97 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
98
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
99 private String getBigString(int which) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
100 return bigstr + which;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
101 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
102
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
103 private String getClassName(int count) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
104 return nameBase + count;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
105 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
106
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
107 private String generateSource(int count, int sizeFactor, int numClasses) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
108 StringBuilder sb = new StringBuilder();
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
109 sb.append("public class ").append(getClassName(count)).append("{\n");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
110 for (int j = 0; j < numClasses; ++j) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
111 sb.append("public static class ")
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
112 .append("Class")
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
113 .append(j)
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
114 .append("{\n");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
115 for (int i = 0; i < sizeFactor; ++i) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
116 int value = i;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
117 sb.append("private long field")
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
118 .append(i).append(" = ")
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
119 .append(getBigValue(value++))
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
120 .append(";\n");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
121 sb.append("public long method")
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
122 .append(i)
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
123 .append("() {\n");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
124 sb.append("return ")
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
125 .append(getBigValue(value++))
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
126 .append(";");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
127 sb.append("}\n");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
128 sb.append("private String str").append(i)
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
129 .append(" = \"")
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
130 .append(getBigString(i))
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
131 .append("\";");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
132 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
133 sb.append("\n}");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
134 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
135 sb.append("\n}");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
136 return sb.toString();
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
137 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
138
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
139 private GeneratedClass[] getGeneratedClass(int sizeFactor, int numClasses) throws IOException {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
140 int uniqueCount = getNextCount();
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
141 String src = generateSource(uniqueCount, sizeFactor, numClasses);
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
142 String className = getClassName(uniqueCount);
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
143 File file = new File(className + ".java");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
144 try (PrintWriter pw = new PrintWriter(new FileWriter(file))) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
145 pw.append(src);
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
146 pw.flush();
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
147 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
148 int exitcode = javac.run(null, null, null, file.getCanonicalPath());
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
149 if (exitcode != 0) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
150 throw new RuntimeException("javac failure when compiling: " +
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
151 file.getCanonicalPath());
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
152 } else {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
153 if (deleteFiles) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
154 file.delete();
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
155 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
156 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
157 GeneratedClass[] gc = new GeneratedClass[numClasses];
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
158 for (int i = 0; i < numClasses; ++i) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
159 String name = className + "$" + "Class" + i;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
160 File classFile = new File(name + ".class");
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
161 byte[] bytes;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
162 try (DataInputStream dis = new DataInputStream(new FileInputStream(classFile))) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
163 bytes = new byte[dis.available()];
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
164 dis.readFully(bytes);
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
165 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
166 if (deleteFiles) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
167 classFile.delete();
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
168 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
169 gc[i] = new GeneratedClass(bytes, name);
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
170 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
171 if (deleteFiles) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
172 new File(className + ".class").delete();
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
173 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
174 return gc;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
175 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
176
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
177 /**
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
178 * Generate a single class, compile it and load it.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
179 * @param sizeFactor Fuzzy measure of how large the class should be.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
180 * @return the Class instance.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
181 * @throws IOException
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
182 */
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
183 public Class<?> generateClass(int sizeFactor) throws IOException {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
184 return getGeneratedClasses(sizeFactor, 1)[0];
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
185 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
186
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
187 /**
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
188 * Generate several classes, compile and load them.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
189 * @param sizeFactor Fuzzy measure of how large each class should be.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
190 * @param numClasses The number of classes to create
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
191 * @return an array of the Class instances.
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
192 * @throws IOException
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
193 */
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
194 public Class<?>[] getGeneratedClasses(int sizeFactor, int numClasses) throws IOException {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
195 GeneratedClass[] gc = getGeneratedClass(sizeFactor, numClasses);
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
196 Class<?>[] classes = new Class[numClasses];
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
197 for (int i = 0; i < numClasses; ++i) {
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
198 classes[i] = defineClass(gc[i].name, gc[i].bytes, 0 , gc[i].bytes.length);
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
199 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
200 return classes;
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
201 }
699d9df07e59 8009576: Test returns ClassNotFoundException
ctornqvi
parents:
diff changeset
202 }