Skip to content
This repository has been archived by the owner on Aug 27, 2022. It is now read-only.

Commit

Permalink
8193066: Avoid use of capturing lambdas in JarFile
Browse files Browse the repository at this point in the history
Reviewed-by: lancea, alanb
  • Loading branch information
cl4es committed May 11, 2020
1 parent 3b93676 commit fc842d2
Show file tree
Hide file tree
Showing 6 changed files with 191 additions and 66 deletions.
34 changes: 13 additions & 21 deletions src/java.base/share/classes/java/util/jar/JarFile.java
Expand Up @@ -503,11 +503,11 @@ public ZipEntry getEntry(String name) {
if (isMultiRelease()) {
JarEntry je = getVersionedEntry(name, null);
if (je == null) {
je = getEntry0(name);
je = (JarEntry)super.getEntry(name);
}
return je;
} else {
return getEntry0(name);
return super.getEntry(name);
}
}

Expand All @@ -519,7 +519,7 @@ public ZipEntry getEntry(String name) {
* may be thrown if the jar file has been closed
*/
public Enumeration<JarEntry> entries() {
return JUZFA.entries(this, JarFileEntry::new);
return JUZFA.entries(this);
}

/**
Expand All @@ -532,7 +532,7 @@ public Enumeration<JarEntry> entries() {
* @since 1.8
*/
public Stream<JarEntry> stream() {
return JUZFA.stream(this, JarFileEntry::new);
return JUZFA.stream(this);
}

/**
Expand Down Expand Up @@ -563,19 +563,11 @@ public Stream<JarEntry> versionedStream() {
return stream();
}

/*
* Invokes {@ZipFile}'s getEntry to Return a {@code JarFileEntry} for the
* given entry name or {@code null} if not found.
/**
* Creates a ZipEntry suitable for the given ZipFile.
*/
private JarFileEntry getEntry0(String name) {
// Not using a lambda/method reference here to optimize startup time
Function<String, JarEntry> newJarFileEntryFn = new Function<>() {
@Override
public JarEntry apply(String name) {
return new JarFileEntry(name);
}
};
return (JarFileEntry)JUZFA.getEntry(this, name, newJarFileEntryFn);
JarEntry entryFor(String name) {
return new JarFileEntry(name);
}

private String getBasename(String name) {
Expand Down Expand Up @@ -613,7 +605,8 @@ private JarEntry getVersionedEntry(String name, JarEntry defaultEntry) {
if (version < BASE_VERSION_FEATURE) {
break;
}
JarFileEntry vje = getEntry0(META_INF_VERSIONS + version + "/" + name);
JarFileEntry vje = (JarFileEntry)super.getEntry(
META_INF_VERSIONS + version + "/" + name);
if (vje != null) {
return vje.withBasename(name);
}
Expand Down Expand Up @@ -926,7 +919,7 @@ private JarEntry getManEntry() {
// initialization
String name = JUZFA.getManifestName(this, false);
if (name != null) {
this.manEntry = getEntry0(name);
this.manEntry = (JarEntry)super.getEntry(name);
}
}
return manEntry;
Expand Down Expand Up @@ -1093,12 +1086,11 @@ Enumeration<String> entryNames(CodeSource[] cs) {
Enumeration<JarEntry> entries2() {
ensureInitialization();
if (jv != null) {
return jv.entries2(this, JUZFA.entries(JarFile.this,
JarFileEntry::new));
return jv.entries2(this, JUZFA.entries(JarFile.this));
}

// screen out entries which are never signed
final var unfilteredEntries = JUZFA.entries(JarFile.this, JarFileEntry::new);
final var unfilteredEntries = JUZFA.entries(JarFile.this);

return new Enumeration<>() {

Expand Down
Expand Up @@ -30,6 +30,9 @@
import java.security.CodeSource;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import jdk.internal.access.JavaUtilJarAccess;

class JavaUtilJarAccessImpl implements JavaUtilJarAccess {
Expand Down Expand Up @@ -72,4 +75,8 @@ public void ensureInitialization(JarFile jar) {
public boolean isInitializing() {
return JarFile.isInitializing();
}

public JarEntry entryFor(JarFile jar, String name) {
return jar.entryFor(name);
}
}
65 changes: 24 additions & 41 deletions src/java.base/share/classes/java/util/zip/ZipFile.java
Expand Up @@ -55,13 +55,13 @@
import java.util.TreeSet;
import java.util.WeakHashMap;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import jdk.internal.access.JavaUtilZipFileAccess;
import jdk.internal.access.JavaUtilJarAccess;
import jdk.internal.access.SharedSecrets;
import jdk.internal.misc.VM;
import jdk.internal.perf.PerfCounter;
Expand Down Expand Up @@ -321,27 +321,13 @@ public String getComment() {
* @throws IllegalStateException if the zip file has been closed
*/
public ZipEntry getEntry(String name) {
return getEntry(name, ZipEntry::new);
}

/*
* Returns the zip file entry for the specified name, or null
* if not found.
*
* @param name the name of the entry
* @param func the function that creates the returned entry
*
* @return the zip file entry, or null if not found
* @throws IllegalStateException if the zip file has been closed
*/
private ZipEntry getEntry(String name, Function<String, ? extends ZipEntry> func) {
Objects.requireNonNull(name, "name");
ZipEntry entry = null;
synchronized (this) {
ensureOpen();
int pos = res.zsrc.getEntryPos(name, true);
if (pos != -1) {
entry = getZipEntry(name, pos, func);
entry = getZipEntry(name, pos);
}
}
return entry;
Expand Down Expand Up @@ -487,11 +473,9 @@ private class ZipEntryIterator<T extends ZipEntry>

private int i = 0;
private final int entryCount;
private final Function<String, T> gen;

public ZipEntryIterator(int entryCount, Function<String, T> gen) {
public ZipEntryIterator(int entryCount) {
this.entryCount = entryCount;
this.gen = gen;
}

@Override
Expand All @@ -518,7 +502,7 @@ public T next() {
throw new NoSuchElementException();
}
// each "entry" has 3 ints in table entries
return (T)getZipEntry(null, res.zsrc.getEntryPos(i++ * 3), gen);
return (T)getZipEntry(null, res.zsrc.getEntryPos(i++ * 3));
}
}

Expand All @@ -536,14 +520,14 @@ public Iterator<T> asIterator() {
public Enumeration<? extends ZipEntry> entries() {
synchronized (this) {
ensureOpen();
return new ZipEntryIterator<ZipEntry>(res.zsrc.total, ZipEntry::new);
return new ZipEntryIterator<ZipEntry>(res.zsrc.total);
}
}

private Enumeration<JarEntry> entries(Function<String, JarEntry> func) {
private Enumeration<JarEntry> jarEntries() {
synchronized (this) {
ensureOpen();
return new ZipEntryIterator<JarEntry>(res.zsrc.total, func);
return new ZipEntryIterator<JarEntry>(res.zsrc.total);
}
}

Expand Down Expand Up @@ -590,7 +574,7 @@ public Stream<? extends ZipEntry> stream() {
synchronized (this) {
ensureOpen();
return StreamSupport.stream(new EntrySpliterator<>(0, res.zsrc.total,
pos -> getZipEntry(null, pos, ZipEntry::new)), false);
pos -> getZipEntry(null, pos)), false);
}
}

Expand Down Expand Up @@ -625,25 +609,23 @@ private Stream<String> entryNameStream() {
* Entries appear in the {@code Stream} in the order they appear in
* the central directory of the jar file.
*
* @param func the function that creates the returned entry
* @return an ordered {@code Stream} of entries in this zip file
* @throws IllegalStateException if the zip file has been closed
* @since 10
*/
private Stream<JarEntry> stream(Function<String, JarEntry> func) {
private Stream<JarEntry> jarStream() {
synchronized (this) {
ensureOpen();
return StreamSupport.stream(new EntrySpliterator<>(0, res.zsrc.total,
pos -> (JarEntry)getZipEntry(null, pos, func)), false);
pos -> (JarEntry)getZipEntry(null, pos)), false);
}
}

private String lastEntryName;
private int lastEntryPos;

/* Check ensureOpen() before invoking this method */
private ZipEntry getZipEntry(String name, int pos,
Function<String, ? extends ZipEntry> func) {
private ZipEntry getZipEntry(String name, int pos) {
byte[] cen = res.zsrc.cen;
int nlen = CENNAM(cen, pos);
int elen = CENEXT(cen, pos);
Expand All @@ -663,7 +645,12 @@ private ZipEntry getZipEntry(String name, int pos,
// invoked from iterator, use the entry name stored in cen
name = zc.toString(cen, pos + CENHDR, nlen);
}
ZipEntry e = func.apply(name); //ZipEntry e = new ZipEntry(name);
ZipEntry e;
if (this instanceof JarFile) {
e = Source.JUJA.entryFor((JarFile)this, name);
} else {
e = new ZipEntry(name);
}
e.flag = CENFLG(cen, pos);
e.xdostime = CENTIM(cen, pos);
e.crc = CENCRC(cen, pos);
Expand Down Expand Up @@ -1094,19 +1081,12 @@ public int[] getMetaInfVersions(JarFile jar) {
return ((ZipFile)jar).getMetaInfVersions();
}
@Override
public JarEntry getEntry(ZipFile zip, String name,
Function<String, JarEntry> func) {
return (JarEntry)zip.getEntry(name, func);
}
@Override
public Enumeration<JarEntry> entries(ZipFile zip,
Function<String, JarEntry> func) {
return zip.entries(func);
public Enumeration<JarEntry> entries(ZipFile zip) {
return zip.jarEntries();
}
@Override
public Stream<JarEntry> stream(ZipFile zip,
Function<String, JarEntry> func) {
return zip.stream(func);
public Stream<JarEntry> stream(ZipFile zip) {
return zip.jarStream();
}
@Override
public Stream<String> entryNameStream(ZipFile zip) {
Expand All @@ -1118,6 +1098,9 @@ public Stream<String> entryNameStream(ZipFile zip) {
}

private static class Source {
// While this is only used from ZipFile, defining it there would cause
// a bootstrap cycle that would leave this initialized as null
private static final JavaUtilJarAccess JUJA = SharedSecrets.javaUtilJarAccess();
// "META-INF/".length()
private static final int META_INF_LENGTH = 9;
private static final int[] EMPTY_META_VERSIONS = new int[0];
Expand Down
Expand Up @@ -46,4 +46,5 @@ public interface JavaUtilJarAccess {
public Attributes getTrustedAttributes(Manifest man, String name);
public void ensureInitialization(JarFile jar);
public boolean isInitializing();
public JarEntry entryFor(JarFile file, String name);
}
Expand Up @@ -27,7 +27,6 @@

import java.util.Enumeration;
import java.util.List;
import java.util.function.Function;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.stream.Stream;
Expand All @@ -38,9 +37,8 @@ public interface JavaUtilZipFileAccess {
public List<String> getManifestAndSignatureRelatedFiles(JarFile zip);
public String getManifestName(JarFile zip, boolean onlyIfSignatureRelatedFiles);
public int[] getMetaInfVersions(JarFile zip);
public JarEntry getEntry(ZipFile zip, String name, Function<String, JarEntry> func);
public Enumeration<JarEntry> entries(ZipFile zip, Function<String, JarEntry> func);
public Stream<JarEntry> stream(ZipFile zip, Function<String, JarEntry> func);
public Enumeration<JarEntry> entries(ZipFile zip);
public Stream<JarEntry> stream(ZipFile zip);
public Stream<String> entryNameStream(ZipFile zip);
}

0 comments on commit fc842d2

Please sign in to comment.