6990106: FindBugs scan - Malicious code vulnerability Warnings in com.sun.java.util.jar.pack.*
Reviewed-by: mduigou, briangoetz
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/AdaptiveCoding.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/AdaptiveCoding.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2010, 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
@@ -29,13 +29,14 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Adaptive coding.
* See the section "Adaptive Encodings" in the Pack200 spec.
* @author John Rose
*/
-class AdaptiveCoding implements Constants, CodingMethod {
+class AdaptiveCoding implements CodingMethod {
CodingMethod headCoding;
int headLength;
CodingMethod tailCoding;
@@ -147,7 +148,6 @@
}
if (KX == KX_MAX) return Integer.MAX_VALUE;
KX += 1;
- int unit2 = 1 << (KX * KX_LG2BASE);
int mask2 = KB_MAX << (KX * KX_LG2BASE);
K1 |= (mask & ~mask2);
K1 += unit;
@@ -250,7 +250,7 @@
return m.toString();
}
public String toString() {
- StringBuffer res = new StringBuffer(20);
+ StringBuilder res = new StringBuilder(20);
AdaptiveCoding run = this;
res.append("run(");
for (;;) {
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Attribute.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Attribute.java Tue Dec 14 07:42:11 2010 -0800
@@ -36,6 +36,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Represents an attribute in a class-file.
@@ -44,7 +45,7 @@
* attribute layouts.
* @author John Rose
*/
-class Attribute implements Comparable, Constants {
+class Attribute implements Comparable {
// Attribute instance fields.
Layout def; // the name and format of this attr
@@ -103,7 +104,6 @@
return this.def.compareTo(that.def);
}
- private static final byte[] noBytes = {};
private static final Map<List<Attribute>, List<Attribute>> canonLists = new HashMap<>();
private static final Map<Layout, Attribute> attributes = new HashMap<>();
private static final Map<Layout, Attribute> standardDefs = new HashMap<>();
@@ -112,7 +112,7 @@
// are used by trimToSize, in order to reduce footprint
// of some common cases. (Note that Code attributes are
// always zero size.)
- public static List getCanonList(List<Attribute> al) {
+ public static List<Attribute> getCanonList(List<Attribute> al) {
synchronized (canonLists) {
List<Attribute> cl = canonLists.get(al);
if (cl == null) {
@@ -465,7 +465,9 @@
return ConstantPool.getUtf8Entry(name());
}
- public boolean isEmpty() { return layout == ""; }
+ public boolean isEmpty() {
+ return layout.isEmpty();
+ }
public Layout(int ctype, String name, String layout) {
this.ctype = ctype;
@@ -479,19 +481,19 @@
} else {
String[] bodies = splitBodies(layout);
// Make the callables now, so they can be linked immediately.
- Element[] elems = new Element[bodies.length];
- this.elems = elems;
- for (int i = 0; i < elems.length; i++) {
+ Element[] lelems = new Element[bodies.length];
+ this.elems = lelems;
+ for (int i = 0; i < lelems.length; i++) {
Element ce = this.new Element();
ce.kind = EK_CBLE;
ce.removeBand();
ce.bandIndex = NO_BAND_INDEX;
ce.layout = bodies[i];
- elems[i] = ce;
+ lelems[i] = ce;
}
// Next fill them in.
- for (int i = 0; i < elems.length; i++) {
- Element ce = elems[i];
+ for (int i = 0; i < lelems.length; i++) {
+ Element ce = lelems[i];
ce.body = tokenizeLayout(this, i, bodies[i]);
}
//System.out.println(Arrays.asList(elems));
@@ -525,11 +527,12 @@
}
public boolean equals(Object x) {
- return x instanceof Layout && equals((Layout)x);
+ return ( x != null) && ( x.getClass() == Layout.class ) &&
+ equals((Layout)x);
}
public boolean equals(Layout that) {
- return this.name == that.name
- && this.layout == that.layout
+ return this.name.equals(that.name)
+ && this.layout.equals(that.layout)
&& this.ctype == that.ctype;
}
public int hashCode() {
@@ -589,14 +592,14 @@
return str;
}
private String stringForDebug() {
- Element[] body = this.body;
+ Element[] lbody = this.body;
switch (kind) {
case EK_CALL:
- body = null;
+ lbody = null;
break;
case EK_CASE:
if (flagTest(EF_BACK))
- body = null;
+ lbody = null;
break;
}
return layout
@@ -604,7 +607,7 @@
+ "<"+ (flags==0?"":""+flags)+kind+len
+ (refKind==0?"":""+refKind) + ">"
+ (value==0?"":"("+value+")")
- + (body==null?"": ""+Arrays.asList(body));
+ + (lbody==null?"": ""+Arrays.asList(lbody));
}
}
@@ -613,16 +616,19 @@
}
static private final Element[] noElems = {};
public Element[] getCallables() {
- if (hasCallables())
- return elems;
- else
+ if (hasCallables()) {
+ Element[] nelems = Arrays.copyOf(elems, elems.length);
+ return nelems;
+ } else
return noElems; // no callables at all
}
public Element[] getEntryPoint() {
if (hasCallables())
return elems[0].body; // body of first callable
- else
- return elems; // no callables; whole body
+ else {
+ Element[] nelems = Arrays.copyOf(elems, elems.length);
+ return nelems; // no callables; whole body
+ }
}
/** Return a sequence of tokens from the given attribute bytes.
@@ -674,7 +680,7 @@
}
}
- void visitRefs(Holder holder, int mode, final Collection refs) {
+ void visitRefs(Holder holder, int mode, final Collection<Entry> refs) {
if (mode == VRM_CLASSIC) {
refs.add(getNameRef());
}
@@ -720,7 +726,7 @@
*/
static public
String normalizeLayoutString(String layout) {
- StringBuffer buf = new StringBuffer();
+ StringBuilder buf = new StringBuilder();
for (int i = 0, len = layout.length(); i < len; ) {
char ch = layout.charAt(i++);
if (ch <= ' ') {
@@ -832,14 +838,14 @@
*/
static //private
Layout.Element[] tokenizeLayout(Layout self, int curCble, String layout) {
- ArrayList<Layout.Element> col = new ArrayList<>(layout.length());
+ List<Layout.Element> col = new ArrayList<>(layout.length());
tokenizeLayout(self, curCble, layout, col);
Layout.Element[] res = new Layout.Element[col.size()];
col.toArray(res);
return res;
}
static //private
- void tokenizeLayout(Layout self, int curCble, String layout, ArrayList<Layout.Element> col) {
+ void tokenizeLayout(Layout self, int curCble, String layout, List<Layout.Element> col) {
boolean prevBCI = false;
for (int len = layout.length(), i = 0; i < len; ) {
int start = i;
@@ -897,7 +903,7 @@
case 'T': // union: 'T' any_int union_case* '(' ')' '[' body ']'
kind = EK_UN;
i = tokenizeSInt(e, layout, i);
- ArrayList<Layout.Element> cases = new ArrayList<>();
+ List<Layout.Element> cases = new ArrayList<>();
for (;;) {
// Keep parsing cases until we hit the default case.
if (layout.charAt(i++) != '(')
@@ -1051,7 +1057,7 @@
}
static //private
String[] splitBodies(String layout) {
- ArrayList<String> bodies = new ArrayList<>();
+ List<String> bodies = new ArrayList<>();
// Parse several independent layout bodies: "[foo][bar]...[baz]"
for (int i = 0; i < layout.length(); i++) {
if (layout.charAt(i++) != '[')
@@ -1156,7 +1162,7 @@
String expandCaseDashNotation(String layout) {
int dash = findCaseDash(layout, 0);
if (dash < 0) return layout; // no dashes (the common case)
- StringBuffer result = new StringBuffer(layout.length() * 3);
+ StringBuilder result = new StringBuilder(layout.length() * 3);
int sofar = 0; // how far have we processed the layout?
for (;;) {
// for each dash, collect everything up to the dash
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/BandStructure.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/BandStructure.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2010, 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
@@ -44,16 +44,17 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.jar.Pack200;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Define the structure and ordering of "bands" in a packed file.
* @author John Rose
*/
abstract
-class BandStructure implements Constants {
+class BandStructure {
static final int MAX_EFFORT = 9;
static final int MIN_EFFORT = 1;
static final int DEFAULT_EFFORT = 5;
@@ -251,18 +252,18 @@
null
};
- final private static HashMap basicCodingIndexes;
+ final private static Map<Coding, Integer> basicCodingIndexes;
static {
assert(basicCodings[_meta_default] == null);
assert(basicCodings[_meta_canon_min] != null);
assert(basicCodings[_meta_canon_max] != null);
- HashMap map = new HashMap();
+ Map<Coding, Integer> map = new HashMap<>();
for (int i = 0; i < basicCodings.length; i++) {
Coding c = basicCodings[i];
if (c == null) continue;
assert(i >= _meta_canon_min);
assert(i <= _meta_canon_max);
- map.put(c, new Integer(i));
+ map.put(c, i);
}
basicCodingIndexes = map;
}
@@ -270,12 +271,12 @@
return i < basicCodings.length ? basicCodings[i] : null;
}
public static int indexOf(Coding c) {
- Integer i = (Integer) basicCodingIndexes.get(c);
+ Integer i = basicCodingIndexes.get(c);
if (i == null) return 0;
return i.intValue();
}
public static Coding[] getBasicCodings() {
- return (Coding[]) basicCodings.clone();
+ return basicCodings.clone();
}
protected byte[] bandHeaderBytes; // used for input only
@@ -687,7 +688,6 @@
}
bandCoding.writeArrayTo(out, values, 0, length);
if (out == outputCounter) {
- long len1 = outputCounter.getCount();
assert(outputSize == outputCounter.getCount() - len0)
: (outputSize+" != "+outputCounter.getCount()+"-"+len0);
}
@@ -1050,8 +1050,8 @@
// Bootstrap support for CPRefBands. These are needed to record
// intended CP indexes, before the CP has been created.
- private ArrayList allKQBands = new ArrayList();
- private ArrayList needPredefIndex = new ArrayList();
+ private final List<CPRefBand> allKQBands = new ArrayList<>();
+ private List<Object[]> needPredefIndex = new ArrayList<>();
int encodeRef(Entry e, Index ix) {
@@ -1078,9 +1078,9 @@
&& this instanceof PackageWriter) {
// Twist the random state based on my first file.
// This sends each segment off in a different direction.
- List classes = ((PackageWriter)this).pkg.classes;
+ List<Package.Class> classes = ((PackageWriter)this).pkg.classes;
if (!classes.isEmpty()) {
- Package.Class cls = (Package.Class) classes.get(0);
+ Package.Class cls = classes.get(0);
codingChooser.addStressSeed(cls.getName().hashCode());
}
}
@@ -1619,8 +1619,7 @@
/** Given CP indexes, distribute tag-specific indexes to bands. */
protected void setBandIndexes() {
// Handle prior calls to setBandIndex:
- for (Iterator i = needPredefIndex.iterator(); i.hasNext(); ) {
- Object[] need = (Object[]) i.next();
+ for (Object[] need : needPredefIndex) {
CPRefBand b = (CPRefBand) need[0];
Byte which = (Byte) need[1];
b.setIndex(getCPIndex(which.byteValue()));
@@ -1633,7 +1632,7 @@
}
protected void setBandIndex(CPRefBand b, byte which) {
- Object[] need = { b, new Byte(which) };
+ Object[] need = { b, Byte.valueOf(which) };
if (which == CONSTANT_Literal) {
// I.e., attribute layouts KQ (no null) or KQN (null ok).
allKQBands.add(b);
@@ -1645,7 +1644,7 @@
}
}
- protected void setConstantValueIndex(com.sun.java.util.jar.pack.Package.Class.Field f) {
+ protected void setConstantValueIndex(Field f) {
Index ix = null;
if (f != null) {
byte tag = f.getLiteralTag();
@@ -1655,8 +1654,7 @@
assert(ix != null);
}
// Typically, allKQBands is the singleton of field_ConstantValue_KQ.
- for (Iterator i = allKQBands.iterator(); i.hasNext(); ) {
- CPRefBand xxx_KQ = (CPRefBand) i.next();
+ for (CPRefBand xxx_KQ : allKQBands) {
xxx_KQ.setIndex(ix);
}
}
@@ -1688,7 +1686,7 @@
protected int attrClassFileVersionMask;
// Mapping from Attribute.Layout to Band[] (layout element bands).
- protected HashMap attrBandTable = new HashMap();
+ protected Map<Attribute.Layout, Band[]> attrBandTable = new HashMap<>();
// Well-known attributes:
protected final Attribute.Layout attrCodeEmpty;
@@ -1697,15 +1695,18 @@
protected final Attribute.Layout attrConstantValue;
// Mapping from Attribute.Layout to Integer (inverse of attrDefs)
- HashMap attrIndexTable = new HashMap();
+ Map<Attribute.Layout, Integer> attrIndexTable = new HashMap<>();
// Mapping from attribute index (<32 are flag bits) to attributes.
- protected ArrayList[] attrDefs = new ArrayList[ATTR_CONTEXT_LIMIT];
+ protected List<List<Attribute.Layout>> attrDefs =
+ new FixedList<>(ATTR_CONTEXT_LIMIT);
{
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
assert(attrIndexLimit[i] == 0);
attrIndexLimit[i] = 32; // just for the sake of predefs.
- attrDefs[i] = new ArrayList(Collections.nCopies(attrIndexLimit[i], null));
+ attrDefs.set(i, new ArrayList<Attribute.Layout>(Collections.nCopies(
+ attrIndexLimit[i], (Attribute.Layout)null)));
+
}
// Add predefined attribute definitions:
@@ -1867,9 +1868,10 @@
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
assert(attrIndexLimit[i] == 0); // decide on it now!
attrIndexLimit[i] = (haveFlagsHi(i)? 63: 32);
- assert(attrDefs[i].size() == 32); // all predef indexes are <32
- int addMore = attrIndexLimit[i] - attrDefs[i].size();
- attrDefs[i].addAll(Collections.nCopies(addMore, null));
+ List<Attribute.Layout> defList = attrDefs.get(i);
+ assert(defList.size() == 32); // all predef indexes are <32
+ int addMore = attrIndexLimit[i] - defList.size();
+ defList.addAll(Collections.nCopies(addMore, (Attribute.Layout) null));
}
}
@@ -1890,13 +1892,13 @@
return testBit(archiveOptions, mask);
}
- protected ArrayList getPredefinedAttrs(int ctype) {
+ protected List getPredefinedAttrs(int ctype) {
assert(attrIndexLimit[ctype] != 0);
- ArrayList res = new ArrayList(attrIndexLimit[ctype]);
+ List<Attribute.Layout> res = new ArrayList<>(attrIndexLimit[ctype]);
// Remove nulls and non-predefs.
for (int ai = 0; ai < attrIndexLimit[ctype]; ai++) {
if (testBit(attrDefSeen[ctype], 1L<<ai)) continue;
- Attribute.Layout def = (Attribute.Layout) attrDefs[ctype].get(ai);
+ Attribute.Layout def = attrDefs.get(ctype).get(ai);
if (def == null) continue; // unused flag bit
assert(isPredefinedAttr(ctype, ai));
res.add(def);
@@ -1910,7 +1912,7 @@
if (ai >= attrIndexLimit[ctype]) return false;
// If the bit is set, it was explicitly def'd.
if (testBit(attrDefSeen[ctype], 1L<<ai)) return false;
- return (attrDefs[ctype].get(ai) != null);
+ return (attrDefs.get(ctype).get(ai) != null);
}
protected void adjustSpecialAttrMasks() {
@@ -2050,8 +2052,8 @@
System.out.println("Removing predefined "+ATTR_CONTEXT_NAME[ctype]+
" attribute on bit "+index);
}
- List defList = attrDefs[ctype];
- Attribute.Layout def = (Attribute.Layout) defList.get(index);
+ List<Attribute.Layout> defList = attrDefs.get(ctype);
+ Attribute.Layout def = defList.get(index);
assert(def != null);
defList.set(index, null);
attrIndexTable.put(def, null);
@@ -2059,7 +2061,7 @@
assert(index < 64);
attrDefSeen[ctype] &= ~(1L<<index);
attrFlagMask[ctype] &= ~(1L<<index);
- Band[] ab = (Band[]) attrBandTable.get(def);
+ Band[] ab = attrBandTable.get(def);
for (int j = 0; j < ab.length; j++) {
ab[j].doneWithUnusedBand();
}
@@ -2085,9 +2087,8 @@
long defSeen = attrDefSeen[ctype];
// Note: attrDefSeen is always a subset of attrFlagMask.
assert((defSeen & ~attrFlagMask[ctype]) == 0);
- for (int i = 0; i < attrDefs[ctype].size(); i++) {
- Attribute.Layout def = (Attribute.Layout)
- attrDefs[ctype].get(i);
+ for (int i = 0; i < attrDefs.get(ctype).size(); i++) {
+ Attribute.Layout def = attrDefs.get(ctype).get(i);
if (def == null) continue; // unused flag bit
if (def.bandCount == 0) continue; // empty attr
if (i < attrIndexLimit[ctype] && !testBit(defSeen, 1L<<i)) {
@@ -2102,7 +2103,7 @@
Band[] newAB = makeNewAttributeBands(pfx, def,
xxx_attr_bands);
assert(newAB.length == def.bandCount);
- Band[] prevAB = (Band[]) attrBandTable.put(def, newAB);
+ Band[] prevAB = attrBandTable.put(def, newAB);
if (prevAB != null) {
// We won't be using these predefined bands.
for (int j = 0; j < prevAB.length; j++) {
@@ -2212,14 +2213,14 @@
protected int setAttributeLayoutIndex(Attribute.Layout def, int index) {
int ctype = def.ctype;
assert(ATTR_INDEX_OVERFLOW <= index && index < attrIndexLimit[ctype]);
- List defList = attrDefs[ctype];
+ List<Attribute.Layout> defList = attrDefs.get(ctype);
if (index == ATTR_INDEX_OVERFLOW) {
// Overflow attribute.
index = defList.size();
defList.add(def);
if (verbose > 0)
Utils.log.info("Adding new attribute at "+def +": "+index);
- attrIndexTable.put(def, new Integer(index));
+ attrIndexTable.put(def, index);
return index;
}
@@ -2240,7 +2241,7 @@
// Remove index binding of any previous fixed attr.
attrIndexTable.put(defList.get(index), null);
defList.set(index, def);
- attrIndexTable.put(def, new Integer(index));
+ attrIndexTable.put(def, index);
return index;
}
@@ -2361,7 +2362,7 @@
////////////////////////////////////////////////////////////////////
static int nextSeqForDebug;
- static File dumpDir;
+ static File dumpDir = null;
static OutputStream getDumpStream(Band b, String ext) throws IOException {
return getDumpStream(b.name, b.seqForDebug, ext, b);
}
@@ -2512,19 +2513,19 @@
+", "+cstr+", "+ixS+"),");
}
- private HashMap prevForAssertMap;
+ private Map<Band, Band> prevForAssertMap;
// DEBUG ONLY: Record something about the band order.
boolean notePrevForAssert(Band b, Band p) {
if (prevForAssertMap == null)
- prevForAssertMap = new HashMap();
+ prevForAssertMap = new HashMap<>();
prevForAssertMap.put(b, p);
return true;
}
// DEBUG ONLY: Validate next input band.
private boolean assertReadyToReadFrom(Band b, InputStream in) throws IOException {
- Band p = (Band) prevForAssertMap.get(b);
+ Band p = prevForAssertMap.get(b);
// Any previous band must be done reading before this one starts.
if (p != null && phaseCmp(p.phase(), DISBURSE_PHASE) < 0) {
Utils.log.warning("Previous band not done reading.");
@@ -2536,19 +2537,21 @@
String name = b.name;
if (optDebugBands && !name.startsWith("(")) {
// Verify synchronization between reader & writer:
- StringBuffer buf = new StringBuffer();
+ StringBuilder buf = new StringBuilder();
int ch;
while ((ch = in.read()) > 0)
buf.append((char)ch);
String inName = buf.toString();
if (!inName.equals(name)) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("Expected "+name+" but read: ");
inName += (char)ch;
- while (inName.length() < 10)
- inName += (char)in.read();
- for (int i = 0; i < inName.length(); i++)
+ while (inName.length() < 10) {
+ inName += (char) in.read();
+ }
+ for (int i = 0; i < inName.length(); i++) {
sb.append(inName.charAt(i));
+ }
Utils.log.warning(sb.toString());
return false;
}
@@ -2573,7 +2576,7 @@
// DEBUG ONLY: Maybe write a debugging cookie to next output band.
private boolean assertReadyToWriteTo(Band b, OutputStream out) throws IOException {
- Band p = (Band) prevForAssertMap.get(b);
+ Band p = prevForAssertMap.get(b);
// Any previous band must be done writing before this one starts.
if (p != null && phaseCmp(p.phase(), DONE_PHASE) < 0) {
Utils.log.warning("Previous band not done writing.");
@@ -2654,7 +2657,7 @@
protected static Object[] realloc(Object[] a) {
return realloc(a, Math.max(10, a.length*2));
}
- static private int[] noInts = {};
+
protected static int[] realloc(int[] a, int len) {
if (len == 0) return noInts;
if (a == null) return new int[len];
@@ -2665,7 +2668,7 @@
protected static int[] realloc(int[] a) {
return realloc(a, Math.max(10, a.length*2));
}
- static private byte[] noBytes = {};
+
protected static byte[] realloc(byte[] a, int len) {
if (len == 0) return noBytes;
if (a == null) return new byte[len];
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java Tue Dec 14 07:42:11 2010 -0800
@@ -38,19 +38,20 @@
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Map;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Reader for a class file that is being incorporated into a package.
* @author John Rose
*/
-class ClassReader implements Constants {
+class ClassReader {
int verbose;
Package pkg;
Class cls;
long inPos;
DataInputStream in;
- Map attrDefs;
+ Map<Attribute.Layout, Attribute> attrDefs;
Map attrCommands;
String unknownAttrCommand = "error";;
@@ -77,7 +78,7 @@
});
}
- public void setAttrDefs(Map attrDefs) {
+ public void setAttrDefs(Map<Attribute.Layout, Attribute> attrDefs) {
this.attrDefs = attrDefs;
}
@@ -211,27 +212,23 @@
break;
case CONSTANT_Integer:
{
- Comparable val = new Integer(in.readInt());
- cpMap[i] = ConstantPool.getLiteralEntry(val);
+ cpMap[i] = ConstantPool.getLiteralEntry(in.readInt());
}
break;
case CONSTANT_Float:
{
- Comparable val = new Float(in.readFloat());
- cpMap[i] = ConstantPool.getLiteralEntry(val);
+ cpMap[i] = ConstantPool.getLiteralEntry(in.readFloat());
}
break;
case CONSTANT_Long:
{
- Comparable val = new Long(in.readLong());
- cpMap[i] = ConstantPool.getLiteralEntry(val);
+ cpMap[i] = ConstantPool.getLiteralEntry(in.readLong());
cpMap[++i] = null;
}
break;
case CONSTANT_Double:
{
- Comparable val = new Double(in.readDouble());
- cpMap[i] = ConstantPool.getLiteralEntry(val);
+ cpMap[i] = ConstantPool.getLiteralEntry(in.readDouble());
cpMap[++i] = null;
}
break;
@@ -353,17 +350,16 @@
if (attrCommands != null) {
Object lkey = Attribute.keyForLookup(ctype, name);
String cmd = (String) attrCommands.get(lkey);
- if (cmd == "pass") {
- String message = "passing attribute bitwise in "+h;
- throw new Attribute.FormatException(message, ctype, name,
- cmd);
- } else if (cmd == "error") {
- String message = "attribute not allowed in "+h;
- throw new Attribute.FormatException(message, ctype, name,
- cmd);
- } else if (cmd == "strip") {
- skip(length, name+" attribute in "+h);
- continue;
+ switch (cmd) {
+ case "pass":
+ String message1 = "passing attribute bitwise in " + h;
+ throw new Attribute.FormatException(message1, ctype, name, cmd);
+ case "error":
+ String message2 = "attribute not allowed in " + h;
+ throw new Attribute.FormatException(message2, ctype, name, cmd);
+ case "strip":
+ skip(length, name + " attribute in " + h);
+ continue;
}
}
// Find canonical instance of the requested attribute.
@@ -408,7 +404,7 @@
String message = "unsupported StackMap variant in "+h;
throw new Attribute.FormatException(message, ctype, name,
"pass");
- } else if (unknownAttrCommand == "strip") {
+ } else if ("strip".equals(unknownAttrCommand)) {
// Skip the unknown attribute.
skip(length, "unknown "+name+" attribute in "+h);
continue;
@@ -422,7 +418,7 @@
a.layout() == Package.attrInnerClassesEmpty) {
// These are hardwired.
long pos0 = inPos;
- if (a.name() == "Code") {
+ if ("Code".equals(a.name())) {
Class.Method m = (Class.Method) h;
m.code = new Code(m);
try {
@@ -471,7 +467,7 @@
void readInnerClasses(Class cls) throws IOException {
int nc = readUnsignedShort();
- ArrayList ics = new ArrayList(nc);
+ ArrayList<InnerClass> ics = new ArrayList<>(nc);
for (int i = 0; i < nc; i++) {
InnerClass ic =
new InnerClass(readClassRef(),
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassWriter.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassWriter.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2010, 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
@@ -38,12 +38,12 @@
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
-
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Writer for a class file that is incorporated into a package.
* @author John Rose
*/
-class ClassWriter implements Constants {
+class ClassWriter {
int verbose;
Package pkg;
@@ -196,8 +196,7 @@
return;
}
writeShort(h.attributes.size());
- for (Iterator i = h.attributes.iterator(); i.hasNext(); ) {
- Attribute a = (Attribute) i.next();
+ for (Attribute a : h.attributes) {
a.finishRefs(cpIndex);
writeRef(a.getNameRef());
if (a.layout() == Package.attrCodeEmpty ||
@@ -207,7 +206,7 @@
assert(out != bufOut);
buf.reset();
out = bufOut;
- if (a.name() == "Code") {
+ if ("Code".equals(a.name())) {
Class.Method m = (Class.Method) h;
writeCode(m.code);
} else {
@@ -246,10 +245,9 @@
}
void writeInnerClasses(Class cls) throws IOException {
- List ics = cls.getInnerClasses();
+ List<InnerClass> ics = cls.getInnerClasses();
writeShort(ics.size());
- for (Iterator i = ics.iterator(); i.hasNext(); ) {
- InnerClass ic = (InnerClass) i.next();
+ for (InnerClass ic : ics) {
writeRef(ic.thisClass);
writeRef(ic.outerClass);
writeRef(ic.name);
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Code.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Code.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2010, 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
@@ -29,12 +29,13 @@
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Collection;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Represents a chunk of bytecodes.
* @author John Rose
*/
-class Code extends Attribute.Holder implements Constants {
+class Code extends Attribute.Holder {
Class.Method m;
public Code(Class.Method m) {
@@ -141,15 +142,12 @@
super.trimToSize();
}
- protected void visitRefs(int mode, Collection refs) {
+ protected void visitRefs(int mode, Collection<ConstantPool.Entry> refs) {
int verbose = getPackage().verbose;
if (verbose > 2)
System.out.println("Reference scan "+this);
Class cls = thisClass();
- Package pkg = cls.getPackage();
- for (int i = 0; i < handler_class.length; i++) {
- refs.add(handler_class[i]);
- }
+ refs.addAll(Arrays.asList(handler_class));
if (fixups != null) {
fixups.visitRefs(refs);
} else {
@@ -196,11 +194,8 @@
map[mapLen] = (short)(PClimit + Short.MIN_VALUE);
return map;
} else {
- int[] map = new int[mapLen+1];
- for (int i = 0; i < mapLen; i++) {
- map[i] = (int) insnMap[i];
- }
- map[mapLen] = (int) PClimit;
+ int[] map = Arrays.copyOf(insnMap, mapLen + 1);
+ map[mapLen] = PClimit;
return map;
}
}
@@ -220,10 +215,7 @@
}
} else {
int[] map = (int[]) map0;
- imap = new int[map.length-1];
- for (int i = 0; i < imap.length; i++) {
- imap[i] = map[i];
- }
+ imap = Arrays.copyOfRange(map, 0, map.length - 1);
}
return imap;
}
@@ -266,7 +258,7 @@
} else {
int[] map = (int[]) map0;
len = map.length;
- i = Arrays.binarySearch(map, (int)bci);
+ i = Arrays.binarySearch(map, bci);
}
assert(i != -1);
assert(i != 0);
@@ -322,7 +314,7 @@
len = map.length;
if (bciCode < len)
return map[bciCode];
- i = Arrays.binarySearch(map, (int)bciCode);
+ i = Arrays.binarySearch(map, bciCode);
if (i < 0) i = -i-1;
int key = bciCode-len;
for (;; i--) {
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Coding.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Coding.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2010, 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
@@ -29,14 +29,15 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
-
+import java.util.Map;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Define the conversions between sequences of small integers and raw bytes.
* This is a schema of encodings which incorporates varying lengths,
* varying degrees of length variability, and varying amounts of signed-ness.
* @author John Rose
*/
-class Coding implements Constants, Comparable, CodingMethod, Histogram.BitMetric {
+class Coding implements Comparable, CodingMethod, Histogram.BitMetric {
/*
Coding schema for single integers, parameterized by (B,H,S):
@@ -191,7 +192,9 @@
if (S == 0 || range >= (long)1<<32)
return saturate32(range-1);
long maxPos = range-1;
- while (isNegativeCode(maxPos, S)) --maxPos;
+ while (isNegativeCode(maxPos, S)) {
+ --maxPos;
+ }
if (maxPos < 0) return -1; // No positive codings at all.
int smax = decodeSign32(maxPos, S);
// check for 32-bit wraparound:
@@ -213,9 +216,10 @@
if (S == 0) {
return 0;
}
- int Smask = (1<<S)-1;
long maxNeg = range-1;
- while (!isNegativeCode(maxNeg, S)) --maxNeg;
+ while (!isNegativeCode(maxNeg, S))
+ --maxNeg;
+
if (maxNeg < 0) return 0; // No negative codings at all.
return decodeSign32(maxNeg, S);
}
@@ -395,12 +399,12 @@
return (del<<14)+(S<<11)+(B<<8)+(H<<0);
}
- private static HashMap codeMap;
+ private static Map<Coding, Coding> codeMap;
private static synchronized Coding of(int B, int H, int S, int del) {
- if (codeMap == null) codeMap = new HashMap();
+ if (codeMap == null) codeMap = new HashMap<>();
Coding x0 = new Coding(B, H, S, del);
- Coding x1 = (Coding) codeMap.get(x0);
+ Coding x1 = codeMap.get(x0);
if (x1 == null) codeMap.put(x0, x1 = x0);
return x1;
}
@@ -462,6 +466,7 @@
// %%% use byte[] buffer
for (int i = start; i < end; i++)
a[i] = readFrom(in);
+
for (int dstep = 0; dstep < del; dstep++) {
long state = 0;
for (int i = start; i < end; i++) {
@@ -750,14 +755,14 @@
if (len == 0) return true;
if (isFullRange()) return true;
// Calculate max, min:
- int max = values[start];
- int min = max;
+ int lmax = values[start];
+ int lmin = lmax;
for (int i = 1; i < len; i++) {
int value = values[start+i];
- if (max < value) max = value;
- if (min > value) min = value;
+ if (lmax < value) lmax = value;
+ if (lmin > value) lmin = value;
}
- return canRepresent(min, max);
+ return canRepresent(lmin, lmax);
}
public double getBitLength(int value) { // implements BitMetric
@@ -800,21 +805,20 @@
//return Coding.of(B, H, S).getLength(deltas, 0, len);
values = deltas;
start = 0;
- end = values.length;
}
int sum = len; // at least 1 byte per
// add extra bytes for extra-long values
for (int n = 1; n <= B; n++) {
// what is the coding interval [min..max] for n bytes?
- int max = byteMax[n-1];
- int min = byteMin[n-1];
+ int lmax = byteMax[n-1];
+ int lmin = byteMin[n-1];
int longer = 0; // count of guys longer than n bytes
for (int i = 0; i < len; i++) {
int value = values[start+i];
if (value >= 0) {
- if (value > max) longer++;
+ if (value > lmax) longer++;
} else {
- if (value < min) longer++;
+ if (value < lmin) longer++;
}
}
if (longer == 0) break; // no more passes needed
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/CodingChooser.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/CodingChooser.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2010, 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
@@ -34,15 +34,16 @@
import java.util.Iterator;
import java.util.List;
import java.util.Random;
+import java.util.Set;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
-
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Heuristic chooser of basic encodings.
* Runs "zip" to measure the apparent information content after coding.
* @author John Rose
*/
-class CodingChooser implements Constants {
+class CodingChooser {
int verbose;
int effort;
boolean optUseHistogram = true;
@@ -124,10 +125,10 @@
= !p200.getBoolean(Utils.COM_PREFIX+"no.population.coding");
this.optUseAdaptiveCoding
= !p200.getBoolean(Utils.COM_PREFIX+"no.adaptive.coding");
- int stress
+ int lstress
= p200.getInteger(Utils.COM_PREFIX+"stress.coding");
- if (stress != 0)
- this.stress = new Random(stress);
+ if (lstress != 0)
+ this.stress = new Random(lstress);
}
this.effort = effort;
@@ -376,9 +377,9 @@
" fewer bytes than regular "+regular+
"; win="+pct(zipSize1-bestZipSize, zipSize1));
}
- CodingMethod bestMethod = this.bestMethod;
+ CodingMethod lbestMethod = this.bestMethod;
reset(null, 0, 0); // for GC
- return bestMethod;
+ return lbestMethod;
}
CodingMethod choose(int[] values, int start, int end, Coding regular) {
return choose(values, start, end, regular, null);
@@ -742,9 +743,9 @@
// Steps 1/2/3 are interdependent, and may be iterated.
// Steps 4 and 5 may be decided independently afterward.
int[] LValuesCoded = PopulationCoding.LValuesCoded;
- ArrayList bestFits = new ArrayList();
- ArrayList fullFits = new ArrayList();
- ArrayList longFits = new ArrayList();
+ List<Coding> bestFits = new ArrayList<>();
+ List<Coding> fullFits = new ArrayList<>();
+ List<Coding> longFits = new ArrayList<>();
final int PACK_TO_MAX_S = 1;
if (bestPopFVC <= 255) {
bestFits.add(BandStructure.BYTE1);
@@ -776,16 +777,16 @@
}
}
// interleave all B greater than bestB with best and full fits
- for (Iterator i = bestFits.iterator(); i.hasNext(); ) {
- Coding c = (Coding) i.next();
+ for (Iterator<Coding> i = bestFits.iterator(); i.hasNext(); ) {
+ Coding c = i.next();
if (c.B() > bestB) {
i.remove();
longFits.add(0, c);
}
}
}
- ArrayList allFits = new ArrayList();
- for (Iterator i = bestFits.iterator(),
+ List<Coding> allFits = new ArrayList<>();
+ for (Iterator<Coding> i = bestFits.iterator(),
j = fullFits.iterator(),
k = longFits.iterator();
i.hasNext() || j.hasNext() || k.hasNext(); ) {
@@ -812,8 +813,7 @@
}
if (verbose > 3)
Utils.log.info("allFits: "+allFits);
- for (Iterator i = allFits.iterator(); i.hasNext(); ) {
- Coding tc = (Coding) i.next();
+ for (Coding tc : allFits) {
boolean packToMax = false;
if (tc.S() == PACK_TO_MAX_S) {
// Kludge: setS(PACK_TO_MAX_S) means packToMax here.
@@ -910,7 +910,7 @@
" tc="+pop.tokenCoding+
" uc="+pop.unfavoredCoding);
//pop.hist.print("pop-hist", null, System.out);
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
sb.append("fv = {");
for (int i = 1; i <= fVlen; i++) {
if ((i % 10) == 0)
@@ -949,20 +949,20 @@
// run occupies too much space. ("Too much" means, say 5% more
// than the average integer size of the band as a whole.)
// Try to find a better coding for those segments.
- int start = this.start;
- int end = this.end;
- int[] values = this.values;
- int len = end-start;
+ int lstart = this.start;
+ int lend = this.end;
+ int[] lvalues = this.values;
+ int len = lend-lstart;
if (plainCoding.isDelta()) {
- values = getDeltas(0,0); //%%% not quite right!
- start = 0;
- end = values.length;
+ lvalues = getDeltas(0,0); //%%% not quite right!
+ lstart = 0;
+ lend = lvalues.length;
}
int[] sizes = new int[len+1];
int fillp = 0;
int totalSize = 0;
- for (int i = start; i < end; i++) {
- int val = values[i];
+ for (int i = lstart; i < lend; i++) {
+ int val = lvalues[i];
sizes[fillp++] = totalSize;
int size = plainCoding.getLength(val);
assert(size < Integer.MAX_VALUE);
@@ -1013,22 +1013,23 @@
double[] fuzzes = new double[meshes.length];
for (int i = 0; i < meshes.length; i++) {
int mesh = meshes[i];
- double fuzz;
+ double lfuzz;
if (mesh < 10)
- fuzz = sizeFuzz3;
+ lfuzz = sizeFuzz3;
else if (mesh < 100)
- fuzz = sizeFuzz2;
+ lfuzz = sizeFuzz2;
else
- fuzz = sizeFuzz;
- fuzzes[i] = fuzz;
- threshes[i] = BAND_HEADER + (int)Math.ceil(mesh * avgSize * fuzz);
+ lfuzz = sizeFuzz;
+ fuzzes[i] = lfuzz;
+ threshes[i] = BAND_HEADER + (int)Math.ceil(mesh * avgSize * lfuzz);
}
if (verbose > 1) {
System.out.print("tryAdaptiveCoding ["+len+"]"+
" avgS="+avgSize+" fuzz="+sizeFuzz+
" meshes: {");
- for (int i = 0; i < meshes.length; i++)
- System.out.print(" "+meshes[i]+"("+threshes[i]+")");
+ for (int i = 0; i < meshes.length; i++) {
+ System.out.print(" " + meshes[i] + "(" + threshes[i] + ")");
+ }
Utils.log.info(" }");
}
if (runHelper == null) {
@@ -1229,20 +1230,19 @@
Histogram hist = getValueHistogram();
int fVlen = stressLen(hist.getTotalLength());
if (fVlen == 0) return coding;
- List popvals = new ArrayList();
+ List<Integer> popvals = new ArrayList<>();
if (stress.nextBoolean()) {
// Build the population from the value list.
- HashSet popset = new HashSet();
+ Set<Integer> popset = new HashSet<>();
for (int i = start; i < end; i++) {
- Integer val = new Integer(values[i]);
- if (popset.add(val)) popvals.add(val);
+ if (popset.add(values[i])) popvals.add(values[i]);
}
} else {
int[][] matrix = hist.getMatrix();
for (int mrow = 0; mrow < matrix.length; mrow++) {
int[] row = matrix[mrow];
for (int mcol = 1; mcol < row.length; mcol++) {
- popvals.add(new Integer(row[mcol]));
+ popvals.add(row[mcol]);
}
}
}
@@ -1269,7 +1269,7 @@
fVlen = popvals.size();
int[] fvals = new int[1+fVlen];
for (int i = 0; i < fVlen; i++) {
- fvals[1+i] = ((Integer)popvals.get(i)).intValue();
+ fvals[1+i] = (popvals.get(i)).intValue();
}
PopulationCoding pop = new PopulationCoding();
pop.setFavoredValues(fvals, fVlen);
@@ -1283,13 +1283,13 @@
}
}
if (pop.tokenCoding == null) {
- int min = fvals[1], max = min;
+ int lmin = fvals[1], lmax = lmin;
for (int i = 2; i <= fVlen; i++) {
int val = fvals[i];
- if (min > val) min = val;
- if (max < val) max = val;
+ if (lmin > val) lmin = val;
+ if (lmax < val) lmax = val;
}
- pop.tokenCoding = stressCoding(min, max);
+ pop.tokenCoding = stressCoding(lmin, lmax);
}
computePopSizePrivate(pop, valueCoding, valueCoding);
@@ -1310,13 +1310,13 @@
try {
assert(!disableRunCoding);
disableRunCoding = true; // temporary, while I decide spans
- int[] allValues = (int[]) values.clone();
+ int[] allValues = values.clone();
CodingMethod result = null;
int scan = this.end;
- int start = this.start;
- for (int split; scan > start; scan = split) {
+ int lstart = this.start;
+ for (int split; scan > lstart; scan = split) {
int thisspan;
- int rand = (scan - start < 100)? -1: stress.nextInt();
+ int rand = (scan - lstart < 100)? -1: stress.nextInt();
if ((rand & 7) != 0) {
thisspan = (spanlen==1? spanlen: stressLen(spanlen-1)+1);
} else {
@@ -1325,7 +1325,7 @@
int KB = (rand >>>= 3) & AdaptiveCoding.KB_MAX;
for (;;) {
thisspan = AdaptiveCoding.decodeK(KX, KB);
- if (thisspan <= scan - start) break;
+ if (thisspan <= scan - lstart) break;
// Try smaller and smaller codings:
if (KB != AdaptiveCoding.KB_DEFAULT)
KB = AdaptiveCoding.KB_DEFAULT;
@@ -1335,11 +1335,13 @@
//System.out.println("KX="+KX+" KB="+KB+" K="+thisspan);
assert(AdaptiveCoding.isCodableLength(thisspan));
}
- if (thisspan > scan - start) thisspan = scan - start;
- while (!AdaptiveCoding.isCodableLength(thisspan)) --thisspan;
+ if (thisspan > scan - lstart) thisspan = scan - lstart;
+ while (!AdaptiveCoding.isCodableLength(thisspan)) {
+ --thisspan;
+ }
split = scan - thisspan;
assert(split < scan);
- assert(split >= start);
+ assert(split >= lstart);
// Choose a coding for the span [split..scan).
CodingMethod sc = choose(allValues, split, scan, plainCoding);
if (result == null) {
@@ -1420,7 +1422,7 @@
case StreamTokenizer.TT_EOF:
throw new NoSuchElementException();
case StreamTokenizer.TT_NUMBER:
- return new Integer((int) in.nval);
+ return Integer.valueOf((int) in.nval);
default:
assert(false);
return null;
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java Tue Dec 14 07:42:11 2010 -0800
@@ -33,13 +33,14 @@
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Representation of constant pool entries and indexes.
* @author John Rose
*/
abstract
-class ConstantPool implements Constants {
+class ConstantPool {
private ConstantPool() {} // do not instantiate
static int verbose() {
@@ -155,9 +156,6 @@
return null;
}
- public boolean sameTagAs(Object o) {
- return (o instanceof Entry) && ((Entry)o).tag == tag;
- }
public boolean eq(Entry that) { // same reference
assert(that != null);
return this == that || this.equals(that);
@@ -219,9 +217,9 @@
return value.hashCode();
}
public boolean equals(Object o) {
- if (!sameTagAs(o)) return false;
// Use reference equality of interned strings:
- return ((Utf8Entry)o).value == value;
+ return (o != null && o.getClass() == Utf8Entry.class
+ && ((Utf8Entry) o).value.equals(value));
}
public int compareTo(Object o) {
int x = superCompareTo(o);
@@ -275,8 +273,9 @@
}
public boolean equals(Object o) {
- if (!sameTagAs(o)) return false;
- return (((NumberEntry)o).value).equals(value);
+ return (o != null && o.getClass() == NumberEntry.class
+ && ((NumberEntry) o).value.equals(value));
+
}
public int compareTo(Object o) {
int x = superCompareTo(o);
@@ -310,8 +309,8 @@
return ref.hashCode() + tag;
}
public boolean equals(Object o) {
- if (!sameTagAs(o)) return false;
- return ((StringEntry)o).ref.eq(ref);
+ return (o != null && o.getClass() == StringEntry.class &&
+ ((StringEntry)o).ref.eq(ref));
}
public int compareTo(Object o) {
int x = superCompareTo(o);
@@ -342,8 +341,8 @@
hashCode(); // force computation of valueHash
}
public boolean equals(Object o) {
- if (!sameTagAs(o)) return false;
- return ((ClassEntry)o).ref.eq(ref);
+ return (o != null && o.getClass() == ClassEntry.class
+ && ((ClassEntry) o).ref.eq(ref));
}
public int compareTo(Object o) {
int x = superCompareTo(o);
@@ -380,7 +379,9 @@
return (nameRef.hashCode() + (hc2 << 8)) ^ hc2;
}
public boolean equals(Object o) {
- if (!sameTagAs(o)) return false;
+ if (o == null || o.getClass() != DescriptorEntry.class) {
+ return false;
+ }
DescriptorEntry that = (DescriptorEntry)o;
return this.nameRef.eq(that.nameRef)
&& this.typeRef.eq(that.typeRef);
@@ -439,7 +440,9 @@
hashCode(); // force computation of valueHash
}
public boolean equals(Object o) {
- if (!sameTagAs(o)) return false;
+ if (o == null || o.getClass() != MemberEntry.class) {
+ return false;
+ }
MemberEntry that = (MemberEntry)o;
return this.classRef.eq(that.classRef)
&& this.descRef.eq(that.descRef);
@@ -511,8 +514,8 @@
}
public boolean equals(Object o) {
- if (!sameTagAs(o)) return false;
- return ((SignatureEntry)o).value == value;
+ return (o != null && o.getClass() == SignatureEntry.class &&
+ ((SignatureEntry)o).value.equals(value));
}
public int compareTo(Object o) {
int x = superCompareTo(o);
@@ -724,7 +727,7 @@
protected static final ClassEntry[] noClassRefs = {};
/** An Index is a mapping between CP entries and small integers. */
- public static
+ public static final
class Index extends AbstractList {
protected String debugName;
protected Entry[] cpMap;
@@ -894,7 +897,7 @@
}
public static
- Index makeIndex(String debugName, Collection cpMapList) {
+ Index makeIndex(String debugName, Collection<Entry> cpMapList) {
return new Index(debugName, cpMapList);
}
@@ -916,7 +919,7 @@
public static
Index[] partition(Index ix, int[] keys) {
// %%% Should move this into class Index.
- ArrayList<List<Entry>> parts = new ArrayList<>();
+ List<List<Entry>> parts = new ArrayList<>();
Entry[] cpMap = ix.cpMap;
assert(keys.length == cpMap.length);
for (int i = 0; i < keys.length; i++) {
@@ -1094,12 +1097,12 @@
// Inverse of getOverloadingIndex
public MemberEntry getOverloadingForIndex(byte tag, ClassEntry classRef, String name, int which) {
- assert(name == name.intern());
+ assert(name.equals(name.intern()));
Index ix = getMemberIndex(tag, classRef);
int ord = 0;
for (int i = 0; i < ix.cpMap.length; i++) {
MemberEntry e = (MemberEntry) ix.cpMap[i];
- if (e.descRef.nameRef.stringValue() == name) {
+ if (e.descRef.nameRef.stringValue().equals(name)) {
if (ord == which) return e;
ord++;
}
@@ -1133,10 +1136,10 @@
public static
void completeReferencesIn(Set<Entry> cpRefs, boolean flattenSigs) {
cpRefs.remove(null);
- for (ListIterator work =
- new ArrayList(cpRefs).listIterator(cpRefs.size());
+ for (ListIterator<Entry> work =
+ new ArrayList<Entry>(cpRefs).listIterator(cpRefs.size());
work.hasPrevious(); ) {
- Entry e = (Entry) work.previous();
+ Entry e = work.previous();
work.remove(); // pop stack
assert(e != null);
if (flattenSigs && e.tag == CONSTANT_Signature) {
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Constants.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Constants.java Tue Dec 14 07:42:11 2010 -0800
@@ -32,7 +32,10 @@
* Shared constants
* @author John Rose
*/
-interface Constants {
+class Constants {
+
+ private Constants(){}
+
public final static int JAVA_MAGIC = 0xCAFEBABE;
/*
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Driver.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Driver.java Tue Dec 14 07:42:11 2010 -0800
@@ -59,12 +59,11 @@
ResourceBundle.getBundle("com.sun.java.util.jar.pack.DriverResource");
public static void main(String[] ava) throws IOException {
- ArrayList<String> av = new ArrayList<>(Arrays.asList(ava));
+ List<String> av = new ArrayList<>(Arrays.asList(ava));
boolean doPack = true;
boolean doUnpack = false;
boolean doRepack = false;
- boolean doForceRepack = false;
boolean doZip = true;
String logFile = null;
String verboseProp = Utils.DEBUG_VERBOSE;
@@ -72,17 +71,20 @@
{
// Non-standard, undocumented "--unpack" switch enables unpack mode.
String arg0 = av.isEmpty() ? "" : av.get(0);
- if (arg0.equals("--pack")) {
+ switch (arg0) {
+ case "--pack":
av.remove(0);
- } else if (arg0.equals("--unpack")) {
+ break;
+ case "--unpack":
av.remove(0);
doPack = false;
doUnpack = true;
+ break;
}
}
// Collect engine properties here:
- HashMap<String,String> engProps = new HashMap<>();
+ Map<String,String> engProps = new HashMap<>();
engProps.put(verboseProp, System.getProperty(verboseProp));
String optionMap;
@@ -96,7 +98,7 @@
}
// Collect argument properties here:
- HashMap<String,String> avProps = new HashMap<>();
+ Map<String,String> avProps = new HashMap<>();
try {
for (;;) {
String state = parseCommandOptions(av, optionMap, avProps);
@@ -146,7 +148,7 @@
}
// See if there is any other action to take.
- if (state == "--config-file=") {
+ if ("--config-file=".equals(state)) {
String propFile = av.remove(0);
InputStream propIn = new FileInputStream(propFile);
Properties fileProps = new Properties();
@@ -157,10 +159,10 @@
for (Map.Entry<Object,Object> me : fileProps.entrySet()) {
engProps.put((String) me.getKey(), (String) me.getValue());
}
- } else if (state == "--version") {
+ } else if ("--version".equals(state)) {
System.out.println(MessageFormat.format(RESOURCE.getString(DriverResource.VERSION), Driver.class.getName(), "1.31, 07/05/05"));
return;
- } else if (state == "--help") {
+ } else if ("--help".equals(state)) {
printUsage(doPack, true, System.out);
System.exit(1);
return;
@@ -178,14 +180,20 @@
// Deal with remaining non-engine properties:
for (String opt : avProps.keySet()) {
String val = avProps.get(opt);
- if (opt == "--repack") {
- doRepack = true;
- } else if (opt == "--no-gzip") {
- doZip = (val == null);
- } else if (opt == "--log-file=") {
- logFile = val;
- } else {
- throw new InternalError(MessageFormat.format(RESOURCE.getString(DriverResource.BAD_OPTION), opt, avProps.get(opt)));
+ switch (opt) {
+ case "--repack":
+ doRepack = true;
+ break;
+ case "--no-gzip":
+ doZip = (val == null);
+ break;
+ case "--log-file=":
+ logFile = val;
+ break;
+ default:
+ throw new InternalError(MessageFormat.format(
+ RESOURCE.getString(DriverResource.BAD_OPTION),
+ opt, avProps.get(opt)));
}
}
@@ -219,7 +227,9 @@
if (packfile.toLowerCase().endsWith(".pack") ||
packfile.toLowerCase().endsWith(".pac") ||
packfile.toLowerCase().endsWith(".gz")) {
- System.err.println(MessageFormat.format(RESOURCE.getString(DriverResource.BAD_REPACK_OUTPUT),packfile));
+ System.err.println(MessageFormat.format(
+ RESOURCE.getString(DriverResource.BAD_REPACK_OUTPUT),
+ packfile));
printUsage(doPack, false, System.err);
System.exit(2);
}
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Fixups.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Fixups.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2010, 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
@@ -42,7 +42,7 @@
*
* @author John Rose
*/
-class Fixups extends AbstractCollection implements Constants {
+final class Fixups extends AbstractCollection {
byte[] bytes; // the subject of the relocations
int head; // desc locating first reloc
int tail; // desc locating last reloc
@@ -99,7 +99,7 @@
}
}
- public void visitRefs(Collection refs) {
+ public void visitRefs(Collection<Entry> refs) {
for (int i = 0; i < size; i++) {
refs.add(entries[i]);
}
@@ -124,6 +124,7 @@
return bytes;
}
+ @SuppressWarnings("unchecked")
public void setBytes(byte[] newBytes) {
if (bytes == newBytes) return;
ArrayList old = null;
@@ -278,7 +279,7 @@
return new Fixup(nextDesc(), entries[thisIndex]);
}
int nextDesc() {
- int thisIndex = index++;
+ index++;
int thisDesc = next;
if (index < size) {
// Fetch next desc eagerly, in case this fixup gets finalized.
@@ -310,6 +311,7 @@
public boolean add(Object fixup) {
return add((Fixup) fixup);
}
+ @SuppressWarnings("unchecked")
public boolean addAll(Collection c) {
if (c instanceof Fixups) {
// Use knowledge of Itr structure to avoid building little structs.
@@ -420,7 +422,7 @@
// Iterate over all the references in this set of fixups.
public static
- void visitRefs(Object fixups, Collection refs) {
+ void visitRefs(Object fixups, Collection<Entry> refs) {
if (fixups == null) {
} else if (!(fixups instanceof Fixups)) {
// Special convention; see above.
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Histogram.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Histogram.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2010, 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
@@ -34,7 +34,7 @@
* Histogram derived from an integer array of events (int[]).
* @author John Rose
*/
-class Histogram {
+final class Histogram {
// Compact histogram representation: 4 bytes per distinct value,
// plus 5 words per distinct count.
protected final int[][] matrix; // multi-row matrix {{counti,valueij...}}
@@ -304,7 +304,7 @@
public
String[] getRowTitles(String name) {
int totalUnique = getTotalLength();
- int totalWeight = getTotalWeight();
+ int ltotalWeight = getTotalWeight();
String[] histTitles = new String[matrix.length];
int cumWeight = 0;
int cumUnique = 0;
@@ -314,7 +314,7 @@
int weight = getRowWeight(i);
cumWeight += weight;
cumUnique += unique;
- long wpct = ((long)cumWeight * 100 + totalWeight/2) / totalWeight;
+ long wpct = ((long)cumWeight * 100 + ltotalWeight/2) / ltotalWeight;
long upct = ((long)cumUnique * 100 + totalUnique/2) / totalUnique;
double len = getRowBitLength(i);
assert(0.1 > Math.abs(len - getBitLength(matrix[i][1])));
@@ -346,14 +346,14 @@
public
void print(String name, String[] histTitles, PrintStream out) {
int totalUnique = getTotalLength();
- int totalWeight = getTotalWeight();
+ int ltotalWeight = getTotalWeight();
double tlen = getBitLength();
- double avgLen = tlen / totalWeight;
- double avg = (double) totalWeight / totalUnique;
+ double avgLen = tlen / ltotalWeight;
+ double avg = (double) ltotalWeight / totalUnique;
String title = (name
+" len="+round(tlen,10)
+" avgLen="+round(avgLen,10)
- +" weight("+totalWeight+")"
+ +" weight("+ltotalWeight+")"
+" unique["+totalUnique+"]"
+" avgWeight("+round(avg,100)+")");
if (histTitles == null) {
@@ -363,9 +363,9 @@
StringBuffer buf = new StringBuffer();
for (int i = 0; i < matrix.length; i++) {
buf.setLength(0);
- buf.append(" "+histTitles[i]+" {");
+ buf.append(" ").append(histTitles[i]).append(" {");
for (int j = 1; j < matrix[i].length; j++) {
- buf.append(" "+matrix[i][j]);
+ buf.append(" ").append(matrix[i][j]);
}
buf.append(" }");
out.println(buf);
@@ -603,7 +603,7 @@
private static
int[] maybeSort(int[] values) {
if (!isSorted(values, 0, false)) {
- values = (int[]) values.clone();
+ values = values.clone();
Arrays.sort(values);
}
return values;
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Instruction.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Instruction.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2010, 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
@@ -26,13 +26,15 @@
package com.sun.java.util.jar.pack;
import java.io.IOException;
+import java.util.Arrays;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* A parsed bytecode instruction.
* Provides accessors to various relevant bits.
* @author John Rose
*/
-class Instruction implements Constants {
+class Instruction {
protected byte[] bytes; // bytecodes
protected int pc; // location of this instruction
protected int bc; // opcode of this instruction
@@ -91,8 +93,8 @@
/** A fake instruction at this pc whose next() will be at nextpc. */
public Instruction forceNextPC(int nextpc) {
- int length = nextpc - pc;
- return new Instruction(bytes, pc, -1, -1, length);
+ int llength = nextpc - pc;
+ return new Instruction(bytes, pc, -1, -1, llength);
}
public static Instruction at(byte[] bytes, int pc) {
@@ -315,12 +317,24 @@
}
}
- /** Two insns are equal if they have the same bytes. */
+ /** Two instructions are equal if they have the same bytes. */
public boolean equals(Object o) {
- return (o instanceof Instruction) && equals((Instruction)o);
+ return (o != null) && (o.getClass() == Instruction.class)
+ && equals((Instruction) o);
+ }
+
+ public int hashCode() {
+ int hash = 3;
+ hash = 11 * hash + Arrays.hashCode(this.bytes);
+ hash = 11 * hash + this.pc;
+ hash = 11 * hash + this.bc;
+ hash = 11 * hash + this.w;
+ hash = 11 * hash + this.length;
+ return hash;
}
public boolean equals(Instruction that) {
+ if (this.pc != that.pc) return false;
if (this.bc != that.bc) return false;
if (this.w != that.w) return false;
if (this.length != that.length) return false;
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/NativeUnpack.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/NativeUnpack.java Tue Dec 14 07:42:11 2010 -0800
@@ -170,8 +170,8 @@
void run(InputStream inRaw, JarOutputStream jstream,
ByteBuffer presetInput) throws IOException {
- BufferedInputStream in = new BufferedInputStream(inRaw);
- this.in = in; // for readInputFn to see
+ BufferedInputStream in0 = new BufferedInputStream(inRaw);
+ this.in = in0; // for readInputFn to see
_verbose = _props.getInteger(Utils.DEBUG_VERBOSE);
// Fix for BugId: 4902477, -unpack.modification.time = 1059010598000
// TODO eliminate and fix in unpack.cpp
@@ -224,7 +224,7 @@
if (_verbose > 0)
Utils.log.info("bytes consumed = "+consumed);
if (presetInput == null &&
- !Utils.isPackMagic(Utils.readMagic(in))) {
+ !Utils.isPackMagic(Utils.readMagic(in0))) {
break;
}
if (_verbose > 0 ) {
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Package.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Package.java Tue Dec 14 07:42:11 2010 -0800
@@ -52,12 +52,13 @@
import java.util.Map;
import java.util.Set;
import java.util.jar.JarFile;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Define the main data structure transmitted by pack/unpack.
* @author John Rose
*/
-class Package implements Constants {
+class Package {
int verbose;
{
PropMap pmap = Utils.currentPropMap();
@@ -109,9 +110,9 @@
public static final Attribute.Layout attrCodeEmpty;
public static final Attribute.Layout attrInnerClassesEmpty;
public static final Attribute.Layout attrSourceFileSpecial;
- public static final Map attrDefs;
+ public static final Map<Attribute.Layout, Attribute> attrDefs;
static {
- HashMap<Layout, Attribute> ad = new HashMap<>(3);
+ Map<Layout, Attribute> ad = new HashMap<>(3);
attrCodeEmpty = Attribute.define(ad, ATTR_CONTEXT_METHOD,
"Code", "").layout();
attrInnerClassesEmpty = Attribute.define(ad, ATTR_CONTEXT_CLASS,
@@ -130,8 +131,7 @@
*/
int getHighestClassVersion() {
int res = 0; // initial low value
- for (Iterator i = classes.iterator(); i.hasNext(); ) {
- Class cls = (Class) i.next();
+ for (Class cls : classes) {
int ver = cls.getVersion();
if (res < ver) res = ver;
}
@@ -187,7 +187,7 @@
return classes;
}
- public
+ public final
class Class extends Attribute.Holder implements Comparable {
public Package getPackage() { return Package.this; }
@@ -232,8 +232,8 @@
initFile(newStub(classFile));
}
- List getFields() { return fields == null ? noFields : fields; }
- List getMethods() { return methods == null ? noMethods : methods; }
+ List<Field> getFields() { return fields == null ? noFields : fields; }
+ List<Method> getMethods() { return methods == null ? noMethods : methods; }
public String getName() {
return thisClass.stringValue();
@@ -264,7 +264,7 @@
if (olda == null)
return; // no SourceFile attr.
String obvious = getObviousSourceFile();
- ArrayList ref = new ArrayList(1);
+ List<Entry> ref = new ArrayList<>(1);
olda.visitRefs(this, VRM_PACKAGE, ref);
Utf8Entry sfName = (Utf8Entry) ref.get(0);
Attribute a = olda;
@@ -341,7 +341,7 @@
* with that of Package.this.allInnerClasses.
*/
public List<InnerClass> computeGloballyImpliedICs() {
- HashSet<Entry> cpRefs = new HashSet<>();
+ Set<Entry> cpRefs = new HashSet<>();
{ // This block temporarily displaces this.innerClasses.
ArrayList<InnerClass> innerClassesSaved = innerClasses;
innerClasses = null; // ignore for the moment
@@ -350,7 +350,7 @@
}
ConstantPool.completeReferencesIn(cpRefs, true);
- HashSet<Entry> icRefs = new HashSet<>();
+ Set<Entry> icRefs = new HashSet<>();
for (Entry e : cpRefs) {
// Restrict cpRefs to InnerClasses entries only.
if (!(e instanceof ClassEntry)) continue;
@@ -390,7 +390,7 @@
List<InnerClass> impliedICs = computeGloballyImpliedICs();
List<InnerClass> actualICs = getInnerClasses();
if (actualICs == null)
- actualICs = Collections.EMPTY_LIST;
+ actualICs = Collections.emptyList();
// Symmetric difference is calculated from I, A like this:
// diff = (I+A) - (I*A)
@@ -409,7 +409,7 @@
// Diff is A since I is empty.
}
// (I*A) is non-trivial
- HashSet<InnerClass> center = new HashSet<>(actualICs);
+ Set<InnerClass> center = new HashSet<>(actualICs);
center.retainAll(new HashSet<>(impliedICs));
impliedICs.addAll(actualICs);
impliedICs.removeAll(center);
@@ -443,7 +443,7 @@
} else if (actualICs == null) {
// No local IC attribute, even though some are implied.
// Signal with trivial attribute.
- localICs = Collections.EMPTY_LIST;
+ localICs = Collections.emptyList();
} else {
// Transmit a non-empty diff, which will create
// a local ICs attribute.
@@ -588,7 +588,7 @@
}
public void strip(String attrName) {
- if (attrName == "Code")
+ if ("Code".equals(attrName))
code = null;
if (code != null)
code.strip(attrName);
@@ -622,7 +622,7 @@
}
public void strip(String attrName) {
- if (attrName == "InnerClass")
+ if ("InnerClass".equals(attrName))
innerClasses = null;
for (int isM = 0; isM <= 1; isM++) {
ArrayList members = (isM == 0) ? fields : methods;
@@ -639,9 +639,7 @@
if (verbose > 2) Utils.log.fine("visitRefs "+this);
refs.add(thisClass);
refs.add(superClass);
- for (int i = 0; i < interfaces.length; i++) {
- refs.add(interfaces[i]);
- }
+ refs.addAll(Arrays.asList(interfaces));
for (int isM = 0; isM <= 1; isM++) {
ArrayList members = (isM == 0) ? fields : methods;
if (members == null) continue;
@@ -741,7 +739,7 @@
}
public List<File> getClassStubs() {
- ArrayList<File> classStubs = new ArrayList<>(classes.size());
+ List<File> classStubs = new ArrayList<>(classes.size());
for (Class cls : classes) {
assert(cls.file.isClassStub());
classStubs.add(cls.file);
@@ -749,8 +747,7 @@
return classStubs;
}
- public
- class File implements Comparable {
+ public final class File implements Comparable {
String nameString; // true name of this file
Utf8Entry name;
int modtime = NO_MODTIME;
@@ -792,8 +789,10 @@
// The nameString is the key. Ignore other things.
// (Note: The name might be "", in the case of a trivial class stub.)
public boolean equals(Object o) {
+ if (o == null || (o.getClass() != File.class))
+ return false;
File that = (File)o;
- return that.nameString == this.nameString;
+ return that.nameString.equals(this.nameString);
}
public int hashCode() {
return nameString.hashCode();
@@ -816,9 +815,9 @@
return getFileName(null);
}
public java.io.File getFileName(java.io.File parent) {
- String name = this.nameString;
+ String lname = this.nameString;
//if (name.startsWith("./")) name = name.substring(2);
- String fname = name.replace('/', java.io.File.separatorChar);
+ String fname = lname.replace('/', java.io.File.separatorChar);
return new java.io.File(parent, fname);
}
@@ -834,7 +833,7 @@
}
public long getFileLength() {
long len = 0;
- if (prepend == null && append == null) return 0;
+ if (prepend == null || append == null) return 0;
for (Iterator i = prepend.iterator(); i.hasNext(); ) {
byte[] block = (byte[]) i.next();
len += block.length;
@@ -843,7 +842,7 @@
return len;
}
public void writeTo(OutputStream out) throws IOException {
- if (prepend == null && append == null) return;
+ if (prepend == null || append == null) return;
for (Iterator i = prepend.iterator(); i.hasNext(); ) {
byte[] block = (byte[]) i.next();
out.write(block);
@@ -859,8 +858,8 @@
}
public InputStream getInputStream() {
InputStream in = new ByteArrayInputStream(append.toByteArray());
- if (prepend.size() == 0) return in;
- ArrayList<InputStream> isa = new ArrayList<>(prepend.size()+1);
+ if (prepend.isEmpty()) return in;
+ List<InputStream> isa = new ArrayList<>(prepend.size()+1);
for (Iterator i = prepend.iterator(); i.hasNext(); ) {
byte[] bytes = (byte[]) i.next();
isa.add(new ByteArrayInputStream(bytes));
@@ -897,11 +896,11 @@
}
// Is there a globally declared table of inner classes?
- ArrayList<InnerClass> allInnerClasses = new ArrayList<>();
- HashMap<ClassEntry, InnerClass> allInnerClassesByThis;
+ List<InnerClass> allInnerClasses = new ArrayList<>();
+ Map<ClassEntry, InnerClass> allInnerClassesByThis;
public
- List getAllInnerClasses() {
+ List<InnerClass> getAllInnerClasses() {
return allInnerClasses;
}
@@ -955,16 +954,17 @@
if (parse == null) return false;
String pkgOuter = parse[0];
//String number = parse[1];
- String name = parse[2];
+ String lname = parse[2];
String haveName = (this.name == null) ? null : this.name.stringValue();
String haveOuter = (outerClass == null) ? null : outerClass.stringValue();
- boolean predictable = (name == haveName && pkgOuter == haveOuter);
+ boolean lpredictable = (lname == haveName && pkgOuter == haveOuter);
//System.out.println("computePredictable => "+predictable);
- return predictable;
+ return lpredictable;
}
public boolean equals(Object o) {
- if (o == null) return false;
+ if (o == null || o.getClass() != InnerClass.class)
+ return false;
InnerClass that = (InnerClass)o;
return eq(this.thisClass, that.thisClass)
&& eq(this.outerClass, that.outerClass)
@@ -999,7 +999,7 @@
// Helper for building InnerClasses attributes.
static private
- void visitInnerClassRefs(Collection innerClasses, int mode, Collection<Entry> refs) {
+ void visitInnerClassRefs(Collection<InnerClass> innerClasses, int mode, Collection<Entry> refs) {
if (innerClasses == null) {
return; // no attribute; nothing to do
}
@@ -1008,8 +1008,7 @@
}
if (innerClasses.size() > 0) {
// Count the entries themselves:
- for (Iterator i = innerClasses.iterator(); i.hasNext(); ) {
- InnerClass c = (InnerClass) i.next();
+ for (InnerClass c : innerClasses) {
c.visitRefs(mode, refs);
}
}
@@ -1117,43 +1116,43 @@
// what is one of { Debug, Compile, Constant, Exceptions, InnerClasses }
if (verbose > 0)
Utils.log.info("Stripping "+what.toLowerCase()+" data and attributes...");
- if (what == "Debug") {
- strip("SourceFile");
- strip("LineNumberTable");
- strip("LocalVariableTable");
- strip("LocalVariableTypeTable");
- }
- if (what == "Compile") {
- // Keep the inner classes normally.
- // Although they have no effect on execution,
- // the Reflection API exposes them, and JCK checks them.
- // NO: // strip("InnerClasses");
- strip("Deprecated");
- strip("Synthetic");
- }
- if (what == "Exceptions") {
- // Keep the exceptions normally.
- // Although they have no effect on execution,
- // the Reflection API exposes them, and JCK checks them.
- strip("Exceptions");
- }
- if (what == "Constant") {
- stripConstantFields();
+ switch (what) {
+ case "Debug":
+ strip("SourceFile");
+ strip("LineNumberTable");
+ strip("LocalVariableTable");
+ strip("LocalVariableTypeTable");
+ break;
+ case "Compile":
+ // Keep the inner classes normally.
+ // Although they have no effect on execution,
+ // the Reflection API exposes them, and JCK checks them.
+ // NO: // strip("InnerClasses");
+ strip("Deprecated");
+ strip("Synthetic");
+ break;
+ case "Exceptions":
+ // Keep the exceptions normally.
+ // Although they have no effect on execution,
+ // the Reflection API exposes them, and JCK checks them.
+ strip("Exceptions");
+ break;
+ case "Constant":
+ stripConstantFields();
+ break;
}
}
public void trimToSize() {
classes.trimToSize();
- for (Iterator i = classes.iterator(); i.hasNext(); ) {
- Class c = (Class)i.next();
+ for (Class c : classes) {
c.trimToSize();
}
files.trimToSize();
}
public void strip(String attrName) {
- for (Iterator i = classes.iterator(); i.hasNext(); ) {
- Class c = (Class)i.next();
+ for (Class c : classes) {
c.strip(attrName);
}
}
@@ -1166,10 +1165,9 @@
}
public void stripConstantFields() {
- for (Iterator i = classes.iterator(); i.hasNext(); ) {
- Class c = (Class) i.next();
- for (Iterator j = c.fields.iterator(); j.hasNext(); ) {
- Class.Field f = (Class.Field) j.next();
+ for (Class c : classes) {
+ for (Iterator<Class.Field> j = c.fields.iterator(); j.hasNext(); ) {
+ Class.Field f = j.next();
if (Modifier.isFinal(f.flags)
// do not strip non-static finals:
&& Modifier.isStatic(f.flags)
@@ -1189,8 +1187,7 @@
c.visitRefs(mode, refs);
}
if (mode != VRM_CLASSIC) {
- for (Iterator i = files.iterator(); i.hasNext(); ) {
- File f = (File)i.next();
+ for (File f : files) {
f.visitRefs(mode, refs);
}
visitInnerClassRefs(allInnerClasses, mode, refs);
@@ -1202,6 +1199,7 @@
// compress better. It also moves classes to the end of the
// file order. It also removes JAR directory entries, which
// are useless.
+ @SuppressWarnings("unchecked")
void reorderFiles(boolean keepClassOrder, boolean stripDirectories) {
// First reorder the classes, if that is allowed.
if (!keepClassOrder) {
@@ -1214,9 +1212,9 @@
// modtimes and options are not transmitted, and the stub files
// for class files do not need to be transmitted at all.
// Also
- List stubs = getClassStubs();
- for (Iterator i = files.iterator(); i.hasNext(); ) {
- File file = (File) i.next();
+ List<File> stubs = getClassStubs();
+ for (Iterator<File> i = files.iterator(); i.hasNext(); ) {
+ File file = i.next();
if (file.isClassStub() ||
(stripDirectories && file.isDirectory())) {
i.remove();
@@ -1259,8 +1257,8 @@
void trimStubs() {
// Restore enough non-trivial stubs to carry the needed class modtimes.
- for (ListIterator i = files.listIterator(files.size()); i.hasPrevious(); ) {
- File file = (File) i.previous();
+ for (ListIterator<File> i = files.listIterator(files.size()); i.hasPrevious(); ) {
+ File file = i.previous();
if (!file.isTrivialClassStub()) {
if (verbose > 1)
Utils.log.fine("Keeping last non-trivial "+file);
@@ -1309,7 +1307,7 @@
// Use this before writing the class files.
void ensureAllClassFiles() {
- HashSet<File> fileSet = new HashSet<>(files);
+ Set<File> fileSet = new HashSet<>(files);
for (Class cls : classes) {
// Add to the end of ths list:
if (!fileSet.contains(cls.file))
@@ -1317,8 +1315,8 @@
}
}
- static final List noObjects = Arrays.asList(new Object[0]);
- static final List noFields = Arrays.asList(new Class.Field[0]);
- static final List noMethods = Arrays.asList(new Class.Method[0]);
- static final List noInnerClasses = Arrays.asList(new InnerClass[0]);
+ static final List<Object> noObjects = Arrays.asList(new Object[0]);
+ static final List<Class.Field> noFields = Arrays.asList(new Class.Field[0]);
+ static final List<Class.Method> noMethods = Arrays.asList(new Class.Method[0]);
+ static final List<InnerClass> noInnerClasses = Arrays.asList(new InnerClass[0]);
}
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/PackageReader.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/PackageReader.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2010, 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
@@ -32,11 +32,28 @@
import com.sun.java.util.jar.pack.ConstantPool.MemberEntry;
import com.sun.java.util.jar.pack.ConstantPool.SignatureEntry;
import com.sun.java.util.jar.pack.ConstantPool.Utf8Entry;
-import java.io.*;
-import java.util.*;
import com.sun.java.util.jar.pack.Package.Class;
import com.sun.java.util.jar.pack.Package.File;
import com.sun.java.util.jar.pack.Package.InnerClass;
+import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.PrintStream;
+import java.io.FilterInputStream;
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Set;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Reader for a package file.
@@ -418,7 +435,7 @@
cp_Int.readFrom(in);
for (int i = 0; i < cpMap.length; i++) {
int x = cp_Int.getInt(); // coding handles signs OK
- cpMap[i] = ConstantPool.getLiteralEntry(new Integer(x));
+ cpMap[i] = ConstantPool.getLiteralEntry(x);
}
cp_Int.doneDisbursing();
break;
@@ -428,7 +445,7 @@
for (int i = 0; i < cpMap.length; i++) {
int x = cp_Float.getInt();
float fx = Float.intBitsToFloat(x);
- cpMap[i] = ConstantPool.getLiteralEntry(new Float(fx));
+ cpMap[i] = ConstantPool.getLiteralEntry(fx);
}
cp_Float.doneDisbursing();
break;
@@ -444,7 +461,7 @@
long hi = cp_Long_hi.getInt();
long lo = cp_Long_lo.getInt();
long x = (hi << 32) + ((lo << 32) >>> 32);
- cpMap[i] = ConstantPool.getLiteralEntry(new Long(x));
+ cpMap[i] = ConstantPool.getLiteralEntry(x);
}
cp_Long_hi.doneDisbursing();
cp_Long_lo.doneDisbursing();
@@ -462,7 +479,7 @@
long lo = cp_Double_lo.getInt();
long x = (hi << 32) + ((lo << 32) >>> 32);
double dx = Double.longBitsToDouble(x);
- cpMap[i] = ConstantPool.getLiteralEntry(new Double(dx));
+ cpMap[i] = ConstantPool.getLiteralEntry(dx);
}
cp_Double_hi.doneDisbursing();
cp_Double_lo.doneDisbursing();
@@ -645,7 +662,7 @@
cp_Utf8_big_suffix.doneDisbursing();
}
- HashMap utf8Signatures; // Utf8Entry->SignatureEntry
+ Map<Utf8Entry, SignatureEntry> utf8Signatures;
void readSignatureBands(Entry[] cpMap) throws IOException {
// cp_Signature:
@@ -663,7 +680,7 @@
cp_Signature_classes.expectLength(getIntTotal(numSigClasses));
cp_Signature_classes.readFrom(in);
cp_Signature_classes.setIndex(getCPIndex(CONSTANT_Class));
- utf8Signatures = new HashMap();
+ utf8Signatures = new HashMap<>();
for (int i = 0; i < cpMap.length; i++) {
Utf8Entry formRef = (Utf8Entry) cp_Signature_form.getRef();
ClassEntry[] classRefs = new ClassEntry[numSigClasses[i]];
@@ -863,7 +880,7 @@
ic_name.expectLength(longICCount);
ic_name.readFrom(in);
ic_flags.resetForSecondPass();
- ArrayList icList = new ArrayList(numInnerClasses);
+ List<InnerClass> icList = new ArrayList<>(numInnerClasses);
for (int i = 0; i < numInnerClasses; i++) {
int flags = ic_flags.getInt();
boolean longForm = (flags & ACC_IC_LONG_FORM) != 0;
@@ -876,7 +893,7 @@
thisName = (Utf8Entry) ic_name.getRef();
} else {
String n = thisClass.stringValue();
- String[] parse = pkg.parseInnerClassName(n);
+ String[] parse = Package.parseInnerClassName(n);
assert(parse != null);
String pkgOuter = parse[0];
//String number = parse[1];
@@ -905,7 +922,7 @@
void readLocalInnerClasses(Class cls) throws IOException {
int nc = class_InnerClasses_N.getInt();
- ArrayList localICs = new ArrayList(nc);
+ List<InnerClass> localICs = new ArrayList<>(nc);
for (int i = 0; i < nc; i++) {
ClassEntry thisClass = (ClassEntry) class_InnerClasses_RC.getRef();
int flags = class_InnerClasses_F.getInt();
@@ -994,10 +1011,8 @@
return -1;
}
- Comparator entryOutputOrder = new Comparator() {
- public int compare(Object o0, Object o1) {
- Entry e0 = (Entry) o0;
- Entry e1 = (Entry) o1;
+ Comparator<Entry> entryOutputOrder = new Comparator<>() {
+ public int compare(Entry e0, Entry e1) {
int k0 = getOutputIndex(e0);
int k1 = getOutputIndex(e1);
if (k0 >= 0 && k1 >= 0)
@@ -1034,9 +1049,8 @@
}
Entry[] reconstructLocalCPMap(Class cls) {
- HashSet ldcRefs = (HashSet) ldcRefMap.get(cls);
- HashSet cpRefs = new HashSet();
- HashSet sigSet = new HashSet();
+ Set<Entry> ldcRefs = ldcRefMap.get(cls);
+ Set<Entry> cpRefs = new HashSet<>();
// look for constant pool entries:
cls.visitRefs(VRM_CLASSIC, cpRefs);
@@ -1064,8 +1078,7 @@
// construct a local constant pool
int numDoubles = 0;
- for (Iterator i = cpRefs.iterator(); i.hasNext(); ) {
- Entry e = (Entry) i.next();
+ for (Entry e : cpRefs) {
if (e.isDoubleWord()) numDoubles++;
assert(e.tag != CONSTANT_Signature) : (e);
}
@@ -1075,8 +1088,7 @@
// Add all ldc operands first.
if (ldcRefs != null) {
assert(cpRefs.containsAll(ldcRefs));
- for (Iterator i = ldcRefs.iterator(); i.hasNext(); ) {
- Entry e = (Entry) i.next();
+ for (Entry e : ldcRefs) {
cpMap[fillp++] = e;
}
assert(fillp == 1+ldcRefs.size());
@@ -1085,11 +1097,10 @@
}
// Next add all the two-byte references.
- HashSet wideRefs = cpRefs;
+ Set<Entry> wideRefs = cpRefs;
cpRefs = null; // do not use!
int narrowLimit = fillp;
- for (Iterator i = wideRefs.iterator(); i.hasNext(); ) {
- Entry e = (Entry) i.next();
+ for (Entry e : wideRefs) {
cpMap[fillp++] = e;
}
assert(fillp == narrowLimit+wideRefs.size());
@@ -1144,7 +1155,7 @@
method_descr.expectLength(totalNM);
if (verbose > 1) Utils.log.fine("expecting #fields="+totalNF+" and #methods="+totalNM+" in #classes="+numClasses);
- ArrayList fields = new ArrayList(totalNF);
+ List<Class.Field> fields = new ArrayList<>(totalNF);
field_descr.readFrom(in);
for (int i = 0; i < classes.length; i++) {
Class c = classes[i];
@@ -1160,7 +1171,7 @@
countAndReadAttrs(ATTR_CONTEXT_FIELD, fields);
fields = null; // release to GC
- ArrayList methods = new ArrayList(totalNM);
+ List<Class.Method> methods = new ArrayList<>(totalNM);
method_descr.readFrom(in);
for (int i = 0; i < classes.length; i++) {
Class c = classes[i];
@@ -1182,13 +1193,12 @@
}
Code[] allCodes;
- List codesWithFlags;
- HashMap ldcRefMap = new HashMap(); // HashMap<Class, HashSet<Entry>>
+ List<Code> codesWithFlags;
+ Map<Class, Set<Entry>> ldcRefMap = new HashMap<>();
- Code[] buildCodeAttrs(List methods) {
- ArrayList codes = new ArrayList(methods.size());
- for (Iterator i = methods.iterator(); i.hasNext(); ) {
- Class.Method m = (Class.Method) i.next();
+ Code[] buildCodeAttrs(List<Class.Method> methods) {
+ List<Code> codes = new ArrayList<>(methods.size());
+ for (Class.Method m : methods) {
if (m.getAttribute(attrCodeEmpty) != null) {
m.code = new Code(m);
codes.add(m.code);
@@ -1211,7 +1221,7 @@
boolean attrsOK = testBit(archiveOptions, AO_HAVE_ALL_CODE_FLAGS);
code_headers.expectLength(allCodes.length);
code_headers.readFrom(in);
- ArrayList longCodes = new ArrayList(allCodes.length / 10);
+ List<Code> longCodes = new ArrayList<>(allCodes.length / 10);
for (int i = 0; i < allCodes.length; i++) {
Code c = allCodes[i];
int sc = code_headers.getByte();
@@ -1238,8 +1248,7 @@
code_max_stack.readFrom(in);
code_max_na_locals.readFrom(in);
code_handler_count.readFrom(in);
- for (Iterator i = longCodes.iterator(); i.hasNext(); ) {
- Code c = (Code) i.next();
+ for (Code c : longCodes) {
c.setMaxStack( code_max_stack.getInt() );
c.setMaxNALocals( code_max_na_locals.getInt() );
c.setHandlerCount( code_handler_count.getInt() );
@@ -1386,8 +1395,9 @@
// Fetch the attribute layout definitions which govern the bands
// we are about to read.
- Attribute.Layout[] defs = new Attribute.Layout[attrDefs[ctype].size()];
- attrDefs[ctype].toArray(defs);
+ List<Attribute.Layout> defList = attrDefs.get(ctype);
+ Attribute.Layout[] defs = new Attribute.Layout[defList.size()];
+ defList.toArray(defs);
IntBand xxx_flags_hi = getAttrBand(xxx_attr_bands, AB_FLAGS_HI);
IntBand xxx_flags_lo = getAttrBand(xxx_attr_bands, AB_FLAGS_LO);
IntBand xxx_attr_count = getAttrBand(xxx_attr_bands, AB_ATTR_COUNT);
@@ -1450,7 +1460,7 @@
bits -= (1L<<ai);
nfa += 1;
}
- ArrayList ha = new ArrayList(nfa + noa);
+ List<Attribute> ha = new ArrayList<>(nfa + noa);
h.attributes = ha;
bits = attrBits; // iterate again
for (int ai = 0; bits != 0; ai++) {
@@ -1516,7 +1526,7 @@
if (predef != isPredefinedAttr(ctype, ai))
continue; // wrong pass
int totalCount = totalCounts[ai];
- Band[] ab = (Band[]) attrBandTable.get(def);
+ Band[] ab = attrBandTable.get(def);
if (def == attrInnerClassesEmpty) {
// Special case.
// Size the bands as if using the following layout:
@@ -1571,15 +1581,16 @@
ATTR_CONTEXT_NAME[ctype]+" attribute");
}
+ @SuppressWarnings("unchecked")
void readAttrs(int ctype, Collection holders) throws IOException {
// Decode band values into attributes.
- HashSet sawDefs = new HashSet();
+ Set<Attribute.Layout> sawDefs = new HashSet<>();
ByteArrayOutputStream buf = new ByteArrayOutputStream();
for (Iterator i = holders.iterator(); i.hasNext(); ) {
final Attribute.Holder h = (Attribute.Holder) i.next();
if (h.attributes == null) continue;
- for (ListIterator j = h.attributes.listIterator(); j.hasNext(); ) {
- Attribute a = (Attribute) j.next();
+ for (ListIterator<Attribute> j = h.attributes.listIterator(); j.hasNext(); ) {
+ Attribute a = j.next();
Attribute.Layout def = a.layout();
if (def.bandCount == 0) {
if (def == attrInnerClassesEmpty) {
@@ -1595,7 +1606,7 @@
if (isCV) setConstantValueIndex((Class.Field)h);
if (verbose > 2)
Utils.log.fine("read "+a+" in "+h);
- final Band[] ab = (Band[]) attrBandTable.get(def);
+ final Band[] ab = attrBandTable.get(def);
// Read one attribute of type def from ab into a byte array.
buf.reset();
Object fixups = a.unparse(new Attribute.ValueStream() {
@@ -1617,10 +1628,9 @@
}
// Mark the bands we just used as done disbursing.
- for (Iterator i = sawDefs.iterator(); i.hasNext(); ) {
- Attribute.Layout def = (Attribute.Layout) i.next();
+ for (Attribute.Layout def : sawDefs) {
if (def == null) continue; // unused index
- Band[] ab = (Band[]) attrBandTable.get(def);
+ Band[] ab = attrBandTable.get(def);
for (int j = 0; j < ab.length; j++) {
ab[j].doneDisbursing();
}
@@ -1778,7 +1788,7 @@
// scratch buffer for collecting code::
byte[] buf = new byte[1<<12];
// record of all switch opcodes (these are variable-length)
- ArrayList allSwitchOps = new ArrayList();
+ List<Integer> allSwitchOps = new ArrayList<>();
for (int k = 0; k < allCodes.length; k++) {
Code c = allCodes[k];
scanOneMethod:
@@ -1798,7 +1808,7 @@
case _tableswitch:
case _lookupswitch:
bc_case_count.expectMoreLength(1);
- allSwitchOps.add(new Integer(bc));
+ allSwitchOps.add(bc);
break;
case _iinc:
bc_local.expectMoreLength(1);
@@ -1866,8 +1876,8 @@
// To size instruction bands correctly, we need info on switches:
bc_case_count.readFrom(in);
- for (Iterator i = allSwitchOps.iterator(); i.hasNext(); ) {
- int bc = ((Integer)i.next()).intValue();
+ for (Integer i : allSwitchOps) {
+ int bc = i.intValue();
int caseCount = bc_case_count.getInt();
bc_label.expectMoreLength(1+caseCount); // default label + cases
bc_case_value.expectMoreLength(bc == _tableswitch ? 1 : caseCount);
@@ -1892,9 +1902,9 @@
Class curClass = code.thisClass();
- HashSet ldcRefSet = (HashSet) ldcRefMap.get(curClass);
+ Set<Entry> ldcRefSet = ldcRefMap.get(curClass);
if (ldcRefSet == null)
- ldcRefMap.put(curClass, ldcRefSet = new HashSet());
+ ldcRefMap.put(curClass, ldcRefSet = new HashSet<>());
ClassEntry thisClass = curClass.thisClass;
ClassEntry superClass = curClass.superClass;
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/PackageWriter.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/PackageWriter.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2010, 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
@@ -45,10 +45,10 @@
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
-import java.util.ListIterator;
import java.util.Map;
+import java.util.Set;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Writer for a package file.
@@ -111,12 +111,12 @@
}
}
- HashSet requiredEntries; // for the CP
- HashMap backCountTable; // for layout callables
+ Set<Entry> requiredEntries; // for the CP
+ Map<Attribute.Layout, int[]> backCountTable; // for layout callables
int[][] attrCounts; // count attr. occurences
void setup() {
- requiredEntries = new HashSet();
+ requiredEntries = new HashSet<>();
setArchiveOptions();
trimClassAttributes();
collectAttributeLayouts();
@@ -139,9 +139,7 @@
// Import defaults from package (deflate hint, etc.).
archiveOptions |= pkg.default_options;
- for (Iterator i = pkg.files.iterator(); i.hasNext(); ) {
- File file = (File) i.next();
-
+ for (File file : pkg.files) {
int modtime = file.modtime;
int options = file.options;
@@ -178,16 +176,15 @@
}
}
// Decide on default version number (majority rule).
- HashMap verCounts = new HashMap();
+ Map<Integer, int[]> verCounts = new HashMap<>();
int bestCount = 0;
int bestVersion = -1;
- for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
- Class cls = (Class) i.next();
+ for (Class cls : pkg.classes) {
int version = cls.getVersion();
- int[] var = (int[]) verCounts.get(new Integer(version));
+ int[] var = verCounts.get(version);
if (var == null) {
var = new int[1];
- verCounts.put(new Integer(version), var);
+ verCounts.put(version, var);
}
int count = (var[0] += 1);
//System.out.println("version="+version+" count="+count);
@@ -210,9 +207,7 @@
Package.versionStringOf(pkg.getHighestClassVersion()));
// Now add explicit pseudo-attrs. to classes with odd versions.
- for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
- Class cls = (Class) i.next();
-
+ for (Class cls : pkg.classes) {
if (cls.getVersion() != bestVersion) {
Attribute a = makeClassFileVersionAttr(cls.minver, cls.majver);
if (verbose > 1) {
@@ -228,8 +223,7 @@
}
// Decide if we are transmitting a huge resource file:
- for (Iterator i = pkg.files.iterator(); i.hasNext(); ) {
- File file = (File) i.next();
+ for (File file : pkg.files) {
long len = file.getFileLength();
if (len != (int)len) {
archiveOptions |= AO_HAVE_FILE_SIZE_HI;
@@ -244,10 +238,8 @@
// we must declare unconditional presence of code flags.
int cost0 = 0;
int cost1 = 0;
- for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
- Class cls = (Class) i.next();
- for (Iterator j = cls.getMethods().iterator(); j.hasNext(); ) {
- Class.Method m = (Class.Method) j.next();
+ for (Class cls : pkg.classes) {
+ for (Class.Method m : cls.getMethods()) {
if (m.code != null) {
if (m.code.attributeSize() == 0) {
// cost of a useless unconditional flags byte
@@ -352,7 +344,7 @@
archive_header_1.putInt(pkg.default_modtime);
archive_header_1.putInt(pkg.files.size());
} else {
- assert(pkg.files.size() == 0);
+ assert(pkg.files.isEmpty());
}
if (haveSpecial) {
@@ -697,8 +689,7 @@
boolean haveModtime = testBit(options, AO_HAVE_FILE_MODTIME);
boolean haveOptions = testBit(options, AO_HAVE_FILE_OPTIONS);
if (!haveOptions) {
- for (Iterator i = pkg.files.iterator(); i.hasNext(); ) {
- File file = (File) i.next();
+ for (File file : pkg.files) {
if (file.isClassStub()) {
haveOptions = true;
options |= AO_HAVE_FILE_OPTIONS;
@@ -711,9 +702,7 @@
options |= AO_HAVE_FILE_HEADERS;
archiveOptions = options;
}
-
- for (Iterator i = pkg.files.iterator(); i.hasNext(); ) {
- File file = (File) i.next();
+ for (File file : pkg.files) {
file_name.putRef(file.name);
long len = file.getFileLength();
file_size_lo.putInt((int)len);
@@ -731,22 +720,20 @@
Utils.log.info("Wrote "+numFiles+" resource files");
}
+ @SuppressWarnings("unchecked")
void collectAttributeLayouts() {
maxFlags = new int[ATTR_CONTEXT_LIMIT];
- allLayouts = new HashMap[ATTR_CONTEXT_LIMIT];
+ allLayouts = new FixedList<>(ATTR_CONTEXT_LIMIT);
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
- allLayouts[i] = new HashMap();
+ allLayouts.set(i, new HashMap<Attribute.Layout, int[]>());
}
// Collect maxFlags and allLayouts.
- for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
- Class cls = (Class) i.next();
+ for (Class cls : pkg.classes) {
visitAttributeLayoutsIn(ATTR_CONTEXT_CLASS, cls);
- for (Iterator j = cls.getFields().iterator(); j.hasNext(); ) {
- Class.Field f = (Class.Field) j.next();
+ for (Class.Field f : cls.getFields()) {
visitAttributeLayoutsIn(ATTR_CONTEXT_FIELD, f);
}
- for (Iterator j = cls.getMethods().iterator(); j.hasNext(); ) {
- Class.Method m = (Class.Method) j.next();
+ for (Class.Method m : cls.getMethods()) {
visitAttributeLayoutsIn(ATTR_CONTEXT_METHOD, m);
if (m.code != null) {
visitAttributeLayoutsIn(ATTR_CONTEXT_CODE, m.code);
@@ -755,7 +742,7 @@
}
// If there are many species of attributes, use 63-bit flags.
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
- int nl = allLayouts[i].size();
+ int nl = allLayouts.get(i).size();
boolean haveLongFlags = haveFlagsHi(i);
final int TOO_MANY_ATTRS = 32 /*int flag size*/
- 12 /*typical flag bits in use*/
@@ -781,7 +768,7 @@
}
// Collect counts for both predefs. and custom defs.
// Decide on custom, local attribute definitions.
- backCountTable = new HashMap();
+ backCountTable = new HashMap<>();
attrCounts = new int[ATTR_CONTEXT_LIMIT][];
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
// Now the remaining defs in allLayouts[i] need attr. indexes.
@@ -793,11 +780,12 @@
assert(attrIndexLimit[i] < 64); // all bits fit into a Java long
avHiBits &= (1L<<attrIndexLimit[i])-1;
int nextLoBit = 0;
- Map.Entry[] layoutsAndCounts = new Map.Entry[allLayouts[i].size()];
- allLayouts[i].entrySet().toArray(layoutsAndCounts);
+ Map<Attribute.Layout, int[]> defMap = allLayouts.get(i);
+ Map.Entry[] layoutsAndCounts = new Map.Entry[defMap.size()];
+ defMap.entrySet().toArray(layoutsAndCounts);
// Sort by count, most frequent first.
// Predefs. participate in this sort, though it does not matter.
- Arrays.sort(layoutsAndCounts, new Comparator() {
+ Arrays.sort(layoutsAndCounts, new Comparator<>() {
public int compare(Object o0, Object o1) {
Map.Entry e0 = (Map.Entry) o0;
Map.Entry e1 = (Map.Entry) o1;
@@ -814,7 +802,7 @@
Attribute.Layout def = (Attribute.Layout) e.getKey();
int count = ((int[])e.getValue())[0];
int index;
- Integer predefIndex = (Integer) attrIndexTable.get(def);
+ Integer predefIndex = attrIndexTable.get(def);
if (predefIndex != null) {
// The index is already set.
index = predefIndex.intValue();
@@ -872,29 +860,32 @@
// Scratch variables for processing attributes and flags.
int[] maxFlags;
- HashMap[] allLayouts;
+ List<Map<Attribute.Layout, int[]>> allLayouts;
void visitAttributeLayoutsIn(int ctype, Attribute.Holder h) {
// Make note of which flags appear in the class file.
// Set them in maxFlags.
maxFlags[ctype] |= h.flags;
- for (Iterator i = h.getAttributes().iterator(); i.hasNext(); ) {
- Attribute a = (Attribute) i.next();
+ for (Attribute a : h.getAttributes()) {
Attribute.Layout def = a.layout();
- int[] count = (int[]) allLayouts[ctype].get(def);
- if (count == null)
- allLayouts[ctype].put(def, count = new int[1]);
- if (count[0] < Integer.MAX_VALUE)
+ Map<Attribute.Layout, int[]> defMap = allLayouts.get(ctype);
+ int[] count = defMap.get(def);
+ if (count == null) {
+ defMap.put(def, count = new int[1]);
+ }
+ if (count[0] < Integer.MAX_VALUE) {
count[0] += 1;
+ }
}
}
Attribute.Layout[] attrDefsWritten;
+ @SuppressWarnings("unchecked")
void writeAttrDefs() throws IOException {
- ArrayList defList = new ArrayList();
+ List<Object[]> defList = new ArrayList<>();
for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
- int limit = attrDefs[i].size();
+ int limit = attrDefs.get(i).size();
for (int j = 0; j < limit; j++) {
int header = i; // ctype
if (j < attrIndexLimit[i]) {
@@ -906,9 +897,9 @@
continue;
}
}
- Attribute.Layout def = (Attribute.Layout) attrDefs[i].get(j);
- defList.add(new Object[]{ new Integer(header), def });
- assert(new Integer(j).equals(attrIndexTable.get(def)));
+ Attribute.Layout def = attrDefs.get(i).get(j);
+ defList.add(new Object[]{ Integer.valueOf(header), def });
+ assert(Integer.valueOf(j).equals(attrIndexTable.get(def)));
}
}
// Sort the new attr defs into some "natural" order.
@@ -934,10 +925,7 @@
attrDefsWritten = new Attribute.Layout[numAttrDefs];
PrintStream dump = !optDumpBands ? null
: new PrintStream(getDumpStream(attr_definition_headers, ".def"));
- int[] indexForDebug = new int[ATTR_CONTEXT_LIMIT];
- for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) {
- indexForDebug[i] = attrIndexLimit[i];
- }
+ int[] indexForDebug = Arrays.copyOf(attrIndexLimit, ATTR_CONTEXT_LIMIT);
for (int i = 0; i < defs.length; i++) {
int header = ((Integer)defs[i][0]).intValue();
Attribute.Layout def = (Attribute.Layout) defs[i][1];
@@ -953,7 +941,7 @@
if (debug) {
int hdrIndex = (header >> ADH_BIT_SHIFT) - ADH_BIT_IS_LSB;
if (hdrIndex < 0) hdrIndex = indexForDebug[def.ctype()]++;
- int realIndex = ((Integer) attrIndexTable.get(def)).intValue();
+ int realIndex = (attrIndexTable.get(def)).intValue();
assert(hdrIndex == realIndex);
}
if (dump != null) {
@@ -969,8 +957,8 @@
for (int ctype = 0; ctype < ATTR_CONTEXT_LIMIT; ctype++) {
MultiBand xxx_attr_bands = attrBands[ctype];
IntBand xxx_attr_calls = getAttrBand(xxx_attr_bands, AB_ATTR_CALLS);
- Attribute.Layout[] defs = new Attribute.Layout[attrDefs[ctype].size()];
- attrDefs[ctype].toArray(defs);
+ Attribute.Layout[] defs = new Attribute.Layout[attrDefs.get(ctype).size()];
+ attrDefs.get(ctype).toArray(defs);
for (boolean predef = true; ; predef = false) {
for (int ai = 0; ai < defs.length; ai++) {
Attribute.Layout def = defs[ai];
@@ -980,7 +968,7 @@
int totalCount = attrCounts[ctype][ai];
if (totalCount == 0)
continue; // irrelevant
- int[] bc = (int[]) backCountTable.get(def);
+ int[] bc = backCountTable.get(def);
for (int j = 0; j < bc.length; j++) {
if (bc[j] >= 0) {
int backCount = bc[j];
@@ -998,8 +986,7 @@
}
void trimClassAttributes() {
- for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
- Class cls = (Class) i.next();
+ for (Class cls : pkg.classes) {
// Replace "obvious" SourceFile attrs by null.
cls.minimizeSourceFile();
}
@@ -1008,14 +995,12 @@
void collectInnerClasses() {
// Capture inner classes, removing them from individual classes.
// Irregular inner classes must stay local, though.
- HashMap allICMap = new HashMap();
+ Map<ClassEntry, InnerClass> allICMap = new HashMap<>();
// First, collect a consistent global set.
- for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
- Class cls = (Class) i.next();
+ for (Class cls : pkg.classes) {
if (!cls.hasInnerClasses()) continue;
- for (Iterator j = cls.getInnerClasses().iterator(); j.hasNext(); ) {
- InnerClass ic = (InnerClass) j.next();
- InnerClass pic = (InnerClass) allICMap.put(ic.thisClass, ic);
+ for (InnerClass ic : cls.getInnerClasses()) {
+ InnerClass pic = allICMap.put(ic.thisClass, ic);
if (pic != null && !pic.equals(ic) && pic.predictable) {
// Different ICs. Choose the better to make global.
allICMap.put(pic.thisClass, pic);
@@ -1036,15 +1021,13 @@
// Next, empty out of every local set the consistent entries.
// Calculate whether there is any remaining need to have a local
// set, and whether it needs to be locked.
- for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) {
- Class cls = (Class) i.next();
+ for (Class cls : pkg.classes) {
cls.minimizeLocalICs();
}
}
void writeInnerClasses() throws IOException {
- for (Iterator i = pkg.getAllInnerClasses().iterator(); i.hasNext(); ) {
- InnerClass ic = (InnerClass) i.next();
+ for (InnerClass ic : pkg.getAllInnerClasses()) {
int flags = ic.flags;
assert((flags & ACC_IC_LONG_FORM) == 0);
if (!ic.predictable) {
@@ -1064,10 +1047,9 @@
* local attribute. This is expected to be rare.
*/
void writeLocalInnerClasses(Class cls) throws IOException {
- List localICs = cls.getInnerClasses();
+ List<InnerClass> localICs = cls.getInnerClasses();
class_InnerClasses_N.putInt(localICs.size());
- for (Iterator i = localICs.iterator(); i.hasNext(); ) {
- InnerClass ic = (InnerClass) i.next();
+ for(InnerClass ic : localICs) {
class_InnerClasses_RC.putRef(ic.thisClass);
// Is it redundant with the global version?
if (ic.equals(pkg.getGlobalInnerClass(ic.thisClass))) {
@@ -1121,18 +1103,16 @@
}
void writeMembers(Class cls) throws IOException {
- List fields = cls.getFields();
+ List<Class.Field> fields = cls.getFields();
class_field_count.putInt(fields.size());
- for (Iterator i = fields.iterator(); i.hasNext(); ) {
- Class.Field f = (Class.Field) i.next();
+ for (Class.Field f : fields) {
field_descr.putRef(f.getDescriptor());
writeAttrs(ATTR_CONTEXT_FIELD, f, cls);
}
- List methods = cls.getMethods();
+ List<Class.Method> methods = cls.getMethods();
class_method_count.putInt(methods.size());
- for (Iterator i = methods.iterator(); i.hasNext(); ) {
- Class.Method m = (Class.Method) i.next();
+ for (Class.Method m : methods) {
method_descr.putRef(m.getDescriptor());
writeAttrs(ATTR_CONTEXT_METHOD, m, cls);
assert((m.code != null) == (m.getAttribute(attrCodeEmpty) != null));
@@ -1206,11 +1186,10 @@
long flagMask = attrFlagMask[ctype]; // which flags are attr bits?
long flagsToAdd = 0;
int overflowCount = 0;
- for (ListIterator j = h.attributes.listIterator(); j.hasNext(); ) {
- Attribute a = (Attribute) j.next();
+ for (Attribute a : h.attributes) {
Attribute.Layout def = a.layout();
- int index = ((Integer)attrIndexTable.get(def)).intValue();
- assert(attrDefs[ctype].get(index) == def);
+ int index = (attrIndexTable.get(def)).intValue();
+ assert(attrDefs.get(ctype).get(index) == def);
if (verbose > 3)
Utils.log.fine("add attr @"+index+" "+a+" in "+h);
if (index < attrIndexLimit[ctype] && testBit(flagMask, 1L<<index)) {
@@ -1239,10 +1218,10 @@
continue;
}
assert(a.fixups == null);
- final Band[] ab = (Band[]) attrBandTable.get(def);
+ final Band[] ab = attrBandTable.get(def);
assert(ab != null);
assert(ab.length == def.bandCount);
- final int[] bc = (int[]) backCountTable.get(def);
+ final int[] bc = backCountTable.get(def);
assert(bc != null);
assert(bc.length == def.getCallables().length);
// Write one attribute of type def into ab.
@@ -1306,7 +1285,7 @@
private int initOpVariant(Instruction i, Entry newClass) {
if (i.getBC() != _invokespecial) return -1;
MemberEntry ref = (MemberEntry) i.getCPRef(curCPMap);
- if (ref.descRef.nameRef.stringValue() != "<init>")
+ if ("<init>".equals(ref.descRef.nameRef.stringValue()) == false)
return -1;
ClassEntry refClass = ref.classRef;
if (refClass == curClass.thisClass)
@@ -1618,14 +1597,16 @@
String count = "" + codeHist[bc];
count = " ".substring(count.length()) + count;
String pct = "" + (codeHist[bc] * 10000 / totalBytes);
- while (pct.length() < 4) pct = "0" + pct;
+ while (pct.length() < 4) {
+ pct = "0" + pct;
+ }
pct = pct.substring(0, pct.length()-2) + "." + pct.substring(pct.length()-2);
hist[bc] = count + " " + pct + "% " + iname;
}
Arrays.sort(hist);
System.out.println("Bytecode histogram ["+totalBytes+"]");
for (int i = hist.length; --i >= 0; ) {
- if (hist[i] == "") continue;
+ if ("".equals(hist[i])) continue;
System.out.println(hist[i]);
}
for (int tag = 0; tag < ldcHist.length; tag++) {
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java Tue Dec 14 07:42:11 2010 -0800
@@ -69,7 +69,8 @@
* Get the set of options for the pack and unpack engines.
* @return A sorted association of option key strings to option values.
*/
- public SortedMap<String, String> properties() {
+ @SuppressWarnings("unchecked")
+ public SortedMap properties() {
return props;
}
@@ -155,8 +156,8 @@
// All the worker bees.....
-
// The packer worker.
+ @SuppressWarnings("unchecked")
private class DoPack {
final int verbose = props.getInteger(Utils.DEBUG_VERBOSE);
@@ -179,11 +180,11 @@
unknownAttrCommand = uaMode.intern();
}
- final HashMap attrDefs;
- final HashMap attrCommands;
+ final Map<Attribute.Layout, Attribute> attrDefs;
+ final Map<Attribute.Layout, String> attrCommands;
{
- HashMap attrDefs = new HashMap();
- HashMap attrCommands = new HashMap();
+ Map<Attribute.Layout, Attribute> lattrDefs = new HashMap<>();
+ Map<Attribute.Layout, String> lattrCommands = new HashMap<>();
String[] keys = {
Pack200.Packer.CLASS_ATTRIBUTE_PFX,
Pack200.Packer.FIELD_ATTRIBUTE_PFX,
@@ -198,8 +199,9 @@
};
for (int i = 0; i < ctypes.length; i++) {
String pfx = keys[i];
- Map<String, String> map = props.prefixMap(pfx);
- for (String key : map.keySet()) {
+ Map<Object, Object> map = props.prefixMap(pfx);
+ for (Object k : map.keySet()) {
+ String key = (String)k;
assert(key.startsWith(pfx));
String name = key.substring(pfx.length());
String layout = props.getProperty(key);
@@ -207,24 +209,18 @@
if (Pack200.Packer.STRIP.equals(layout) ||
Pack200.Packer.PASS.equals(layout) ||
Pack200.Packer.ERROR.equals(layout)) {
- attrCommands.put(lkey, layout.intern());
+ lattrCommands.put(lkey, layout.intern());
} else {
- Attribute.define(attrDefs, ctypes[i], name, layout);
+ Attribute.define(lattrDefs, ctypes[i], name, layout);
if (verbose > 1) {
Utils.log.fine("Added layout for "+Constants.ATTR_CONTEXT_NAME[i]+" attribute "+name+" = "+layout);
}
- assert(attrDefs.containsKey(lkey));
+ assert(lattrDefs.containsKey(lkey));
}
}
}
- if (attrDefs.size() > 0)
- this.attrDefs = attrDefs;
- else
- this.attrDefs = null;
- if (attrCommands.size() > 0)
- this.attrCommands = attrCommands;
- else
- this.attrCommands = null;
+ this.attrDefs = (lattrDefs.isEmpty()) ? null : lattrDefs;
+ this.attrCommands = (lattrCommands.isEmpty()) ? null : lattrCommands;
}
final boolean keepFileOrder
@@ -275,8 +271,8 @@
{
// Which class files will be passed through?
passFiles = props.getProperties(Pack200.Packer.PASS_FILE_PFX);
- for (ListIterator i = passFiles.listIterator(); i.hasNext(); ) {
- String file = (String) i.next();
+ for (ListIterator<String> i = passFiles.listIterator(); i.hasNext(); ) {
+ String file = i.next();
if (file == null) { i.remove(); continue; }
file = Utils.getJarEntryName(file); // normalize '\\' to '/'
if (file.endsWith("/"))
@@ -333,7 +329,7 @@
pkg.reset();
}
- class InFile {
+ final class InFile {
final String name;
final JarFile jf;
final JarEntry je;
@@ -596,8 +592,8 @@
// Package builder must have created a stub for each class.
assert(pkg.files.containsAll(pkg.getClassStubs()));
// Order of stubs in file list must agree with classes.
- List res = pkg.files;
- assert((res = new ArrayList(pkg.files))
+ List<Package.File> res = pkg.files;
+ assert((res = new ArrayList<>(pkg.files))
.retainAll(pkg.getClassStubs()) || true);
assert(res.equals(pkg.getClassStubs()));
}
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/PopulationCoding.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/PopulationCoding.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2010, 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
@@ -31,6 +31,8 @@
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.Set;
+import static com.sun.java.util.jar.pack.Constants.*;
/**
* Population-based coding.
@@ -38,7 +40,7 @@
* @author John Rose
*/
// This tactic alone reduces the final zipped rt.jar by about a percent.
-class PopulationCoding implements Constants, CodingMethod {
+class PopulationCoding implements CodingMethod {
Histogram vHist; // histogram of all values
int[] fValues; // list of favored values
int fVlen; // inclusive max index
@@ -62,8 +64,8 @@
}
}
public void setFavoredValues(int[] fValues) {
- int fVlen = fValues.length-1;
- setFavoredValues(fValues, fVlen);
+ int lfVlen = fValues.length-1;
+ setFavoredValues(fValues, lfVlen);
}
public void setHistogram(Histogram vHist) {
this.vHist = vHist;
@@ -103,7 +105,7 @@
if (tokenCoding instanceof Coding && fValues != null) {
Coding tc = (Coding) tokenCoding;
if (tc == fitTokenCoding(fVlen, tc.L()))
- this.L = tc.L();;
+ this.L = tc.L();
// Otherwise, it's a non-default coding.
}
}
@@ -217,13 +219,13 @@
}
private long[] makeSymtab() {
- long[] symtab = new long[fVlen];
+ long[] lsymtab = new long[fVlen];
for (int token = 1; token <= fVlen; token++) {
- symtab[token-1] = ((long)fValues[token] << 32) | token;
+ lsymtab[token-1] = ((long)fValues[token] << 32) | token;
}
// Index by value:
- Arrays.sort(symtab);
- return symtab;
+ Arrays.sort(lsymtab);
+ return lsymtab;
}
private Coding getTailCoding(CodingMethod c) {
@@ -302,12 +304,12 @@
}
int[] readFavoredValuesFrom(InputStream in, int maxForDebug) throws IOException {
- int[] fValues = new int[1000]; // realloc as needed
+ int[] lfValues = new int[1000]; // realloc as needed
// The set uniqueValuesForDebug records all favored values.
// As each new value is added, we assert that the value
// was not already in the set.
- HashSet uniqueValuesForDebug = null;
- assert((uniqueValuesForDebug = new HashSet()) != null);
+ Set<Integer> uniqueValuesForDebug = null;
+ assert((uniqueValuesForDebug = new HashSet<>()) != null);
int fillp = 1;
maxForDebug += fillp;
int min = Integer.MIN_VALUE; // farthest from the center
@@ -317,13 +319,14 @@
while (fcm instanceof AdaptiveCoding) {
AdaptiveCoding ac = (AdaptiveCoding) fcm;
int len = ac.headLength;
- while (fillp + len > fValues.length)
- fValues = BandStructure.realloc(fValues);
+ while (fillp + len > lfValues.length) {
+ lfValues = BandStructure.realloc(lfValues);
+ }
int newFillp = fillp + len;
- ac.headCoding.readArrayFrom(in, fValues, fillp, newFillp);
+ ac.headCoding.readArrayFrom(in, lfValues, fillp, newFillp);
while (fillp < newFillp) {
- int val = fValues[fillp++];
- assert(uniqueValuesForDebug.add(new Integer(val)));
+ int val = lfValues[fillp++];
+ assert(uniqueValuesForDebug.add(val));
assert(fillp <= maxForDebug);
last = val;
min = moreCentral(min, val);
@@ -344,10 +347,10 @@
state = val;
if (fillp > 1 && (val == last || val == min)) //|| val == min2
break;
- if (fillp == fValues.length)
- fValues = BandStructure.realloc(fValues);
- fValues[fillp++] = val;
- assert(uniqueValuesForDebug.add(new Integer(val)));
+ if (fillp == lfValues.length)
+ lfValues = BandStructure.realloc(lfValues);
+ lfValues[fillp++] = val;
+ assert(uniqueValuesForDebug.add(val));
assert(fillp <= maxForDebug);
last = val;
min = moreCentral(min, val);
@@ -358,17 +361,17 @@
int val = fc.readFrom(in);
if (fillp > 1 && (val == last || val == min)) //|| val == min2
break;
- if (fillp == fValues.length)
- fValues = BandStructure.realloc(fValues);
- fValues[fillp++] = val;
- assert(uniqueValuesForDebug.add(new Integer(val)));
+ if (fillp == lfValues.length)
+ lfValues = BandStructure.realloc(lfValues);
+ lfValues[fillp++] = val;
+ assert(uniqueValuesForDebug.add(val));
assert(fillp <= maxForDebug);
last = val;
min = moreCentral(min, val);
//min2 = moreCentral2(min2, val, min);
}
}
- return BandStructure.realloc(fValues, fillp);
+ return BandStructure.realloc(lfValues, fillp);
}
private static int moreCentral(int x, int y) {
@@ -478,7 +481,7 @@
boolean verbose
= (p200 != null &&
p200.getBoolean(Utils.COM_PREFIX+"verbose.pop"));
- StringBuffer res = new StringBuffer(100);
+ StringBuilder res = new StringBuilder(100);
res.append("pop(").append("fVlen=").append(fVlen);
if (verbose && fValues != null) {
res.append(" fV=[");
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/PropMap.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/PropMap.java Tue Dec 14 07:42:11 2010 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003,2010 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2010, 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
@@ -34,8 +34,8 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Comparator;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -46,36 +46,36 @@
/**
* Control block for publishing Pack200 options to the other classes.
*/
-class PropMap extends TreeMap {
- ArrayList _listeners = new ArrayList(1);
+
+final class PropMap implements SortedMap<Object, Object> {
+ private final TreeMap<Object, Object> theMap = new TreeMap<>();;
+ private final List<PropertyChangeListener> listenerList = new ArrayList<>(1);
void addListener(PropertyChangeListener listener) {
- _listeners.add(listener);
+ listenerList.add(listener);
}
void removeListener(PropertyChangeListener listener) {
- _listeners.remove(listener);
+ listenerList.remove(listener);
}
- void addListeners(ArrayList listeners) {
- _listeners.addAll(listeners);
+ void addListeners(ArrayList<PropertyChangeListener> listeners) {
+ listenerList.addAll(listeners);
}
- void removeListeners(ArrayList listeners) {
- _listeners.removeAll(listeners);
+ void removeListeners(ArrayList<PropertyChangeListener> listeners) {
+ listenerList.removeAll(listeners);
}
// Override:
public Object put(Object key, Object value) {
- Object oldValue = super.put(key, value);
- if (value != oldValue && _listeners.size() > 0) {
+ Object oldValue = theMap.put(key, value);
+ if (value != oldValue && !listenerList.isEmpty()) {
// Post the property change event.
PropertyChangeEvent event =
new PropertyChangeEvent(this, (String) key,
oldValue, value);
- for (Iterator i = _listeners.iterator(); i.hasNext(); ) {
- PropertyChangeListener listener =
- (PropertyChangeListener) i.next();
+ for (PropertyChangeListener listener : listenerList) {
listener.propertyChange(event);
}
}
@@ -85,7 +85,7 @@
// All this other stuff is private to the current package.
// Outide clients of Pack200 do not need to use it; they can
// get by with generic SortedMap functionality.
- private static Map defaultProps;
+ private static Map<Object, Object> defaultProps;
static {
Properties props = new Properties();
@@ -122,13 +122,12 @@
// Define certain attribute layouts by default.
// Do this after the previous props are put in place,
// to allow override if necessary.
+ InputStream propStr = null;
try {
String propFile = "intrinsic.properties";
- InputStream propStr = PackerImpl.class.getResourceAsStream(propFile);
+ propStr = PackerImpl.class.getResourceAsStream(propFile);
props.load(new BufferedInputStream(propStr));
- propStr.close();
- for (Iterator i = props.entrySet().iterator(); i.hasNext(); ) {
- Map.Entry e = (Map.Entry) i.next();
+ for (Map.Entry<Object, Object> e : props.entrySet()) {
String key = (String) e.getKey();
String val = (String) e.getValue();
if (key.startsWith("attribute.")) {
@@ -137,19 +136,25 @@
}
} catch (IOException ee) {
throw new RuntimeException(ee);
+ } finally {
+ try {
+ if (propStr != null) {
+ propStr.close();
+ }
+ } catch (IOException ignore) {}
}
- defaultProps = (new HashMap(props)); // shrink to fit
+ defaultProps = (new HashMap<>(props)); // shrink to fit
}
PropMap() {
- putAll(defaultProps);
+ theMap.putAll(defaultProps);
}
// Return a view of this map which includes only properties
// that begin with the given prefix. This is easy because
// the map is sorted, and has a subMap accessor.
- SortedMap prefixMap(String prefix) {
+ SortedMap<Object, Object> prefixMap(String prefix) {
int len = prefix.length();
if (len == 0)
return this;
@@ -174,8 +179,8 @@
// Get sequence of props for "prefix", and "prefix.*".
List getProperties(String prefix) {
- Collection values = prefixMap(prefix).values();
- ArrayList res = new ArrayList(values.size());
+ Collection<Object> values = prefixMap(prefix).values();
+ List<Object> res = new ArrayList<>(values.size());
res.addAll(values);
while (res.remove(null));
return res;
@@ -240,11 +245,97 @@
void list(PrintWriter out) {
out.println("#"+Utils.PACK_ZIP_ARCHIVE_MARKER_COMMENT+"[");
Set defaults = defaultProps.entrySet();
- for (Iterator i = entrySet().iterator(); i.hasNext(); ) {
- Map.Entry e = (Map.Entry) i.next();
+ for (Map.Entry e : theMap.entrySet()) {
if (defaults.contains(e)) continue;
out.println(" " + e.getKey() + " = " + e.getValue());
}
out.println("#]");
}
+
+ @Override
+ public int size() {
+ return theMap.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return theMap.isEmpty();
+ }
+
+ @Override
+ public boolean containsKey(Object key) {
+ return theMap.containsKey(key);
+ }
+
+ @Override
+ public boolean containsValue(Object value) {
+ return theMap.containsValue(value);
+ }
+
+ @Override
+ public Object get(Object key) {
+ return theMap.get(key);
+ }
+
+ @Override
+ public Object remove(Object key) {
+ return theMap.remove(key);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void putAll(Map m) {
+ theMap.putAll(m);
+ }
+
+ @Override
+ public void clear() {
+ theMap.clear();
+ }
+
+ @Override
+ public Set<Object> keySet() {
+ return theMap.keySet();
+ }
+
+ @Override
+ public Collection<Object> values() {
+ return theMap.values();
+ }
+
+ @Override
+ public Set<Map.Entry<Object, Object>> entrySet() {
+ return theMap.entrySet();
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public Comparator<Object> comparator() {
+ return (Comparator<Object>) theMap.comparator();
+ }
+
+ @Override
+ public SortedMap<Object, Object> subMap(Object fromKey, Object toKey) {
+ return theMap.subMap(fromKey, toKey);
+ }
+
+ @Override
+ public SortedMap<Object, Object> headMap(Object toKey) {
+ return theMap.headMap(toKey);
+ }
+
+ @Override
+ public SortedMap<Object, Object> tailMap(Object fromKey) {
+ return theMap.tailMap(fromKey);
+ }
+
+ @Override
+ public Object firstKey() {
+ return theMap.firstKey();
+ }
+
+ @Override
+ public Object lastKey() {
+ return theMap.lastKey();
+ }
}
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java Tue Dec 14 07:42:11 2010 -0800
@@ -34,7 +34,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashSet;
-import java.util.Iterator;
+import java.util.Set;
import java.util.SortedMap;
import java.util.TimeZone;
import java.util.jar.JarEntry;
@@ -81,7 +81,8 @@
* Get the set of options for the pack and unpack engines.
* @return A sorted association of option key strings to option values.
*/
- public SortedMap<String, String> properties() {
+ @SuppressWarnings("unchecked")
+ public SortedMap properties() {
return props;
}
@@ -225,9 +226,8 @@
props.setProperty(java.util.jar.Pack200.Unpacker.PROGRESS,"50");
pkg.ensureAllClassFiles();
// Now write out the files.
- HashSet<Package.Class> classesToWrite = new HashSet<>(pkg.getClasses());
- for (Iterator i = pkg.getFiles().iterator(); i.hasNext(); ) {
- Package.File file = (Package.File) i.next();
+ Set<Package.Class> classesToWrite = new HashSet<>(pkg.getClasses());
+ for (Package.File file : pkg.getFiles()) {
String name = file.nameString;
JarEntry je = new JarEntry(Utils.getJarEntryName(name));
boolean deflate;
--- a/jdk/src/share/classes/com/sun/java/util/jar/pack/Utils.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/Utils.java Tue Dec 14 07:42:11 2010 -0800
@@ -297,7 +297,7 @@
(int)( (1.0 - ((double)ze.getCompressedSize()/(double)ze.getSize()))*100 )
: 0 ;
// Follow unzip -lv output
- return (long)ze.getSize() + "\t" + ze.getMethod()
+ return ze.getSize() + "\t" + ze.getMethod()
+ "\t" + ze.getCompressedSize() + "\t"
+ store + "%\t"
+ new Date(ze.getTime()) + "\t"
--- a/jdk/src/share/classes/java/util/jar/Pack200.java Mon Dec 13 14:34:37 2010 -0800
+++ b/jdk/src/share/classes/java/util/jar/Pack200.java Tue Dec 14 07:42:11 2010 -0800
@@ -732,14 +732,14 @@
private synchronized static Object newInstance(String prop) {
String implName = "(unknown)";
try {
- Class impl = (prop == PACK_PROVIDER)? packerImpl: unpackerImpl;
+ Class impl = (PACK_PROVIDER.equals(prop))? packerImpl: unpackerImpl;
if (impl == null) {
// The first time, we must decide which class to use.
implName = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction(prop,""));
if (implName != null && !implName.equals(""))
impl = Class.forName(implName);
- else if (prop == PACK_PROVIDER)
+ else if (PACK_PROVIDER.equals(prop))
impl = com.sun.java.util.jar.pack.PackerImpl.class;
else
impl = com.sun.java.util.jar.pack.UnpackerImpl.class;