4884240: additional option required for javap

Reviewed-by: ksrini
This commit is contained in:
Jonathan Gibbons 2008-08-04 17:54:15 -07:00
parent 44444bd9c0
commit b6dbc8cf63
6 changed files with 172 additions and 3 deletions

View File

@ -25,6 +25,7 @@
package com.sun.tools.javap;
import java.net.URI;
import java.util.Collection;
import java.util.List;
@ -46,6 +47,8 @@ import com.sun.tools.classfile.Signature_attribute;
import com.sun.tools.classfile.SourceFile_attribute;
import com.sun.tools.classfile.Type;
import java.text.DateFormat;
import java.util.Date;
import static com.sun.tools.classfile.AccessFlags.*;
/*
@ -73,6 +76,23 @@ public class ClassWriter extends BasicWriter {
constantWriter = ConstantWriter.instance(context);
}
void setDigest(String name, byte[] digest) {
this.digestName = name;
this.digest = digest;
}
void setFile(URI uri) {
this.uri = uri;
}
void setFileSize(int size) {
this.size = size;
}
void setLastModified(long lastModified) {
this.lastModified = lastModified;
}
ClassFile getClassFile() {
return classFile;
}
@ -85,6 +105,32 @@ public class ClassWriter extends BasicWriter {
classFile = cf;
constant_pool = classFile.constant_pool;
if ((options.sysInfo || options.verbose) && !options.compat) {
if (uri != null) {
if (uri.getScheme().equals("file"))
println("Classfile " + uri.getPath());
else
println("Classfile " + uri);
}
if (lastModified != -1) {
Date lm = new Date(lastModified);
DateFormat df = DateFormat.getDateInstance();
if (size > 0) {
println("Last modified " + df.format(lm) + "; size " + size + " bytes");
} else {
println("Last modified " + df.format(lm));
}
} else if (size > 0) {
println("Size " + size + " bytes");
}
if (digestName != null && digest != null) {
StringBuilder sb = new StringBuilder();
for (byte b: digest)
sb.append(String.format("%02x", b));
println(digestName + " checksum " + sb);
}
}
Attribute sfa = cf.getAttribute(Attribute.SourceFile);
if (sfa instanceof SourceFile_attribute) {
println("Compiled from \"" + getSourceFile((SourceFile_attribute) sfa) + "\"");
@ -570,6 +616,11 @@ public class ClassWriter extends BasicWriter {
private CodeWriter codeWriter;
private ConstantWriter constantWriter;
private ClassFile classFile;
private URI uri;
private long lastModified;
private String digestName;
private byte[] digest;
private int size;
private ConstantPool constant_pool;
private Method method;
private static final String NEWLINE = System.getProperty("line.separator", "\n");

View File

@ -27,11 +27,15 @@ package com.sun.tools.javap;
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.FilterInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
@ -199,6 +203,12 @@ public class JavapTask implements DisassemblerTool.DisassemblerTask {
}
},
new Option(false, "-sysinfo") {
void process(JavapTask task, String opt, String arg) {
task.options.sysInfo = true;
}
},
new Option(false, "-Xold") {
void process(JavapTask task, String opt, String arg) throws BadArgs {
// -Xold is only supported as first arg when invoked from
@ -494,8 +504,27 @@ public class JavapTask implements DisassemblerTool.DisassemblerTask {
Attribute.Factory attributeFactory = new Attribute.Factory();
attributeFactory.setCompat(options.compat);
attributeFactory.setJSR277(options.jsr277);
ClassFile cf = ClassFile.read(fo.openInputStream(), attributeFactory);
InputStream in = fo.openInputStream();
SizeInputStream sizeIn = null;
MessageDigest md = null;
if (options.sysInfo || options.verbose) {
md = MessageDigest.getInstance("MD5");
in = new DigestInputStream(in, md);
in = sizeIn = new SizeInputStream(in);
}
ClassFile cf = ClassFile.read(in, attributeFactory);
if (options.sysInfo || options.verbose) {
classWriter.setFile(fo.toUri());
classWriter.setLastModified(fo.getLastModified());
classWriter.setDigest("MD5", md.digest());
classWriter.setFileSize(sizeIn.size());
}
classWriter.write(cf);
} catch (ConstantPoolException e) {
diagnosticListener.report(createDiagnostic("err.bad.constant.pool", className, e.getLocalizedMessage()));
ok = false;
@ -665,4 +694,31 @@ public class JavapTask implements DisassemblerTool.DisassemblerTask {
Map<Locale, ResourceBundle> bundles;
private static final String progname = "javap";
private static class SizeInputStream extends FilterInputStream {
SizeInputStream(InputStream in) {
super(in);
}
int size() {
return size;
}
@Override
public int read(byte[] buf, int offset, int length) throws IOException {
int n = super.read(buf, offset, length);
if (n > 0)
size += n;
return n;
}
@Override
public int read() throws IOException {
int b = super.read();
size += 1;
return b;
}
private int size;
}
}

View File

@ -81,6 +81,7 @@ public class Options {
public boolean showInternalSignatures;
public boolean showAllAttrs;
public boolean showConstants;
public boolean sysInfo;
public boolean compat; // bug-for-bug compatibility mode with old javap
public boolean jsr277;

View File

@ -67,5 +67,6 @@ main.opt.constants=\
\ -constants Show static final constants
main.opt.sysinfo=\
\ -sysinfo Show system info (path, size, date, MD5 hash)\n\
\ of class being processed

View File

@ -0,0 +1,56 @@
/*
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-15301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/*
* @test
* @bug 4884240
* @summary additional option required for javap
*/
import java.io.*;
public class T4884240 {
public static void main(String... args) throws Exception {
new T4884240().run();
}
public void run() throws Exception {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
String[] args = { "-sysinfo", "java.lang.Object" };
int rc = com.sun.tools.javap.Main.run(args, pw);
if (rc != 0)
throw new Exception("unexpected return code: " + rc);
pw.close();
String[] lines = sw.toString().split("\n");
if (lines.length < 3
|| !lines[0].startsWith("Classfile")
|| !lines[1].startsWith("Last modified")
|| !lines[2].startsWith("MD5")) {
System.out.println(sw);
throw new Exception("unexpected output");
}
}
}

View File

@ -189,6 +189,10 @@ public class T6622260 {
void verify(String output) {
System.out.println(output);
if (output.startsWith("Classfile")) {
// make sure to ignore filename
output = output.substring(output.indexOf('\n'));
}
if (output.indexOf("-") >= 0)
throw new Error("- found in output");
if (output.indexOf("FFFFFF") >= 0)