From d07131ac672793bc2444ad02e60b93782fd0c4fe Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Fri, 17 Aug 2012 08:28:48 -0700 Subject: [PATCH] 7190750: (pack200) the java unpacker produces non spec. compliant classfile with lambda classfiles Reviewed-by: jrose --- .../sun/java/util/jar/pack/ClassWriter.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassWriter.java b/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassWriter.java index deb66252a23..da48df9af86 100644 --- a/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassWriter.java +++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassWriter.java @@ -207,6 +207,22 @@ class ClassWriter { m); } + private void reorderBSMandICS(Attribute.Holder h) { + Attribute bsmAttr = h.getAttribute(Package.attrBootstrapMethodsEmpty); + if (bsmAttr == null) return; + + Attribute icsAttr = h.getAttribute(Package.attrInnerClassesEmpty); + if (icsAttr == null) return; + + int bsmidx = h.attributes.indexOf(bsmAttr); + int icsidx = h.attributes.indexOf(icsAttr); + if (bsmidx > icsidx) { + h.attributes.remove(bsmAttr); + h.attributes.add(icsidx, bsmAttr); + } + return; + } + // handy buffer for collecting attrs ByteArrayOutputStream buf = new ByteArrayOutputStream(); DataOutputStream bufOut = new DataOutputStream(buf); @@ -216,6 +232,11 @@ class ClassWriter { writeShort(0); // attribute size return; } + // there may be cases if an InnerClass attribute is explicit, then the + // ordering could be wrong, fix the ordering before we write it out. + if (h instanceof Package.Class) + reorderBSMandICS(h); + writeShort(h.attributes.size()); for (Attribute a : h.attributes) { a.finishRefs(cpIndex);