# HG changeset patch # User vromero # Date 1372533144 -3600 # Node ID 7c871925691f56477e38dc6a138843a118ce7ae3 # Parent 59ab10272fb55f7ddcf7e65e44e6253b167d06dc 6983646: javap should identify why a DefaultAttribute is being used Reviewed-by: jjg diff -r 59ab10272fb5 -r 7c871925691f langtools/src/share/classes/com/sun/tools/classfile/Attribute.java --- a/langtools/src/share/classes/com/sun/tools/classfile/Attribute.java Fri Jun 28 19:47:54 2013 -0700 +++ b/langtools/src/share/classes/com/sun/tools/classfile/Attribute.java Sat Jun 29 20:12:24 2013 +0100 @@ -77,10 +77,12 @@ public Attribute createAttribute(ClassReader cr, int name_index, byte[] data) throws IOException { - if (standardAttributes == null) + if (standardAttributes == null) { init(); + } ConstantPool cp = cr.getConstantPool(); + String reasonForDefaultAttr; try { String name = cp.getUTF8Value(name_index); Class attrClass = standardAttributes.get(name); @@ -90,14 +92,18 @@ Constructor constr = attrClass.getDeclaredConstructor(constrArgTypes); return constr.newInstance(new Object[] { cr, name_index, data.length }); } catch (Throwable t) { + reasonForDefaultAttr = t.toString(); // fall through and use DefaultAttribute // t.printStackTrace(); } + } else { + reasonForDefaultAttr = "unknown attribute"; } } catch (ConstantPoolException e) { + reasonForDefaultAttr = e.toString(); // fall through and use DefaultAttribute } - return new DefaultAttribute(cr, name_index, data); + return new DefaultAttribute(cr, name_index, data, reasonForDefaultAttr); } protected void init() { diff -r 59ab10272fb5 -r 7c871925691f langtools/src/share/classes/com/sun/tools/classfile/DefaultAttribute.java --- a/langtools/src/share/classes/com/sun/tools/classfile/DefaultAttribute.java Fri Jun 28 19:47:54 2013 -0700 +++ b/langtools/src/share/classes/com/sun/tools/classfile/DefaultAttribute.java Sat Jun 29 20:12:24 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. 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 @@ -33,13 +33,24 @@ */ public class DefaultAttribute extends Attribute { DefaultAttribute(ClassReader cr, int name_index, byte[] data) { + this(cr, name_index, data, null); + } + + DefaultAttribute(ClassReader cr, int name_index, byte[] data, String reason) { super(name_index, data.length); info = data; + this.reason = reason; } public DefaultAttribute(ConstantPool constant_pool, int name_index, byte[] info) { + this(constant_pool, name_index, info, null); + } + + public DefaultAttribute(ConstantPool constant_pool, int name_index, + byte[] info, String reason) { super(name_index, info.length); this.info = info; + this.reason = reason; } public R accept(Visitor visitor, P p) { @@ -47,4 +58,7 @@ } public final byte[] info; + /** Why did we need to generate a DefaultAttribute + */ + public final String reason; } diff -r 59ab10272fb5 -r 7c871925691f langtools/src/share/classes/com/sun/tools/javap/AttributeWriter.java --- a/langtools/src/share/classes/com/sun/tools/javap/AttributeWriter.java Fri Jun 28 19:47:54 2013 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javap/AttributeWriter.java Sat Jun 29 20:12:24 2013 +0100 @@ -114,6 +114,9 @@ } public Void visitDefault(DefaultAttribute attr, Void ignore) { + if (attr.reason != null) { + report(attr.reason); + } byte[] data = attr.info; int i = 0; int j = 0;