patch: javap does not show SourceDebugExtension properly

Dmytro Sheyko dmytro_sheyko at hotmail.com
Tue Jun 25 11:32:52 PDT 2013


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 		 	   		  


More information about the compiler-dev mailing list