aoqi@0: /* aoqi@0: * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: /* aoqi@0: * @test aoqi@0: * @bug 6627362 aoqi@0: * @summary javac generates code that uses array.clone, aoqi@0: * which is not available on JavaCard aoqi@0: */ aoqi@0: aoqi@0: import java.io.*; aoqi@0: import java.lang.reflect.*; aoqi@0: import java.net.*; aoqi@0: import java.util.*; aoqi@0: aoqi@0: public class T6627362 { aoqi@0: static String testSrc = System.getProperty("test.src", "."); aoqi@0: aoqi@0: public static void main(String... args) throws Exception { aoqi@0: new T6627362().run(); aoqi@0: } aoqi@0: aoqi@0: public void run() throws Exception { aoqi@0: testStandard(); aoqi@0: testNoClone(); aoqi@0: if (errors > 0) aoqi@0: throw new Error(errors + " test cases failed"); aoqi@0: } aoqi@0: aoqi@0: void testStandard() throws Exception { aoqi@0: // compile and disassemble E.java, check for reference to Object.clone() aoqi@0: File x = new File(testSrc, "x"); aoqi@0: String[] jcArgs = { "-d", ".", aoqi@0: new File(x, "E.java").getPath() }; aoqi@0: compile(jcArgs); aoqi@0: aoqi@0: String[] jpArgs = { "-classpath", ".", "-c", "E" }; aoqi@0: aoqi@0: StringWriter sw = new StringWriter(); aoqi@0: javap(new PrintWriter(sw, true), jpArgs); aoqi@0: check(sw.toString(), "Method \"[LE;\".clone:()Ljava/lang/Object;"); aoqi@0: callValues(); aoqi@0: } aoqi@0: aoqi@0: void testNoClone() throws Exception { aoqi@0: // compile and disassemble E.java, using modified Object.java, aoqi@0: // check for reference to System.arraycopy aoqi@0: File x = new File(testSrc, "x"); aoqi@0: String[] jcArgs = { "-d", ".", aoqi@0: new File(x, "E.java").getPath(), aoqi@0: new File(x, "Object.java").getPath()}; aoqi@0: compile(jcArgs); aoqi@0: aoqi@0: String[] jpArgs = { "-classpath", ".", "-c", "E" }; aoqi@0: aoqi@0: StringWriter sw = new StringWriter(); aoqi@0: javap(new PrintWriter(sw, true), jpArgs); aoqi@0: check(sw.toString(), "// Method java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V"); aoqi@0: callValues(); aoqi@0: } aoqi@0: aoqi@0: void compile(String... args) { aoqi@0: int rc = com.sun.tools.javac.Main.compile(args); aoqi@0: if (rc != 0) aoqi@0: throw new Error("javac failed: " + Arrays.asList(args) + ": " + rc); aoqi@0: } aoqi@0: aoqi@0: void javap(PrintWriter out, String... args) throws Exception { aoqi@0: int rc = com.sun.tools.javap.Main.run(args, out); aoqi@0: if (rc != 0) aoqi@0: throw new Error("javap failed: " + Arrays.asList(args) + ": " + rc); aoqi@0: } aoqi@0: aoqi@0: void check(String s, String require) { aoqi@0: System.out.println("Checking:\n" + s); aoqi@0: if (s.indexOf(require) == -1) { aoqi@0: System.err.println("Can't find " + require); aoqi@0: errors++; aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: void callValues() { aoqi@0: try { aoqi@0: File dot = new File(System.getProperty("user.dir")); aoqi@0: ClassLoader cl = new URLClassLoader(new URL[] { dot.toURL() }); aoqi@0: Class e_class = cl.loadClass("E"); aoqi@0: Method m = e_class.getMethod("values", new Class[] { }); aoqi@0: //System.err.println(m); aoqi@0: Object o = m.invoke(null, (Object[]) null); aoqi@0: List v = Arrays.asList((Object[]) o); aoqi@0: if (!v.toString().equals("[a, b, c]")) aoqi@0: throw new Error("unexpected result for E.values(): " + v); aoqi@0: } catch (Exception e) { aoqi@0: throw new Error(e); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: int errors; aoqi@0: } aoqi@0: