diff options
author | Paul Phillips <paulp@improving.org> | 2011-12-30 21:06:46 -0800 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-12-30 21:43:23 -0800 |
commit | 6150b589993fc58817d6d1d2e4326c8ff135a0ea (patch) | |
tree | 9fc392aeb82ec00979994b5cc2ea5203ee432797 /src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala | |
parent | 30028483272e4401e04fabc85fe645995eb7bc02 (diff) | |
download | scala-6150b589993fc58817d6d1d2e4326c8ff135a0ea.tar.gz scala-6150b589993fc58817d6d1d2e4326c8ff135a0ea.tar.bz2 scala-6150b589993fc58817d6d1d2e4326c8ff135a0ea.zip |
Low-level optimization.
Eliminated a bunch of unnecessary array expense.
Diffstat (limited to 'src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index b73eaff524..94eb6d2afd 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -365,6 +365,13 @@ abstract class ClassfileParser { case arr: Type => Constant(arr) } } + + private def getSubArray(bytes: Array[Byte]): Array[Byte] = { + val decodedLength = ByteCodecs.decode(bytes) + val arr = new Array[Byte](decodedLength) + System.arraycopy(bytes, 0, arr, 0, decodedLength) + arr + } def getBytes(index: Int): Array[Byte] = { if (index <= 0 || len <= index) errorBadIndex(index) @@ -372,11 +379,10 @@ abstract class ClassfileParser { if (value eq null) { val start = starts(index) if (in.buf(start).toInt != CONSTANT_UTF8) errorBadTag(start) - val len = in.getChar(start + 1) + val len = in.getChar(start + 1) val bytes = new Array[Byte](len) - Array.copy(in.buf, start + 3, bytes, 0, len) - val decodedLength = ByteCodecs.decode(bytes) - value = bytes.take(decodedLength) + System.arraycopy(in.buf, start + 3, bytes, 0, len) + value = getSubArray(bytes) values(index) = value } value @@ -394,9 +400,7 @@ abstract class ClassfileParser { val len = in.getChar(start + 1) bytesBuffer ++= in.buf.view(start + 3, start + 3 + len) } - val bytes = bytesBuffer.toArray - val decodedLength = ByteCodecs.decode(bytes) - value = bytes.take(decodedLength) + value = getSubArray(bytesBuffer.toArray) values(indices.head) = value } value @@ -968,7 +972,7 @@ abstract class ClassfileParser { Some(ScalaSigBytes(pool getBytes in.nextChar)) } - def parseScalaLongSigBytes: Option[ScalaSigBytes] = try { + def parseScalaLongSigBytes: Option[ScalaSigBytes] = { val tag = in.nextByte.toChar assert(tag == ARRAY_TAG) val stringCount = in.nextChar @@ -980,11 +984,6 @@ abstract class ClassfileParser { } Some(ScalaSigBytes(pool.getBytes(entries.toList))) } - catch { - case e: Throwable => - e.printStackTrace - throw e - } /** Parse and return a single annotation. If it is malformed, * return None. |