patch: javap does not show SourceDebugExtension properly

Dmytro Sheyko dmytro_sheyko at hotmail.com
Wed Jun 26 00:58:38 PDT 2013


Hello,

I am sending class file sample with sources and javap output:
Hello.jsp, greeting.jsp - original sources
Hello_jsp.java, Hello_jsp.class - files generated by Jasper (Apache Tomcat 7.0.41)
Hello_jsp.*.current.javap, Hello_jsp.*.patched.javap - javap output (without patch and with patch, used jdk1.7.0_25 and jdk1.8.0-ea-b91, however it seems there is no difference in patched classes between repositoried jdk7u/langtools and jdk8/langtools, whatever the case patch (which I sent earlier) is made on jdk8/langtools)

Thanks,
Dmytro
________________________________
> From: dmytro_sheyko at hotmail.com 
> To: jonathan.gibbons at oracle.com; compiler-dev at openjdk.java.net 
> Subject: RE: patch: javap does not show SourceDebugExtension properly 
> Date: Tue, 25 Jun 2013 23:52:02 +0300 
>  
> Jonathan, 
>  
> This bug does not manifest itself with exception. javap just prints 
>  
> SourceDebugExtension: null 
>  
> In a class file content of SDE attribute appears as UTF-8 string, where  
> the first 4 bytes are 'S', 'M', 'A', 'P'. Existing code of  
> SourceDebugExtension_attribute.getValue() uses readUTF and hence  
> attempts to interpret the first two bytes (i.e. 'S' and 'M') as length  
> of the string and then fails with EOFException. Then it catches this  
> exception and returns null, which, in turn, appears in output. 
>  
> As for sample class file, it's generated by Tomcat 7.0 runtime. I will  
> send it later. 
>  
> Regards, 
> Dmytro 
>  
> > Date: Tue, 25 Jun 2013 12:01:32 -0700 
> > From: jonathan.gibbons at oracle.com 
> > To: compiler-dev at openjdk.java.net 
> > Subject: Re: patch: javap does not show SourceDebugExtension properly 
> > 
> > Dmytro, 
> > 
> > Thank you for your suggestion. Can you provide more details on why the 
> > existing code does not work. Presumably you get an exception -- what is 
> > it? Alternative, can you provide a sample class file for which the 
> > existing code does not work, together with info on which version of 
> > which compiler generated the class file? 
> > 
> > I agree that the change to visitSourceDebugExtension is probably desirable. 
> > 
> > -- Jon 
> > 
> > 
> > On 06/25/2013 11:32 AM, Dmytro Sheyko wrote: 
> >> Hello, 
> >> 
> >> I was trying to get SourceDebugExtension for compiled jsp class  
> using javap (1.7.0_25, 1.8.0-ea-b91) and it printed something like: 
> >> 
> >> SourceFile: "x_jsp.java" 
> >> SourceDebugExtension: null 
> >> minor version: 0 
> >> major version: 50 
> >> 
> >> where expected output is following: 
> >> 
> >> SourceFile: "x_jsp.java" 
> >> SourceDebugExtension: 
> >> SMAP 
> >> x_jsp.java 
> >> JSP 
> >> *S JSP 
> >> *F 
> >> + 0 x.jsp 
> >> x.jsp 
> >> *L 
> >> 1,3:62 
> >> 4:65,4 
> >> 6,4:70 
> >> 9,4:74 
> >> *E 
> >> minor version: 0 
> >> major version: 50 
> >> 
> >> Getting SourceDebugExtension using JDI works well (i.e. class file  
> is correct). 
> >> 
> >> And I would like to propose a patch to fix this issue. Please review. 
> >> 
> >> diff -r b3458329d060  
> src/share/classes/com/sun/tools/classfile/SourceDebugExtension_attribute.java 
> >> ---  
> a/src/share/classes/com/sun/tools/classfile/SourceDebugExtension_attribute.java  
> Mon Jun 24 14:27:32 2013 -0700 
> >> +++  
> b/src/share/classes/com/sun/tools/classfile/SourceDebugExtension_attribute.java  
> Tue Jun 25 20:22:06 2013 +0300 
> >> @@ -25,9 +25,8 @@ 
> >> 
> >> package com.sun.tools.classfile; 
> >> 
> >> -import java.io.ByteArrayInputStream; 
> >> -import java.io.DataInputStream; 
> >> import java.io.IOException; 
> >> +import java.nio.charset.Charset; 
> >> 
> >> /** 
> >> * See JVMS, section 4.8.15. 
> >> @@ -38,6 +37,8 @@ 
> >> * deletion without notice.</b> 
> >> */ 
> >> public class SourceDebugExtension_attribute extends Attribute { 
> >> + private static final Charset UTF8 = Charset.forName("UTF-8"); 
> >> + 
> >> SourceDebugExtension_attribute(ClassReader cr, int name_index, int  
> length) throws IOException { 
> >> super(name_index, length); 
> >> debug_extension = new byte[attribute_length]; 
> >> @@ -55,12 +56,7 @@ 
> >> } 
> >> 
> >> public String getValue() { 
> >> - DataInputStream d = new DataInputStream(new  
> ByteArrayInputStream(debug_extension)); 
> >> - try { 
> >> - return d.readUTF(); 
> >> - } catch (IOException e) { 
> >> - return null; 
> >> - } 
> >> + return new String(debug_extension, UTF8); 
> >> } 
> >> 
> >> public <R, D> R accept(Visitor<R, D> visitor, D data) { 
> >> diff -r b3458329d060  
> src/share/classes/com/sun/tools/javap/AttributeWriter.java 
> >> --- a/src/share/classes/com/sun/tools/javap/AttributeWriter.java  
> Mon Jun 24 14:27:32 2013 -0700 
> >> +++ b/src/share/classes/com/sun/tools/javap/AttributeWriter.java  
> Tue Jun 25 20:22:06 2013 +0300 
> >> @@ -511,7 +511,10 @@ 
> >> } 
> >> 
> >> public Void  
> visitSourceDebugExtension(SourceDebugExtension_attribute attr, Void  
> ignore) { 
> >> - println("SourceDebugExtension: " + attr.getValue()); 
> >> + println("SourceDebugExtension:"); 
> >> + indent(+1); 
> >> + print(attr.getValue()); 
> >> + indent(-1); 
> >> return null; 
> >> } 
> >> 
> >> Regards, 
> >> Dmytro 
> > 		 	   		  
-------------- next part --------------
A non-text attachment was scrubbed...
Name: javap_sde_sample.zip
Type: application/zip
Size: 14631 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20130626/a4269850/javap_sde_sample.zip 


More information about the compiler-dev mailing list