diff options
author | Paul Phillips <paulp@improving.org> | 2012-01-05 14:26:01 -0800 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-01-05 15:25:58 -0800 |
commit | 020053c3215579e8aeb871a4ad0078516994270d (patch) | |
tree | 447f518a7361a9a49993a22012b37a5c653e6284 /src/scalap | |
parent | 749b476beca481b48cad8ea3810865634a010686 (diff) | |
download | scala-020053c3215579e8aeb871a4ad0078516994270d.tar.gz scala-020053c3215579e8aeb871a4ad0078516994270d.tar.bz2 scala-020053c3215579e8aeb871a4ad0078516994270d.zip |
More consistent use of Names.
Several large helpings of tedium later, fewer strings are being
discarded like so much refuse. Some names now cache a String, but only
"named Names", so it's not very many and they pay for themselves pretty
quickly. Many fewer name-related implicit conversions now taking place.
A number of efficiency related measures.
Diffstat (limited to 'src/scalap')
4 files changed, 13 insertions, 109 deletions
diff --git a/src/scalap/scala/tools/scalap/JavaWriter.scala b/src/scalap/scala/tools/scalap/JavaWriter.scala index db9d6c5ed9..02b940ab16 100644 --- a/src/scalap/scala/tools/scalap/JavaWriter.scala +++ b/src/scalap/scala/tools/scalap/JavaWriter.scala @@ -9,7 +9,7 @@ package scala.tools.scalap import java.io._ - +import scala.reflect.NameTransformer class JavaWriter(classfile: Classfile, writer: Writer) extends CodeWriter(writer) { @@ -32,22 +32,22 @@ class JavaWriter(classfile: Classfile, writer: Writer) extends CodeWriter(writer } def nameToClass(str: String): String = { - val res = Names.decode(str.replace('/', '.')) + val res = NameTransformer.decode(str.replace('/', '.')) if (res == "java.lang.Object") "scala.Any" else res } def nameToClass0(str: String) = { - val res = Names.decode(str.replace('/', '.')) + val res = NameTransformer.decode(str.replace('/', '.')) if (res == "java.lang.Object") "scala.AnyRef" else res } def nameToSimpleClass(str: String) = - Names.decode(str.substring(str.lastIndexOf('/') + 1)) + NameTransformer.decode(str.substring(str.lastIndexOf('/') + 1)) def nameToPackage(str: String) = { val inx = str.lastIndexOf('/') val name = if (inx == -1) str else str.substring(0, inx).replace('/', '.') - Names.decode(name) + NameTransformer.decode(name) } def sigToType(str: String): String = @@ -119,9 +119,9 @@ class JavaWriter(classfile: Classfile, writer: Writer) extends CodeWriter(writer def printField(flags: Int, name: Int, tpe: Int, attribs: List[cf.Attribute]) { print(flagsToStr(false, flags)) if ((flags & 0x0010) != 0) - print("val " + Names.decode(getName(name))) + print("val " + NameTransformer.decode(getName(name))) else - print("final var " + Names.decode(getName(name))) + print("final var " + NameTransformer.decode(getName(name))) print(": " + getType(tpe) + ";").newline } @@ -139,20 +139,20 @@ class JavaWriter(classfile: Classfile, writer: Writer) extends CodeWriter(writer if (getName(name) == "<init>") { print("def this" + getType(tpe) + ";").newline } else { - print("def " + Names.decode(getName(name))) + print("def " + NameTransformer.decode(getName(name))) print(getType(tpe) + ";").newline } case Some(str) => if (getName(name) == "<init>") print("def this" + str + ";").newline else - print("def " + Names.decode(getName(name)) + str + ";").newline + print("def " + NameTransformer.decode(getName(name)) + str + ";").newline } case None => if (getName(name) == "<init>") { print("def this" + getType(tpe) + ";").newline } else { - print("def " + Names.decode(getName(name))) + print("def " + NameTransformer.decode(getName(name))) print(getType(tpe) + ";").newline } } diff --git a/src/scalap/scala/tools/scalap/Main.scala b/src/scalap/scala/tools/scalap/Main.scala index 7254b00480..a8a9c65f63 100644 --- a/src/scalap/scala/tools/scalap/Main.scala +++ b/src/scalap/scala/tools/scalap/Main.scala @@ -8,6 +8,7 @@ package scala.tools.scalap import java.io.{ PrintStream, OutputStreamWriter, ByteArrayOutputStream } +import scala.reflect.NameTransformer import scalax.rules.scalasig._ import tools.nsc.util.{ ClassPath, JavaClassPath } import tools.util.PathResolver @@ -96,7 +97,7 @@ class Main { */ def process(args: Arguments, path: ClassPath[AbstractFile])(classname: String): Unit = { // find the classfile - val encName = Names.encode( + val encName = NameTransformer.encode( if (classname == "scala.AnyRef") "java.lang.Object" else classname) val cls = path.findClass(encName) diff --git a/src/scalap/scala/tools/scalap/Names.scala b/src/scalap/scala/tools/scalap/Names.scala deleted file mode 100644 index 1d66b31ce3..0000000000 --- a/src/scalap/scala/tools/scalap/Names.scala +++ /dev/null @@ -1,96 +0,0 @@ -/* ___ ____ ___ __ ___ ___ -** / _// __// _ | / / / _ | / _ \ Scala classfile decoder -** __\ \/ /__/ __ |/ /__/ __ |/ ___/ (c) 2003-2011, LAMP/EPFL -** /____/\___/_/ |_/____/_/ |_/_/ http://scala-lang.org/ -** -*/ - - -package scala.tools.scalap - - -object Names { - - val operatorName = new Array[String](128) - operatorName('$') = "$" - operatorName('~') = "$tilde" - operatorName('=') = "$eq" - operatorName('<') = "$less" - operatorName('>') = "$greater" - operatorName('!') = "$bang" - operatorName('#') = "$hash" - operatorName('%') = "$percent" - operatorName('^') = "$up" - operatorName('&') = "$amp" - operatorName('|') = "$bar" - operatorName('*') = "$times" - operatorName('/') = "$div" - operatorName('\\') = "$bslash" - operatorName('+') = "$plus" - operatorName('-') = "$minus" - operatorName(':') = "$colon" - - /** Replace operator symbols by corresponding "$op_name" in names. - */ - def encode(name: String): String = { - var i = 0 - val len = name.length() - val res = new StringBuffer() - while (i < len) { - val c = name.charAt(i) - if (c < 128) { - val nop = operatorName(c) - if (nop == null) - res.append(c) - else - res.append(nop) - } else - res.append(c) - i = i + 1 - } - res.toString() - } - - /** Replace "$op_name" by corresponding operator symbols in names. - */ - def decode(name: String): String = { - var i = 0 - val len = name.length() - val res = new StringBuffer() - while (i < len) { - val c = name.charAt(i) - if (c == '$') { - var j = len - while (j > i) { - val prefix = name.substring(i, j) - val c = lookup(prefix) - if (c != null) { - i = j - res.append(c) - } else - j = j - 1 - } - } else { - i = i + 1 - res.append(c) - } - } - res.toString() - } - - /** Looks up the array entry for the operator name. - */ - def lookup(string: String): String = { - var i = 0 - var res: String = null - while (i < 128) { - if (string.equals(operatorName(i))) { - res = String.valueOf(i.asInstanceOf[Char]) - i = 128 - } - i = i + 1 - } - res - } - -} diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala index df78bad25e..aa454934c1 100644 --- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala +++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala @@ -13,9 +13,8 @@ package scalasig import java.io.{PrintStream, ByteArrayOutputStream} import java.util.regex.Pattern - import scala.tools.scalap.scalax.util.StringUtil -import reflect.NameTransformer +import scala.reflect.NameTransformer import java.lang.String class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) { |