RFR: 8151901: test/tools/pack200/Pack200Test fails on verifying native unpacked JAR

Kumar Srinivasan kumar.x.srinivasan at oracle.com
Fri Sep 2 17:14:46 UTC 2016


Hi John,

Please review the amended patch, based on our discussions.
http://cr.openjdk.java.net/~ksrini/8151901/webrev.01/

Highlights:
* adjust the ordering of the InnerClass and BootStrapMethods computations
* enabled the test, and disabled memory leak check, which causes 
intermittent
   failures, because of GC's ergonomics etc.
* added the two test files to golden.jar, just in case.

Thanks
Kumar



> Good.
>
> Please change the comment:
> s/null, no tuple change, force recomputation/null, drop ICs attribute, force CP recomputation/
>
> Reordering BSMs and ICs should work.
> The BSMs may need extra ICs, but ICs cannot depend on BSMs.
> I wonder why we did the other order first?  I guess because that is what the spec. says.
>
> Oh, there's a problem with the attribute insertion order logic; it's buggy that we unconditionally
> insert a BSMs attr. and then delete it later.  (That goes wrong when change<0 and we recompute
> from scratch.)
>
> Suggested amended patch enclosed.
>
> --- John
>
> On Mar 21, 2016, at 12:49 PM, Kumar Srinivasan <kumar.x.srinivasan at oracle.com> wrote:
>> Hi John,
>>
>> This patch contains fixes for two bugs:
>> 8151901: test/tools/pack200/Pack200Test fails on verifying native unpacked JAR
>> 8062335: Pack200 Java implementation differs from C version, outputs unused UTF8 for BootstrapMethods Note: The test case exhibits both of the above.
>>
>> With this  the classes produced by java and the native implementation are congruent,
>> though the JDK image's classes exhibit these issues, as a precaution I have extracted the
>> minimal set of classes to reproduce the issues, into the golden jar.
>>
>> The webrev is at:
>> http://cr.openjdk.java.net/~ksrini/8151901/webrev.00/
>>
>> Thanks
>> Kumar
>>
>
>
> diff --git a/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java b/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java
> --- a/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java
> +++ b/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java
> @@ -312,6 +312,12 @@
>           void setBootstrapMethods(Collection<BootstrapMethodEntry> bsms) {
>               assert(bootstrapMethods == null);  // do not do this twice
>               bootstrapMethods = new ArrayList<>(bsms);
> +            // Edit the attribute list, if necessary.
> +            Attribute a = getAttribute(attrBootstrapMethodsEmpty);
> +            if (bootstrapMethods != null && a == null)
> +                addAttribute(attrBootstrapMethodsEmpty.canonicalInstance());
> +            else if (bootstrapMethods == null && a != null)
> +                removeAttribute(a);
>           }
>   
>           boolean hasInnerClasses() {
> diff --git a/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageReader.java b/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageReader.java
> --- a/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageReader.java
> +++ b/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageReader.java
> @@ -1193,16 +1193,25 @@
>           cls.visitRefs(VRM_CLASSIC, cpRefs);
>   
>           ArrayList<BootstrapMethodEntry> bsms = new ArrayList<>();
> -        /*
> -         * BootstrapMethod(BSMs) are added here before InnerClasses(ICs),
> -         * so as to ensure the order. Noting that the BSMs  may be
> -         * removed if they are not found in the CP, after the ICs expansion.
> -         */
> -        cls.addAttribute(Package.attrBootstrapMethodsEmpty.canonicalInstance());
>   
>           // flesh out the local constant pool
>           ConstantPool.completeReferencesIn(cpRefs, true, bsms);
>   
> +        // Add the BSMs and references as required.
> +        if (!bsms.isEmpty()) {
> +            // Add the attirbute name to the CP (visitRefs would have wanted this).
> +            cpRefs.add(Package.getRefString("BootstrapMethods"));
> +            // The pack-spec requires that BootstrapMethods precedes the InnerClasses attribute.
> +            // So add BSMs now before running expandLocalICs.
> +            // But first delete any local InnerClasses attr.  (This is rare.)
> +            List<InnerClass> localICs = cls.getInnerClasses();
> +            cls.setInnerClasses(null);
> +            Collections.sort(bsms);
> +            cls.setBootstrapMethods(bsms);
> +            // Re-add the ICs, so the attribute lists are in the required order.
> +            cls.setInnerClasses(localICs);
> +        }
> +
>           // Now that we know all our local class references,
>           // compute the InnerClasses attribute.
>           int changed = cls.expandLocalICs();
> @@ -1221,16 +1230,6 @@
>               ConstantPool.completeReferencesIn(cpRefs, true, bsms);
>           }
>   
> -        // remove the attr previously set, otherwise add the bsm and
> -        // references as required
> -        if (bsms.isEmpty()) {
> -            cls.attributes.remove(Package.attrBootstrapMethodsEmpty.canonicalInstance());
> -        } else {
> -            cpRefs.add(Package.getRefString("BootstrapMethods"));
> -            Collections.sort(bsms);
> -            cls.setBootstrapMethods(bsms);
> -        }
> -
>           // construct a local constant pool
>           int numDoubles = 0;
>           for (Entry e : cpRefs) {
>



More information about the core-libs-dev mailing list