T6622260.java revision 145
13faa91230bde46da937bf33010b9accc5bdeb59sd/*
13faa91230bde46da937bf33010b9accc5bdeb59sd * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
13faa91230bde46da937bf33010b9accc5bdeb59sd * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
13faa91230bde46da937bf33010b9accc5bdeb59sd *
13faa91230bde46da937bf33010b9accc5bdeb59sd * This code is free software; you can redistribute it and/or modify it
13faa91230bde46da937bf33010b9accc5bdeb59sd * under the terms of the GNU General Public License version 2 only, as
13faa91230bde46da937bf33010b9accc5bdeb59sd * published by the Free Software Foundation.
13faa91230bde46da937bf33010b9accc5bdeb59sd *
13faa91230bde46da937bf33010b9accc5bdeb59sd * This code is distributed in the hope that it will be useful, but WITHOUT
13faa91230bde46da937bf33010b9accc5bdeb59sd * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13faa91230bde46da937bf33010b9accc5bdeb59sd * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13faa91230bde46da937bf33010b9accc5bdeb59sd * version 2 for more details (a copy is included in the LICENSE file that
13faa91230bde46da937bf33010b9accc5bdeb59sd * accompanied this code).
13faa91230bde46da937bf33010b9accc5bdeb59sd *
13faa91230bde46da937bf33010b9accc5bdeb59sd * You should have received a copy of the GNU General Public License version
13faa91230bde46da937bf33010b9accc5bdeb59sd * 2 along with this work; if not, write to the Free Software Foundation,
13faa91230bde46da937bf33010b9accc5bdeb59sd * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
13faa91230bde46da937bf33010b9accc5bdeb59sd *
13faa91230bde46da937bf33010b9accc5bdeb59sd * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
13faa91230bde46da937bf33010b9accc5bdeb59sd * CA 95054 USA or visit www.sun.com if you need additional information or
13faa91230bde46da937bf33010b9accc5bdeb59sd * have any questions.
13faa91230bde46da937bf33010b9accc5bdeb59sd */
b64bfe7dc77dc5c5561cdcd10c80b0b550701a24Trang Do
13faa91230bde46da937bf33010b9accc5bdeb59sd/*
13faa91230bde46da937bf33010b9accc5bdeb59sd * @test
13faa91230bde46da937bf33010b9accc5bdeb59sd * @bug 6622260
13faa91230bde46da937bf33010b9accc5bdeb59sd * @summary javap prints negative bytes incorrectly in hex
13faa91230bde46da937bf33010b9accc5bdeb59sd */
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sdimport java.io.*;
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sdpublic class T6622260 {
13faa91230bde46da937bf33010b9accc5bdeb59sd public static void main(String[] args) throws Exception {
13faa91230bde46da937bf33010b9accc5bdeb59sd new T6622260().run();
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd public void run() throws IOException {
13faa91230bde46da937bf33010b9accc5bdeb59sd File javaFile = writeTestFile();
13faa91230bde46da937bf33010b9accc5bdeb59sd File classFile = compileTestFile(javaFile);
13faa91230bde46da937bf33010b9accc5bdeb59sd modifyClassFile(classFile);
13faa91230bde46da937bf33010b9accc5bdeb59sd String output = javap(classFile);
13faa91230bde46da937bf33010b9accc5bdeb59sd verify(output);
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd File writeTestFile() throws IOException {
13faa91230bde46da937bf33010b9accc5bdeb59sd File f = new File("Test.java");
13faa91230bde46da937bf33010b9accc5bdeb59sd PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(f)));
13faa91230bde46da937bf33010b9accc5bdeb59sd out.println("@Deprecated class Test { int f; void m() { } }");
13faa91230bde46da937bf33010b9accc5bdeb59sd out.close();
13faa91230bde46da937bf33010b9accc5bdeb59sd return f;
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd File compileTestFile(File f) {
13faa91230bde46da937bf33010b9accc5bdeb59sd int rc = com.sun.tools.javac.Main.compile(new String[] { f.getPath() });
13faa91230bde46da937bf33010b9accc5bdeb59sd if (rc != 0)
13faa91230bde46da937bf33010b9accc5bdeb59sd throw new Error("compilation failed. rc=" + rc);
13faa91230bde46da937bf33010b9accc5bdeb59sd String path = f.getPath();
13faa91230bde46da937bf33010b9accc5bdeb59sd return new File(path.substring(0, path.length() - 5) + ".class");
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd void modifyClassFile(File f) throws IOException {
13faa91230bde46da937bf33010b9accc5bdeb59sd String newAttributeName = "NonstandardAttribute";
13faa91230bde46da937bf33010b9accc5bdeb59sd byte[] newAttributeData = { 0, 1, 2, 127, (byte)128, (byte)129, (byte)254, (byte)255 };
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd DataInputStream in = new DataInputStream(new FileInputStream(f));
13faa91230bde46da937bf33010b9accc5bdeb59sd byte[] data = new byte[(int) f.length()];
13faa91230bde46da937bf33010b9accc5bdeb59sd in.readFully(data);
13faa91230bde46da937bf33010b9accc5bdeb59sd in.close();
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd in = new DataInputStream(new ByteArrayInputStream(data));
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(4); // magic
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(2); // minor
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(2); // minor
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd int constantPoolPos = data.length - in.available();
13faa91230bde46da937bf33010b9accc5bdeb59sd int constant_pool_count = skipConstantPool(in);
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd int flagsPos = data.length - in.available();
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(2); // access_flags
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(2); // this_class
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(2); // super_class
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd int interfaces_count = in.readUnsignedShort();
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(interfaces_count * 2);
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd int field_count = in.readUnsignedShort();
13faa91230bde46da937bf33010b9accc5bdeb59sd for (int i = 0; i < field_count; i++) {
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(6); // access_flags, name_index, descriptor_index
13faa91230bde46da937bf33010b9accc5bdeb59sd skipAttributes(in);
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd int method_count = in.readUnsignedShort();
13faa91230bde46da937bf33010b9accc5bdeb59sd for (int i = 0; i < method_count; i++) {
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(6); // access_flags, name_index, descriptor_index
13faa91230bde46da937bf33010b9accc5bdeb59sd skipAttributes(in);
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd int classAttributesPos = data.length - in.available();
13faa91230bde46da937bf33010b9accc5bdeb59sd int attributes_count = in.readUnsignedShort();
13faa91230bde46da937bf33010b9accc5bdeb59sd
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen f.renameTo(new File(f.getPath() + ".BAK"));
13faa91230bde46da937bf33010b9accc5bdeb59sd DataOutputStream out = new DataOutputStream(new FileOutputStream(f));
13faa91230bde46da937bf33010b9accc5bdeb59sd
67d4b2f88b8e27bb035d67a046d5aad7db3bfc71gk // copy head
13faa91230bde46da937bf33010b9accc5bdeb59sd out.write(data, 0, constantPoolPos);
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd // copy constant pool, adding in name of new attribute
13faa91230bde46da937bf33010b9accc5bdeb59sd out.writeShort(constant_pool_count + 1);
67d4b2f88b8e27bb035d67a046d5aad7db3bfc71gk out.write(data, constantPoolPos + 2, flagsPos - constantPoolPos - 2);
13faa91230bde46da937bf33010b9accc5bdeb59sd out.write(1); // CONSTANT_Utf8
13faa91230bde46da937bf33010b9accc5bdeb59sd out.writeUTF(newAttributeName);
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd // copy flags, class, superclass, interfaces, fields and methods
13faa91230bde46da937bf33010b9accc5bdeb59sd out.write(data, flagsPos, classAttributesPos - flagsPos);
13faa91230bde46da937bf33010b9accc5bdeb59sd
67d4b2f88b8e27bb035d67a046d5aad7db3bfc71gk // copy class attributes, adding in new attribute
13faa91230bde46da937bf33010b9accc5bdeb59sd out.writeShort(attributes_count + 1);
13faa91230bde46da937bf33010b9accc5bdeb59sd out.write(data, classAttributesPos + 2, data.length - classAttributesPos - 2);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen out.writeShort(constant_pool_count); // index of new attribute name
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen out.writeInt(newAttributeData.length);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen out.write(newAttributeData);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen out.close();
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen }
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int skipConstantPool(DataInputStream in) throws IOException {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int constant_pool_count = in.readUnsignedShort();
13faa91230bde46da937bf33010b9accc5bdeb59sd for (int i = 1; i < constant_pool_count; i++) {
13faa91230bde46da937bf33010b9accc5bdeb59sd int tag = in.readUnsignedByte();
67d4b2f88b8e27bb035d67a046d5aad7db3bfc71gk switch (tag) {
13faa91230bde46da937bf33010b9accc5bdeb59sd case 1: // CONSTANT_Utf8
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen int length = in.readUnsignedShort();
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(length); // bytes
13faa91230bde46da937bf33010b9accc5bdeb59sd break;
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd case 3: // CONSTANT_Integer
13faa91230bde46da937bf33010b9accc5bdeb59sd case 4: // CONSTANT_Float
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(4); // bytes
13faa91230bde46da937bf33010b9accc5bdeb59sd break;
67d4b2f88b8e27bb035d67a046d5aad7db3bfc71gk
13faa91230bde46da937bf33010b9accc5bdeb59sd case 5: // CONSTANT_Long
13faa91230bde46da937bf33010b9accc5bdeb59sd case 6: // CONSTANT_Double
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(8); // high_bytes, low_bytes
13faa91230bde46da937bf33010b9accc5bdeb59sd break;
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd case 7: // CONSTANT_Class
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(2); // name_index
13faa91230bde46da937bf33010b9accc5bdeb59sd break;
13faa91230bde46da937bf33010b9accc5bdeb59sd
67d4b2f88b8e27bb035d67a046d5aad7db3bfc71gk case 8: // CONSTANT_String
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(2); // string_index
13faa91230bde46da937bf33010b9accc5bdeb59sd break;
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd case 9: // CONSTANT_FieldRef
13faa91230bde46da937bf33010b9accc5bdeb59sd case 10: // CONSTANT_Methodref
13faa91230bde46da937bf33010b9accc5bdeb59sd case 11: // CONSTANT_InterfaceMethodref
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(4); // class_index, name_and_type_index
13faa91230bde46da937bf33010b9accc5bdeb59sd break;
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd case 12: // CONSTANT_NameAndType
67d4b2f88b8e27bb035d67a046d5aad7db3bfc71gk in.skipBytes(4); // name_index, descriptor_index
13faa91230bde46da937bf33010b9accc5bdeb59sd break;
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd default:
13faa91230bde46da937bf33010b9accc5bdeb59sd throw new Error("constant pool tag: " + tag);
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd return constant_pool_count;
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd int skipAttributes(DataInputStream in) throws IOException {
13faa91230bde46da937bf33010b9accc5bdeb59sd int attributes_count = in.readUnsignedShort();
13faa91230bde46da937bf33010b9accc5bdeb59sd for (int i = 0; i < attributes_count; i++) {
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(2); // attribute_name_index;
13faa91230bde46da937bf33010b9accc5bdeb59sd int length = in.readInt();
13faa91230bde46da937bf33010b9accc5bdeb59sd in.skipBytes(length); // info
186d582bd9dbcd38e0aeea49036d47d3426a3536Surya Prakki }
13faa91230bde46da937bf33010b9accc5bdeb59sd return attributes_count;
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd String javap(File f) {
13faa91230bde46da937bf33010b9accc5bdeb59sd StringWriter sw = new StringWriter();
13faa91230bde46da937bf33010b9accc5bdeb59sd PrintWriter out = new PrintWriter(sw);
67d4b2f88b8e27bb035d67a046d5aad7db3bfc71gk int rc = com.sun.tools.javap.Main.run(new String[] { "-v", f.getPath() }, out);
13faa91230bde46da937bf33010b9accc5bdeb59sd if (rc != 0)
13faa91230bde46da937bf33010b9accc5bdeb59sd throw new Error("javap failed. rc=" + rc);
13faa91230bde46da937bf33010b9accc5bdeb59sd out.close();
13faa91230bde46da937bf33010b9accc5bdeb59sd return sw.toString();
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd
13faa91230bde46da937bf33010b9accc5bdeb59sd void verify(String output) {
13faa91230bde46da937bf33010b9accc5bdeb59sd System.out.println(output);
13faa91230bde46da937bf33010b9accc5bdeb59sd output = output.substring(output.indexOf("Test.java"));
13faa91230bde46da937bf33010b9accc5bdeb59sd if (output.indexOf("-") >= 0)
13faa91230bde46da937bf33010b9accc5bdeb59sd throw new Error("- found in output");
13faa91230bde46da937bf33010b9accc5bdeb59sd if (output.indexOf("FFFFFF") >= 0)
13faa91230bde46da937bf33010b9accc5bdeb59sd throw new Error("FFFFFF found in output");
13faa91230bde46da937bf33010b9accc5bdeb59sd }
13faa91230bde46da937bf33010b9accc5bdeb59sd}
13faa91230bde46da937bf33010b9accc5bdeb59sd