summaryrefslogtreecommitdiff
path: root/src/reflect/scala/tools/nsc/io/ZipArchive.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2012-08-16 20:03:14 +0200
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2012-08-20 08:11:06 +0100
commit1ee7ffb6fd2de6e7194a4eb89601d98503b50048 (patch)
treea7395953072397beb1435c4907cf4e23cbb4e469 /src/reflect/scala/tools/nsc/io/ZipArchive.scala
parent0cde930b192acc73d1e0b5951b3300c286ae4dd2 (diff)
downloadscala-1ee7ffb6fd2de6e7194a4eb89601d98503b50048.tar.gz
scala-1ee7ffb6fd2de6e7194a4eb89601d98503b50048.tar.bz2
scala-1ee7ffb6fd2de6e7194a4eb89601d98503b50048.zip
Optimizations to cut down on #closures created
Driven by profile data.
Diffstat (limited to 'src/reflect/scala/tools/nsc/io/ZipArchive.scala')
-rw-r--r--src/reflect/scala/tools/nsc/io/ZipArchive.scala27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/reflect/scala/tools/nsc/io/ZipArchive.scala b/src/reflect/scala/tools/nsc/io/ZipArchive.scala
index 852dba9ec8..d1a91294a5 100644
--- a/src/reflect/scala/tools/nsc/io/ZipArchive.scala
+++ b/src/reflect/scala/tools/nsc/io/ZipArchive.scala
@@ -96,14 +96,25 @@ abstract class ZipArchive(override val file: JFile) extends AbstractFile with Eq
}
}
- private def ensureDir(dirs: mutable.Map[String, DirEntry], path: String, zipEntry: ZipEntry): DirEntry = {
- dirs.getOrElseUpdate(path, {
- val parent = ensureDir(dirs, dirName(path), null)
- val dir = new DirEntry(path)
- parent.entries(baseName(path)) = dir
- dir
- })
- }
+ private def ensureDir(dirs: mutable.Map[String, DirEntry], path: String, zipEntry: ZipEntry): DirEntry =
+ //OPT inlined from getOrElseUpdate; saves ~50K closures on test run.
+ // was:
+ // dirs.getOrElseUpdate(path, {
+ // val parent = ensureDir(dirs, dirName(path), null)
+ // val dir = new DirEntry(path)
+ // parent.entries(baseName(path)) = dir
+ // dir
+ // })
+ dirs get path match {
+ case Some(v) => v
+ case None =>
+ val parent = ensureDir(dirs, dirName(path), null)
+ val dir = new DirEntry(path)
+ parent.entries(baseName(path)) = dir
+ dirs(path) = dir
+ dir
+ }
+
protected def getDir(dirs: mutable.Map[String, DirEntry], entry: ZipEntry): DirEntry = {
if (entry.isDirectory) ensureDir(dirs, entry.getName, entry)
else ensureDir(dirs, dirName(entry.getName), null)