diff -r e1953d8b8338 -r cf6d5d357696 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeParser.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeParser.java Sat Mar 19 10:31:13 2016 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeParser.java Sun Mar 20 08:12:55 2016 +0100 @@ -570,6 +570,7 @@ private Hashtable indexHashAscii = new Hashtable(); private String pkgPrefix = ""; private int pkgPrefixLen = 0; + private boolean hasEnclosingMethod; /** * Read classfile to disassemble. @@ -620,42 +621,45 @@ attrs = new AttrData[attributes_count]; for (int k = 0; k < attributes_count; k++) { int name_cpx = in.readUnsignedShort(); - if (getTag(name_cpx) == CONSTANT_UTF8 - && getString(name_cpx).equals("SourceFile")) { - if (in.readInt() != 2) { - throw new ClassFormatError("invalid attr length"); + if (getTag(name_cpx) == CONSTANT_UTF8) { + final String attrName = getString(name_cpx); + if (attrName.equals("SourceFile")) { + if (in.readInt() != 2) { + throw new ClassFormatError("invalid attr length"); + } + source_cpx = in.readUnsignedShort(); + AttrData attr = new AttrData(this); + attr.read(name_cpx); + attrs[k] = attr; + + } else if (attrName.equals("InnerClasses")) { + int length = in.readInt(); + int num = in.readUnsignedShort(); + if (2 + num * 8 != length) { + throw new ClassFormatError("invalid attr length"); + } + innerClasses = new InnerClassData[num]; + for (int j = 0; j < num; j++) { + InnerClassData innerClass = new InnerClassData(this); + innerClass.read(in); + innerClasses[j] = innerClass; + } + AttrData attr = new AttrData(this); + attr.read(name_cpx); + attrs[k] = attr; + } else if (attrName.equals("BootstrapMethods")) { + AttrData attr = new AttrData(this); + bootMethods = readBootstrapMethods(in); + attr.read(name_cpx); + attrs[k] = attr; + } else { + if (attrName.equals("EnclosingMethod")) { + hasEnclosingMethod = true; + } + AttrData attr = new AttrData(this); + attr.read(name_cpx, in); + attrs[k] = attr; } - source_cpx = in.readUnsignedShort(); - AttrData attr = new AttrData(this); - attr.read(name_cpx); - attrs[k] = attr; - - } else if (getTag(name_cpx) == CONSTANT_UTF8 - && getString(name_cpx).equals("InnerClasses")) { - int length = in.readInt(); - int num = in.readUnsignedShort(); - if (2 + num * 8 != length) { - throw new ClassFormatError("invalid attr length"); - } - innerClasses = new InnerClassData[num]; - for (int j = 0; j < num; j++) { - InnerClassData innerClass = new InnerClassData(this); - innerClass.read(in); - innerClasses[j] = innerClass; - } - AttrData attr = new AttrData(this); - attr.read(name_cpx); - attrs[k] = attr; - } else if (getTag(name_cpx) == CONSTANT_UTF8 - && getString(name_cpx).equals("BootstrapMethods")) { - AttrData attr = new AttrData(this); - bootMethods = readBootstrapMethods(in); - attr.read(name_cpx); - attrs[k] = attr; - } else { - AttrData attr = new AttrData(this); - attr.read(name_cpx, in); - attrs[k] = attr; } } in.close(); @@ -876,6 +880,10 @@ return access; } + public boolean hasEnclosingMethod() { + return hasEnclosingMethod; + } + /** * Returns true if it is a class */