summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-05-13 08:48:23 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-05-13 08:48:23 +1000
commita436e9064807d95d5aa9691aebefeccf448734bc (patch)
tree9cd6198413ef8ea5e885559e4f3230373821c00c
parent0bcd0a40dcfda091bbb665b5f0879d9ce3384ab5 (diff)
parentd253702f9f23186cbf95f611c2fd1a2d08330ad6 (diff)
downloadscala-a436e9064807d95d5aa9691aebefeccf448734bc.tar.gz
scala-a436e9064807d95d5aa9691aebefeccf448734bc.tar.bz2
scala-a436e9064807d95d5aa9691aebefeccf448734bc.zip
Merge pull request #4500 from lrytz/merge-2.11-may-12
Merge 2.11.x into 2.12.x [ci: last-only]
-rw-r--r--README.md6
-rw-r--r--build-ant-macros.xml7
-rw-r--r--build.sbt66
-rwxr-xr-xbuild.xml62
-rwxr-xr-xscripts/jobs/integrate/bootstrap7
-rwxr-xr-xscripts/jobs/integrate/ide2
-rw-r--r--src/asm/README37
-rw-r--r--src/asm/scala/tools/asm/AnnotationVisitor.java169
-rw-r--r--src/asm/scala/tools/asm/AnnotationWriter.java371
-rw-r--r--src/asm/scala/tools/asm/Attribute.java255
-rw-r--r--src/asm/scala/tools/asm/ByteVector.java339
-rw-r--r--src/asm/scala/tools/asm/ClassReader.java2496
-rw-r--r--src/asm/scala/tools/asm/ClassVisitor.java320
-rw-r--r--src/asm/scala/tools/asm/ClassWriter.java1785
-rw-r--r--src/asm/scala/tools/asm/Context.java145
-rw-r--r--src/asm/scala/tools/asm/CustomAttr.java20
-rw-r--r--src/asm/scala/tools/asm/Edge.java75
-rw-r--r--src/asm/scala/tools/asm/FieldVisitor.java150
-rw-r--r--src/asm/scala/tools/asm/FieldWriter.java329
-rw-r--r--src/asm/scala/tools/asm/Frame.java1462
-rw-r--r--src/asm/scala/tools/asm/Handle.java170
-rw-r--r--src/asm/scala/tools/asm/Handler.java121
-rw-r--r--src/asm/scala/tools/asm/Item.java312
-rw-r--r--src/asm/scala/tools/asm/Label.java560
-rw-r--r--src/asm/scala/tools/asm/MethodVisitor.java880
-rw-r--r--src/asm/scala/tools/asm/MethodWriter.java2924
-rw-r--r--src/asm/scala/tools/asm/Opcodes.java361
-rw-r--r--src/asm/scala/tools/asm/Type.java896
-rw-r--r--src/asm/scala/tools/asm/TypePath.java193
-rw-r--r--src/asm/scala/tools/asm/TypeReference.java452
-rw-r--r--src/asm/scala/tools/asm/commons/CodeSizeEvaluator.java238
-rw-r--r--src/asm/scala/tools/asm/signature/SignatureReader.java228
-rw-r--r--src/asm/scala/tools/asm/signature/SignatureVisitor.java238
-rw-r--r--src/asm/scala/tools/asm/signature/SignatureWriter.java227
-rw-r--r--src/asm/scala/tools/asm/tree/AbstractInsnNode.java326
-rw-r--r--src/asm/scala/tools/asm/tree/AnnotationNode.java231
-rw-r--r--src/asm/scala/tools/asm/tree/ClassNode.java417
-rw-r--r--src/asm/scala/tools/asm/tree/FieldInsnNode.java110
-rw-r--r--src/asm/scala/tools/asm/tree/FieldNode.java307
-rw-r--r--src/asm/scala/tools/asm/tree/FrameNode.java210
-rw-r--r--src/asm/scala/tools/asm/tree/IincInsnNode.java83
-rw-r--r--src/asm/scala/tools/asm/tree/InnerClassNode.java101
-rw-r--r--src/asm/scala/tools/asm/tree/InsnList.java622
-rw-r--r--src/asm/scala/tools/asm/tree/InsnNode.java88
-rw-r--r--src/asm/scala/tools/asm/tree/IntInsnNode.java88
-rw-r--r--src/asm/scala/tools/asm/tree/InvokeDynamicInsnNode.java102
-rw-r--r--src/asm/scala/tools/asm/tree/JumpInsnNode.java97
-rw-r--r--src/asm/scala/tools/asm/tree/LabelNode.java78
-rw-r--r--src/asm/scala/tools/asm/tree/LdcInsnNode.java79
-rw-r--r--src/asm/scala/tools/asm/tree/LineNumberNode.java84
-rw-r--r--src/asm/scala/tools/asm/tree/LocalVariableAnnotationNode.java157
-rw-r--r--src/asm/scala/tools/asm/tree/LocalVariableNode.java112
-rw-r--r--src/asm/scala/tools/asm/tree/LookupSwitchInsnNode.java118
-rw-r--r--src/asm/scala/tools/asm/tree/MethodInsnNode.java141
-rw-r--r--src/asm/scala/tools/asm/tree/MethodNode.java839
-rw-r--r--src/asm/scala/tools/asm/tree/MultiANewArrayInsnNode.java84
-rw-r--r--src/asm/scala/tools/asm/tree/ParameterNode.java76
-rw-r--r--src/asm/scala/tools/asm/tree/TableSwitchInsnNode.java114
-rw-r--r--src/asm/scala/tools/asm/tree/TryCatchBlockNode.java153
-rw-r--r--src/asm/scala/tools/asm/tree/TypeAnnotationNode.java100
-rw-r--r--src/asm/scala/tools/asm/tree/TypeInsnNode.java91
-rw-r--r--src/asm/scala/tools/asm/tree/VarInsnNode.java94
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/Analyzer.java549
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/AnalyzerException.java62
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/BasicInterpreter.java358
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/BasicValue.java111
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/BasicVerifier.java433
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/Frame.java738
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/Interpreter.java226
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/SimpleVerifier.java320
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/SmallSet.java134
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/SourceInterpreter.java198
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/SourceValue.java97
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/Subroutine.java90
-rw-r--r--src/asm/scala/tools/asm/tree/analysis/Value.java45
-rw-r--r--src/asm/scala/tools/asm/util/ASMifiable.java56
-rw-r--r--src/asm/scala/tools/asm/util/ASMifier.java1284
-rw-r--r--src/asm/scala/tools/asm/util/CheckAnnotationAdapter.java136
-rw-r--r--src/asm/scala/tools/asm/util/CheckClassAdapter.java1009
-rw-r--r--src/asm/scala/tools/asm/util/CheckFieldAdapter.java122
-rw-r--r--src/asm/scala/tools/asm/util/CheckMethodAdapter.java1542
-rw-r--r--src/asm/scala/tools/asm/util/CheckSignatureAdapter.java330
-rw-r--r--src/asm/scala/tools/asm/util/Printer.java589
-rw-r--r--src/asm/scala/tools/asm/util/Textifiable.java56
-rw-r--r--src/asm/scala/tools/asm/util/Textifier.java1459
-rw-r--r--src/asm/scala/tools/asm/util/TraceAnnotationVisitor.java89
-rw-r--r--src/asm/scala/tools/asm/util/TraceClassVisitor.java220
-rw-r--r--src/asm/scala/tools/asm/util/TraceFieldVisitor.java87
-rw-r--r--src/asm/scala/tools/asm/util/TraceMethodVisitor.java292
-rw-r--r--src/asm/scala/tools/asm/util/TraceSignatureVisitor.java317
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala39
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala3
-rw-r--r--src/compiler/scala/tools/nsc/settings/ScalaSettings.scala3
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala9
-rw-r--r--src/compiler/scala/tools/nsc/transform/Delambdafy.scala103
-rw-r--r--src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala17
-rw-r--r--src/compiler/scala/tools/nsc/transform/UnCurry.scala6
-rw-r--r--src/compiler/scala/tools/nsc/transform/patmat/Logic.scala3
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala2
-rw-r--r--src/intellij-14/README12
-rw-r--r--src/intellij-14/asm.iml.SAMPLE12
-rw-r--r--src/intellij-14/compiler.iml.SAMPLE16
-rwxr-xr-xsrc/intellij-14/diff.sh8
-rw-r--r--src/intellij-14/forkjoin.iml.SAMPLE11
-rw-r--r--src/intellij-14/interactive.iml.SAMPLE16
-rw-r--r--src/intellij-14/library.iml.SAMPLE13
-rw-r--r--src/intellij-14/manual.iml.SAMPLE15
-rw-r--r--src/intellij-14/partest-extras.iml.SAMPLE18
-rw-r--r--src/intellij-14/partest-javaagent.iml.SAMPLE13
-rw-r--r--src/intellij-14/reflect.iml.SAMPLE13
-rw-r--r--src/intellij-14/repl.iml.SAMPLE17
-rw-r--r--src/intellij-14/scala.iml.SAMPLE11
-rw-r--r--src/intellij-14/scala.ipr.SAMPLE260
-rw-r--r--src/intellij-14/scaladoc.iml.SAMPLE18
-rw-r--r--src/intellij-14/scalap.iml.SAMPLE15
-rwxr-xr-xsrc/intellij-14/setup.sh17
-rw-r--r--src/intellij-14/test-junit.iml.SAMPLE21
-rw-r--r--src/intellij-14/test.iml.SAMPLE21
-rwxr-xr-xsrc/intellij-14/update.sh22
-rw-r--r--src/intellij/README4
-rw-r--r--src/intellij/asm.iml.SAMPLE3
-rw-r--r--src/intellij/compiler.iml.SAMPLE18
-rw-r--r--src/intellij/forkjoin.iml.SAMPLE3
-rw-r--r--src/intellij/interactive.iml.SAMPLE18
-rw-r--r--src/intellij/library.iml.SAMPLE17
-rw-r--r--src/intellij/manual.iml.SAMPLE17
-rw-r--r--src/intellij/partest-extras.iml.SAMPLE17
-rw-r--r--src/intellij/partest-javaagent.iml.SAMPLE5
-rw-r--r--src/intellij/reflect.iml.SAMPLE16
-rw-r--r--src/intellij/repl.iml.SAMPLE18
-rw-r--r--src/intellij/scala-lang.ipr.SAMPLE286
-rw-r--r--src/intellij/scala.iml.SAMPLE3
-rw-r--r--src/intellij/scala.ipr.SAMPLE127
-rw-r--r--src/intellij/scaladoc.iml.SAMPLE20
-rw-r--r--src/intellij/scalap.iml.SAMPLE17
-rwxr-xr-xsrc/intellij/setup.sh3
-rw-r--r--src/intellij/test-junit.iml.SAMPLE21
-rw-r--r--src/intellij/test-osgi.iml.SAMPLE22
-rw-r--r--src/intellij/test.iml.SAMPLE23
-rw-r--r--src/library/scala/Array.scala2
-rw-r--r--src/library/scala/Predef.scala6
-rw-r--r--src/library/scala/collection/GenSeqLike.scala1
-rw-r--r--src/library/scala/util/Try.scala4
-rw-r--r--src/reflect/scala/reflect/api/Constants.scala2
-rw-r--r--src/reflect/scala/reflect/internal/Definitions.scala4
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala2
-rw-r--r--src/reflect/scala/reflect/internal/transform/Erasure.scala2
-rw-r--r--src/reflect/scala/reflect/runtime/JavaMirrors.scala1
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala127
-rw-r--r--src/scalap/scala/tools/scalap/Main.scala1
-rw-r--r--src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala22
-rw-r--r--test/disabled/presentation/timeofday/src/timeofday.scala4
-rw-r--r--test/files/neg/virtpatmat_exhaust_big.check (renamed from src/intellij/test/files/neg/virtpatmat_exhaust_big.check)0
-rw-r--r--test/files/neg/virtpatmat_exhaust_big.flags (renamed from src/intellij/test/files/neg/virtpatmat_exhaust_big.flags)0
-rw-r--r--test/files/neg/virtpatmat_exhaust_big.scala (renamed from src/intellij/test/files/neg/virtpatmat_exhaust_big.scala)0
-rw-r--r--test/files/pos/t9285.flags1
-rw-r--r--test/files/pos/t9285.scala1
-rw-r--r--test/files/pos/virtpatmat_exhaust_big.scala (renamed from src/intellij/test/files/pos/virtpatmat_exhaust_big.scala)3
-rw-r--r--test/files/run/disable-assertions.flags1
-rw-r--r--test/files/run/disable-assertions.scala14
-rw-r--r--test/files/run/reify_timeofday.scala4
-rw-r--r--test/files/run/t2318.scala1
-rw-r--r--test/files/run/t9298/Test.java7
-rw-r--r--test/files/run/t9298/VC.scala5
-rw-r--r--test/files/run/t9298b/Test.java7
-rw-r--r--test/files/run/t9298b/VC.scala8
-rw-r--r--test/files/scalap/t8679.check3503
-rw-r--r--test/files/scalap/t8679.scala3502
-rwxr-xr-xtools/binary-repo-lib.sh6
-rw-r--r--versions.properties1
170 files changed, 7550 insertions, 33038 deletions
diff --git a/README.md b/README.md
index 3729f9eeb8..ba269dd71f 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ scala/
+---/reflect Scala Reflection.
+---/compiler Scala Compiler.
+---/eclipse Eclipse project files.
- +---/intellij-14 IntelliJ project templates.
+ +---/intellij IntelliJ project templates.
+--scripts/ Scripts for the CI jobs (including building releases)
+--test/ The Scala test suite.
+--build/ [Generated] Build products output directory for ant.
@@ -118,8 +118,8 @@ Use the latest IntelliJ IDEA release and install the Scala plugin from within th
The following steps are required to use IntelliJ IDEA on Scala trunk
- Run `ant init`. This will download some JARs to `./build/deps`, which are included in IntelliJ's classpath.
- - Run src/intellij-14/setup.sh
- - Open ./src/intellij-14/scala.ipr in IntelliJ
+ - Run src/intellij/setup.sh
+ - Open ./src/intellij/scala.ipr in IntelliJ
- File, Project Settings, Project, SDK. Create an SDK entry named "1.6" containing the Java 1.6 SDK.
(You may use a later SDK for local development, but the CI will verify against Java 6.)
diff --git a/build-ant-macros.xml b/build-ant-macros.xml
index 246ff01a39..c44a361374 100644
--- a/build-ant-macros.xml
+++ b/build-ant-macros.xml
@@ -91,7 +91,7 @@
<macrodef name="simple-javac">
<attribute name="project"/>
- <!-- project: asm/forkjoin -->
+ <!-- project: forkjoin -->
<attribute name="args" default=""/>
<attribute name="jar" default="yes"/>
<sequential>
@@ -371,6 +371,10 @@
<then>
<mkdir dir="${build-pack.dir}/${@{project}.targetdir}"/>
<pre/>
+ <!-- can't check if a fileset is defined, so we have an additional property -->
+ <if><not><isset property="pack.@{project}.include-jars.defined"/></not><then>
+ <fileset id="pack.@{project}.include-jars" dir="." excludes="**" />
+ </then></if>
<if>
<not>
<equals arg1="@{manifest}" arg2=""/>
@@ -380,6 +384,7 @@
<!-- update="true" makes no difference on my machine, so starting from scratch-->
<jar-opts/>
<path refid="pack.@{project}.files"/>
+ <zipgroupfileset refid="pack.@{project}.include-jars"/>
</jar>
</then>
<else>
diff --git a/build.sbt b/build.sbt
index 0df2e6a800..553c217d4a 100644
--- a/build.sbt
+++ b/build.sbt
@@ -61,6 +61,7 @@ val partestDep = withoutScalaLang("org.scala-lang.modules" %% "scala-partest" %
val partestInterfaceDep = withoutScalaLang("org.scala-lang.modules" %% "scala-partest-interface" % "0.5.0")
val junitDep = "junit" % "junit" % "4.11"
val junitIntefaceDep = "com.novocode" % "junit-interface" % "0.11" % "test"
+val asmDep = "org.scala-lang.modules" % "scala-asm" % versionProps("scala-asm.version")
val jlineDep = "jline" % "jline" % versionProps("jline.version")
val antDep = "org.apache.ant" % "ant" % "1.9.4"
val scalacheckDep = withoutScalaLang("org.scalacheck" %% "scalacheck" % "1.11.4")
@@ -169,17 +170,22 @@ lazy val compiler = configureAsSubproject(project)
.settings(generatePropertiesFileSettings: _*)
.settings(
name := "scala-compiler",
- libraryDependencies += antDep,
+ libraryDependencies ++= Seq(antDep, asmDep),
// this a way to make sure that classes from interactive and scaladoc projects
// end up in compiler jar (that's what Ant build does)
// we need to use LocalProject references (with strings) to deal with mutual recursion
mappings in Compile in packageBin :=
(mappings in Compile in packageBin).value ++
+ dependencyClasses(
+ (externalDependencyClasspath in Compile).value,
+ modules = Set(asmDep),
+ keep = "*.class" || "scala-asm.properties",
+ streams.value.cacheDirectory) ++
(mappings in Compile in packageBin in LocalProject("interactive")).value ++
(mappings in Compile in packageBin in LocalProject("scaladoc")).value ++
(mappings in Compile in packageBin in LocalProject("repl")).value,
includeFilter in unmanagedResources in Compile := compilerIncludes)
- .dependsOn(library, reflect, asm)
+ .dependsOn(library, reflect)
lazy val interactive = configureAsSubproject(project)
.settings(disableDocsAndPublishingTasks: _*)
@@ -209,8 +215,6 @@ lazy val actors = configureAsSubproject(project)
lazy val forkjoin = configureAsForkOfJavaProject(project)
-lazy val asm = configureAsForkOfJavaProject(project)
-
lazy val partestExtras = configureAsSubproject(Project("partest-extras", file(".") / "src" / "partest-extras"))
.dependsOn(repl)
.settings(clearSourceAndResourceDirectories: _*)
@@ -231,9 +235,9 @@ lazy val junit = project.in(file("test") / "junit")
)
lazy val partestJavaAgent = (project in file(".") / "src" / "partest-javaagent").
- dependsOn(asm).
settings(commonSettings: _*).
settings(
+ libraryDependencies += asmDep,
doc := file("!!! NO DOCS !!!"),
publishLocal := {},
publish := {},
@@ -249,13 +253,13 @@ lazy val partestJavaAgent = (project in file(".") / "src" / "partest-javaagent")
)
lazy val test = project.
- dependsOn(compiler, interactive, actors, repl, scalap, partestExtras, partestJavaAgent, asm, scaladoc).
+ dependsOn(compiler, interactive, actors, repl, scalap, partestExtras, partestJavaAgent, scaladoc).
configs(IntegrationTest).
settings(disableDocsAndPublishingTasks: _*).
settings(commonSettings: _*).
settings(Defaults.itSettings: _*).
settings(
- libraryDependencies ++= Seq(partestDep, scalaXmlDep, partestInterfaceDep, scalacheckDep),
+ libraryDependencies ++= Seq(asmDep, partestDep, scalaXmlDep, partestInterfaceDep, scalacheckDep),
unmanagedBase in Test := baseDirectory.value / "files" / "lib",
unmanagedJars in Test <+= (unmanagedBase) (j => Attributed.blank(j)) map(identity),
// no main sources
@@ -279,7 +283,7 @@ lazy val test = project.
)
lazy val root = (project in file(".")).
- aggregate(library, forkjoin, reflect, compiler, asm, interactive, repl,
+ aggregate(library, forkjoin, reflect, compiler, interactive, repl,
scaladoc, scalap, actors, partestExtras, junit).settings(
sources in Compile := Seq.empty,
onLoadMessage := """|*** Welcome to the sbt build definition for Scala! ***
@@ -310,7 +314,7 @@ def configureAsSubproject(project: Project): Project = {
/**
* Configuration for subprojects that are forks of some Java projects
- * we depend on. At the moment there are just two: asm and forkjoin.
+ * we depend on. At the moment there's just forkjoin.
*
* We do not publish artifacts for those projects but we package their
* binaries in a jar of other project (compiler or library).
@@ -382,6 +386,50 @@ lazy val generateVersionPropertiesFileImpl: Def.Initialize[Task[File]] = Def.tas
propFile
}
+/**
+ * Extract selected dependencies to the `cacheDirectory` and return a mapping for the content.
+ * Heavily inspired by sbt-assembly (https://github.com/sbt/sbt-assembly/blob/0.13.0/src/main/scala/sbtassembly/Assembly.scala#L157)
+ */
+def dependencyClasses(dependencies: Classpath, modules: Set[ModuleID], keep: FileFilter, cacheDirectory: File): Seq[(File, String)] = {
+ val dependencyFiles: Seq[File] = dependencies.map(_.data).toSeq
+ val toInclude = dependencyFiles.filter(f => {
+ val p = f.getCanonicalPath
+ modules.exists(m => {
+ // works for both .m2 (org/scala-lang/modules/scala-asm/5.0.3-scala-3/scala-asm-5.0.3-scala-3.jar)
+ // and .ivy2 (org.scala-lang.modules/scala-asm/5.0.3-scala-3/bundles/scala-asm.jar)
+ val nameParts = m.organization.split('.').toSet + m.name + m.revision
+ nameParts.forall(p.contains)
+ })
+ })
+ assert(toInclude.forall(sbt.classpath.ClasspathUtilities.isArchive), s"Expected JAR files as dependencies: $toInclude")
+
+ val tempDir = cacheDirectory / "unpackedDependencies"
+
+ def sha1name(f: File): String = bytesToSha1String(f.getCanonicalPath.getBytes("UTF-8"))
+ def sha1content(f: File): String = bytesToSha1String(IO.readBytes(f))
+ def bytesToSha1String(bytes: Array[Byte]): String = {
+ val sha1 = java.security.MessageDigest.getInstance("SHA-1")
+ val hash = sha1.digest(bytes)
+ hash map {"%02x".format(_)} mkString
+ }
+
+ val jarDirs: Seq[File] = for (jar <- toInclude) yield {
+ val jarName = jar.getName
+ val hash = sha1name(jar) + "_" + sha1content(jar)
+ val jarNamePath = tempDir / (hash + ".jarName")
+ val dest = tempDir / hash
+ if (!jarNamePath.exists || IO.read(jarNamePath) != jar.getCanonicalPath) {
+ IO.delete(dest)
+ dest.mkdir()
+ IO.unzip(jar, dest)
+ IO.write(jarNamePath, jar.getCanonicalPath, IO.utf8, append = false)
+ }
+ dest
+ }
+
+ jarDirs.flatMap(dir => dir ** keep --- dir pair relativeTo(dir))
+}
+
// Defining these settings is somewhat redundant as we also redefine settings that depend on them.
// However, IntelliJ's project import works better when these are set correctly.
def clearSourceAndResourceDirectories = Seq(Compile, Test).flatMap(config => inConfig(config)(Seq(
diff --git a/build.xml b/build.xml
index 4aa8683824..31ed78d6dc 100755
--- a/build.xml
+++ b/build.xml
@@ -165,7 +165,6 @@ TODO:
<property name="build.dir" value="${basedir}/build"/>
<property name="build-deps.dir" value="${build.dir}/deps"/>
<property name="build-libs.dir" value="${build.dir}/libs"/>
- <property name="build-asm.dir" value="${build-libs.dir}"/>
<property name="build-forkjoin.dir" value="${build-libs.dir}"/>
<property name="build-locker.dir" value="${build.dir}/locker"/>
<property name="build-quick.dir" value="${build.dir}/quick"/>
@@ -266,6 +265,11 @@ TODO:
-->
<if><not><isset property="maven-deps-done"></isset></not><then>
<mkdir dir="${user.home}/.m2/repository"/>
+
+ <artifact:remoteRepository id="sonatype-release" url="https://oss.sonatype.org/content/repositories/releases"/>
+ <artifact:remoteRepository id="sonatype-snapshots" url="https://oss.sonatype.org/content/repositories/snapshots"/>
+ <artifact:remoteRepository id="extra-repo" url="${extra.repo.url}"/>
+
<!-- This task has an issue where if the user directory does not exist, so we create it above. UGH. -->
<artifact:dependencies pathId="extra.tasks.classpath" filesetId="extra.tasks.fileset">
<dependency groupId="biz.aQute" artifactId="bnd" version="1.50.0"/>
@@ -307,6 +311,36 @@ TODO:
<artifact:remoteRepository id="sonatype-release" url="https://oss.sonatype.org/content/repositories/releases"/>
<artifact:remoteRepository id="extra-repo" url="${extra.repo.url}"/>
+ <!-- scala-java8-compat, used by the experimental -target jvm-1.8 support. -->
+ <if><isset property="scala-java8-compat.package"/><then>
+ <property name="scala-java8-compat.version" value="0.2.0"/>
+ <property name="scala-java8-compat.binary.version" value="2.11"/>
+ <artifact:dependencies pathId="scala-java8-compat.classpath" filesetId="scala-java8-compat.fileset">
+ <dependency groupId="org.scala-lang.modules" artifactId="scala-java8-compat_${scala-java8-compat.binary.version}" version="${scala-java8-compat.version}">
+ <exclusion groupId="org.scala-lang" artifactId="scala-library"/>
+ </dependency>
+ </artifact:dependencies>
+ <property name="scala-java8-compat-classes" value="${build-quick.dir}/scala-java8-compat"/>
+ <delete dir="${scala-java8-compat-classes}"/>
+ <unzip dest="${scala-java8-compat-classes}">
+ <fileset refid="scala-java8-compat.fileset"/>
+ <patternset>
+ <include name="**/*.class"/>
+ </patternset>
+ </unzip>
+ <path id="scala-java8-compat.libs">
+ <pathelement location="${scala-java8-compat-classes}"/>
+ </path>
+ <fileset id="scala-java8-compat.fileset" dir="${scala-java8-compat-classes}">
+ <include name="**/*"/>
+ </fileset>
+ </then>
+ <else>
+ <path id="scala-java8-compat.libs"/>
+ <fileset id="scala-java8-compat.fileset" dir="." excludes="**"/>
+ </else>
+ </if>
+
<!-- prepare, for each of the names below, the property "@{name}.cross", set to the
necessary cross suffix (usually something like "_2.11.0-M6". -->
<prepareCross name="scala-xml" />
@@ -315,6 +349,11 @@ TODO:
<prepareCross name="partest"/>
<prepareCross name="scalacheck"/>
+ <artifact:dependencies pathId="asm.classpath" filesetId="asm.fileset">
+ <dependency groupId="org.scala-lang.modules" artifactId="scala-asm" version="${scala-asm.version}"/>
+ </artifact:dependencies>
+ <copy-deps project="asm"/>
+
<!-- TODO: delay until absolutely necessary to allow minimal build, also move out partest dependency from scaladoc -->
<artifact:dependencies pathId="partest.classpath" filesetId="partest.fileset" versionsId="partest.versions">
<!-- uncomment the following if you're deploying your own partest locally -->
@@ -572,9 +611,7 @@ TODO:
</then></if>
<path id="forkjoin.classpath" path="${build-forkjoin.dir}/classes/forkjoin"/>
- <path id="asm.classpath" path="${build-asm.dir}/classes/asm"/>
<property name="forkjoin-classes" refid="forkjoin.classpath"/>
- <property name="asm-classes" refid="asm.classpath"/>
<!-- the following properties fully define staged-docs, staged-pack, make-bundle, copy-bundle and mvn-package for each of the projects -->
<property name="library.description" value="Scala Standard Library"/>
@@ -627,7 +664,7 @@ TODO:
<property name="partest-extras.description" value="Scala Compiler Testing Tool (compiler-specific extras)"/>
<property name="partest-javaagent.description" value="Scala Compiler Testing Tool (compiler-specific java agent)"/>
- <!-- projects without project-specific options: asm, forkjoin, manual, bin, repl -->
+ <!-- projects without project-specific options: forkjoin, manual, bin, repl -->
<for list="compiler,interactive,scaladoc,library,parser-combinators,partest,partest-extras,partest-javaagent,reflect,scalap,swing,xml" param="project">
<sequential>
<!-- description is mandatory -->
@@ -687,6 +724,7 @@ TODO:
<pathelement location="${build-locker.dir}/classes/library"/>
<path refid="forkjoin.classpath"/>
<path refid="aux.libs"/>
+ <path refid="scala-java8-compat.libs"/>
</path>
<path id="locker.reflect.build.path">
@@ -708,6 +746,7 @@ TODO:
<pathelement location="${build-quick.dir}/classes/library"/>
<path refid="forkjoin.classpath"/>
<path refid="aux.libs"/>
+ <path refid="scala-java8-compat.libs"/>
</path>
<path id="quick.reflect.build.path">
@@ -789,6 +828,7 @@ TODO:
<path id="pack.library.files">
<fileset dir="${build-quick.dir}/classes/library"/>
<fileset dir="${forkjoin-classes}"/>
+ <fileset refid="scala-java8-compat.fileset"/>
</path>
<path id="pack.compiler.files">
@@ -798,8 +838,9 @@ TODO:
<fileset dir="${build-quick.dir}/classes/scaladoc"/>
<fileset dir="${build-quick.dir}/classes/interactive"/>
<fileset dir="${build-quick.dir}/classes/repl"/>
- <fileset dir="${asm-classes}"/>
</path>
+ <fileset id="pack.compiler.include-jars" refid="asm.fileset"/>
+ <property name="pack.compiler.include-jars.defined" value="yeah"/>
<!-- TODO modularize compiler.
<path id="pack.scaladoc.files"> <fileset dir="${build-quick.dir}/classes/scaladoc"/> </path>
@@ -994,9 +1035,9 @@ TODO:
<!-- ===========================================================================
CLEANLINESS
=============================================================================-->
- <target name="libs.clean"> <clean build="libs"/> <clean build="asm"/> </target>
- <target name="quick.clean" depends="libs.clean"> <clean build="quick"/> <clean build="pack"/> <clean build="strap"/> </target>
- <target name="locker.clean" depends="quick.clean"> <clean build="locker"/> </target>
+ <target name="libs.clean"> <clean build="libs"/> </target>
+ <target name="quick.clean" depends="libs.clean"> <clean build="quick"/> <clean build="pack"/> <clean build="strap"/> </target>
+ <target name="locker.clean" depends="quick.clean"> <clean build="locker"/> </target>
<target name="docs.clean"> <clean build="docs"/> <delete dir="${build.dir}/manmaker" includeemptydirs="yes" quiet="yes" failonerror="no"/> </target>
<target name="dist.clean"> <delete dir="${dists.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> </target>
@@ -1014,7 +1055,6 @@ TODO:
LOCAL DEPENDENCIES
============================================================================ -->
- <target name="asm.done" depends="init"> <simple-javac project="asm" jar="no"/> </target>
<target name="forkjoin.done" depends="init"> <simple-javac project="forkjoin" args="-XDignore.symbol.file" jar="no"/></target>
<!-- For local development only. We only allow released versions of Scala for STARR.
@@ -1037,7 +1077,7 @@ TODO:
<!-- ===========================================================================
LOCAL REFERENCE BUILD (LOCKER)
============================================================================ -->
- <target name="locker.start" depends="asm.done, forkjoin.done">
+ <target name="locker.start" depends="forkjoin.done">
<condition property="locker.locked"><available file="${build-locker.dir}/locker.locked"/></condition></target>
<target name="locker.lib" depends="locker.start" unless="locker.locked">
@@ -1102,7 +1142,7 @@ TODO:
<target name="pack.reflect" depends="quick.reflect"> <staged-pack project="reflect"/> </target>
<!-- TODO modularize compiler. Remove other quick targets when they become modules. -->
- <target name="pack.comp" depends="quick.comp, quick.scaladoc, quick.interactive, quick.repl, asm.done">
+ <target name="pack.comp" depends="quick.comp, quick.scaladoc, quick.interactive, quick.repl">
<staged-pack project="compiler" manifest="${build-pack.dir}/META-INF/MANIFEST.MF">
<pre> <!-- TODO the files copied here do not influence actuality of this target (nor does the manifest) -->
<copy todir="${build-pack.dir}/lib">
diff --git a/scripts/jobs/integrate/bootstrap b/scripts/jobs/integrate/bootstrap
index 56e23a51b4..ccc62c0d45 100755
--- a/scripts/jobs/integrate/bootstrap
+++ b/scripts/jobs/integrate/bootstrap
@@ -114,6 +114,7 @@ mkdir -p $baseDir/resolutionScratch_
# repo used to publish "locker" scala to (to start the bootstrap)
releaseTempRepoCred="private-repo"
releaseTempRepoUrl=${releaseTempRepoUrl-"https://scala-ci.typesafe.com/artifactory/scala-release-temp/"}
+jcenterCacheUrl=${jcenterCacheUrl-"https://scala-ci.typesafe.com/artifactory/jcenter/"}
# Used below in sbtArgs since we use a dedicated repository to share artifcacts between jobs,
# so we need to configure SBT to use these rather than its default, Maven Central.
@@ -121,10 +122,10 @@ releaseTempRepoUrl=${releaseTempRepoUrl-"https://scala-ci.typesafe.com/artifacto
sbtRepositoryConfig="$scriptsDir/repositories-scala-release"
cat > "$sbtRepositoryConfig" << EOF
[repositories]
- plugins: http://dl.bintray.com/sbt/sbt-plugin-releases/, [organisation]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
private-repo: $releaseTempRepoUrl
- typesafe-ivy-releases: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
- sbt-plugin-releases: http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
+ jcenter-cache: $jcenterCacheUrl
+ typesafe-ivy-releases: https://dl.bintray.com/typesafe/ivy-releases/, [organisation]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
+ sbt-plugin-releases: https://dl.bintray.com/sbt/sbt-plugin-releases/, [organisation]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
maven-central
local
EOF
diff --git a/scripts/jobs/integrate/ide b/scripts/jobs/integrate/ide
index 447f34f937..c39facbc3d 100755
--- a/scripts/jobs/integrate/ide
+++ b/scripts/jobs/integrate/ide
@@ -26,7 +26,7 @@ echo "maven.version.number=$scalaVersion" >> versions.properties
# pass prRepoUrl in, which uber-build passes along to dbuild (in sbt-builds-for-ide)
# the "-P pr-scala" maven arg accomplishes the same thing for maven (directly used in uber-build)
-BASEDIR="$baseDir" prRepoUrl="$prRepoUrl" MAVEN_ARGS="-P pr-scala"\
+BASEDIR="$baseDir" prRepoUrl="$prRepoUrl" IDE_M2_REPO="$prRepoUrl" MAVEN_ARGS="-P pr-scala"\
$uberBuildDir/uber-build.sh $uberBuildDir/config/$uberBuildConfig $repo_ref $scalaVersion
# uber-build puts its local repo under target/m2repo
diff --git a/src/asm/README b/src/asm/README
deleted file mode 100644
index 58d555acde..0000000000
--- a/src/asm/README
+++ /dev/null
@@ -1,37 +0,0 @@
-Version 5.0.3, SVN r1748, tags/ASM_5_0_3
-
-Git SVN repo: https://github.com/lrytz/asm
- - git svn howto: https://github.com/lrytz/asm/issues/1
-
-Upgrading ASM
--------------
-
-Check the commit history of src/asm: https://github.com/scala/scala/commits/2.11.x/src/asm.
-Find the previous commit that upgraded ASM and take a look at its commit message. It should
-be a squashed version of a pull request that shows the precise procedure how the last upgrade
-was made.
-
-Start by deleting all source files in src/asm/ and copy the ones from the latest ASM release.
-
-Excluded Files (don't copy):
- - package.html files
- - org/objectweb/asm/commons, but keep CodeSizeEvaluator.java
- - org/objectweb/asm/optimizer
- - org/objectweb/asm/xml
-
-Re-packaging and cosmetic changes:
- - convert line endings (there are some CRLF)
- find src/asm/scala/tools/asm -name '*.java' | xargs dos2unix
- - change package clauses
- find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/package org\.objectweb\.asm/package scala.tools.asm/'
- - update imports
- find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/import org\.objectweb\.asm/import scala.tools.asm/'
- - update @links, @associates
- find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/@link org\.objectweb\.asm/@link scala.tools.asm/'
- find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/@associates org\.objectweb\.asm/@associates scala.tools.asm/'
- - remove trailing whitespace
- find src/asm/scala/tools/asm -name '*.java' | xargs sed -i '' -e 's/[ ]*$//'
-
-Include the actual changes that we have in our repostiory
- - Include the commits labelled [asm-cherry-pick] in the non-squashed PR of the previous upgrade
- - Include the changes that were added to src/asm since the last upgrade and label them [asm-cherry-pick]
diff --git a/src/asm/scala/tools/asm/AnnotationVisitor.java b/src/asm/scala/tools/asm/AnnotationVisitor.java
deleted file mode 100644
index abcaf1d6d1..0000000000
--- a/src/asm/scala/tools/asm/AnnotationVisitor.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A visitor to visit a Java annotation. The methods of this class must be
- * called in the following order: ( <tt>visit</tt> | <tt>visitEnum</tt> |
- * <tt>visitAnnotation</tt> | <tt>visitArray</tt> )* <tt>visitEnd</tt>.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public abstract class AnnotationVisitor {
-
- /**
- * The ASM API version implemented by this visitor. The value of this field
- * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- protected final int api;
-
- /**
- * The annotation visitor to which this visitor must delegate method calls.
- * May be null.
- */
- protected AnnotationVisitor av;
-
- /**
- * Constructs a new {@link AnnotationVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- public AnnotationVisitor(final int api) {
- this(api, null);
- }
-
- /**
- * Constructs a new {@link AnnotationVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param av
- * the annotation visitor to which this visitor must delegate
- * method calls. May be null.
- */
- public AnnotationVisitor(final int api, final AnnotationVisitor av) {
- if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
- throw new IllegalArgumentException();
- }
- this.api = api;
- this.av = av;
- }
-
- /**
- * Visits a primitive value of the annotation.
- *
- * @param name
- * the value name.
- * @param value
- * the actual value, whose type must be {@link Byte},
- * {@link Boolean}, {@link Character}, {@link Short},
- * {@link Integer} , {@link Long}, {@link Float}, {@link Double},
- * {@link String} or {@link Type} or OBJECT or ARRAY sort. This
- * value can also be an array of byte, boolean, short, char, int,
- * long, float or double values (this is equivalent to using
- * {@link #visitArray visitArray} and visiting each array element
- * in turn, but is more convenient).
- */
- public void visit(String name, Object value) {
- if (av != null) {
- av.visit(name, value);
- }
- }
-
- /**
- * Visits an enumeration value of the annotation.
- *
- * @param name
- * the value name.
- * @param desc
- * the class descriptor of the enumeration class.
- * @param value
- * the actual enumeration value.
- */
- public void visitEnum(String name, String desc, String value) {
- if (av != null) {
- av.visitEnum(name, desc, value);
- }
- }
-
- /**
- * Visits a nested annotation value of the annotation.
- *
- * @param name
- * the value name.
- * @param desc
- * the class descriptor of the nested annotation class.
- * @return a visitor to visit the actual nested annotation value, or
- * <tt>null</tt> if this visitor is not interested in visiting this
- * nested annotation. <i>The nested annotation value must be fully
- * visited before calling other methods on this annotation
- * visitor</i>.
- */
- public AnnotationVisitor visitAnnotation(String name, String desc) {
- if (av != null) {
- return av.visitAnnotation(name, desc);
- }
- return null;
- }
-
- /**
- * Visits an array value of the annotation. Note that arrays of primitive
- * types (such as byte, boolean, short, char, int, long, float or double)
- * can be passed as value to {@link #visit visit}. This is what
- * {@link ClassReader} does.
- *
- * @param name
- * the value name.
- * @return a visitor to visit the actual array value elements, or
- * <tt>null</tt> if this visitor is not interested in visiting these
- * values. The 'name' parameters passed to the methods of this
- * visitor are ignored. <i>All the array values must be visited
- * before calling other methods on this annotation visitor</i>.
- */
- public AnnotationVisitor visitArray(String name) {
- if (av != null) {
- return av.visitArray(name);
- }
- return null;
- }
-
- /**
- * Visits the end of the annotation.
- */
- public void visitEnd() {
- if (av != null) {
- av.visitEnd();
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/AnnotationWriter.java b/src/asm/scala/tools/asm/AnnotationWriter.java
deleted file mode 100644
index 6de74ce041..0000000000
--- a/src/asm/scala/tools/asm/AnnotationWriter.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * An {@link AnnotationVisitor} that generates annotations in bytecode form.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-final class AnnotationWriter extends AnnotationVisitor {
-
- /**
- * The class writer to which this annotation must be added.
- */
- private final ClassWriter cw;
-
- /**
- * The number of values in this annotation.
- */
- private int size;
-
- /**
- * <tt>true<tt> if values are named, <tt>false</tt> otherwise. Annotation
- * writers used for annotation default and annotation arrays use unnamed
- * values.
- */
- private final boolean named;
-
- /**
- * The annotation values in bytecode form. This byte vector only contains
- * the values themselves, i.e. the number of values must be stored as a
- * unsigned short just before these bytes.
- */
- private final ByteVector bv;
-
- /**
- * The byte vector to be used to store the number of values of this
- * annotation. See {@link #bv}.
- */
- private final ByteVector parent;
-
- /**
- * Where the number of values of this annotation must be stored in
- * {@link #parent}.
- */
- private final int offset;
-
- /**
- * Next annotation writer. This field is used to store annotation lists.
- */
- AnnotationWriter next;
-
- /**
- * Previous annotation writer. This field is used to store annotation lists.
- */
- AnnotationWriter prev;
-
- // ------------------------------------------------------------------------
- // Constructor
- // ------------------------------------------------------------------------
-
- /**
- * Constructs a new {@link AnnotationWriter}.
- *
- * @param cw
- * the class writer to which this annotation must be added.
- * @param named
- * <tt>true<tt> if values are named, <tt>false</tt> otherwise.
- * @param bv
- * where the annotation values must be stored.
- * @param parent
- * where the number of annotation values must be stored.
- * @param offset
- * where in <tt>parent</tt> the number of annotation values must
- * be stored.
- */
- AnnotationWriter(final ClassWriter cw, final boolean named,
- final ByteVector bv, final ByteVector parent, final int offset) {
- super(Opcodes.ASM5);
- this.cw = cw;
- this.named = named;
- this.bv = bv;
- this.parent = parent;
- this.offset = offset;
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the AnnotationVisitor abstract class
- // ------------------------------------------------------------------------
-
- @Override
- public void visit(final String name, final Object value) {
- ++size;
- if (named) {
- bv.putShort(cw.newUTF8(name));
- }
- if (value instanceof String) {
- bv.put12('s', cw.newUTF8((String) value));
- } else if (value instanceof Byte) {
- bv.put12('B', cw.newInteger(((Byte) value).byteValue()).index);
- } else if (value instanceof Boolean) {
- int v = ((Boolean) value).booleanValue() ? 1 : 0;
- bv.put12('Z', cw.newInteger(v).index);
- } else if (value instanceof Character) {
- bv.put12('C', cw.newInteger(((Character) value).charValue()).index);
- } else if (value instanceof Short) {
- bv.put12('S', cw.newInteger(((Short) value).shortValue()).index);
- } else if (value instanceof Type) {
- bv.put12('c', cw.newUTF8(((Type) value).getDescriptor()));
- } else if (value instanceof byte[]) {
- byte[] v = (byte[]) value;
- bv.put12('[', v.length);
- for (int i = 0; i < v.length; i++) {
- bv.put12('B', cw.newInteger(v[i]).index);
- }
- } else if (value instanceof boolean[]) {
- boolean[] v = (boolean[]) value;
- bv.put12('[', v.length);
- for (int i = 0; i < v.length; i++) {
- bv.put12('Z', cw.newInteger(v[i] ? 1 : 0).index);
- }
- } else if (value instanceof short[]) {
- short[] v = (short[]) value;
- bv.put12('[', v.length);
- for (int i = 0; i < v.length; i++) {
- bv.put12('S', cw.newInteger(v[i]).index);
- }
- } else if (value instanceof char[]) {
- char[] v = (char[]) value;
- bv.put12('[', v.length);
- for (int i = 0; i < v.length; i++) {
- bv.put12('C', cw.newInteger(v[i]).index);
- }
- } else if (value instanceof int[]) {
- int[] v = (int[]) value;
- bv.put12('[', v.length);
- for (int i = 0; i < v.length; i++) {
- bv.put12('I', cw.newInteger(v[i]).index);
- }
- } else if (value instanceof long[]) {
- long[] v = (long[]) value;
- bv.put12('[', v.length);
- for (int i = 0; i < v.length; i++) {
- bv.put12('J', cw.newLong(v[i]).index);
- }
- } else if (value instanceof float[]) {
- float[] v = (float[]) value;
- bv.put12('[', v.length);
- for (int i = 0; i < v.length; i++) {
- bv.put12('F', cw.newFloat(v[i]).index);
- }
- } else if (value instanceof double[]) {
- double[] v = (double[]) value;
- bv.put12('[', v.length);
- for (int i = 0; i < v.length; i++) {
- bv.put12('D', cw.newDouble(v[i]).index);
- }
- } else {
- Item i = cw.newConstItem(value);
- bv.put12(".s.IFJDCS".charAt(i.type), i.index);
- }
- }
-
- @Override
- public void visitEnum(final String name, final String desc,
- final String value) {
- ++size;
- if (named) {
- bv.putShort(cw.newUTF8(name));
- }
- bv.put12('e', cw.newUTF8(desc)).putShort(cw.newUTF8(value));
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String name,
- final String desc) {
- ++size;
- if (named) {
- bv.putShort(cw.newUTF8(name));
- }
- // write tag and type, and reserve space for values count
- bv.put12('@', cw.newUTF8(desc)).putShort(0);
- return new AnnotationWriter(cw, true, bv, bv, bv.length - 2);
- }
-
- @Override
- public AnnotationVisitor visitArray(final String name) {
- ++size;
- if (named) {
- bv.putShort(cw.newUTF8(name));
- }
- // write tag, and reserve space for array size
- bv.put12('[', 0);
- return new AnnotationWriter(cw, false, bv, bv, bv.length - 2);
- }
-
- @Override
- public void visitEnd() {
- if (parent != null) {
- byte[] data = parent.data;
- data[offset] = (byte) (size >>> 8);
- data[offset + 1] = (byte) size;
- }
- }
-
- // ------------------------------------------------------------------------
- // Utility methods
- // ------------------------------------------------------------------------
-
- /**
- * Returns the size of this annotation writer list.
- *
- * @return the size of this annotation writer list.
- */
- int getSize() {
- int size = 0;
- AnnotationWriter aw = this;
- while (aw != null) {
- size += aw.bv.length;
- aw = aw.next;
- }
- return size;
- }
-
- /**
- * Puts the annotations of this annotation writer list into the given byte
- * vector.
- *
- * @param out
- * where the annotations must be put.
- */
- void put(final ByteVector out) {
- int n = 0;
- int size = 2;
- AnnotationWriter aw = this;
- AnnotationWriter last = null;
- while (aw != null) {
- ++n;
- size += aw.bv.length;
- aw.visitEnd(); // in case user forgot to call visitEnd
- aw.prev = last;
- last = aw;
- aw = aw.next;
- }
- out.putInt(size);
- out.putShort(n);
- aw = last;
- while (aw != null) {
- out.putByteArray(aw.bv.data, 0, aw.bv.length);
- aw = aw.prev;
- }
- }
-
- /**
- * Puts the given annotation lists into the given byte vector.
- *
- * @param panns
- * an array of annotation writer lists.
- * @param off
- * index of the first annotation to be written.
- * @param out
- * where the annotations must be put.
- */
- static void put(final AnnotationWriter[] panns, final int off,
- final ByteVector out) {
- int size = 1 + 2 * (panns.length - off);
- for (int i = off; i < panns.length; ++i) {
- size += panns[i] == null ? 0 : panns[i].getSize();
- }
- out.putInt(size).putByte(panns.length - off);
- for (int i = off; i < panns.length; ++i) {
- AnnotationWriter aw = panns[i];
- AnnotationWriter last = null;
- int n = 0;
- while (aw != null) {
- ++n;
- aw.visitEnd(); // in case user forgot to call visitEnd
- aw.prev = last;
- last = aw;
- aw = aw.next;
- }
- out.putShort(n);
- aw = last;
- while (aw != null) {
- out.putByteArray(aw.bv.data, 0, aw.bv.length);
- aw = aw.prev;
- }
- }
- }
-
- /**
- * Puts the given type reference and type path into the given bytevector.
- * LOCAL_VARIABLE and RESOURCE_VARIABLE target types are not supported.
- *
- * @param typeRef
- * a reference to the annotated type. See {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param out
- * where the type reference and type path must be put.
- */
- static void putTarget(int typeRef, TypePath typePath, ByteVector out) {
- switch (typeRef >>> 24) {
- case 0x00: // CLASS_TYPE_PARAMETER
- case 0x01: // METHOD_TYPE_PARAMETER
- case 0x16: // METHOD_FORMAL_PARAMETER
- out.putShort(typeRef >>> 16);
- break;
- case 0x13: // FIELD
- case 0x14: // METHOD_RETURN
- case 0x15: // METHOD_RECEIVER
- out.putByte(typeRef >>> 24);
- break;
- case 0x47: // CAST
- case 0x48: // CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
- case 0x49: // METHOD_INVOCATION_TYPE_ARGUMENT
- case 0x4A: // CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
- case 0x4B: // METHOD_REFERENCE_TYPE_ARGUMENT
- out.putInt(typeRef);
- break;
- // case 0x10: // CLASS_EXTENDS
- // case 0x11: // CLASS_TYPE_PARAMETER_BOUND
- // case 0x12: // METHOD_TYPE_PARAMETER_BOUND
- // case 0x17: // THROWS
- // case 0x42: // EXCEPTION_PARAMETER
- // case 0x43: // INSTANCEOF
- // case 0x44: // NEW
- // case 0x45: // CONSTRUCTOR_REFERENCE
- // case 0x46: // METHOD_REFERENCE
- default:
- out.put12(typeRef >>> 24, (typeRef & 0xFFFF00) >> 8);
- break;
- }
- if (typePath == null) {
- out.putByte(0);
- } else {
- int length = typePath.b[typePath.offset] * 2 + 1;
- out.putByteArray(typePath.b, typePath.offset, length);
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/Attribute.java b/src/asm/scala/tools/asm/Attribute.java
deleted file mode 100644
index ac40a758a2..0000000000
--- a/src/asm/scala/tools/asm/Attribute.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A non standard class, field, method or code attribute.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public class Attribute {
-
- /**
- * The type of this attribute.
- */
- public final String type;
-
- /**
- * The raw value of this attribute, used only for unknown attributes.
- */
- byte[] value;
-
- /**
- * The next attribute in this attribute list. May be <tt>null</tt>.
- */
- Attribute next;
-
- /**
- * Constructs a new empty attribute.
- *
- * @param type
- * the type of the attribute.
- */
- protected Attribute(final String type) {
- this.type = type;
- }
-
- /**
- * Returns <tt>true</tt> if this type of attribute is unknown. The default
- * implementation of this method always returns <tt>true</tt>.
- *
- * @return <tt>true</tt> if this type of attribute is unknown.
- */
- public boolean isUnknown() {
- return true;
- }
-
- /**
- * Returns <tt>true</tt> if this type of attribute is a code attribute.
- *
- * @return <tt>true</tt> if this type of attribute is a code attribute.
- */
- public boolean isCodeAttribute() {
- return false;
- }
-
- /**
- * Returns the labels corresponding to this attribute.
- *
- * @return the labels corresponding to this attribute, or <tt>null</tt> if
- * this attribute is not a code attribute that contains labels.
- */
- protected Label[] getLabels() {
- return null;
- }
-
- /**
- * Reads a {@link #type type} attribute. This method must return a
- * <i>new</i> {@link Attribute} object, of type {@link #type type},
- * corresponding to the <tt>len</tt> bytes starting at the given offset, in
- * the given class reader.
- *
- * @param cr
- * the class that contains the attribute to be read.
- * @param off
- * index of the first byte of the attribute's content in
- * {@link ClassReader#b cr.b}. The 6 attribute header bytes,
- * containing the type and the length of the attribute, are not
- * taken into account here.
- * @param len
- * the length of the attribute's content.
- * @param buf
- * buffer to be used to call {@link ClassReader#readUTF8
- * readUTF8}, {@link ClassReader#readClass(int,char[]) readClass}
- * or {@link ClassReader#readConst readConst}.
- * @param codeOff
- * index of the first byte of code's attribute content in
- * {@link ClassReader#b cr.b}, or -1 if the attribute to be read
- * is not a code attribute. The 6 attribute header bytes,
- * containing the type and the length of the attribute, are not
- * taken into account here.
- * @param labels
- * the labels of the method's code, or <tt>null</tt> if the
- * attribute to be read is not a code attribute.
- * @return a <i>new</i> {@link Attribute} object corresponding to the given
- * bytes.
- */
- protected Attribute read(final ClassReader cr, final int off,
- final int len, final char[] buf, final int codeOff,
- final Label[] labels) {
- Attribute attr = new Attribute(type);
- attr.value = new byte[len];
- System.arraycopy(cr.b, off, attr.value, 0, len);
- return attr;
- }
-
- /**
- * Returns the byte array form of this attribute.
- *
- * @param cw
- * the class to which this attribute must be added. This
- * parameter can be used to add to the constant pool of this
- * class the items that corresponds to this attribute.
- * @param code
- * the bytecode of the method corresponding to this code
- * attribute, or <tt>null</tt> if this attribute is not a code
- * attributes.
- * @param len
- * the length of the bytecode of the method corresponding to this
- * code attribute, or <tt>null</tt> if this attribute is not a
- * code attribute.
- * @param maxStack
- * the maximum stack size of the method corresponding to this
- * code attribute, or -1 if this attribute is not a code
- * attribute.
- * @param maxLocals
- * the maximum number of local variables of the method
- * corresponding to this code attribute, or -1 if this attribute
- * is not a code attribute.
- * @return the byte array form of this attribute.
- */
- protected ByteVector write(final ClassWriter cw, final byte[] code,
- final int len, final int maxStack, final int maxLocals) {
- ByteVector v = new ByteVector();
- v.data = value;
- v.length = value.length;
- return v;
- }
-
- /**
- * Returns the length of the attribute list that begins with this attribute.
- *
- * @return the length of the attribute list that begins with this attribute.
- */
- final int getCount() {
- int count = 0;
- Attribute attr = this;
- while (attr != null) {
- count += 1;
- attr = attr.next;
- }
- return count;
- }
-
- /**
- * Returns the size of all the attributes in this attribute list.
- *
- * @param cw
- * the class writer to be used to convert the attributes into
- * byte arrays, with the {@link #write write} method.
- * @param code
- * the bytecode of the method corresponding to these code
- * attributes, or <tt>null</tt> if these attributes are not code
- * attributes.
- * @param len
- * the length of the bytecode of the method corresponding to
- * these code attributes, or <tt>null</tt> if these attributes
- * are not code attributes.
- * @param maxStack
- * the maximum stack size of the method corresponding to these
- * code attributes, or -1 if these attributes are not code
- * attributes.
- * @param maxLocals
- * the maximum number of local variables of the method
- * corresponding to these code attributes, or -1 if these
- * attributes are not code attributes.
- * @return the size of all the attributes in this attribute list. This size
- * includes the size of the attribute headers.
- */
- final int getSize(final ClassWriter cw, final byte[] code, final int len,
- final int maxStack, final int maxLocals) {
- Attribute attr = this;
- int size = 0;
- while (attr != null) {
- cw.newUTF8(attr.type);
- size += attr.write(cw, code, len, maxStack, maxLocals).length + 6;
- attr = attr.next;
- }
- return size;
- }
-
- /**
- * Writes all the attributes of this attribute list in the given byte
- * vector.
- *
- * @param cw
- * the class writer to be used to convert the attributes into
- * byte arrays, with the {@link #write write} method.
- * @param code
- * the bytecode of the method corresponding to these code
- * attributes, or <tt>null</tt> if these attributes are not code
- * attributes.
- * @param len
- * the length of the bytecode of the method corresponding to
- * these code attributes, or <tt>null</tt> if these attributes
- * are not code attributes.
- * @param maxStack
- * the maximum stack size of the method corresponding to these
- * code attributes, or -1 if these attributes are not code
- * attributes.
- * @param maxLocals
- * the maximum number of local variables of the method
- * corresponding to these code attributes, or -1 if these
- * attributes are not code attributes.
- * @param out
- * where the attributes must be written.
- */
- final void put(final ClassWriter cw, final byte[] code, final int len,
- final int maxStack, final int maxLocals, final ByteVector out) {
- Attribute attr = this;
- while (attr != null) {
- ByteVector b = attr.write(cw, code, len, maxStack, maxLocals);
- out.putShort(cw.newUTF8(attr.type)).putInt(b.length);
- out.putByteArray(b.data, 0, b.length);
- attr = attr.next;
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/ByteVector.java b/src/asm/scala/tools/asm/ByteVector.java
deleted file mode 100644
index 3bca7af12a..0000000000
--- a/src/asm/scala/tools/asm/ByteVector.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A dynamically extensible vector of bytes. This class is roughly equivalent to
- * a DataOutputStream on top of a ByteArrayOutputStream, but is more efficient.
- *
- * @author Eric Bruneton
- */
-public class ByteVector {
-
- /**
- * The content of this vector.
- */
- byte[] data;
-
- /**
- * Actual number of bytes in this vector.
- */
- int length;
-
- /**
- * Constructs a new {@link ByteVector ByteVector} with a default initial
- * size.
- */
- public ByteVector() {
- data = new byte[64];
- }
-
- /**
- * Constructs a new {@link ByteVector ByteVector} with the given initial
- * size.
- *
- * @param initialSize
- * the initial size of the byte vector to be constructed.
- */
- public ByteVector(final int initialSize) {
- data = new byte[initialSize];
- }
-
- /**
- * Puts a byte into this byte vector. The byte vector is automatically
- * enlarged if necessary.
- *
- * @param b
- * a byte.
- * @return this byte vector.
- */
- public ByteVector putByte(final int b) {
- int length = this.length;
- if (length + 1 > data.length) {
- enlarge(1);
- }
- data[length++] = (byte) b;
- this.length = length;
- return this;
- }
-
- /**
- * Puts two bytes into this byte vector. The byte vector is automatically
- * enlarged if necessary.
- *
- * @param b1
- * a byte.
- * @param b2
- * another byte.
- * @return this byte vector.
- */
- ByteVector put11(final int b1, final int b2) {
- int length = this.length;
- if (length + 2 > data.length) {
- enlarge(2);
- }
- byte[] data = this.data;
- data[length++] = (byte) b1;
- data[length++] = (byte) b2;
- this.length = length;
- return this;
- }
-
- /**
- * Puts a short into this byte vector. The byte vector is automatically
- * enlarged if necessary.
- *
- * @param s
- * a short.
- * @return this byte vector.
- */
- public ByteVector putShort(final int s) {
- int length = this.length;
- if (length + 2 > data.length) {
- enlarge(2);
- }
- byte[] data = this.data;
- data[length++] = (byte) (s >>> 8);
- data[length++] = (byte) s;
- this.length = length;
- return this;
- }
-
- /**
- * Puts a byte and a short into this byte vector. The byte vector is
- * automatically enlarged if necessary.
- *
- * @param b
- * a byte.
- * @param s
- * a short.
- * @return this byte vector.
- */
- ByteVector put12(final int b, final int s) {
- int length = this.length;
- if (length + 3 > data.length) {
- enlarge(3);
- }
- byte[] data = this.data;
- data[length++] = (byte) b;
- data[length++] = (byte) (s >>> 8);
- data[length++] = (byte) s;
- this.length = length;
- return this;
- }
-
- /**
- * Puts an int into this byte vector. The byte vector is automatically
- * enlarged if necessary.
- *
- * @param i
- * an int.
- * @return this byte vector.
- */
- public ByteVector putInt(final int i) {
- int length = this.length;
- if (length + 4 > data.length) {
- enlarge(4);
- }
- byte[] data = this.data;
- data[length++] = (byte) (i >>> 24);
- data[length++] = (byte) (i >>> 16);
- data[length++] = (byte) (i >>> 8);
- data[length++] = (byte) i;
- this.length = length;
- return this;
- }
-
- /**
- * Puts a long into this byte vector. The byte vector is automatically
- * enlarged if necessary.
- *
- * @param l
- * a long.
- * @return this byte vector.
- */
- public ByteVector putLong(final long l) {
- int length = this.length;
- if (length + 8 > data.length) {
- enlarge(8);
- }
- byte[] data = this.data;
- int i = (int) (l >>> 32);
- data[length++] = (byte) (i >>> 24);
- data[length++] = (byte) (i >>> 16);
- data[length++] = (byte) (i >>> 8);
- data[length++] = (byte) i;
- i = (int) l;
- data[length++] = (byte) (i >>> 24);
- data[length++] = (byte) (i >>> 16);
- data[length++] = (byte) (i >>> 8);
- data[length++] = (byte) i;
- this.length = length;
- return this;
- }
-
- /**
- * Puts an UTF8 string into this byte vector. The byte vector is
- * automatically enlarged if necessary.
- *
- * @param s
- * a String whose UTF8 encoded length must be less than 65536.
- * @return this byte vector.
- */
- public ByteVector putUTF8(final String s) {
- int charLength = s.length();
- if (charLength > 65535) {
- throw new IllegalArgumentException();
- }
- int len = length;
- if (len + 2 + charLength > data.length) {
- enlarge(2 + charLength);
- }
- byte[] data = this.data;
- // optimistic algorithm: instead of computing the byte length and then
- // serializing the string (which requires two loops), we assume the byte
- // length is equal to char length (which is the most frequent case), and
- // we start serializing the string right away. During the serialization,
- // if we find that this assumption is wrong, we continue with the
- // general method.
- data[len++] = (byte) (charLength >>> 8);
- data[len++] = (byte) charLength;
- for (int i = 0; i < charLength; ++i) {
- char c = s.charAt(i);
- if (c >= '\001' && c <= '\177') {
- data[len++] = (byte) c;
- } else {
- length = len;
- return encodeUTF8(s, i, 65535);
- }
- }
- length = len;
- return this;
- }
-
- /**
- * Puts an UTF8 string into this byte vector. The byte vector is
- * automatically enlarged if necessary. The string length is encoded in two
- * bytes before the encoded characters, if there is space for that (i.e. if
- * this.length - i - 2 >= 0).
- *
- * @param s
- * the String to encode.
- * @param i
- * the index of the first character to encode. The previous
- * characters are supposed to have already been encoded, using
- * only one byte per character.
- * @param maxByteLength
- * the maximum byte length of the encoded string, including the
- * already encoded characters.
- * @return this byte vector.
- */
- ByteVector encodeUTF8(final String s, int i, int maxByteLength) {
- int charLength = s.length();
- int byteLength = i;
- char c;
- for (int j = i; j < charLength; ++j) {
- c = s.charAt(j);
- if (c >= '\001' && c <= '\177') {
- byteLength++;
- } else if (c > '\u07FF') {
- byteLength += 3;
- } else {
- byteLength += 2;
- }
- }
- if (byteLength > maxByteLength) {
- throw new IllegalArgumentException();
- }
- int start = length - i - 2;
- if (start >= 0) {
- data[start] = (byte) (byteLength >>> 8);
- data[start + 1] = (byte) byteLength;
- }
- if (length + byteLength - i > data.length) {
- enlarge(byteLength - i);
- }
- int len = length;
- for (int j = i; j < charLength; ++j) {
- c = s.charAt(j);
- if (c >= '\001' && c <= '\177') {
- data[len++] = (byte) c;
- } else if (c > '\u07FF') {
- data[len++] = (byte) (0xE0 | c >> 12 & 0xF);
- data[len++] = (byte) (0x80 | c >> 6 & 0x3F);
- data[len++] = (byte) (0x80 | c & 0x3F);
- } else {
- data[len++] = (byte) (0xC0 | c >> 6 & 0x1F);
- data[len++] = (byte) (0x80 | c & 0x3F);
- }
- }
- length = len;
- return this;
- }
-
- /**
- * Puts an array of bytes into this byte vector. The byte vector is
- * automatically enlarged if necessary.
- *
- * @param b
- * an array of bytes. May be <tt>null</tt> to put <tt>len</tt>
- * null bytes into this byte vector.
- * @param off
- * index of the fist byte of b that must be copied.
- * @param len
- * number of bytes of b that must be copied.
- * @return this byte vector.
- */
- public ByteVector putByteArray(final byte[] b, final int off, final int len) {
- if (length + len > data.length) {
- enlarge(len);
- }
- if (b != null) {
- System.arraycopy(b, off, data, length, len);
- }
- length += len;
- return this;
- }
-
- /**
- * Enlarge this byte vector so that it can receive n more bytes.
- *
- * @param size
- * number of additional bytes that this byte vector should be
- * able to receive.
- */
- private void enlarge(final int size) {
- int length1 = 2 * data.length;
- int length2 = length + size;
- byte[] newData = new byte[length1 > length2 ? length1 : length2];
- System.arraycopy(data, 0, newData, 0, length);
- data = newData;
- }
-}
diff --git a/src/asm/scala/tools/asm/ClassReader.java b/src/asm/scala/tools/asm/ClassReader.java
deleted file mode 100644
index 8b0e12cb04..0000000000
--- a/src/asm/scala/tools/asm/ClassReader.java
+++ /dev/null
@@ -1,2496 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A Java class parser to make a {@link ClassVisitor} visit an existing class.
- * This class parses a byte array conforming to the Java class file format and
- * calls the appropriate visit methods of a given class visitor for each field,
- * method and bytecode instruction encountered.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public class ClassReader {
-
- /**
- * True to enable signatures support.
- */
- static final boolean SIGNATURES = true;
-
- /**
- * True to enable annotations support.
- */
- static final boolean ANNOTATIONS = true;
-
- /**
- * True to enable stack map frames support.
- */
- static final boolean FRAMES = true;
-
- /**
- * True to enable bytecode writing support.
- */
- static final boolean WRITER = true;
-
- /**
- * True to enable JSR_W and GOTO_W support.
- */
- static final boolean RESIZE = true;
-
- /**
- * Flag to skip method code. If this class is set <code>CODE</code>
- * attribute won't be visited. This can be used, for example, to retrieve
- * annotations for methods and method parameters.
- */
- public static final int SKIP_CODE = 1;
-
- /**
- * Flag to skip the debug information in the class. If this flag is set the
- * debug information of the class is not visited, i.e. the
- * {@link MethodVisitor#visitLocalVariable visitLocalVariable} and
- * {@link MethodVisitor#visitLineNumber visitLineNumber} methods will not be
- * called.
- */
- public static final int SKIP_DEBUG = 2;
-
- /**
- * Flag to skip the stack map frames in the class. If this flag is set the
- * stack map frames of the class is not visited, i.e. the
- * {@link MethodVisitor#visitFrame visitFrame} method will not be called.
- * This flag is useful when the {@link ClassWriter#COMPUTE_FRAMES} option is
- * used: it avoids visiting frames that will be ignored and recomputed from
- * scratch in the class writer.
- */
- public static final int SKIP_FRAMES = 4;
-
- /**
- * Flag to expand the stack map frames. By default stack map frames are
- * visited in their original format (i.e. "expanded" for classes whose
- * version is less than V1_6, and "compressed" for the other classes). If
- * this flag is set, stack map frames are always visited in expanded format
- * (this option adds a decompression/recompression step in ClassReader and
- * ClassWriter which degrades performances quite a lot).
- */
- public static final int EXPAND_FRAMES = 8;
-
- /**
- * The class to be parsed. <i>The content of this array must not be
- * modified. This field is intended for {@link Attribute} sub classes, and
- * is normally not needed by class generators or adapters.</i>
- */
- public final byte[] b;
-
- /**
- * The start index of each constant pool item in {@link #b b}, plus one. The
- * one byte offset skips the constant pool item tag that indicates its type.
- */
- private final int[] items;
-
- /**
- * The String objects corresponding to the CONSTANT_Utf8 items. This cache
- * avoids multiple parsing of a given CONSTANT_Utf8 constant pool item,
- * which GREATLY improves performances (by a factor 2 to 3). This caching
- * strategy could be extended to all constant pool items, but its benefit
- * would not be so great for these items (because they are much less
- * expensive to parse than CONSTANT_Utf8 items).
- */
- private final String[] strings;
-
- /**
- * Maximum length of the strings contained in the constant pool of the
- * class.
- */
- private final int maxStringLength;
-
- /**
- * Start index of the class header information (access, name...) in
- * {@link #b b}.
- */
- public final int header;
-
- // ------------------------------------------------------------------------
- // Constructors
- // ------------------------------------------------------------------------
-
- /**
- * Constructs a new {@link ClassReader} object.
- *
- * @param b
- * the bytecode of the class to be read.
- */
- public ClassReader(final byte[] b) {
- this(b, 0, b.length);
- }
-
- /**
- * Constructs a new {@link ClassReader} object.
- *
- * @param b
- * the bytecode of the class to be read.
- * @param off
- * the start offset of the class data.
- * @param len
- * the length of the class data.
- */
- public ClassReader(final byte[] b, final int off, final int len) {
- this.b = b;
- // checks the class version
- if (readShort(off + 6) > Opcodes.V1_8) {
- throw new IllegalArgumentException();
- }
- // parses the constant pool
- items = new int[readUnsignedShort(off + 8)];
- int n = items.length;
- strings = new String[n];
- int max = 0;
- int index = off + 10;
- for (int i = 1; i < n; ++i) {
- items[i] = index + 1;
- int size;
- switch (b[index]) {
- case ClassWriter.FIELD:
- case ClassWriter.METH:
- case ClassWriter.IMETH:
- case ClassWriter.INT:
- case ClassWriter.FLOAT:
- case ClassWriter.NAME_TYPE:
- case ClassWriter.INDY:
- size = 5;
- break;
- case ClassWriter.LONG:
- case ClassWriter.DOUBLE:
- size = 9;
- ++i;
- break;
- case ClassWriter.UTF8:
- size = 3 + readUnsignedShort(index + 1);
- if (size > max) {
- max = size;
- }
- break;
- case ClassWriter.HANDLE:
- size = 4;
- break;
- // case ClassWriter.CLASS:
- // case ClassWriter.STR:
- // case ClassWriter.MTYPE
- default:
- size = 3;
- break;
- }
- index += size;
- }
- maxStringLength = max;
- // the class header information starts just after the constant pool
- header = index;
- }
-
- /**
- * Returns the class's access flags (see {@link Opcodes}). This value may
- * not reflect Deprecated and Synthetic flags when bytecode is before 1.5
- * and those flags are represented by attributes.
- *
- * @return the class access flags
- *
- * @see ClassVisitor#visit(int, int, String, String, String, String[])
- */
- public int getAccess() {
- return readUnsignedShort(header);
- }
-
- /**
- * Returns the internal name of the class (see
- * {@link Type#getInternalName() getInternalName}).
- *
- * @return the internal class name
- *
- * @see ClassVisitor#visit(int, int, String, String, String, String[])
- */
- public String getClassName() {
- return readClass(header + 2, new char[maxStringLength]);
- }
-
- /**
- * Returns the internal of name of the super class (see
- * {@link Type#getInternalName() getInternalName}). For interfaces, the
- * super class is {@link Object}.
- *
- * @return the internal name of super class, or <tt>null</tt> for
- * {@link Object} class.
- *
- * @see ClassVisitor#visit(int, int, String, String, String, String[])
- */
- public String getSuperName() {
- return readClass(header + 4, new char[maxStringLength]);
- }
-
- /**
- * Returns the internal names of the class's interfaces (see
- * {@link Type#getInternalName() getInternalName}).
- *
- * @return the array of internal names for all implemented interfaces or
- * <tt>null</tt>.
- *
- * @see ClassVisitor#visit(int, int, String, String, String, String[])
- */
- public String[] getInterfaces() {
- int index = header + 6;
- int n = readUnsignedShort(index);
- String[] interfaces = new String[n];
- if (n > 0) {
- char[] buf = new char[maxStringLength];
- for (int i = 0; i < n; ++i) {
- index += 2;
- interfaces[i] = readClass(index, buf);
- }
- }
- return interfaces;
- }
-
- /**
- * Copies the constant pool data into the given {@link ClassWriter}. Should
- * be called before the {@link #accept(ClassVisitor,int)} method.
- *
- * @param classWriter
- * the {@link ClassWriter} to copy constant pool into.
- */
- void copyPool(final ClassWriter classWriter) {
- char[] buf = new char[maxStringLength];
- int ll = items.length;
- Item[] items2 = new Item[ll];
- for (int i = 1; i < ll; i++) {
- int index = items[i];
- int tag = b[index - 1];
- Item item = new Item(i);
- int nameType;
- switch (tag) {
- case ClassWriter.FIELD:
- case ClassWriter.METH:
- case ClassWriter.IMETH:
- nameType = items[readUnsignedShort(index + 2)];
- item.set(tag, readClass(index, buf), readUTF8(nameType, buf),
- readUTF8(nameType + 2, buf));
- break;
- case ClassWriter.INT:
- item.set(readInt(index));
- break;
- case ClassWriter.FLOAT:
- item.set(Float.intBitsToFloat(readInt(index)));
- break;
- case ClassWriter.NAME_TYPE:
- item.set(tag, readUTF8(index, buf), readUTF8(index + 2, buf),
- null);
- break;
- case ClassWriter.LONG:
- item.set(readLong(index));
- ++i;
- break;
- case ClassWriter.DOUBLE:
- item.set(Double.longBitsToDouble(readLong(index)));
- ++i;
- break;
- case ClassWriter.UTF8: {
- String s = strings[i];
- if (s == null) {
- index = items[i];
- s = strings[i] = readUTF(index + 2,
- readUnsignedShort(index), buf);
- }
- item.set(tag, s, null, null);
- break;
- }
- case ClassWriter.HANDLE: {
- int fieldOrMethodRef = items[readUnsignedShort(index + 1)];
- nameType = items[readUnsignedShort(fieldOrMethodRef + 2)];
- item.set(ClassWriter.HANDLE_BASE + readByte(index),
- readClass(fieldOrMethodRef, buf),
- readUTF8(nameType, buf), readUTF8(nameType + 2, buf));
- break;
- }
- case ClassWriter.INDY:
- if (classWriter.bootstrapMethods == null) {
- copyBootstrapMethods(classWriter, items2, buf);
- }
- nameType = items[readUnsignedShort(index + 2)];
- item.set(readUTF8(nameType, buf), readUTF8(nameType + 2, buf),
- readUnsignedShort(index));
- break;
- // case ClassWriter.STR:
- // case ClassWriter.CLASS:
- // case ClassWriter.MTYPE
- default:
- item.set(tag, readUTF8(index, buf), null, null);
- break;
- }
-
- int index2 = item.hashCode % items2.length;
- item.next = items2[index2];
- items2[index2] = item;
- }
-
- int off = items[1] - 1;
- classWriter.pool.putByteArray(b, off, header - off);
- classWriter.items = items2;
- classWriter.threshold = (int) (0.75d * ll);
- classWriter.index = ll;
- }
-
- /**
- * Copies the bootstrap method data into the given {@link ClassWriter}.
- * Should be called before the {@link #accept(ClassVisitor,int)} method.
- *
- * @param classWriter
- * the {@link ClassWriter} to copy bootstrap methods into.
- */
- private void copyBootstrapMethods(final ClassWriter classWriter,
- final Item[] items, final char[] c) {
- // finds the "BootstrapMethods" attribute
- int u = getAttributes();
- boolean found = false;
- for (int i = readUnsignedShort(u); i > 0; --i) {
- String attrName = readUTF8(u + 2, c);
- if ("BootstrapMethods".equals(attrName)) {
- found = true;
- break;
- }
- u += 6 + readInt(u + 4);
- }
- if (!found) {
- return;
- }
- // copies the bootstrap methods in the class writer
- int boostrapMethodCount = readUnsignedShort(u + 8);
- for (int j = 0, v = u + 10; j < boostrapMethodCount; j++) {
- int position = v - u - 10;
- int hashCode = readConst(readUnsignedShort(v), c).hashCode();
- for (int k = readUnsignedShort(v + 2); k > 0; --k) {
- hashCode ^= readConst(readUnsignedShort(v + 4), c).hashCode();
- v += 2;
- }
- v += 4;
- Item item = new Item(j);
- item.set(position, hashCode & 0x7FFFFFFF);
- int index = item.hashCode % items.length;
- item.next = items[index];
- items[index] = item;
- }
- int attrSize = readInt(u + 4);
- ByteVector bootstrapMethods = new ByteVector(attrSize + 62);
- bootstrapMethods.putByteArray(b, u + 10, attrSize - 2);
- classWriter.bootstrapMethodsCount = boostrapMethodCount;
- classWriter.bootstrapMethods = bootstrapMethods;
- }
-
- /**
- * Constructs a new {@link ClassReader} object.
- *
- * @param is
- * an input stream from which to read the class.
- * @throws IOException
- * if a problem occurs during reading.
- */
- public ClassReader(final InputStream is) throws IOException {
- this(readClass(is, false));
- }
-
- /**
- * Constructs a new {@link ClassReader} object.
- *
- * @param name
- * the binary qualified name of the class to be read.
- * @throws IOException
- * if an exception occurs during reading.
- */
- public ClassReader(final String name) throws IOException {
- this(readClass(
- ClassLoader.getSystemResourceAsStream(name.replace('.', '/')
- + ".class"), true));
- }
-
- /**
- * Reads the bytecode of a class.
- *
- * @param is
- * an input stream from which to read the class.
- * @param close
- * true to close the input stream after reading.
- * @return the bytecode read from the given input stream.
- * @throws IOException
- * if a problem occurs during reading.
- */
- private static byte[] readClass(final InputStream is, boolean close)
- throws IOException {
- if (is == null) {
- throw new IOException("Class not found");
- }
- try {
- byte[] b = new byte[is.available()];
- int len = 0;
- while (true) {
- int n = is.read(b, len, b.length - len);
- if (n == -1) {
- if (len < b.length) {
- byte[] c = new byte[len];
- System.arraycopy(b, 0, c, 0, len);
- b = c;
- }
- return b;
- }
- len += n;
- if (len == b.length) {
- int last = is.read();
- if (last < 0) {
- return b;
- }
- byte[] c = new byte[b.length + 1000];
- System.arraycopy(b, 0, c, 0, len);
- c[len++] = (byte) last;
- b = c;
- }
- }
- } finally {
- if (close) {
- is.close();
- }
- }
- }
-
- // ------------------------------------------------------------------------
- // Public methods
- // ------------------------------------------------------------------------
-
- /**
- * Makes the given visitor visit the Java class of this {@link ClassReader}
- * . This class is the one specified in the constructor (see
- * {@link #ClassReader(byte[]) ClassReader}).
- *
- * @param classVisitor
- * the visitor that must visit this class.
- * @param flags
- * option flags that can be used to modify the default behavior
- * of this class. See {@link #SKIP_DEBUG}, {@link #EXPAND_FRAMES}
- * , {@link #SKIP_FRAMES}, {@link #SKIP_CODE}.
- */
- public void accept(final ClassVisitor classVisitor, final int flags) {
- accept(classVisitor, new Attribute[0], flags);
- }
-
- /**
- * Makes the given visitor visit the Java class of this {@link ClassReader}.
- * This class is the one specified in the constructor (see
- * {@link #ClassReader(byte[]) ClassReader}).
- *
- * @param classVisitor
- * the visitor that must visit this class.
- * @param attrs
- * prototypes of the attributes that must be parsed during the
- * visit of the class. Any attribute whose type is not equal to
- * the type of one the prototypes will not be parsed: its byte
- * array value will be passed unchanged to the ClassWriter.
- * <i>This may corrupt it if this value contains references to
- * the constant pool, or has syntactic or semantic links with a
- * class element that has been transformed by a class adapter
- * between the reader and the writer</i>.
- * @param flags
- * option flags that can be used to modify the default behavior
- * of this class. See {@link #SKIP_DEBUG}, {@link #EXPAND_FRAMES}
- * , {@link #SKIP_FRAMES}, {@link #SKIP_CODE}.
- */
- public void accept(final ClassVisitor classVisitor,
- final Attribute[] attrs, final int flags) {
- int u = header; // current offset in the class file
- char[] c = new char[maxStringLength]; // buffer used to read strings
-
- Context context = new Context();
- context.attrs = attrs;
- context.flags = flags;
- context.buffer = c;
-
- // reads the class declaration
- int access = readUnsignedShort(u);
- String name = readClass(u + 2, c);
- String superClass = readClass(u + 4, c);
- String[] interfaces = new String[readUnsignedShort(u + 6)];
- u += 8;
- for (int i = 0; i < interfaces.length; ++i) {
- interfaces[i] = readClass(u, c);
- u += 2;
- }
-
- // reads the class attributes
- String signature = null;
- String sourceFile = null;
- String sourceDebug = null;
- String enclosingOwner = null;
- String enclosingName = null;
- String enclosingDesc = null;
- int anns = 0;
- int ianns = 0;
- int tanns = 0;
- int itanns = 0;
- int innerClasses = 0;
- Attribute attributes = null;
-
- u = getAttributes();
- for (int i = readUnsignedShort(u); i > 0; --i) {
- String attrName = readUTF8(u + 2, c);
- // tests are sorted in decreasing frequency order
- // (based on frequencies observed on typical classes)
- if ("SourceFile".equals(attrName)) {
- sourceFile = readUTF8(u + 8, c);
- } else if ("InnerClasses".equals(attrName)) {
- innerClasses = u + 8;
- } else if ("EnclosingMethod".equals(attrName)) {
- enclosingOwner = readClass(u + 8, c);
- int item = readUnsignedShort(u + 10);
- if (item != 0) {
- enclosingName = readUTF8(items[item], c);
- enclosingDesc = readUTF8(items[item] + 2, c);
- }
- } else if (SIGNATURES && "Signature".equals(attrName)) {
- signature = readUTF8(u + 8, c);
- } else if (ANNOTATIONS
- && "RuntimeVisibleAnnotations".equals(attrName)) {
- anns = u + 8;
- } else if (ANNOTATIONS
- && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
- tanns = u + 8;
- } else if ("Deprecated".equals(attrName)) {
- access |= Opcodes.ACC_DEPRECATED;
- } else if ("Synthetic".equals(attrName)) {
- access |= Opcodes.ACC_SYNTHETIC
- | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
- } else if ("SourceDebugExtension".equals(attrName)) {
- int len = readInt(u + 4);
- sourceDebug = readUTF(u + 8, len, new char[len]);
- } else if (ANNOTATIONS
- && "RuntimeInvisibleAnnotations".equals(attrName)) {
- ianns = u + 8;
- } else if (ANNOTATIONS
- && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
- itanns = u + 8;
- } else if ("BootstrapMethods".equals(attrName)) {
- int[] bootstrapMethods = new int[readUnsignedShort(u + 8)];
- for (int j = 0, v = u + 10; j < bootstrapMethods.length; j++) {
- bootstrapMethods[j] = v;
- v += 2 + readUnsignedShort(v + 2) << 1;
- }
- context.bootstrapMethods = bootstrapMethods;
- } else {
- Attribute attr = readAttribute(attrs, attrName, u + 8,
- readInt(u + 4), c, -1, null);
- if (attr != null) {
- attr.next = attributes;
- attributes = attr;
- }
- }
- u += 6 + readInt(u + 4);
- }
-
- // visits the class declaration
- classVisitor.visit(readInt(items[1] - 7), access, name, signature,
- superClass, interfaces);
-
- // visits the source and debug info
- if ((flags & SKIP_DEBUG) == 0
- && (sourceFile != null || sourceDebug != null)) {
- classVisitor.visitSource(sourceFile, sourceDebug);
- }
-
- // visits the outer class
- if (enclosingOwner != null) {
- classVisitor.visitOuterClass(enclosingOwner, enclosingName,
- enclosingDesc);
- }
-
- // visits the class annotations and type annotations
- if (ANNOTATIONS && anns != 0) {
- for (int i = readUnsignedShort(anns), v = anns + 2; i > 0; --i) {
- v = readAnnotationValues(v + 2, c, true,
- classVisitor.visitAnnotation(readUTF8(v, c), true));
- }
- }
- if (ANNOTATIONS && ianns != 0) {
- for (int i = readUnsignedShort(ianns), v = ianns + 2; i > 0; --i) {
- v = readAnnotationValues(v + 2, c, true,
- classVisitor.visitAnnotation(readUTF8(v, c), false));
- }
- }
- if (ANNOTATIONS && tanns != 0) {
- for (int i = readUnsignedShort(tanns), v = tanns + 2; i > 0; --i) {
- v = readAnnotationTarget(context, v);
- v = readAnnotationValues(v + 2, c, true,
- classVisitor.visitTypeAnnotation(context.typeRef,
- context.typePath, readUTF8(v, c), true));
- }
- }
- if (ANNOTATIONS && itanns != 0) {
- for (int i = readUnsignedShort(itanns), v = itanns + 2; i > 0; --i) {
- v = readAnnotationTarget(context, v);
- v = readAnnotationValues(v + 2, c, true,
- classVisitor.visitTypeAnnotation(context.typeRef,
- context.typePath, readUTF8(v, c), false));
- }
- }
-
- // visits the attributes
- while (attributes != null) {
- Attribute attr = attributes.next;
- attributes.next = null;
- classVisitor.visitAttribute(attributes);
- attributes = attr;
- }
-
- // visits the inner classes
- if (innerClasses != 0) {
- int v = innerClasses + 2;
- for (int i = readUnsignedShort(innerClasses); i > 0; --i) {
- classVisitor.visitInnerClass(readClass(v, c),
- readClass(v + 2, c), readUTF8(v + 4, c),
- readUnsignedShort(v + 6));
- v += 8;
- }
- }
-
- // visits the fields and methods
- u = header + 10 + 2 * interfaces.length;
- for (int i = readUnsignedShort(u - 2); i > 0; --i) {
- u = readField(classVisitor, context, u);
- }
- u += 2;
- for (int i = readUnsignedShort(u - 2); i > 0; --i) {
- u = readMethod(classVisitor, context, u);
- }
-
- // visits the end of the class
- classVisitor.visitEnd();
- }
-
- /**
- * Reads a field and makes the given visitor visit it.
- *
- * @param classVisitor
- * the visitor that must visit the field.
- * @param context
- * information about the class being parsed.
- * @param u
- * the start offset of the field in the class file.
- * @return the offset of the first byte following the field in the class.
- */
- private int readField(final ClassVisitor classVisitor,
- final Context context, int u) {
- // reads the field declaration
- char[] c = context.buffer;
- int access = readUnsignedShort(u);
- String name = readUTF8(u + 2, c);
- String desc = readUTF8(u + 4, c);
- u += 6;
-
- // reads the field attributes
- String signature = null;
- int anns = 0;
- int ianns = 0;
- int tanns = 0;
- int itanns = 0;
- Object value = null;
- Attribute attributes = null;
-
- for (int i = readUnsignedShort(u); i > 0; --i) {
- String attrName = readUTF8(u + 2, c);
- // tests are sorted in decreasing frequency order
- // (based on frequencies observed on typical classes)
- if ("ConstantValue".equals(attrName)) {
- int item = readUnsignedShort(u + 8);
- value = item == 0 ? null : readConst(item, c);
- } else if (SIGNATURES && "Signature".equals(attrName)) {
- signature = readUTF8(u + 8, c);
- } else if ("Deprecated".equals(attrName)) {
- access |= Opcodes.ACC_DEPRECATED;
- } else if ("Synthetic".equals(attrName)) {
- access |= Opcodes.ACC_SYNTHETIC
- | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
- } else if (ANNOTATIONS
- && "RuntimeVisibleAnnotations".equals(attrName)) {
- anns = u + 8;
- } else if (ANNOTATIONS
- && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
- tanns = u + 8;
- } else if (ANNOTATIONS
- && "RuntimeInvisibleAnnotations".equals(attrName)) {
- ianns = u + 8;
- } else if (ANNOTATIONS
- && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
- itanns = u + 8;
- } else {
- Attribute attr = readAttribute(context.attrs, attrName, u + 8,
- readInt(u + 4), c, -1, null);
- if (attr != null) {
- attr.next = attributes;
- attributes = attr;
- }
- }
- u += 6 + readInt(u + 4);
- }
- u += 2;
-
- // visits the field declaration
- FieldVisitor fv = classVisitor.visitField(access, name, desc,
- signature, value);
- if (fv == null) {
- return u;
- }
-
- // visits the field annotations and type annotations
- if (ANNOTATIONS && anns != 0) {
- for (int i = readUnsignedShort(anns), v = anns + 2; i > 0; --i) {
- v = readAnnotationValues(v + 2, c, true,
- fv.visitAnnotation(readUTF8(v, c), true));
- }
- }
- if (ANNOTATIONS && ianns != 0) {
- for (int i = readUnsignedShort(ianns), v = ianns + 2; i > 0; --i) {
- v = readAnnotationValues(v + 2, c, true,
- fv.visitAnnotation(readUTF8(v, c), false));
- }
- }
- if (ANNOTATIONS && tanns != 0) {
- for (int i = readUnsignedShort(tanns), v = tanns + 2; i > 0; --i) {
- v = readAnnotationTarget(context, v);
- v = readAnnotationValues(v + 2, c, true,
- fv.visitTypeAnnotation(context.typeRef,
- context.typePath, readUTF8(v, c), true));
- }
- }
- if (ANNOTATIONS && itanns != 0) {
- for (int i = readUnsignedShort(itanns), v = itanns + 2; i > 0; --i) {
- v = readAnnotationTarget(context, v);
- v = readAnnotationValues(v + 2, c, true,
- fv.visitTypeAnnotation(context.typeRef,
- context.typePath, readUTF8(v, c), false));
- }
- }
-
- // visits the field attributes
- while (attributes != null) {
- Attribute attr = attributes.next;
- attributes.next = null;
- fv.visitAttribute(attributes);
- attributes = attr;
- }
-
- // visits the end of the field
- fv.visitEnd();
-
- return u;
- }
-
- /**
- * Reads a method and makes the given visitor visit it.
- *
- * @param classVisitor
- * the visitor that must visit the method.
- * @param context
- * information about the class being parsed.
- * @param u
- * the start offset of the method in the class file.
- * @return the offset of the first byte following the method in the class.
- */
- private int readMethod(final ClassVisitor classVisitor,
- final Context context, int u) {
- // reads the method declaration
- char[] c = context.buffer;
- context.access = readUnsignedShort(u);
- context.name = readUTF8(u + 2, c);
- context.desc = readUTF8(u + 4, c);
- u += 6;
-
- // reads the method attributes
- int code = 0;
- int exception = 0;
- String[] exceptions = null;
- String signature = null;
- int methodParameters = 0;
- int anns = 0;
- int ianns = 0;
- int tanns = 0;
- int itanns = 0;
- int dann = 0;
- int mpanns = 0;
- int impanns = 0;
- int firstAttribute = u;
- Attribute attributes = null;
-
- for (int i = readUnsignedShort(u); i > 0; --i) {
- String attrName = readUTF8(u + 2, c);
- // tests are sorted in decreasing frequency order
- // (based on frequencies observed on typical classes)
- if ("Code".equals(attrName)) {
- if ((context.flags & SKIP_CODE) == 0) {
- code = u + 8;
- }
- } else if ("Exceptions".equals(attrName)) {
- exceptions = new String[readUnsignedShort(u + 8)];
- exception = u + 10;
- for (int j = 0; j < exceptions.length; ++j) {
- exceptions[j] = readClass(exception, c);
- exception += 2;
- }
- } else if (SIGNATURES && "Signature".equals(attrName)) {
- signature = readUTF8(u + 8, c);
- } else if ("Deprecated".equals(attrName)) {
- context.access |= Opcodes.ACC_DEPRECATED;
- } else if (ANNOTATIONS
- && "RuntimeVisibleAnnotations".equals(attrName)) {
- anns = u + 8;
- } else if (ANNOTATIONS
- && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
- tanns = u + 8;
- } else if (ANNOTATIONS && "AnnotationDefault".equals(attrName)) {
- dann = u + 8;
- } else if ("Synthetic".equals(attrName)) {
- context.access |= Opcodes.ACC_SYNTHETIC
- | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
- } else if (ANNOTATIONS
- && "RuntimeInvisibleAnnotations".equals(attrName)) {
- ianns = u + 8;
- } else if (ANNOTATIONS
- && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
- itanns = u + 8;
- } else if (ANNOTATIONS
- && "RuntimeVisibleParameterAnnotations".equals(attrName)) {
- mpanns = u + 8;
- } else if (ANNOTATIONS
- && "RuntimeInvisibleParameterAnnotations".equals(attrName)) {
- impanns = u + 8;
- } else if ("MethodParameters".equals(attrName)) {
- methodParameters = u + 8;
- } else {
- Attribute attr = readAttribute(context.attrs, attrName, u + 8,
- readInt(u + 4), c, -1, null);
- if (attr != null) {
- attr.next = attributes;
- attributes = attr;
- }
- }
- u += 6 + readInt(u + 4);
- }
- u += 2;
-
- // visits the method declaration
- MethodVisitor mv = classVisitor.visitMethod(context.access,
- context.name, context.desc, signature, exceptions);
- if (mv == null) {
- return u;
- }
-
- /*
- * if the returned MethodVisitor is in fact a MethodWriter, it means
- * there is no method adapter between the reader and the writer. If, in
- * addition, the writer's constant pool was copied from this reader
- * (mw.cw.cr == this), and the signature and exceptions of the method
- * have not been changed, then it is possible to skip all visit events
- * and just copy the original code of the method to the writer (the
- * access, name and descriptor can have been changed, this is not
- * important since they are not copied as is from the reader).
- */
- if (WRITER && mv instanceof MethodWriter) {
- MethodWriter mw = (MethodWriter) mv;
- if (mw.cw.cr == this && signature == mw.signature) {
- boolean sameExceptions = false;
- if (exceptions == null) {
- sameExceptions = mw.exceptionCount == 0;
- } else if (exceptions.length == mw.exceptionCount) {
- sameExceptions = true;
- for (int j = exceptions.length - 1; j >= 0; --j) {
- exception -= 2;
- if (mw.exceptions[j] != readUnsignedShort(exception)) {
- sameExceptions = false;
- break;
- }
- }
- }
- if (sameExceptions) {
- /*
- * we do not copy directly the code into MethodWriter to
- * save a byte array copy operation. The real copy will be
- * done in ClassWriter.toByteArray().
- */
- mw.classReaderOffset = firstAttribute;
- mw.classReaderLength = u - firstAttribute;
- return u;
- }
- }
- }
-
- // visit the method parameters
- if (methodParameters != 0) {
- for (int i = b[methodParameters] & 0xFF, v = methodParameters + 1; i > 0; --i, v = v + 4) {
- mv.visitParameter(readUTF8(v, c), readUnsignedShort(v + 2));
- }
- }
-
- // visits the method annotations
- if (ANNOTATIONS && dann != 0) {
- AnnotationVisitor dv = mv.visitAnnotationDefault();
- readAnnotationValue(dann, c, null, dv);
- if (dv != null) {
- dv.visitEnd();
- }
- }
- if (ANNOTATIONS && anns != 0) {
- for (int i = readUnsignedShort(anns), v = anns + 2; i > 0; --i) {
- v = readAnnotationValues(v + 2, c, true,
- mv.visitAnnotation(readUTF8(v, c), true));
- }
- }
- if (ANNOTATIONS && ianns != 0) {
- for (int i = readUnsignedShort(ianns), v = ianns + 2; i > 0; --i) {
- v = readAnnotationValues(v + 2, c, true,
- mv.visitAnnotation(readUTF8(v, c), false));
- }
- }
- if (ANNOTATIONS && tanns != 0) {
- for (int i = readUnsignedShort(tanns), v = tanns + 2; i > 0; --i) {
- v = readAnnotationTarget(context, v);
- v = readAnnotationValues(v + 2, c, true,
- mv.visitTypeAnnotation(context.typeRef,
- context.typePath, readUTF8(v, c), true));
- }
- }
- if (ANNOTATIONS && itanns != 0) {
- for (int i = readUnsignedShort(itanns), v = itanns + 2; i > 0; --i) {
- v = readAnnotationTarget(context, v);
- v = readAnnotationValues(v + 2, c, true,
- mv.visitTypeAnnotation(context.typeRef,
- context.typePath, readUTF8(v, c), false));
- }
- }
- if (ANNOTATIONS && mpanns != 0) {
- readParameterAnnotations(mv, context, mpanns, true);
- }
- if (ANNOTATIONS && impanns != 0) {
- readParameterAnnotations(mv, context, impanns, false);
- }
-
- // visits the method attributes
- while (attributes != null) {
- Attribute attr = attributes.next;
- attributes.next = null;
- mv.visitAttribute(attributes);
- attributes = attr;
- }
-
- // visits the method code
- if (code != 0) {
- mv.visitCode();
- readCode(mv, context, code);
- }
-
- // visits the end of the method
- mv.visitEnd();
-
- return u;
- }
-
- /**
- * Reads the bytecode of a method and makes the given visitor visit it.
- *
- * @param mv
- * the visitor that must visit the method's code.
- * @param context
- * information about the class being parsed.
- * @param u
- * the start offset of the code attribute in the class file.
- */
- private void readCode(final MethodVisitor mv, final Context context, int u) {
- // reads the header
- byte[] b = this.b;
- char[] c = context.buffer;
- int maxStack = readUnsignedShort(u);
- int maxLocals = readUnsignedShort(u + 2);
- int codeLength = readInt(u + 4);
- u += 8;
-
- // reads the bytecode to find the labels
- int codeStart = u;
- int codeEnd = u + codeLength;
- Label[] labels = context.labels = new Label[codeLength + 2];
- readLabel(codeLength + 1, labels);
- while (u < codeEnd) {
- int offset = u - codeStart;
- int opcode = b[u] & 0xFF;
- switch (ClassWriter.TYPE[opcode]) {
- case ClassWriter.NOARG_INSN:
- case ClassWriter.IMPLVAR_INSN:
- u += 1;
- break;
- case ClassWriter.LABEL_INSN:
- readLabel(offset + readShort(u + 1), labels);
- u += 3;
- break;
- case ClassWriter.LABELW_INSN:
- readLabel(offset + readInt(u + 1), labels);
- u += 5;
- break;
- case ClassWriter.WIDE_INSN:
- opcode = b[u + 1] & 0xFF;
- if (opcode == Opcodes.IINC) {
- u += 6;
- } else {
- u += 4;
- }
- break;
- case ClassWriter.TABL_INSN:
- // skips 0 to 3 padding bytes
- u = u + 4 - (offset & 3);
- // reads instruction
- readLabel(offset + readInt(u), labels);
- for (int i = readInt(u + 8) - readInt(u + 4) + 1; i > 0; --i) {
- readLabel(offset + readInt(u + 12), labels);
- u += 4;
- }
- u += 12;
- break;
- case ClassWriter.LOOK_INSN:
- // skips 0 to 3 padding bytes
- u = u + 4 - (offset & 3);
- // reads instruction
- readLabel(offset + readInt(u), labels);
- for (int i = readInt(u + 4); i > 0; --i) {
- readLabel(offset + readInt(u + 12), labels);
- u += 8;
- }
- u += 8;
- break;
- case ClassWriter.VAR_INSN:
- case ClassWriter.SBYTE_INSN:
- case ClassWriter.LDC_INSN:
- u += 2;
- break;
- case ClassWriter.SHORT_INSN:
- case ClassWriter.LDCW_INSN:
- case ClassWriter.FIELDORMETH_INSN:
- case ClassWriter.TYPE_INSN:
- case ClassWriter.IINC_INSN:
- u += 3;
- break;
- case ClassWriter.ITFMETH_INSN:
- case ClassWriter.INDYMETH_INSN:
- u += 5;
- break;
- // case MANA_INSN:
- default:
- u += 4;
- break;
- }
- }
-
- // reads the try catch entries to find the labels, and also visits them
- for (int i = readUnsignedShort(u); i > 0; --i) {
- Label start = readLabel(readUnsignedShort(u + 2), labels);
- Label end = readLabel(readUnsignedShort(u + 4), labels);
- Label handler = readLabel(readUnsignedShort(u + 6), labels);
- String type = readUTF8(items[readUnsignedShort(u + 8)], c);
- mv.visitTryCatchBlock(start, end, handler, type);
- u += 8;
- }
- u += 2;
-
- // reads the code attributes
- int[] tanns = null; // start index of each visible type annotation
- int[] itanns = null; // start index of each invisible type annotation
- int tann = 0; // current index in tanns array
- int itann = 0; // current index in itanns array
- int ntoff = -1; // next visible type annotation code offset
- int nitoff = -1; // next invisible type annotation code offset
- int varTable = 0;
- int varTypeTable = 0;
- boolean zip = true;
- boolean unzip = (context.flags & EXPAND_FRAMES) != 0;
- int stackMap = 0;
- int stackMapSize = 0;
- int frameCount = 0;
- Context frame = null;
- Attribute attributes = null;
-
- for (int i = readUnsignedShort(u); i > 0; --i) {
- String attrName = readUTF8(u + 2, c);
- if ("LocalVariableTable".equals(attrName)) {
- if ((context.flags & SKIP_DEBUG) == 0) {
- varTable = u + 8;
- for (int j = readUnsignedShort(u + 8), v = u; j > 0; --j) {
- int label = readUnsignedShort(v + 10);
- if (labels[label] == null) {
- readLabel(label, labels).status |= Label.DEBUG;
- }
- label += readUnsignedShort(v + 12);
- if (labels[label] == null) {
- readLabel(label, labels).status |= Label.DEBUG;
- }
- v += 10;
- }
- }
- } else if ("LocalVariableTypeTable".equals(attrName)) {
- varTypeTable = u + 8;
- } else if ("LineNumberTable".equals(attrName)) {
- if ((context.flags & SKIP_DEBUG) == 0) {
- for (int j = readUnsignedShort(u + 8), v = u; j > 0; --j) {
- int label = readUnsignedShort(v + 10);
- if (labels[label] == null) {
- readLabel(label, labels).status |= Label.DEBUG;
- }
- labels[label].line = readUnsignedShort(v + 12);
- v += 4;
- }
- }
- } else if (ANNOTATIONS
- && "RuntimeVisibleTypeAnnotations".equals(attrName)) {
- tanns = readTypeAnnotations(mv, context, u + 8, true);
- ntoff = tanns.length == 0 || readByte(tanns[0]) < 0x43 ? -1
- : readUnsignedShort(tanns[0] + 1);
- } else if (ANNOTATIONS
- && "RuntimeInvisibleTypeAnnotations".equals(attrName)) {
- itanns = readTypeAnnotations(mv, context, u + 8, false);
- nitoff = itanns.length == 0 || readByte(itanns[0]) < 0x43 ? -1
- : readUnsignedShort(itanns[0] + 1);
- } else if (FRAMES && "StackMapTable".equals(attrName)) {
- if ((context.flags & SKIP_FRAMES) == 0) {
- stackMap = u + 10;
- stackMapSize = readInt(u + 4);
- frameCount = readUnsignedShort(u + 8);
- }
- /*
- * here we do not extract the labels corresponding to the
- * attribute content. This would require a full parsing of the
- * attribute, which would need to be repeated in the second
- * phase (see below). Instead the content of the attribute is
- * read one frame at a time (i.e. after a frame has been
- * visited, the next frame is read), and the labels it contains
- * are also extracted one frame at a time. Thanks to the
- * ordering of frames, having only a "one frame lookahead" is
- * not a problem, i.e. it is not possible to see an offset
- * smaller than the offset of the current insn and for which no
- * Label exist.
- */
- /*
- * This is not true for UNINITIALIZED type offsets. We solve
- * this by parsing the stack map table without a full decoding
- * (see below).
- */
- } else if (FRAMES && "StackMap".equals(attrName)) {
- if ((context.flags & SKIP_FRAMES) == 0) {
- zip = false;
- stackMap = u + 10;
- stackMapSize = readInt(u + 4);
- frameCount = readUnsignedShort(u + 8);
- }
- /*
- * IMPORTANT! here we assume that the frames are ordered, as in
- * the StackMapTable attribute, although this is not guaranteed
- * by the attribute format.
- */
- } else {
- for (int j = 0; j < context.attrs.length; ++j) {
- if (context.attrs[j].type.equals(attrName)) {
- Attribute attr = context.attrs[j].read(this, u + 8,
- readInt(u + 4), c, codeStart - 8, labels);
- if (attr != null) {
- attr.next = attributes;
- attributes = attr;
- }
- }
- }
- }
- u += 6 + readInt(u + 4);
- }
- u += 2;
-
- // generates the first (implicit) stack map frame
- if (FRAMES && stackMap != 0) {
- /*
- * for the first explicit frame the offset is not offset_delta + 1
- * but only offset_delta; setting the implicit frame offset to -1
- * allow the use of the "offset_delta + 1" rule in all cases
- */
- frame = context;
- frame.offset = -1;
- frame.mode = 0;
- frame.localCount = 0;
- frame.localDiff = 0;
- frame.stackCount = 0;
- frame.local = new Object[maxLocals];
- frame.stack = new Object[maxStack];
- if (unzip) {
- getImplicitFrame(context);
- }
- /*
- * Finds labels for UNINITIALIZED frame types. Instead of decoding
- * each element of the stack map table, we look for 3 consecutive
- * bytes that "look like" an UNINITIALIZED type (tag 8, offset
- * within code bounds, NEW instruction at this offset). We may find
- * false positives (i.e. not real UNINITIALIZED types), but this
- * should be rare, and the only consequence will be the creation of
- * an unneeded label. This is better than creating a label for each
- * NEW instruction, and faster than fully decoding the whole stack
- * map table.
- */
- for (int i = stackMap; i < stackMap + stackMapSize - 2; ++i) {
- if (b[i] == 8) { // UNINITIALIZED FRAME TYPE
- int v = readUnsignedShort(i + 1);
- if (v >= 0 && v < codeLength) {
- if ((b[codeStart + v] & 0xFF) == Opcodes.NEW) {
- readLabel(v, labels);
- }
- }
- }
- }
- }
-
- // visits the instructions
- u = codeStart;
- while (u < codeEnd) {
- int offset = u - codeStart;
-
- // visits the label and line number for this offset, if any
- Label l = labels[offset];
- if (l != null) {
- mv.visitLabel(l);
- if ((context.flags & SKIP_DEBUG) == 0 && l.line > 0) {
- mv.visitLineNumber(l.line, l);
- }
- }
-
- // visits the frame for this offset, if any
- while (FRAMES && frame != null
- && (frame.offset == offset || frame.offset == -1)) {
- // if there is a frame for this offset, makes the visitor visit
- // it, and reads the next frame if there is one.
- if (frame.offset != -1) {
- if (!zip || unzip) {
- mv.visitFrame(Opcodes.F_NEW, frame.localCount,
- frame.local, frame.stackCount, frame.stack);
- } else {
- mv.visitFrame(frame.mode, frame.localDiff, frame.local,
- frame.stackCount, frame.stack);
- }
- }
- if (frameCount > 0) {
- stackMap = readFrame(stackMap, zip, unzip, frame);
- --frameCount;
- } else {
- frame = null;
- }
- }
-
- // visits the instruction at this offset
- int opcode = b[u] & 0xFF;
- switch (ClassWriter.TYPE[opcode]) {
- case ClassWriter.NOARG_INSN:
- mv.visitInsn(opcode);
- u += 1;
- break;
- case ClassWriter.IMPLVAR_INSN:
- if (opcode > Opcodes.ISTORE) {
- opcode -= 59; // ISTORE_0
- mv.visitVarInsn(Opcodes.ISTORE + (opcode >> 2),
- opcode & 0x3);
- } else {
- opcode -= 26; // ILOAD_0
- mv.visitVarInsn(Opcodes.ILOAD + (opcode >> 2), opcode & 0x3);
- }
- u += 1;
- break;
- case ClassWriter.LABEL_INSN:
- mv.visitJumpInsn(opcode, labels[offset + readShort(u + 1)]);
- u += 3;
- break;
- case ClassWriter.LABELW_INSN:
- mv.visitJumpInsn(opcode - 33, labels[offset + readInt(u + 1)]);
- u += 5;
- break;
- case ClassWriter.WIDE_INSN:
- opcode = b[u + 1] & 0xFF;
- if (opcode == Opcodes.IINC) {
- mv.visitIincInsn(readUnsignedShort(u + 2), readShort(u + 4));
- u += 6;
- } else {
- mv.visitVarInsn(opcode, readUnsignedShort(u + 2));
- u += 4;
- }
- break;
- case ClassWriter.TABL_INSN: {
- // skips 0 to 3 padding bytes
- u = u + 4 - (offset & 3);
- // reads instruction
- int label = offset + readInt(u);
- int min = readInt(u + 4);
- int max = readInt(u + 8);
- Label[] table = new Label[max - min + 1];
- u += 12;
- for (int i = 0; i < table.length; ++i) {
- table[i] = labels[offset + readInt(u)];
- u += 4;
- }
- mv.visitTableSwitchInsn(min, max, labels[label], table);
- break;
- }
- case ClassWriter.LOOK_INSN: {
- // skips 0 to 3 padding bytes
- u = u + 4 - (offset & 3);
- // reads instruction
- int label = offset + readInt(u);
- int len = readInt(u + 4);
- int[] keys = new int[len];
- Label[] values = new Label[len];
- u += 8;
- for (int i = 0; i < len; ++i) {
- keys[i] = readInt(u);
- values[i] = labels[offset + readInt(u + 4)];
- u += 8;
- }
- mv.visitLookupSwitchInsn(labels[label], keys, values);
- break;
- }
- case ClassWriter.VAR_INSN:
- mv.visitVarInsn(opcode, b[u + 1] & 0xFF);
- u += 2;
- break;
- case ClassWriter.SBYTE_INSN:
- mv.visitIntInsn(opcode, b[u + 1]);
- u += 2;
- break;
- case ClassWriter.SHORT_INSN:
- mv.visitIntInsn(opcode, readShort(u + 1));
- u += 3;
- break;
- case ClassWriter.LDC_INSN:
- mv.visitLdcInsn(readConst(b[u + 1] & 0xFF, c));
- u += 2;
- break;
- case ClassWriter.LDCW_INSN:
- mv.visitLdcInsn(readConst(readUnsignedShort(u + 1), c));
- u += 3;
- break;
- case ClassWriter.FIELDORMETH_INSN:
- case ClassWriter.ITFMETH_INSN: {
- int cpIndex = items[readUnsignedShort(u + 1)];
- boolean itf = b[cpIndex - 1] == ClassWriter.IMETH;
- String iowner = readClass(cpIndex, c);
- cpIndex = items[readUnsignedShort(cpIndex + 2)];
- String iname = readUTF8(cpIndex, c);
- String idesc = readUTF8(cpIndex + 2, c);
- if (opcode < Opcodes.INVOKEVIRTUAL) {
- mv.visitFieldInsn(opcode, iowner, iname, idesc);
- } else {
- mv.visitMethodInsn(opcode, iowner, iname, idesc, itf);
- }
- if (opcode == Opcodes.INVOKEINTERFACE) {
- u += 5;
- } else {
- u += 3;
- }
- break;
- }
- case ClassWriter.INDYMETH_INSN: {
- int cpIndex = items[readUnsignedShort(u + 1)];
- int bsmIndex = context.bootstrapMethods[readUnsignedShort(cpIndex)];
- Handle bsm = (Handle) readConst(readUnsignedShort(bsmIndex), c);
- int bsmArgCount = readUnsignedShort(bsmIndex + 2);
- Object[] bsmArgs = new Object[bsmArgCount];
- bsmIndex += 4;
- for (int i = 0; i < bsmArgCount; i++) {
- bsmArgs[i] = readConst(readUnsignedShort(bsmIndex), c);
- bsmIndex += 2;
- }
- cpIndex = items[readUnsignedShort(cpIndex + 2)];
- String iname = readUTF8(cpIndex, c);
- String idesc = readUTF8(cpIndex + 2, c);
- mv.visitInvokeDynamicInsn(iname, idesc, bsm, bsmArgs);
- u += 5;
- break;
- }
- case ClassWriter.TYPE_INSN:
- mv.visitTypeInsn(opcode, readClass(u + 1, c));
- u += 3;
- break;
- case ClassWriter.IINC_INSN:
- mv.visitIincInsn(b[u + 1] & 0xFF, b[u + 2]);
- u += 3;
- break;
- // case MANA_INSN:
- default:
- mv.visitMultiANewArrayInsn(readClass(u + 1, c), b[u + 3] & 0xFF);
- u += 4;
- break;
- }
-
- // visit the instruction annotations, if any
- while (tanns != null && tann < tanns.length && ntoff <= offset) {
- if (ntoff == offset) {
- int v = readAnnotationTarget(context, tanns[tann]);
- readAnnotationValues(v + 2, c, true,
- mv.visitInsnAnnotation(context.typeRef,
- context.typePath, readUTF8(v, c), true));
- }
- ntoff = ++tann >= tanns.length || readByte(tanns[tann]) < 0x43 ? -1
- : readUnsignedShort(tanns[tann] + 1);
- }
- while (itanns != null && itann < itanns.length && nitoff <= offset) {
- if (nitoff == offset) {
- int v = readAnnotationTarget(context, itanns[itann]);
- readAnnotationValues(v + 2, c, true,
- mv.visitInsnAnnotation(context.typeRef,
- context.typePath, readUTF8(v, c), false));
- }
- nitoff = ++itann >= itanns.length
- || readByte(itanns[itann]) < 0x43 ? -1
- : readUnsignedShort(itanns[itann] + 1);
- }
- }
- if (labels[codeLength] != null) {
- mv.visitLabel(labels[codeLength]);
- }
-
- // visits the local variable tables
- if ((context.flags & SKIP_DEBUG) == 0 && varTable != 0) {
- int[] typeTable = null;
- if (varTypeTable != 0) {
- u = varTypeTable + 2;
- typeTable = new int[readUnsignedShort(varTypeTable) * 3];
- for (int i = typeTable.length; i > 0;) {
- typeTable[--i] = u + 6; // signature
- typeTable[--i] = readUnsignedShort(u + 8); // index
- typeTable[--i] = readUnsignedShort(u); // start
- u += 10;
- }
- }
- u = varTable + 2;
- for (int i = readUnsignedShort(varTable); i > 0; --i) {
- int start = readUnsignedShort(u);
- int length = readUnsignedShort(u + 2);
- int index = readUnsignedShort(u + 8);
- String vsignature = null;
- if (typeTable != null) {
- for (int j = 0; j < typeTable.length; j += 3) {
- if (typeTable[j] == start && typeTable[j + 1] == index) {
- vsignature = readUTF8(typeTable[j + 2], c);
- break;
- }
- }
- }
- mv.visitLocalVariable(readUTF8(u + 4, c), readUTF8(u + 6, c),
- vsignature, labels[start], labels[start + length],
- index);
- u += 10;
- }
- }
-
- // visits the local variables type annotations
- if (tanns != null) {
- for (int i = 0; i < tanns.length; ++i) {
- if ((readByte(tanns[i]) >> 1) == (0x40 >> 1)) {
- int v = readAnnotationTarget(context, tanns[i]);
- v = readAnnotationValues(v + 2, c, true,
- mv.visitLocalVariableAnnotation(context.typeRef,
- context.typePath, context.start,
- context.end, context.index, readUTF8(v, c),
- true));
- }
- }
- }
- if (itanns != null) {
- for (int i = 0; i < itanns.length; ++i) {
- if ((readByte(itanns[i]) >> 1) == (0x40 >> 1)) {
- int v = readAnnotationTarget(context, itanns[i]);
- v = readAnnotationValues(v + 2, c, true,
- mv.visitLocalVariableAnnotation(context.typeRef,
- context.typePath, context.start,
- context.end, context.index, readUTF8(v, c),
- false));
- }
- }
- }
-
- // visits the code attributes
- while (attributes != null) {
- Attribute attr = attributes.next;
- attributes.next = null;
- mv.visitAttribute(attributes);
- attributes = attr;
- }
-
- // visits the max stack and max locals values
- mv.visitMaxs(maxStack, maxLocals);
- }
-
- /**
- * Parses a type annotation table to find the labels, and to visit the try
- * catch block annotations.
- *
- * @param u
- * the start offset of a type annotation table.
- * @param mv
- * the method visitor to be used to visit the try catch block
- * annotations.
- * @param context
- * information about the class being parsed.
- * @param visible
- * if the type annotation table to parse contains runtime visible
- * annotations.
- * @return the start offset of each type annotation in the parsed table.
- */
- private int[] readTypeAnnotations(final MethodVisitor mv,
- final Context context, int u, boolean visible) {
- char[] c = context.buffer;
- int[] offsets = new int[readUnsignedShort(u)];
- u += 2;
- for (int i = 0; i < offsets.length; ++i) {
- offsets[i] = u;
- int target = readInt(u);
- switch (target >>> 24) {
- case 0x00: // CLASS_TYPE_PARAMETER
- case 0x01: // METHOD_TYPE_PARAMETER
- case 0x16: // METHOD_FORMAL_PARAMETER
- u += 2;
- break;
- case 0x13: // FIELD
- case 0x14: // METHOD_RETURN
- case 0x15: // METHOD_RECEIVER
- u += 1;
- break;
- case 0x40: // LOCAL_VARIABLE
- case 0x41: // RESOURCE_VARIABLE
- for (int j = readUnsignedShort(u + 1); j > 0; --j) {
- int start = readUnsignedShort(u + 3);
- int length = readUnsignedShort(u + 5);
- readLabel(start, context.labels);
- readLabel(start + length, context.labels);
- u += 6;
- }
- u += 3;
- break;
- case 0x47: // CAST
- case 0x48: // CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
- case 0x49: // METHOD_INVOCATION_TYPE_ARGUMENT
- case 0x4A: // CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
- case 0x4B: // METHOD_REFERENCE_TYPE_ARGUMENT
- u += 4;
- break;
- // case 0x10: // CLASS_EXTENDS
- // case 0x11: // CLASS_TYPE_PARAMETER_BOUND
- // case 0x12: // METHOD_TYPE_PARAMETER_BOUND
- // case 0x17: // THROWS
- // case 0x42: // EXCEPTION_PARAMETER
- // case 0x43: // INSTANCEOF
- // case 0x44: // NEW
- // case 0x45: // CONSTRUCTOR_REFERENCE
- // case 0x46: // METHOD_REFERENCE
- default:
- u += 3;
- break;
- }
- int pathLength = readByte(u);
- if ((target >>> 24) == 0x42) {
- TypePath path = pathLength == 0 ? null : new TypePath(b, u);
- u += 1 + 2 * pathLength;
- u = readAnnotationValues(u + 2, c, true,
- mv.visitTryCatchAnnotation(target, path,
- readUTF8(u, c), visible));
- } else {
- u = readAnnotationValues(u + 3 + 2 * pathLength, c, true, null);
- }
- }
- return offsets;
- }
-
- /**
- * Parses the header of a type annotation to extract its target_type and
- * target_path (the result is stored in the given context), and returns the
- * start offset of the rest of the type_annotation structure (i.e. the
- * offset to the type_index field, which is followed by
- * num_element_value_pairs and then the name,value pairs).
- *
- * @param context
- * information about the class being parsed. This is where the
- * extracted target_type and target_path must be stored.
- * @param u
- * the start offset of a type_annotation structure.
- * @return the start offset of the rest of the type_annotation structure.
- */
- private int readAnnotationTarget(final Context context, int u) {
- int target = readInt(u);
- switch (target >>> 24) {
- case 0x00: // CLASS_TYPE_PARAMETER
- case 0x01: // METHOD_TYPE_PARAMETER
- case 0x16: // METHOD_FORMAL_PARAMETER
- target &= 0xFFFF0000;
- u += 2;
- break;
- case 0x13: // FIELD
- case 0x14: // METHOD_RETURN
- case 0x15: // METHOD_RECEIVER
- target &= 0xFF000000;
- u += 1;
- break;
- case 0x40: // LOCAL_VARIABLE
- case 0x41: { // RESOURCE_VARIABLE
- target &= 0xFF000000;
- int n = readUnsignedShort(u + 1);
- context.start = new Label[n];
- context.end = new Label[n];
- context.index = new int[n];
- u += 3;
- for (int i = 0; i < n; ++i) {
- int start = readUnsignedShort(u);
- int length = readUnsignedShort(u + 2);
- context.start[i] = readLabel(start, context.labels);
- context.end[i] = readLabel(start + length, context.labels);
- context.index[i] = readUnsignedShort(u + 4);
- u += 6;
- }
- break;
- }
- case 0x47: // CAST
- case 0x48: // CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
- case 0x49: // METHOD_INVOCATION_TYPE_ARGUMENT
- case 0x4A: // CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
- case 0x4B: // METHOD_REFERENCE_TYPE_ARGUMENT
- target &= 0xFF0000FF;
- u += 4;
- break;
- // case 0x10: // CLASS_EXTENDS
- // case 0x11: // CLASS_TYPE_PARAMETER_BOUND
- // case 0x12: // METHOD_TYPE_PARAMETER_BOUND
- // case 0x17: // THROWS
- // case 0x42: // EXCEPTION_PARAMETER
- // case 0x43: // INSTANCEOF
- // case 0x44: // NEW
- // case 0x45: // CONSTRUCTOR_REFERENCE
- // case 0x46: // METHOD_REFERENCE
- default:
- target &= (target >>> 24) < 0x43 ? 0xFFFFFF00 : 0xFF000000;
- u += 3;
- break;
- }
- int pathLength = readByte(u);
- context.typeRef = target;
- context.typePath = pathLength == 0 ? null : new TypePath(b, u);
- return u + 1 + 2 * pathLength;
- }
-
- /**
- * Reads parameter annotations and makes the given visitor visit them.
- *
- * @param mv
- * the visitor that must visit the annotations.
- * @param context
- * information about the class being parsed.
- * @param v
- * start offset in {@link #b b} of the annotations to be read.
- * @param visible
- * <tt>true</tt> if the annotations to be read are visible at
- * runtime.
- */
- private void readParameterAnnotations(final MethodVisitor mv,
- final Context context, int v, final boolean visible) {
- int i;
- int n = b[v++] & 0xFF;
- // workaround for a bug in javac (javac compiler generates a parameter
- // annotation array whose size is equal to the number of parameters in
- // the Java source file, while it should generate an array whose size is
- // equal to the number of parameters in the method descriptor - which
- // includes the synthetic parameters added by the compiler). This work-
- // around supposes that the synthetic parameters are the first ones.
- int synthetics = Type.getArgumentTypes(context.desc).length - n;
- AnnotationVisitor av;
- for (i = 0; i < synthetics; ++i) {
- // virtual annotation to detect synthetic parameters in MethodWriter
- av = mv.visitParameterAnnotation(i, "Ljava/lang/Synthetic;", false);
- if (av != null) {
- av.visitEnd();
- }
- }
- char[] c = context.buffer;
- for (; i < n + synthetics; ++i) {
- int j = readUnsignedShort(v);
- v += 2;
- for (; j > 0; --j) {
- av = mv.visitParameterAnnotation(i, readUTF8(v, c), visible);
- v = readAnnotationValues(v + 2, c, true, av);
- }
- }
- }
-
- /**
- * Reads the values of an annotation and makes the given visitor visit them.
- *
- * @param v
- * the start offset in {@link #b b} of the values to be read
- * (including the unsigned short that gives the number of
- * values).
- * @param buf
- * buffer to be used to call {@link #readUTF8 readUTF8},
- * {@link #readClass(int,char[]) readClass} or {@link #readConst
- * readConst}.
- * @param named
- * if the annotation values are named or not.
- * @param av
- * the visitor that must visit the values.
- * @return the end offset of the annotation values.
- */
- private int readAnnotationValues(int v, final char[] buf,
- final boolean named, final AnnotationVisitor av) {
- int i = readUnsignedShort(v);
- v += 2;
- if (named) {
- for (; i > 0; --i) {
- v = readAnnotationValue(v + 2, buf, readUTF8(v, buf), av);
- }
- } else {
- for (; i > 0; --i) {
- v = readAnnotationValue(v, buf, null, av);
- }
- }
- if (av != null) {
- av.visitEnd();
- }
- return v;
- }
-
- /**
- * Reads a value of an annotation and makes the given visitor visit it.
- *
- * @param v
- * the start offset in {@link #b b} of the value to be read
- * (<i>not including the value name constant pool index</i>).
- * @param buf
- * buffer to be used to call {@link #readUTF8 readUTF8},
- * {@link #readClass(int,char[]) readClass} or {@link #readConst
- * readConst}.
- * @param name
- * the name of the value to be read.
- * @param av
- * the visitor that must visit the value.
- * @return the end offset of the annotation value.
- */
- private int readAnnotationValue(int v, final char[] buf, final String name,
- final AnnotationVisitor av) {
- int i;
- if (av == null) {
- switch (b[v] & 0xFF) {
- case 'e': // enum_const_value
- return v + 5;
- case '@': // annotation_value
- return readAnnotationValues(v + 3, buf, true, null);
- case '[': // array_value
- return readAnnotationValues(v + 1, buf, false, null);
- default:
- return v + 3;
- }
- }
- switch (b[v++] & 0xFF) {
- case 'I': // pointer to CONSTANT_Integer
- case 'J': // pointer to CONSTANT_Long
- case 'F': // pointer to CONSTANT_Float
- case 'D': // pointer to CONSTANT_Double
- av.visit(name, readConst(readUnsignedShort(v), buf));
- v += 2;
- break;
- case 'B': // pointer to CONSTANT_Byte
- av.visit(name,
- new Byte((byte) readInt(items[readUnsignedShort(v)])));
- v += 2;
- break;
- case 'Z': // pointer to CONSTANT_Boolean
- av.visit(name,
- readInt(items[readUnsignedShort(v)]) == 0 ? Boolean.FALSE
- : Boolean.TRUE);
- v += 2;
- break;
- case 'S': // pointer to CONSTANT_Short
- av.visit(name, new Short(
- (short) readInt(items[readUnsignedShort(v)])));
- v += 2;
- break;
- case 'C': // pointer to CONSTANT_Char
- av.visit(name, new Character(
- (char) readInt(items[readUnsignedShort(v)])));
- v += 2;
- break;
- case 's': // pointer to CONSTANT_Utf8
- av.visit(name, readUTF8(v, buf));
- v += 2;
- break;
- case 'e': // enum_const_value
- av.visitEnum(name, readUTF8(v, buf), readUTF8(v + 2, buf));
- v += 4;
- break;
- case 'c': // class_info
- av.visit(name, Type.getType(readUTF8(v, buf)));
- v += 2;
- break;
- case '@': // annotation_value
- v = readAnnotationValues(v + 2, buf, true,
- av.visitAnnotation(name, readUTF8(v, buf)));
- break;
- case '[': // array_value
- int size = readUnsignedShort(v);
- v += 2;
- if (size == 0) {
- return readAnnotationValues(v - 2, buf, false,
- av.visitArray(name));
- }
- switch (this.b[v++] & 0xFF) {
- case 'B':
- byte[] bv = new byte[size];
- for (i = 0; i < size; i++) {
- bv[i] = (byte) readInt(items[readUnsignedShort(v)]);
- v += 3;
- }
- av.visit(name, bv);
- --v;
- break;
- case 'Z':
- boolean[] zv = new boolean[size];
- for (i = 0; i < size; i++) {
- zv[i] = readInt(items[readUnsignedShort(v)]) != 0;
- v += 3;
- }
- av.visit(name, zv);
- --v;
- break;
- case 'S':
- short[] sv = new short[size];
- for (i = 0; i < size; i++) {
- sv[i] = (short) readInt(items[readUnsignedShort(v)]);
- v += 3;
- }
- av.visit(name, sv);
- --v;
- break;
- case 'C':
- char[] cv = new char[size];
- for (i = 0; i < size; i++) {
- cv[i] = (char) readInt(items[readUnsignedShort(v)]);
- v += 3;
- }
- av.visit(name, cv);
- --v;
- break;
- case 'I':
- int[] iv = new int[size];
- for (i = 0; i < size; i++) {
- iv[i] = readInt(items[readUnsignedShort(v)]);
- v += 3;
- }
- av.visit(name, iv);
- --v;
- break;
- case 'J':
- long[] lv = new long[size];
- for (i = 0; i < size; i++) {
- lv[i] = readLong(items[readUnsignedShort(v)]);
- v += 3;
- }
- av.visit(name, lv);
- --v;
- break;
- case 'F':
- float[] fv = new float[size];
- for (i = 0; i < size; i++) {
- fv[i] = Float
- .intBitsToFloat(readInt(items[readUnsignedShort(v)]));
- v += 3;
- }
- av.visit(name, fv);
- --v;
- break;
- case 'D':
- double[] dv = new double[size];
- for (i = 0; i < size; i++) {
- dv[i] = Double
- .longBitsToDouble(readLong(items[readUnsignedShort(v)]));
- v += 3;
- }
- av.visit(name, dv);
- --v;
- break;
- default:
- v = readAnnotationValues(v - 3, buf, false, av.visitArray(name));
- }
- }
- return v;
- }
-
- /**
- * Computes the implicit frame of the method currently being parsed (as
- * defined in the given {@link Context}) and stores it in the given context.
- *
- * @param frame
- * information about the class being parsed.
- */
- private void getImplicitFrame(final Context frame) {
- String desc = frame.desc;
- Object[] locals = frame.local;
- int local = 0;
- if ((frame.access & Opcodes.ACC_STATIC) == 0) {
- if ("<init>".equals(frame.name)) {
- locals[local++] = Opcodes.UNINITIALIZED_THIS;
- } else {
- locals[local++] = readClass(header + 2, frame.buffer);
- }
- }
- int i = 1;
- loop: while (true) {
- int j = i;
- switch (desc.charAt(i++)) {
- case 'Z':
- case 'C':
- case 'B':
- case 'S':
- case 'I':
- locals[local++] = Opcodes.INTEGER;
- break;
- case 'F':
- locals[local++] = Opcodes.FLOAT;
- break;
- case 'J':
- locals[local++] = Opcodes.LONG;
- break;
- case 'D':
- locals[local++] = Opcodes.DOUBLE;
- break;
- case '[':
- while (desc.charAt(i) == '[') {
- ++i;
- }
- if (desc.charAt(i) == 'L') {
- ++i;
- while (desc.charAt(i) != ';') {
- ++i;
- }
- }
- locals[local++] = desc.substring(j, ++i);
- break;
- case 'L':
- while (desc.charAt(i) != ';') {
- ++i;
- }
- locals[local++] = desc.substring(j + 1, i++);
- break;
- default:
- break loop;
- }
- }
- frame.localCount = local;
- }
-
- /**
- * Reads a stack map frame and stores the result in the given
- * {@link Context} object.
- *
- * @param stackMap
- * the start offset of a stack map frame in the class file.
- * @param zip
- * if the stack map frame at stackMap is compressed or not.
- * @param unzip
- * if the stack map frame must be uncompressed.
- * @param frame
- * where the parsed stack map frame must be stored.
- * @return the offset of the first byte following the parsed frame.
- */
- private int readFrame(int stackMap, boolean zip, boolean unzip,
- Context frame) {
- char[] c = frame.buffer;
- Label[] labels = frame.labels;
- int tag;
- int delta;
- if (zip) {
- tag = b[stackMap++] & 0xFF;
- } else {
- tag = MethodWriter.FULL_FRAME;
- frame.offset = -1;
- }
- frame.localDiff = 0;
- if (tag < MethodWriter.SAME_LOCALS_1_STACK_ITEM_FRAME) {
- delta = tag;
- frame.mode = Opcodes.F_SAME;
- frame.stackCount = 0;
- } else if (tag < MethodWriter.RESERVED) {
- delta = tag - MethodWriter.SAME_LOCALS_1_STACK_ITEM_FRAME;
- stackMap = readFrameType(frame.stack, 0, stackMap, c, labels);
- frame.mode = Opcodes.F_SAME1;
- frame.stackCount = 1;
- } else {
- delta = readUnsignedShort(stackMap);
- stackMap += 2;
- if (tag == MethodWriter.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) {
- stackMap = readFrameType(frame.stack, 0, stackMap, c, labels);
- frame.mode = Opcodes.F_SAME1;
- frame.stackCount = 1;
- } else if (tag >= MethodWriter.CHOP_FRAME
- && tag < MethodWriter.SAME_FRAME_EXTENDED) {
- frame.mode = Opcodes.F_CHOP;
- frame.localDiff = MethodWriter.SAME_FRAME_EXTENDED - tag;
- frame.localCount -= frame.localDiff;
- frame.stackCount = 0;
- } else if (tag == MethodWriter.SAME_FRAME_EXTENDED) {
- frame.mode = Opcodes.F_SAME;
- frame.stackCount = 0;
- } else if (tag < MethodWriter.FULL_FRAME) {
- int local = unzip ? frame.localCount : 0;
- for (int i = tag - MethodWriter.SAME_FRAME_EXTENDED; i > 0; i--) {
- stackMap = readFrameType(frame.local, local++, stackMap, c,
- labels);
- }
- frame.mode = Opcodes.F_APPEND;
- frame.localDiff = tag - MethodWriter.SAME_FRAME_EXTENDED;
- frame.localCount += frame.localDiff;
- frame.stackCount = 0;
- } else { // if (tag == FULL_FRAME) {
- frame.mode = Opcodes.F_FULL;
- int n = readUnsignedShort(stackMap);
- stackMap += 2;
- frame.localDiff = n;
- frame.localCount = n;
- for (int local = 0; n > 0; n--) {
- stackMap = readFrameType(frame.local, local++, stackMap, c,
- labels);
- }
- n = readUnsignedShort(stackMap);
- stackMap += 2;
- frame.stackCount = n;
- for (int stack = 0; n > 0; n--) {
- stackMap = readFrameType(frame.stack, stack++, stackMap, c,
- labels);
- }
- }
- }
- frame.offset += delta + 1;
- readLabel(frame.offset, labels);
- return stackMap;
- }
-
- /**
- * Reads a stack map frame type and stores it at the given index in the
- * given array.
- *
- * @param frame
- * the array where the parsed type must be stored.
- * @param index
- * the index in 'frame' where the parsed type must be stored.
- * @param v
- * the start offset of the stack map frame type to read.
- * @param buf
- * a buffer to read strings.
- * @param labels
- * the labels of the method currently being parsed, indexed by
- * their offset. If the parsed type is an Uninitialized type, a
- * new label for the corresponding NEW instruction is stored in
- * this array if it does not already exist.
- * @return the offset of the first byte after the parsed type.
- */
- private int readFrameType(final Object[] frame, final int index, int v,
- final char[] buf, final Label[] labels) {
- int type = b[v++] & 0xFF;
- switch (type) {
- case 0:
- frame[index] = Opcodes.TOP;
- break;
- case 1:
- frame[index] = Opcodes.INTEGER;
- break;
- case 2:
- frame[index] = Opcodes.FLOAT;
- break;
- case 3:
- frame[index] = Opcodes.DOUBLE;
- break;
- case 4:
- frame[index] = Opcodes.LONG;
- break;
- case 5:
- frame[index] = Opcodes.NULL;
- break;
- case 6:
- frame[index] = Opcodes.UNINITIALIZED_THIS;
- break;
- case 7: // Object
- frame[index] = readClass(v, buf);
- v += 2;
- break;
- default: // Uninitialized
- frame[index] = readLabel(readUnsignedShort(v), labels);
- v += 2;
- }
- return v;
- }
-
- /**
- * Returns the label corresponding to the given offset. The default
- * implementation of this method creates a label for the given offset if it
- * has not been already created.
- *
- * @param offset
- * a bytecode offset in a method.
- * @param labels
- * the already created labels, indexed by their offset. If a
- * label already exists for offset this method must not create a
- * new one. Otherwise it must store the new label in this array.
- * @return a non null Label, which must be equal to labels[offset].
- */
- protected Label readLabel(int offset, Label[] labels) {
- if (labels[offset] == null) {
- labels[offset] = new Label();
- }
- return labels[offset];
- }
-
- /**
- * Returns the start index of the attribute_info structure of this class.
- *
- * @return the start index of the attribute_info structure of this class.
- */
- private int getAttributes() {
- // skips the header
- int u = header + 8 + readUnsignedShort(header + 6) * 2;
- // skips fields and methods
- for (int i = readUnsignedShort(u); i > 0; --i) {
- for (int j = readUnsignedShort(u + 8); j > 0; --j) {
- u += 6 + readInt(u + 12);
- }
- u += 8;
- }
- u += 2;
- for (int i = readUnsignedShort(u); i > 0; --i) {
- for (int j = readUnsignedShort(u + 8); j > 0; --j) {
- u += 6 + readInt(u + 12);
- }
- u += 8;
- }
- // the attribute_info structure starts just after the methods
- return u + 2;
- }
-
- /**
- * Reads an attribute in {@link #b b}.
- *
- * @param attrs
- * prototypes of the attributes that must be parsed during the
- * visit of the class. Any attribute whose type is not equal to
- * the type of one the prototypes is ignored (i.e. an empty
- * {@link Attribute} instance is returned).
- * @param type
- * the type of the attribute.
- * @param off
- * index of the first byte of the attribute's content in
- * {@link #b b}. The 6 attribute header bytes, containing the
- * type and the length of the attribute, are not taken into
- * account here (they have already been read).
- * @param len
- * the length of the attribute's content.
- * @param buf
- * buffer to be used to call {@link #readUTF8 readUTF8},
- * {@link #readClass(int,char[]) readClass} or {@link #readConst
- * readConst}.
- * @param codeOff
- * index of the first byte of code's attribute content in
- * {@link #b b}, or -1 if the attribute to be read is not a code
- * attribute. The 6 attribute header bytes, containing the type
- * and the length of the attribute, are not taken into account
- * here.
- * @param labels
- * the labels of the method's code, or <tt>null</tt> if the
- * attribute to be read is not a code attribute.
- * @return the attribute that has been read, or <tt>null</tt> to skip this
- * attribute.
- */
- private Attribute readAttribute(final Attribute[] attrs, final String type,
- final int off, final int len, final char[] buf, final int codeOff,
- final Label[] labels) {
- for (int i = 0; i < attrs.length; ++i) {
- if (attrs[i].type.equals(type)) {
- return attrs[i].read(this, off, len, buf, codeOff, labels);
- }
- }
- return new Attribute(type).read(this, off, len, null, -1, null);
- }
-
- // ------------------------------------------------------------------------
- // Utility methods: low level parsing
- // ------------------------------------------------------------------------
-
- /**
- * Returns the number of constant pool items in {@link #b b}.
- *
- * @return the number of constant pool items in {@link #b b}.
- */
- public int getItemCount() {
- return items.length;
- }
-
- /**
- * Returns the start index of the constant pool item in {@link #b b}, plus
- * one. <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param item
- * the index a constant pool item.
- * @return the start index of the constant pool item in {@link #b b}, plus
- * one.
- */
- public int getItem(final int item) {
- return items[item];
- }
-
- /**
- * Returns the maximum length of the strings contained in the constant pool
- * of the class.
- *
- * @return the maximum length of the strings contained in the constant pool
- * of the class.
- */
- public int getMaxStringLength() {
- return maxStringLength;
- }
-
- /**
- * Reads a byte value in {@link #b b}. <i>This method is intended for
- * {@link Attribute} sub classes, and is normally not needed by class
- * generators or adapters.</i>
- *
- * @param index
- * the start index of the value to be read in {@link #b b}.
- * @return the read value.
- */
- public int readByte(final int index) {
- return b[index] & 0xFF;
- }
-
- /**
- * Reads an unsigned short value in {@link #b b}. <i>This method is intended
- * for {@link Attribute} sub classes, and is normally not needed by class
- * generators or adapters.</i>
- *
- * @param index
- * the start index of the value to be read in {@link #b b}.
- * @return the read value.
- */
- public int readUnsignedShort(final int index) {
- byte[] b = this.b;
- return ((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF);
- }
-
- /**
- * Reads a signed short value in {@link #b b}. <i>This method is intended
- * for {@link Attribute} sub classes, and is normally not needed by class
- * generators or adapters.</i>
- *
- * @param index
- * the start index of the value to be read in {@link #b b}.
- * @return the read value.
- */
- public short readShort(final int index) {
- byte[] b = this.b;
- return (short) (((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF));
- }
-
- /**
- * Reads a signed int value in {@link #b b}. <i>This method is intended for
- * {@link Attribute} sub classes, and is normally not needed by class
- * generators or adapters.</i>
- *
- * @param index
- * the start index of the value to be read in {@link #b b}.
- * @return the read value.
- */
- public int readInt(final int index) {
- byte[] b = this.b;
- return ((b[index] & 0xFF) << 24) | ((b[index + 1] & 0xFF) << 16)
- | ((b[index + 2] & 0xFF) << 8) | (b[index + 3] & 0xFF);
- }
-
- /**
- * Reads a signed long value in {@link #b b}. <i>This method is intended for
- * {@link Attribute} sub classes, and is normally not needed by class
- * generators or adapters.</i>
- *
- * @param index
- * the start index of the value to be read in {@link #b b}.
- * @return the read value.
- */
- public long readLong(final int index) {
- long l1 = readInt(index);
- long l0 = readInt(index + 4) & 0xFFFFFFFFL;
- return (l1 << 32) | l0;
- }
-
- /**
- * Reads an UTF8 string constant pool item in {@link #b b}. <i>This method
- * is intended for {@link Attribute} sub classes, and is normally not needed
- * by class generators or adapters.</i>
- *
- * @param index
- * the start index of an unsigned short value in {@link #b b},
- * whose value is the index of an UTF8 constant pool item.
- * @param buf
- * buffer to be used to read the item. This buffer must be
- * sufficiently large. It is not automatically resized.
- * @return the String corresponding to the specified UTF8 item.
- */
- public String readUTF8(int index, final char[] buf) {
- int item = readUnsignedShort(index);
- if (index == 0 || item == 0) {
- return null;
- }
- String s = strings[item];
- if (s != null) {
- return s;
- }
- index = items[item];
- return strings[item] = readUTF(index + 2, readUnsignedShort(index), buf);
- }
-
- /**
- * Reads UTF8 string in {@link #b b}.
- *
- * @param index
- * start offset of the UTF8 string to be read.
- * @param utfLen
- * length of the UTF8 string to be read.
- * @param buf
- * buffer to be used to read the string. This buffer must be
- * sufficiently large. It is not automatically resized.
- * @return the String corresponding to the specified UTF8 string.
- */
- private String readUTF(int index, final int utfLen, final char[] buf) {
- int endIndex = index + utfLen;
- byte[] b = this.b;
- int strLen = 0;
- int c;
- int st = 0;
- char cc = 0;
- while (index < endIndex) {
- c = b[index++];
- switch (st) {
- case 0:
- c = c & 0xFF;
- if (c < 0x80) { // 0xxxxxxx
- buf[strLen++] = (char) c;
- } else if (c < 0xE0 && c > 0xBF) { // 110x xxxx 10xx xxxx
- cc = (char) (c & 0x1F);
- st = 1;
- } else { // 1110 xxxx 10xx xxxx 10xx xxxx
- cc = (char) (c & 0x0F);
- st = 2;
- }
- break;
-
- case 1: // byte 2 of 2-byte char or byte 3 of 3-byte char
- buf[strLen++] = (char) ((cc << 6) | (c & 0x3F));
- st = 0;
- break;
-
- case 2: // byte 2 of 3-byte char
- cc = (char) ((cc << 6) | (c & 0x3F));
- st = 1;
- break;
- }
- }
- return new String(buf, 0, strLen);
- }
-
- /**
- * Reads a class constant pool item in {@link #b b}. <i>This method is
- * intended for {@link Attribute} sub classes, and is normally not needed by
- * class generators or adapters.</i>
- *
- * @param index
- * the start index of an unsigned short value in {@link #b b},
- * whose value is the index of a class constant pool item.
- * @param buf
- * buffer to be used to read the item. This buffer must be
- * sufficiently large. It is not automatically resized.
- * @return the String corresponding to the specified class item.
- */
- public String readClass(final int index, final char[] buf) {
- // computes the start index of the CONSTANT_Class item in b
- // and reads the CONSTANT_Utf8 item designated by
- // the first two bytes of this CONSTANT_Class item
- return readUTF8(items[readUnsignedShort(index)], buf);
- }
-
- /**
- * Reads a numeric or string constant pool item in {@link #b b}. <i>This
- * method is intended for {@link Attribute} sub classes, and is normally not
- * needed by class generators or adapters.</i>
- *
- * @param item
- * the index of a constant pool item.
- * @param buf
- * buffer to be used to read the item. This buffer must be
- * sufficiently large. It is not automatically resized.
- * @return the {@link Integer}, {@link Float}, {@link Long}, {@link Double},
- * {@link String}, {@link Type} or {@link Handle} corresponding to
- * the given constant pool item.
- */
- public Object readConst(final int item, final char[] buf) {
- int index = items[item];
- switch (b[index - 1]) {
- case ClassWriter.INT:
- return new Integer(readInt(index));
- case ClassWriter.FLOAT:
- return new Float(Float.intBitsToFloat(readInt(index)));
- case ClassWriter.LONG:
- return new Long(readLong(index));
- case ClassWriter.DOUBLE:
- return new Double(Double.longBitsToDouble(readLong(index)));
- case ClassWriter.CLASS:
- return Type.getObjectType(readUTF8(index, buf));
- case ClassWriter.STR:
- return readUTF8(index, buf);
- case ClassWriter.MTYPE:
- return Type.getMethodType(readUTF8(index, buf));
- default: // case ClassWriter.HANDLE_BASE + [1..9]:
- int tag = readByte(index);
- int[] items = this.items;
- int cpIndex = items[readUnsignedShort(index + 1)];
- String owner = readClass(cpIndex, buf);
- cpIndex = items[readUnsignedShort(cpIndex + 2)];
- String name = readUTF8(cpIndex, buf);
- String desc = readUTF8(cpIndex + 2, buf);
- return new Handle(tag, owner, name, desc);
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/ClassVisitor.java b/src/asm/scala/tools/asm/ClassVisitor.java
deleted file mode 100644
index 48dc2ca6ae..0000000000
--- a/src/asm/scala/tools/asm/ClassVisitor.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A visitor to visit a Java class. The methods of this class must be called in
- * the following order: <tt>visit</tt> [ <tt>visitSource</tt> ] [
- * <tt>visitOuterClass</tt> ] ( <tt>visitAnnotation</tt> |
- * <tt>visitTypeAnnotation</tt> | <tt>visitAttribute</tt> )* (
- * <tt>visitInnerClass</tt> | <tt>visitField</tt> | <tt>visitMethod</tt> )*
- * <tt>visitEnd</tt>.
- *
- * @author Eric Bruneton
- */
-public abstract class ClassVisitor {
-
- /**
- * The ASM API version implemented by this visitor. The value of this field
- * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- protected final int api;
-
- /**
- * The class visitor to which this visitor must delegate method calls. May
- * be null.
- */
- protected ClassVisitor cv;
-
- /**
- * Constructs a new {@link ClassVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- public ClassVisitor(final int api) {
- this(api, null);
- }
-
- /**
- * Constructs a new {@link ClassVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param cv
- * the class visitor to which this visitor must delegate method
- * calls. May be null.
- */
- public ClassVisitor(final int api, final ClassVisitor cv) {
- if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
- throw new IllegalArgumentException();
- }
- this.api = api;
- this.cv = cv;
- }
-
- /**
- * Visits the header of the class.
- *
- * @param version
- * the class version.
- * @param access
- * the class's access flags (see {@link Opcodes}). This parameter
- * also indicates if the class is deprecated.
- * @param name
- * the internal name of the class (see
- * {@link Type#getInternalName() getInternalName}).
- * @param signature
- * the signature of this class. May be <tt>null</tt> if the class
- * is not a generic one, and does not extend or implement generic
- * classes or interfaces.
- * @param superName
- * the internal of name of the super class (see
- * {@link Type#getInternalName() getInternalName}). For
- * interfaces, the super class is {@link Object}. May be
- * <tt>null</tt>, but only for the {@link Object} class.
- * @param interfaces
- * the internal names of the class's interfaces (see
- * {@link Type#getInternalName() getInternalName}). May be
- * <tt>null</tt>.
- */
- public void visit(int version, int access, String name, String signature,
- String superName, String[] interfaces) {
- if (cv != null) {
- cv.visit(version, access, name, signature, superName, interfaces);
- }
- }
-
- /**
- * Visits the source of the class.
- *
- * @param source
- * the name of the source file from which the class was compiled.
- * May be <tt>null</tt>.
- * @param debug
- * additional debug information to compute the correspondance
- * between source and compiled elements of the class. May be
- * <tt>null</tt>.
- */
- public void visitSource(String source, String debug) {
- if (cv != null) {
- cv.visitSource(source, debug);
- }
- }
-
- /**
- * Visits the enclosing class of the class. This method must be called only
- * if the class has an enclosing class.
- *
- * @param owner
- * internal name of the enclosing class of the class.
- * @param name
- * the name of the method that contains the class, or
- * <tt>null</tt> if the class is not enclosed in a method of its
- * enclosing class.
- * @param desc
- * the descriptor of the method that contains the class, or
- * <tt>null</tt> if the class is not enclosed in a method of its
- * enclosing class.
- */
- public void visitOuterClass(String owner, String name, String desc) {
- if (cv != null) {
- cv.visitOuterClass(owner, name, desc);
- }
- }
-
- /**
- * Visits an annotation of the class.
- *
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- if (cv != null) {
- return cv.visitAnnotation(desc, visible);
- }
- return null;
- }
-
- /**
- * Visits an annotation on a type in the class signature.
- *
- * @param typeRef
- * a reference to the annotated type. The sort of this type
- * reference must be {@link TypeReference#CLASS_TYPE_PARAMETER
- * CLASS_TYPE_PARAMETER},
- * {@link TypeReference#CLASS_TYPE_PARAMETER_BOUND
- * CLASS_TYPE_PARAMETER_BOUND} or
- * {@link TypeReference#CLASS_EXTENDS CLASS_EXTENDS}. See
- * {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- if (api < Opcodes.ASM5) {
- throw new RuntimeException();
- }
- if (cv != null) {
- return cv.visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
- return null;
- }
-
- /**
- * Visits a non standard attribute of the class.
- *
- * @param attr
- * an attribute.
- */
- public void visitAttribute(Attribute attr) {
- if (cv != null) {
- cv.visitAttribute(attr);
- }
- }
-
- /**
- * Visits information about an inner class. This inner class is not
- * necessarily a member of the class being visited.
- *
- * @param name
- * the internal name of an inner class (see
- * {@link Type#getInternalName() getInternalName}).
- * @param outerName
- * the internal name of the class to which the inner class
- * belongs (see {@link Type#getInternalName() getInternalName}).
- * May be <tt>null</tt> for not member classes.
- * @param innerName
- * the (simple) name of the inner class inside its enclosing
- * class. May be <tt>null</tt> for anonymous inner classes.
- * @param access
- * the access flags of the inner class as originally declared in
- * the enclosing class.
- */
- public void visitInnerClass(String name, String outerName,
- String innerName, int access) {
- if (cv != null) {
- cv.visitInnerClass(name, outerName, innerName, access);
- }
- }
-
- /**
- * Visits a field of the class.
- *
- * @param access
- * the field's access flags (see {@link Opcodes}). This parameter
- * also indicates if the field is synthetic and/or deprecated.
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor (see {@link Type Type}).
- * @param signature
- * the field's signature. May be <tt>null</tt> if the field's
- * type does not use generic types.
- * @param value
- * the field's initial value. This parameter, which may be
- * <tt>null</tt> if the field does not have an initial value,
- * must be an {@link Integer}, a {@link Float}, a {@link Long}, a
- * {@link Double} or a {@link String} (for <tt>int</tt>,
- * <tt>float</tt>, <tt>long</tt> or <tt>String</tt> fields
- * respectively). <i>This parameter is only used for static
- * fields</i>. Its value is ignored for non static fields, which
- * must be initialized through bytecode instructions in
- * constructors or methods.
- * @return a visitor to visit field annotations and attributes, or
- * <tt>null</tt> if this class visitor is not interested in visiting
- * these annotations and attributes.
- */
- public FieldVisitor visitField(int access, String name, String desc,
- String signature, Object value) {
- if (cv != null) {
- return cv.visitField(access, name, desc, signature, value);
- }
- return null;
- }
-
- /**
- * Visits a method of the class. This method <i>must</i> return a new
- * {@link MethodVisitor} instance (or <tt>null</tt>) each time it is called,
- * i.e., it should not return a previously returned visitor.
- *
- * @param access
- * the method's access flags (see {@link Opcodes}). This
- * parameter also indicates if the method is synthetic and/or
- * deprecated.
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link Type Type}).
- * @param signature
- * the method's signature. May be <tt>null</tt> if the method
- * parameters, return type and exceptions do not use generic
- * types.
- * @param exceptions
- * the internal names of the method's exception classes (see
- * {@link Type#getInternalName() getInternalName}). May be
- * <tt>null</tt>.
- * @return an object to visit the byte code of the method, or <tt>null</tt>
- * if this class visitor is not interested in visiting the code of
- * this method.
- */
- public MethodVisitor visitMethod(int access, String name, String desc,
- String signature, String[] exceptions) {
- if (cv != null) {
- return cv.visitMethod(access, name, desc, signature, exceptions);
- }
- return null;
- }
-
- /**
- * Visits the end of the class. This method, which is the last one to be
- * called, is used to inform the visitor that all the fields and methods of
- * the class have been visited.
- */
- public void visitEnd() {
- if (cv != null) {
- cv.visitEnd();
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/ClassWriter.java b/src/asm/scala/tools/asm/ClassWriter.java
deleted file mode 100644
index 5c2de3f982..0000000000
--- a/src/asm/scala/tools/asm/ClassWriter.java
+++ /dev/null
@@ -1,1785 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A {@link ClassVisitor} that generates classes in bytecode form. More
- * precisely this visitor generates a byte array conforming to the Java class
- * file format. It can be used alone, to generate a Java class "from scratch",
- * or with one or more {@link ClassReader ClassReader} and adapter class visitor
- * to generate a modified class from one or more existing Java classes.
- *
- * @author Eric Bruneton
- */
-public class ClassWriter extends ClassVisitor {
-
- /**
- * Flag to automatically compute the maximum stack size and the maximum
- * number of local variables of methods. If this flag is set, then the
- * arguments of the {@link MethodVisitor#visitMaxs visitMaxs} method of the
- * {@link MethodVisitor} returned by the {@link #visitMethod visitMethod}
- * method will be ignored, and computed automatically from the signature and
- * the bytecode of each method.
- *
- * @see #ClassWriter(int)
- */
- public static final int COMPUTE_MAXS = 1;
-
- /**
- * Flag to automatically compute the stack map frames of methods from
- * scratch. If this flag is set, then the calls to the
- * {@link MethodVisitor#visitFrame} method are ignored, and the stack map
- * frames are recomputed from the methods bytecode. The arguments of the
- * {@link MethodVisitor#visitMaxs visitMaxs} method are also ignored and
- * recomputed from the bytecode. In other words, computeFrames implies
- * computeMaxs.
- *
- * @see #ClassWriter(int)
- */
- public static final int COMPUTE_FRAMES = 2;
-
- /**
- * Pseudo access flag to distinguish between the synthetic attribute and the
- * synthetic access flag.
- */
- static final int ACC_SYNTHETIC_ATTRIBUTE = 0x40000;
-
- /**
- * Factor to convert from ACC_SYNTHETIC_ATTRIBUTE to Opcode.ACC_SYNTHETIC.
- */
- static final int TO_ACC_SYNTHETIC = ACC_SYNTHETIC_ATTRIBUTE
- / Opcodes.ACC_SYNTHETIC;
-
- /**
- * The type of instructions without any argument.
- */
- static final int NOARG_INSN = 0;
-
- /**
- * The type of instructions with an signed byte argument.
- */
- static final int SBYTE_INSN = 1;
-
- /**
- * The type of instructions with an signed short argument.
- */
- static final int SHORT_INSN = 2;
-
- /**
- * The type of instructions with a local variable index argument.
- */
- static final int VAR_INSN = 3;
-
- /**
- * The type of instructions with an implicit local variable index argument.
- */
- static final int IMPLVAR_INSN = 4;
-
- /**
- * The type of instructions with a type descriptor argument.
- */
- static final int TYPE_INSN = 5;
-
- /**
- * The type of field and method invocations instructions.
- */
- static final int FIELDORMETH_INSN = 6;
-
- /**
- * The type of the INVOKEINTERFACE/INVOKEDYNAMIC instruction.
- */
- static final int ITFMETH_INSN = 7;
-
- /**
- * The type of the INVOKEDYNAMIC instruction.
- */
- static final int INDYMETH_INSN = 8;
-
- /**
- * The type of instructions with a 2 bytes bytecode offset label.
- */
- static final int LABEL_INSN = 9;
-
- /**
- * The type of instructions with a 4 bytes bytecode offset label.
- */
- static final int LABELW_INSN = 10;
-
- /**
- * The type of the LDC instruction.
- */
- static final int LDC_INSN = 11;
-
- /**
- * The type of the LDC_W and LDC2_W instructions.
- */
- static final int LDCW_INSN = 12;
-
- /**
- * The type of the IINC instruction.
- */
- static final int IINC_INSN = 13;
-
- /**
- * The type of the TABLESWITCH instruction.
- */
- static final int TABL_INSN = 14;
-
- /**
- * The type of the LOOKUPSWITCH instruction.
- */
- static final int LOOK_INSN = 15;
-
- /**
- * The type of the MULTIANEWARRAY instruction.
- */
- static final int MANA_INSN = 16;
-
- /**
- * The type of the WIDE instruction.
- */
- static final int WIDE_INSN = 17;
-
- /**
- * The instruction types of all JVM opcodes.
- */
- static final byte[] TYPE;
-
- /**
- * The type of CONSTANT_Class constant pool items.
- */
- static final int CLASS = 7;
-
- /**
- * The type of CONSTANT_Fieldref constant pool items.
- */
- static final int FIELD = 9;
-
- /**
- * The type of CONSTANT_Methodref constant pool items.
- */
- static final int METH = 10;
-
- /**
- * The type of CONSTANT_InterfaceMethodref constant pool items.
- */
- static final int IMETH = 11;
-
- /**
- * The type of CONSTANT_String constant pool items.
- */
- static final int STR = 8;
-
- /**
- * The type of CONSTANT_Integer constant pool items.
- */
- static final int INT = 3;
-
- /**
- * The type of CONSTANT_Float constant pool items.
- */
- static final int FLOAT = 4;
-
- /**
- * The type of CONSTANT_Long constant pool items.
- */
- static final int LONG = 5;
-
- /**
- * The type of CONSTANT_Double constant pool items.
- */
- static final int DOUBLE = 6;
-
- /**
- * The type of CONSTANT_NameAndType constant pool items.
- */
- static final int NAME_TYPE = 12;
-
- /**
- * The type of CONSTANT_Utf8 constant pool items.
- */
- static final int UTF8 = 1;
-
- /**
- * The type of CONSTANT_MethodType constant pool items.
- */
- static final int MTYPE = 16;
-
- /**
- * The type of CONSTANT_MethodHandle constant pool items.
- */
- static final int HANDLE = 15;
-
- /**
- * The type of CONSTANT_InvokeDynamic constant pool items.
- */
- static final int INDY = 18;
-
- /**
- * The base value for all CONSTANT_MethodHandle constant pool items.
- * Internally, ASM store the 9 variations of CONSTANT_MethodHandle into 9
- * different items.
- */
- static final int HANDLE_BASE = 20;
-
- /**
- * Normal type Item stored in the ClassWriter {@link ClassWriter#typeTable},
- * instead of the constant pool, in order to avoid clashes with normal
- * constant pool items in the ClassWriter constant pool's hash table.
- */
- static final int TYPE_NORMAL = 30;
-
- /**
- * Uninitialized type Item stored in the ClassWriter
- * {@link ClassWriter#typeTable}, instead of the constant pool, in order to
- * avoid clashes with normal constant pool items in the ClassWriter constant
- * pool's hash table.
- */
- static final int TYPE_UNINIT = 31;
-
- /**
- * Merged type Item stored in the ClassWriter {@link ClassWriter#typeTable},
- * instead of the constant pool, in order to avoid clashes with normal
- * constant pool items in the ClassWriter constant pool's hash table.
- */
- static final int TYPE_MERGED = 32;
-
- /**
- * The type of BootstrapMethods items. These items are stored in a special
- * class attribute named BootstrapMethods and not in the constant pool.
- */
- static final int BSM = 33;
-
- /**
- * The class reader from which this class writer was constructed, if any.
- */
- ClassReader cr;
-
- /**
- * Minor and major version numbers of the class to be generated.
- */
- int version;
-
- /**
- * Index of the next item to be added in the constant pool.
- */
- int index;
-
- /**
- * The constant pool of this class.
- */
- final ByteVector pool;
-
- /**
- * The constant pool's hash table data.
- */
- Item[] items;
-
- /**
- * The threshold of the constant pool's hash table.
- */
- int threshold;
-
- /**
- * A reusable key used to look for items in the {@link #items} hash table.
- */
- final Item key;
-
- /**
- * A reusable key used to look for items in the {@link #items} hash table.
- */
- final Item key2;
-
- /**
- * A reusable key used to look for items in the {@link #items} hash table.
- */
- final Item key3;
-
- /**
- * A reusable key used to look for items in the {@link #items} hash table.
- */
- final Item key4;
-
- /**
- * A type table used to temporarily store internal names that will not
- * necessarily be stored in the constant pool. This type table is used by
- * the control flow and data flow analysis algorithm used to compute stack
- * map frames from scratch. This array associates to each index <tt>i</tt>
- * the Item whose index is <tt>i</tt>. All Item objects stored in this array
- * are also stored in the {@link #items} hash table. These two arrays allow
- * to retrieve an Item from its index or, conversely, to get the index of an
- * Item from its value. Each Item stores an internal name in its
- * {@link Item#strVal1} field.
- */
- Item[] typeTable;
-
- /**
- * Number of elements in the {@link #typeTable} array.
- */
- private short typeCount;
-
- /**
- * The access flags of this class.
- */
- private int access;
-
- /**
- * The constant pool item that contains the internal name of this class.
- */
- private int name;
-
- /**
- * The internal name of this class.
- */
- String thisName;
-
- /**
- * The constant pool item that contains the signature of this class.
- */
- private int signature;
-
- /**
- * The constant pool item that contains the internal name of the super class
- * of this class.
- */
- private int superName;
-
- /**
- * Number of interfaces implemented or extended by this class or interface.
- */
- private int interfaceCount;
-
- /**
- * The interfaces implemented or extended by this class or interface. More
- * precisely, this array contains the indexes of the constant pool items
- * that contain the internal names of these interfaces.
- */
- private int[] interfaces;
-
- /**
- * The index of the constant pool item that contains the name of the source
- * file from which this class was compiled.
- */
- private int sourceFile;
-
- /**
- * The SourceDebug attribute of this class.
- */
- private ByteVector sourceDebug;
-
- /**
- * The constant pool item that contains the name of the enclosing class of
- * this class.
- */
- private int enclosingMethodOwner;
-
- /**
- * The constant pool item that contains the name and descriptor of the
- * enclosing method of this class.
- */
- private int enclosingMethod;
-
- /**
- * The runtime visible annotations of this class.
- */
- private AnnotationWriter anns;
-
- /**
- * The runtime invisible annotations of this class.
- */
- private AnnotationWriter ianns;
-
- /**
- * The runtime visible type annotations of this class.
- */
- private AnnotationWriter tanns;
-
- /**
- * The runtime invisible type annotations of this class.
- */
- private AnnotationWriter itanns;
-
- /**
- * The non standard attributes of this class.
- */
- private Attribute attrs;
-
- /**
- * The number of entries in the InnerClasses attribute.
- */
- private int innerClassesCount;
-
- /**
- * The InnerClasses attribute.
- */
- private ByteVector innerClasses;
-
- /**
- * The number of entries in the BootstrapMethods attribute.
- */
- int bootstrapMethodsCount;
-
- /**
- * The BootstrapMethods attribute.
- */
- ByteVector bootstrapMethods;
-
- /**
- * The fields of this class. These fields are stored in a linked list of
- * {@link FieldWriter} objects, linked to each other by their
- * {@link FieldWriter#fv} field. This field stores the first element of this
- * list.
- */
- FieldWriter firstField;
-
- /**
- * The fields of this class. These fields are stored in a linked list of
- * {@link FieldWriter} objects, linked to each other by their
- * {@link FieldWriter#fv} field. This field stores the last element of this
- * list.
- */
- FieldWriter lastField;
-
- /**
- * The methods of this class. These methods are stored in a linked list of
- * {@link MethodWriter} objects, linked to each other by their
- * {@link MethodWriter#mv} field. This field stores the first element of
- * this list.
- */
- MethodWriter firstMethod;
-
- /**
- * The methods of this class. These methods are stored in a linked list of
- * {@link MethodWriter} objects, linked to each other by their
- * {@link MethodWriter#mv} field. This field stores the last element of this
- * list.
- */
- MethodWriter lastMethod;
-
- /**
- * <tt>true</tt> if the maximum stack size and number of local variables
- * must be automatically computed.
- */
- private boolean computeMaxs;
-
- /**
- * <tt>true</tt> if the stack map frames must be recomputed from scratch.
- */
- private boolean computeFrames;
-
- /**
- * <tt>true</tt> if the stack map tables of this class are invalid. The
- * {@link MethodWriter#resizeInstructions} method cannot transform existing
- * stack map tables, and so produces potentially invalid classes when it is
- * executed. In this case the class is reread and rewritten with the
- * {@link #COMPUTE_FRAMES} option (the resizeInstructions method can resize
- * stack map tables when this option is used).
- */
- boolean invalidFrames;
-
- // ------------------------------------------------------------------------
- // Static initializer
- // ------------------------------------------------------------------------
-
- /**
- * Computes the instruction types of JVM opcodes.
- */
- static {
- int i;
- byte[] b = new byte[220];
- String s = "AAAAAAAAAAAAAAAABCLMMDDDDDEEEEEEEEEEEEEEEEEEEEAAAAAAAADD"
- + "DDDEEEEEEEEEEEEEEEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- + "AAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAJJJJJJJJJJJJJJJJDOPAA"
- + "AAAAGGGGGGGHIFBFAAFFAARQJJKKJJJJJJJJJJJJJJJJJJ";
- for (i = 0; i < b.length; ++i) {
- b[i] = (byte) (s.charAt(i) - 'A');
- }
- TYPE = b;
-
- // code to generate the above string
- //
- // // SBYTE_INSN instructions
- // b[Constants.NEWARRAY] = SBYTE_INSN;
- // b[Constants.BIPUSH] = SBYTE_INSN;
- //
- // // SHORT_INSN instructions
- // b[Constants.SIPUSH] = SHORT_INSN;
- //
- // // (IMPL)VAR_INSN instructions
- // b[Constants.RET] = VAR_INSN;
- // for (i = Constants.ILOAD; i <= Constants.ALOAD; ++i) {
- // b[i] = VAR_INSN;
- // }
- // for (i = Constants.ISTORE; i <= Constants.ASTORE; ++i) {
- // b[i] = VAR_INSN;
- // }
- // for (i = 26; i <= 45; ++i) { // ILOAD_0 to ALOAD_3
- // b[i] = IMPLVAR_INSN;
- // }
- // for (i = 59; i <= 78; ++i) { // ISTORE_0 to ASTORE_3
- // b[i] = IMPLVAR_INSN;
- // }
- //
- // // TYPE_INSN instructions
- // b[Constants.NEW] = TYPE_INSN;
- // b[Constants.ANEWARRAY] = TYPE_INSN;
- // b[Constants.CHECKCAST] = TYPE_INSN;
- // b[Constants.INSTANCEOF] = TYPE_INSN;
- //
- // // (Set)FIELDORMETH_INSN instructions
- // for (i = Constants.GETSTATIC; i <= Constants.INVOKESTATIC; ++i) {
- // b[i] = FIELDORMETH_INSN;
- // }
- // b[Constants.INVOKEINTERFACE] = ITFMETH_INSN;
- // b[Constants.INVOKEDYNAMIC] = INDYMETH_INSN;
- //
- // // LABEL(W)_INSN instructions
- // for (i = Constants.IFEQ; i <= Constants.JSR; ++i) {
- // b[i] = LABEL_INSN;
- // }
- // b[Constants.IFNULL] = LABEL_INSN;
- // b[Constants.IFNONNULL] = LABEL_INSN;
- // b[200] = LABELW_INSN; // GOTO_W
- // b[201] = LABELW_INSN; // JSR_W
- // // temporary opcodes used internally by ASM - see Label and
- // MethodWriter
- // for (i = 202; i < 220; ++i) {
- // b[i] = LABEL_INSN;
- // }
- //
- // // LDC(_W) instructions
- // b[Constants.LDC] = LDC_INSN;
- // b[19] = LDCW_INSN; // LDC_W
- // b[20] = LDCW_INSN; // LDC2_W
- //
- // // special instructions
- // b[Constants.IINC] = IINC_INSN;
- // b[Constants.TABLESWITCH] = TABL_INSN;
- // b[Constants.LOOKUPSWITCH] = LOOK_INSN;
- // b[Constants.MULTIANEWARRAY] = MANA_INSN;
- // b[196] = WIDE_INSN; // WIDE
- //
- // for (i = 0; i < b.length; ++i) {
- // System.err.print((char)('A' + b[i]));
- // }
- // System.err.println();
- }
-
- // ------------------------------------------------------------------------
- // Constructor
- // ------------------------------------------------------------------------
-
- /**
- * Constructs a new {@link ClassWriter} object.
- *
- * @param flags
- * option flags that can be used to modify the default behavior
- * of this class. See {@link #COMPUTE_MAXS},
- * {@link #COMPUTE_FRAMES}.
- */
- public ClassWriter(final int flags) {
- super(Opcodes.ASM5);
- index = 1;
- pool = new ByteVector();
- items = new Item[256];
- threshold = (int) (0.75d * items.length);
- key = new Item();
- key2 = new Item();
- key3 = new Item();
- key4 = new Item();
- this.computeMaxs = (flags & COMPUTE_MAXS) != 0;
- this.computeFrames = (flags & COMPUTE_FRAMES) != 0;
- }
-
- /**
- * Constructs a new {@link ClassWriter} object and enables optimizations for
- * "mostly add" bytecode transformations. These optimizations are the
- * following:
- *
- * <ul>
- * <li>The constant pool from the original class is copied as is in the new
- * class, which saves time. New constant pool entries will be added at the
- * end if necessary, but unused constant pool entries <i>won't be
- * removed</i>.</li>
- * <li>Methods that are not transformed are copied as is in the new class,
- * directly from the original class bytecode (i.e. without emitting visit
- * events for all the method instructions), which saves a <i>lot</i> of
- * time. Untransformed methods are detected by the fact that the
- * {@link ClassReader} receives {@link MethodVisitor} objects that come from
- * a {@link ClassWriter} (and not from any other {@link ClassVisitor}
- * instance).</li>
- * </ul>
- *
- * @param classReader
- * the {@link ClassReader} used to read the original class. It
- * will be used to copy the entire constant pool from the
- * original class and also to copy other fragments of original
- * bytecode where applicable.
- * @param flags
- * option flags that can be used to modify the default behavior
- * of this class. <i>These option flags do not affect methods
- * that are copied as is in the new class. This means that the
- * maximum stack size nor the stack frames will be computed for
- * these methods</i>. See {@link #COMPUTE_MAXS},
- * {@link #COMPUTE_FRAMES}.
- */
- public ClassWriter(final ClassReader classReader, final int flags) {
- this(flags);
- classReader.copyPool(this);
- this.cr = classReader;
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the ClassVisitor abstract class
- // ------------------------------------------------------------------------
-
- @Override
- public final void visit(final int version, final int access,
- final String name, final String signature, final String superName,
- final String[] interfaces) {
- this.version = version;
- this.access = access;
- this.name = newClass(name);
- thisName = name;
- if (ClassReader.SIGNATURES && signature != null) {
- this.signature = newUTF8(signature);
- }
- this.superName = superName == null ? 0 : newClass(superName);
- if (interfaces != null && interfaces.length > 0) {
- interfaceCount = interfaces.length;
- this.interfaces = new int[interfaceCount];
- for (int i = 0; i < interfaceCount; ++i) {
- this.interfaces[i] = newClass(interfaces[i]);
- }
- }
- }
-
- @Override
- public final void visitSource(final String file, final String debug) {
- if (file != null) {
- sourceFile = newUTF8(file);
- }
- if (debug != null) {
- sourceDebug = new ByteVector().encodeUTF8(debug, 0,
- Integer.MAX_VALUE);
- }
- }
-
- @Override
- public final void visitOuterClass(final String owner, final String name,
- final String desc) {
- enclosingMethodOwner = newClass(owner);
- if (name != null && desc != null) {
- enclosingMethod = newNameType(name, desc);
- }
- }
-
- @Override
- public final AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- // write type, and reserve space for values count
- bv.putShort(newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(this, true, bv, bv, 2);
- if (visible) {
- aw.next = anns;
- anns = aw;
- } else {
- aw.next = ianns;
- ianns = aw;
- }
- return aw;
- }
-
- @Override
- public final AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, final String desc, final boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- // write target_type and target_info
- AnnotationWriter.putTarget(typeRef, typePath, bv);
- // write type, and reserve space for values count
- bv.putShort(newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(this, true, bv, bv,
- bv.length - 2);
- if (visible) {
- aw.next = tanns;
- tanns = aw;
- } else {
- aw.next = itanns;
- itanns = aw;
- }
- return aw;
- }
-
- @Override
- public final void visitAttribute(final Attribute attr) {
- attr.next = attrs;
- attrs = attr;
- }
-
- @Override
- public final void visitInnerClass(final String name,
- final String outerName, final String innerName, final int access) {
- if (innerClasses == null) {
- innerClasses = new ByteVector();
- }
- // Sec. 4.7.6 of the JVMS states "Every CONSTANT_Class_info entry in the
- // constant_pool table which represents a class or interface C that is
- // not a package member must have exactly one corresponding entry in the
- // classes array". To avoid duplicates we keep track in the intVal field
- // of the Item of each CONSTANT_Class_info entry C whether an inner
- // class entry has already been added for C (this field is unused for
- // class entries, and changing its value does not change the hashcode
- // and equality tests). If so we store the index of this inner class
- // entry (plus one) in intVal. This hack allows duplicate detection in
- // O(1) time.
- Item nameItem = newClassItem(name);
- if (nameItem.intVal == 0) {
- ++innerClassesCount;
- innerClasses.putShort(nameItem.index);
- innerClasses.putShort(outerName == null ? 0 : newClass(outerName));
- innerClasses.putShort(innerName == null ? 0 : newUTF8(innerName));
- innerClasses.putShort(access);
- nameItem.intVal = innerClassesCount;
- } else {
- // Compare the inner classes entry nameItem.intVal - 1 with the
- // arguments of this method and throw an exception if there is a
- // difference?
- }
- }
-
- @Override
- public final FieldVisitor visitField(final int access, final String name,
- final String desc, final String signature, final Object value) {
- return new FieldWriter(this, access, name, desc, signature, value);
- }
-
- @Override
- public final MethodVisitor visitMethod(final int access, final String name,
- final String desc, final String signature, final String[] exceptions) {
- return new MethodWriter(this, access, name, desc, signature,
- exceptions, computeMaxs, computeFrames);
- }
-
- @Override
- public final void visitEnd() {
- }
-
- // ------------------------------------------------------------------------
- // Other public methods
- // ------------------------------------------------------------------------
-
- /**
- * Returns the bytecode of the class that was build with this class writer.
- *
- * @return the bytecode of the class that was build with this class writer.
- */
- public byte[] toByteArray() {
- if (index > 0xFFFF) {
- throw new RuntimeException("Class file too large!");
- }
- // computes the real size of the bytecode of this class
- int size = 24 + 2 * interfaceCount;
- int nbFields = 0;
- FieldWriter fb = firstField;
- while (fb != null) {
- ++nbFields;
- size += fb.getSize();
- fb = (FieldWriter) fb.fv;
- }
- int nbMethods = 0;
- MethodWriter mb = firstMethod;
- while (mb != null) {
- ++nbMethods;
- size += mb.getSize();
- mb = (MethodWriter) mb.mv;
- }
- int attributeCount = 0;
- if (bootstrapMethods != null) {
- // we put it as first attribute in order to improve a bit
- // ClassReader.copyBootstrapMethods
- ++attributeCount;
- size += 8 + bootstrapMethods.length;
- newUTF8("BootstrapMethods");
- }
- if (ClassReader.SIGNATURES && signature != 0) {
- ++attributeCount;
- size += 8;
- newUTF8("Signature");
- }
- if (sourceFile != 0) {
- ++attributeCount;
- size += 8;
- newUTF8("SourceFile");
- }
- if (sourceDebug != null) {
- ++attributeCount;
- size += sourceDebug.length + 6;
- newUTF8("SourceDebugExtension");
- }
- if (enclosingMethodOwner != 0) {
- ++attributeCount;
- size += 10;
- newUTF8("EnclosingMethod");
- }
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- ++attributeCount;
- size += 6;
- newUTF8("Deprecated");
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- if ((version & 0xFFFF) < Opcodes.V1_5
- || (access & ACC_SYNTHETIC_ATTRIBUTE) != 0) {
- ++attributeCount;
- size += 6;
- newUTF8("Synthetic");
- }
- }
- if (innerClasses != null) {
- ++attributeCount;
- size += 8 + innerClasses.length;
- newUTF8("InnerClasses");
- }
- if (ClassReader.ANNOTATIONS && anns != null) {
- ++attributeCount;
- size += 8 + anns.getSize();
- newUTF8("RuntimeVisibleAnnotations");
- }
- if (ClassReader.ANNOTATIONS && ianns != null) {
- ++attributeCount;
- size += 8 + ianns.getSize();
- newUTF8("RuntimeInvisibleAnnotations");
- }
- if (ClassReader.ANNOTATIONS && tanns != null) {
- ++attributeCount;
- size += 8 + tanns.getSize();
- newUTF8("RuntimeVisibleTypeAnnotations");
- }
- if (ClassReader.ANNOTATIONS && itanns != null) {
- ++attributeCount;
- size += 8 + itanns.getSize();
- newUTF8("RuntimeInvisibleTypeAnnotations");
- }
- if (attrs != null) {
- attributeCount += attrs.getCount();
- size += attrs.getSize(this, null, 0, -1, -1);
- }
- size += pool.length;
- // allocates a byte vector of this size, in order to avoid unnecessary
- // arraycopy operations in the ByteVector.enlarge() method
- ByteVector out = new ByteVector(size);
- out.putInt(0xCAFEBABE).putInt(version);
- out.putShort(index).putByteArray(pool.data, 0, pool.length);
- int mask = Opcodes.ACC_DEPRECATED | ACC_SYNTHETIC_ATTRIBUTE
- | ((access & ACC_SYNTHETIC_ATTRIBUTE) / TO_ACC_SYNTHETIC);
- out.putShort(access & ~mask).putShort(name).putShort(superName);
- out.putShort(interfaceCount);
- for (int i = 0; i < interfaceCount; ++i) {
- out.putShort(interfaces[i]);
- }
- out.putShort(nbFields);
- fb = firstField;
- while (fb != null) {
- fb.put(out);
- fb = (FieldWriter) fb.fv;
- }
- out.putShort(nbMethods);
- mb = firstMethod;
- while (mb != null) {
- mb.put(out);
- mb = (MethodWriter) mb.mv;
- }
- out.putShort(attributeCount);
- if (bootstrapMethods != null) {
- out.putShort(newUTF8("BootstrapMethods"));
- out.putInt(bootstrapMethods.length + 2).putShort(
- bootstrapMethodsCount);
- out.putByteArray(bootstrapMethods.data, 0, bootstrapMethods.length);
- }
- if (ClassReader.SIGNATURES && signature != 0) {
- out.putShort(newUTF8("Signature")).putInt(2).putShort(signature);
- }
- if (sourceFile != 0) {
- out.putShort(newUTF8("SourceFile")).putInt(2).putShort(sourceFile);
- }
- if (sourceDebug != null) {
- int len = sourceDebug.length;
- out.putShort(newUTF8("SourceDebugExtension")).putInt(len);
- out.putByteArray(sourceDebug.data, 0, len);
- }
- if (enclosingMethodOwner != 0) {
- out.putShort(newUTF8("EnclosingMethod")).putInt(4);
- out.putShort(enclosingMethodOwner).putShort(enclosingMethod);
- }
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- out.putShort(newUTF8("Deprecated")).putInt(0);
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- if ((version & 0xFFFF) < Opcodes.V1_5
- || (access & ACC_SYNTHETIC_ATTRIBUTE) != 0) {
- out.putShort(newUTF8("Synthetic")).putInt(0);
- }
- }
- if (innerClasses != null) {
- out.putShort(newUTF8("InnerClasses"));
- out.putInt(innerClasses.length + 2).putShort(innerClassesCount);
- out.putByteArray(innerClasses.data, 0, innerClasses.length);
- }
- if (ClassReader.ANNOTATIONS && anns != null) {
- out.putShort(newUTF8("RuntimeVisibleAnnotations"));
- anns.put(out);
- }
- if (ClassReader.ANNOTATIONS && ianns != null) {
- out.putShort(newUTF8("RuntimeInvisibleAnnotations"));
- ianns.put(out);
- }
- if (ClassReader.ANNOTATIONS && tanns != null) {
- out.putShort(newUTF8("RuntimeVisibleTypeAnnotations"));
- tanns.put(out);
- }
- if (ClassReader.ANNOTATIONS && itanns != null) {
- out.putShort(newUTF8("RuntimeInvisibleTypeAnnotations"));
- itanns.put(out);
- }
- if (attrs != null) {
- attrs.put(this, null, 0, -1, -1, out);
- }
- if (invalidFrames) {
- anns = null;
- ianns = null;
- attrs = null;
- innerClassesCount = 0;
- innerClasses = null;
- bootstrapMethodsCount = 0;
- bootstrapMethods = null;
- firstField = null;
- lastField = null;
- firstMethod = null;
- lastMethod = null;
- computeMaxs = false;
- computeFrames = true;
- invalidFrames = false;
- new ClassReader(out.data).accept(this, ClassReader.SKIP_FRAMES);
- return toByteArray();
- }
- return out.data;
- }
-
- // ------------------------------------------------------------------------
- // Utility methods: constant pool management
- // ------------------------------------------------------------------------
-
- /**
- * Adds a number or string constant to the constant pool of the class being
- * build. Does nothing if the constant pool already contains a similar item.
- *
- * @param cst
- * the value of the constant to be added to the constant pool.
- * This parameter must be an {@link Integer}, a {@link Float}, a
- * {@link Long}, a {@link Double}, a {@link String} or a
- * {@link Type}.
- * @return a new or already existing constant item with the given value.
- */
- Item newConstItem(final Object cst) {
- if (cst instanceof Integer) {
- int val = ((Integer) cst).intValue();
- return newInteger(val);
- } else if (cst instanceof Byte) {
- int val = ((Byte) cst).intValue();
- return newInteger(val);
- } else if (cst instanceof Character) {
- int val = ((Character) cst).charValue();
- return newInteger(val);
- } else if (cst instanceof Short) {
- int val = ((Short) cst).intValue();
- return newInteger(val);
- } else if (cst instanceof Boolean) {
- int val = ((Boolean) cst).booleanValue() ? 1 : 0;
- return newInteger(val);
- } else if (cst instanceof Float) {
- float val = ((Float) cst).floatValue();
- return newFloat(val);
- } else if (cst instanceof Long) {
- long val = ((Long) cst).longValue();
- return newLong(val);
- } else if (cst instanceof Double) {
- double val = ((Double) cst).doubleValue();
- return newDouble(val);
- } else if (cst instanceof String) {
- return newString((String) cst);
- } else if (cst instanceof Type) {
- Type t = (Type) cst;
- int s = t.getSort();
- if (s == Type.OBJECT) {
- return newClassItem(t.getInternalName());
- } else if (s == Type.METHOD) {
- return newMethodTypeItem(t.getDescriptor());
- } else { // s == primitive type or array
- return newClassItem(t.getDescriptor());
- }
- } else if (cst instanceof Handle) {
- Handle h = (Handle) cst;
- return newHandleItem(h.tag, h.owner, h.name, h.desc);
- } else {
- throw new IllegalArgumentException("value " + cst);
- }
- }
-
- /**
- * Adds a number or string constant to the constant pool of the class being
- * build. Does nothing if the constant pool already contains a similar item.
- * <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param cst
- * the value of the constant to be added to the constant pool.
- * This parameter must be an {@link Integer}, a {@link Float}, a
- * {@link Long}, a {@link Double} or a {@link String}.
- * @return the index of a new or already existing constant item with the
- * given value.
- */
- public int newConst(final Object cst) {
- return newConstItem(cst).index;
- }
-
- /**
- * Adds an UTF8 string to the constant pool of the class being build. Does
- * nothing if the constant pool already contains a similar item. <i>This
- * method is intended for {@link Attribute} sub classes, and is normally not
- * needed by class generators or adapters.</i>
- *
- * @param value
- * the String value.
- * @return the index of a new or already existing UTF8 item.
- */
- public int newUTF8(final String value) {
- key.set(UTF8, value, null, null);
- Item result = get(key);
- if (result == null) {
- pool.putByte(UTF8).putUTF8(value);
- result = new Item(index++, key);
- put(result);
- }
- return result.index;
- }
-
- /**
- * Adds a class reference to the constant pool of the class being build.
- * Does nothing if the constant pool already contains a similar item.
- * <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param value
- * the internal name of the class.
- * @return a new or already existing class reference item.
- */
- Item newClassItem(final String value) {
- key2.set(CLASS, value, null, null);
- Item result = get(key2);
- if (result == null) {
- pool.put12(CLASS, newUTF8(value));
- result = new Item(index++, key2);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a class reference to the constant pool of the class being build.
- * Does nothing if the constant pool already contains a similar item.
- * <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param value
- * the internal name of the class.
- * @return the index of a new or already existing class reference item.
- */
- public int newClass(final String value) {
- return newClassItem(value).index;
- }
-
- /**
- * Adds a method type reference to the constant pool of the class being
- * build. Does nothing if the constant pool already contains a similar item.
- * <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param methodDesc
- * method descriptor of the method type.
- * @return a new or already existing method type reference item.
- */
- Item newMethodTypeItem(final String methodDesc) {
- key2.set(MTYPE, methodDesc, null, null);
- Item result = get(key2);
- if (result == null) {
- pool.put12(MTYPE, newUTF8(methodDesc));
- result = new Item(index++, key2);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a method type reference to the constant pool of the class being
- * build. Does nothing if the constant pool already contains a similar item.
- * <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param methodDesc
- * method descriptor of the method type.
- * @return the index of a new or already existing method type reference
- * item.
- */
- public int newMethodType(final String methodDesc) {
- return newMethodTypeItem(methodDesc).index;
- }
-
- /**
- * Adds a handle to the constant pool of the class being build. Does nothing
- * if the constant pool already contains a similar item. <i>This method is
- * intended for {@link Attribute} sub classes, and is normally not needed by
- * class generators or adapters.</i>
- *
- * @param tag
- * the kind of this handle. Must be {@link Opcodes#H_GETFIELD},
- * {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD},
- * {@link Opcodes#H_PUTSTATIC}, {@link Opcodes#H_INVOKEVIRTUAL},
- * {@link Opcodes#H_INVOKESTATIC},
- * {@link Opcodes#H_INVOKESPECIAL},
- * {@link Opcodes#H_NEWINVOKESPECIAL} or
- * {@link Opcodes#H_INVOKEINTERFACE}.
- * @param owner
- * the internal name of the field or method owner class.
- * @param name
- * the name of the field or method.
- * @param desc
- * the descriptor of the field or method.
- * @return a new or an already existing method type reference item.
- */
- Item newHandleItem(final int tag, final String owner, final String name,
- final String desc) {
- key4.set(HANDLE_BASE + tag, owner, name, desc);
- Item result = get(key4);
- if (result == null) {
- if (tag <= Opcodes.H_PUTSTATIC) {
- put112(HANDLE, tag, newField(owner, name, desc));
- } else {
- put112(HANDLE,
- tag,
- newMethod(owner, name, desc,
- tag == Opcodes.H_INVOKEINTERFACE));
- }
- result = new Item(index++, key4);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a handle to the constant pool of the class being build. Does nothing
- * if the constant pool already contains a similar item. <i>This method is
- * intended for {@link Attribute} sub classes, and is normally not needed by
- * class generators or adapters.</i>
- *
- * @param tag
- * the kind of this handle. Must be {@link Opcodes#H_GETFIELD},
- * {@link Opcodes#H_GETSTATIC}, {@link Opcodes#H_PUTFIELD},
- * {@link Opcodes#H_PUTSTATIC}, {@link Opcodes#H_INVOKEVIRTUAL},
- * {@link Opcodes#H_INVOKESTATIC},
- * {@link Opcodes#H_INVOKESPECIAL},
- * {@link Opcodes#H_NEWINVOKESPECIAL} or
- * {@link Opcodes#H_INVOKEINTERFACE}.
- * @param owner
- * the internal name of the field or method owner class.
- * @param name
- * the name of the field or method.
- * @param desc
- * the descriptor of the field or method.
- * @return the index of a new or already existing method type reference
- * item.
- */
- public int newHandle(final int tag, final String owner, final String name,
- final String desc) {
- return newHandleItem(tag, owner, name, desc).index;
- }
-
- /**
- * Adds an invokedynamic reference to the constant pool of the class being
- * build. Does nothing if the constant pool already contains a similar item.
- * <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param name
- * name of the invoked method.
- * @param desc
- * descriptor of the invoke method.
- * @param bsm
- * the bootstrap method.
- * @param bsmArgs
- * the bootstrap method constant arguments.
- *
- * @return a new or an already existing invokedynamic type reference item.
- */
- Item newInvokeDynamicItem(final String name, final String desc,
- final Handle bsm, final Object... bsmArgs) {
- // cache for performance
- ByteVector bootstrapMethods = this.bootstrapMethods;
- if (bootstrapMethods == null) {
- bootstrapMethods = this.bootstrapMethods = new ByteVector();
- }
-
- int position = bootstrapMethods.length; // record current position
-
- int hashCode = bsm.hashCode();
- bootstrapMethods.putShort(newHandle(bsm.tag, bsm.owner, bsm.name,
- bsm.desc));
-
- int argsLength = bsmArgs.length;
- bootstrapMethods.putShort(argsLength);
-
- for (int i = 0; i < argsLength; i++) {
- Object bsmArg = bsmArgs[i];
- hashCode ^= bsmArg.hashCode();
- bootstrapMethods.putShort(newConst(bsmArg));
- }
-
- byte[] data = bootstrapMethods.data;
- int length = (1 + 1 + argsLength) << 1; // (bsm + argCount + arguments)
- hashCode &= 0x7FFFFFFF;
- Item result = items[hashCode % items.length];
- loop: while (result != null) {
- if (result.type != BSM || result.hashCode != hashCode) {
- result = result.next;
- continue;
- }
-
- // because the data encode the size of the argument
- // we don't need to test if these size are equals
- int resultPosition = result.intVal;
- for (int p = 0; p < length; p++) {
- if (data[position + p] != data[resultPosition + p]) {
- result = result.next;
- continue loop;
- }
- }
- break;
- }
-
- int bootstrapMethodIndex;
- if (result != null) {
- bootstrapMethodIndex = result.index;
- bootstrapMethods.length = position; // revert to old position
- } else {
- bootstrapMethodIndex = bootstrapMethodsCount++;
- result = new Item(bootstrapMethodIndex);
- result.set(position, hashCode);
- put(result);
- }
-
- // now, create the InvokeDynamic constant
- key3.set(name, desc, bootstrapMethodIndex);
- result = get(key3);
- if (result == null) {
- put122(INDY, bootstrapMethodIndex, newNameType(name, desc));
- result = new Item(index++, key3);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds an invokedynamic reference to the constant pool of the class being
- * build. Does nothing if the constant pool already contains a similar item.
- * <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param name
- * name of the invoked method.
- * @param desc
- * descriptor of the invoke method.
- * @param bsm
- * the bootstrap method.
- * @param bsmArgs
- * the bootstrap method constant arguments.
- *
- * @return the index of a new or already existing invokedynamic reference
- * item.
- */
- public int newInvokeDynamic(final String name, final String desc,
- final Handle bsm, final Object... bsmArgs) {
- return newInvokeDynamicItem(name, desc, bsm, bsmArgs).index;
- }
-
- /**
- * Adds a field reference to the constant pool of the class being build.
- * Does nothing if the constant pool already contains a similar item.
- *
- * @param owner
- * the internal name of the field's owner class.
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor.
- * @return a new or already existing field reference item.
- */
- Item newFieldItem(final String owner, final String name, final String desc) {
- key3.set(FIELD, owner, name, desc);
- Item result = get(key3);
- if (result == null) {
- put122(FIELD, newClass(owner), newNameType(name, desc));
- result = new Item(index++, key3);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a field reference to the constant pool of the class being build.
- * Does nothing if the constant pool already contains a similar item.
- * <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param owner
- * the internal name of the field's owner class.
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor.
- * @return the index of a new or already existing field reference item.
- */
- public int newField(final String owner, final String name, final String desc) {
- return newFieldItem(owner, name, desc).index;
- }
-
- /**
- * Adds a method reference to the constant pool of the class being build.
- * Does nothing if the constant pool already contains a similar item.
- *
- * @param owner
- * the internal name of the method's owner class.
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor.
- * @param itf
- * <tt>true</tt> if <tt>owner</tt> is an interface.
- * @return a new or already existing method reference item.
- */
- Item newMethodItem(final String owner, final String name,
- final String desc, final boolean itf) {
- int type = itf ? IMETH : METH;
- key3.set(type, owner, name, desc);
- Item result = get(key3);
- if (result == null) {
- put122(type, newClass(owner), newNameType(name, desc));
- result = new Item(index++, key3);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a method reference to the constant pool of the class being build.
- * Does nothing if the constant pool already contains a similar item.
- * <i>This method is intended for {@link Attribute} sub classes, and is
- * normally not needed by class generators or adapters.</i>
- *
- * @param owner
- * the internal name of the method's owner class.
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor.
- * @param itf
- * <tt>true</tt> if <tt>owner</tt> is an interface.
- * @return the index of a new or already existing method reference item.
- */
- public int newMethod(final String owner, final String name,
- final String desc, final boolean itf) {
- return newMethodItem(owner, name, desc, itf).index;
- }
-
- /**
- * Adds an integer to the constant pool of the class being build. Does
- * nothing if the constant pool already contains a similar item.
- *
- * @param value
- * the int value.
- * @return a new or already existing int item.
- */
- Item newInteger(final int value) {
- key.set(value);
- Item result = get(key);
- if (result == null) {
- pool.putByte(INT).putInt(value);
- result = new Item(index++, key);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a float to the constant pool of the class being build. Does nothing
- * if the constant pool already contains a similar item.
- *
- * @param value
- * the float value.
- * @return a new or already existing float item.
- */
- Item newFloat(final float value) {
- key.set(value);
- Item result = get(key);
- if (result == null) {
- pool.putByte(FLOAT).putInt(key.intVal);
- result = new Item(index++, key);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a long to the constant pool of the class being build. Does nothing
- * if the constant pool already contains a similar item.
- *
- * @param value
- * the long value.
- * @return a new or already existing long item.
- */
- Item newLong(final long value) {
- key.set(value);
- Item result = get(key);
- if (result == null) {
- pool.putByte(LONG).putLong(value);
- result = new Item(index, key);
- index += 2;
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a double to the constant pool of the class being build. Does nothing
- * if the constant pool already contains a similar item.
- *
- * @param value
- * the double value.
- * @return a new or already existing double item.
- */
- Item newDouble(final double value) {
- key.set(value);
- Item result = get(key);
- if (result == null) {
- pool.putByte(DOUBLE).putLong(key.longVal);
- result = new Item(index, key);
- index += 2;
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a string to the constant pool of the class being build. Does nothing
- * if the constant pool already contains a similar item.
- *
- * @param value
- * the String value.
- * @return a new or already existing string item.
- */
- private Item newString(final String value) {
- key2.set(STR, value, null, null);
- Item result = get(key2);
- if (result == null) {
- pool.put12(STR, newUTF8(value));
- result = new Item(index++, key2);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds a name and type to the constant pool of the class being build. Does
- * nothing if the constant pool already contains a similar item. <i>This
- * method is intended for {@link Attribute} sub classes, and is normally not
- * needed by class generators or adapters.</i>
- *
- * @param name
- * a name.
- * @param desc
- * a type descriptor.
- * @return the index of a new or already existing name and type item.
- */
- public int newNameType(final String name, final String desc) {
- return newNameTypeItem(name, desc).index;
- }
-
- /**
- * Adds a name and type to the constant pool of the class being build. Does
- * nothing if the constant pool already contains a similar item.
- *
- * @param name
- * a name.
- * @param desc
- * a type descriptor.
- * @return a new or already existing name and type item.
- */
- Item newNameTypeItem(final String name, final String desc) {
- key2.set(NAME_TYPE, name, desc, null);
- Item result = get(key2);
- if (result == null) {
- put122(NAME_TYPE, newUTF8(name), newUTF8(desc));
- result = new Item(index++, key2);
- put(result);
- }
- return result;
- }
-
- /**
- * Adds the given internal name to {@link #typeTable} and returns its index.
- * Does nothing if the type table already contains this internal name.
- *
- * @param type
- * the internal name to be added to the type table.
- * @return the index of this internal name in the type table.
- */
- int addType(final String type) {
- key.set(TYPE_NORMAL, type, null, null);
- Item result = get(key);
- if (result == null) {
- result = addType(key);
- }
- return result.index;
- }
-
- /**
- * Adds the given "uninitialized" type to {@link #typeTable} and returns its
- * index. This method is used for UNINITIALIZED types, made of an internal
- * name and a bytecode offset.
- *
- * @param type
- * the internal name to be added to the type table.
- * @param offset
- * the bytecode offset of the NEW instruction that created this
- * UNINITIALIZED type value.
- * @return the index of this internal name in the type table.
- */
- int addUninitializedType(final String type, final int offset) {
- key.type = TYPE_UNINIT;
- key.intVal = offset;
- key.strVal1 = type;
- key.hashCode = 0x7FFFFFFF & (TYPE_UNINIT + type.hashCode() + offset);
- Item result = get(key);
- if (result == null) {
- result = addType(key);
- }
- return result.index;
- }
-
- /**
- * Adds the given Item to {@link #typeTable}.
- *
- * @param item
- * the value to be added to the type table.
- * @return the added Item, which a new Item instance with the same value as
- * the given Item.
- */
- private Item addType(final Item item) {
- ++typeCount;
- Item result = new Item(typeCount, key);
- put(result);
- if (typeTable == null) {
- typeTable = new Item[16];
- }
- if (typeCount == typeTable.length) {
- Item[] newTable = new Item[2 * typeTable.length];
- System.arraycopy(typeTable, 0, newTable, 0, typeTable.length);
- typeTable = newTable;
- }
- typeTable[typeCount] = result;
- return result;
- }
-
- /**
- * Returns the index of the common super type of the two given types. This
- * method calls {@link #getCommonSuperClass} and caches the result in the
- * {@link #items} hash table to speedup future calls with the same
- * parameters.
- *
- * @param type1
- * index of an internal name in {@link #typeTable}.
- * @param type2
- * index of an internal name in {@link #typeTable}.
- * @return the index of the common super type of the two given types.
- */
- int getMergedType(final int type1, final int type2) {
- key2.type = TYPE_MERGED;
- key2.longVal = type1 | (((long) type2) << 32);
- key2.hashCode = 0x7FFFFFFF & (TYPE_MERGED + type1 + type2);
- Item result = get(key2);
- if (result == null) {
- String t = typeTable[type1].strVal1;
- String u = typeTable[type2].strVal1;
- key2.intVal = addType(getCommonSuperClass(t, u));
- result = new Item((short) 0, key2);
- put(result);
- }
- return result.intVal;
- }
-
- /**
- * Returns the common super type of the two given types. The default
- * implementation of this method <i>loads</i> the two given classes and uses
- * the java.lang.Class methods to find the common super class. It can be
- * overridden to compute this common super type in other ways, in particular
- * without actually loading any class, or to take into account the class
- * that is currently being generated by this ClassWriter, which can of
- * course not be loaded since it is under construction.
- *
- * @param type1
- * the internal name of a class.
- * @param type2
- * the internal name of another class.
- * @return the internal name of the common super class of the two given
- * classes.
- */
- protected String getCommonSuperClass(final String type1, final String type2) {
- Class<?> c, d;
- ClassLoader classLoader = getClass().getClassLoader();
- try {
- c = Class.forName(type1.replace('/', '.'), false, classLoader);
- d = Class.forName(type2.replace('/', '.'), false, classLoader);
- } catch (Exception e) {
- throw new RuntimeException(e.toString());
- }
- if (c.isAssignableFrom(d)) {
- return type1;
- }
- if (d.isAssignableFrom(c)) {
- return type2;
- }
- if (c.isInterface() || d.isInterface()) {
- return "java/lang/Object";
- } else {
- do {
- c = c.getSuperclass();
- } while (!c.isAssignableFrom(d));
- return c.getName().replace('.', '/');
- }
- }
-
- /**
- * Returns the constant pool's hash table item which is equal to the given
- * item.
- *
- * @param key
- * a constant pool item.
- * @return the constant pool's hash table item which is equal to the given
- * item, or <tt>null</tt> if there is no such item.
- */
- private Item get(final Item key) {
- Item i = items[key.hashCode % items.length];
- while (i != null && (i.type != key.type || !key.isEqualTo(i))) {
- i = i.next;
- }
- return i;
- }
-
- /**
- * Puts the given item in the constant pool's hash table. The hash table
- * <i>must</i> not already contains this item.
- *
- * @param i
- * the item to be added to the constant pool's hash table.
- */
- private void put(final Item i) {
- if (index + typeCount > threshold) {
- int ll = items.length;
- int nl = ll * 2 + 1;
- Item[] newItems = new Item[nl];
- for (int l = ll - 1; l >= 0; --l) {
- Item j = items[l];
- while (j != null) {
- int index = j.hashCode % newItems.length;
- Item k = j.next;
- j.next = newItems[index];
- newItems[index] = j;
- j = k;
- }
- }
- items = newItems;
- threshold = (int) (nl * 0.75);
- }
- int index = i.hashCode % items.length;
- i.next = items[index];
- items[index] = i;
- }
-
- /**
- * Find item that whose index is `index`.
- */
- public Item findItemByIndex(int index) {
- int i = 0;
- while (i < items.length && (items[i] == null || items[i].index != index)) i++;
- return items[i];
- }
-
- /**
- * Puts one byte and two shorts into the constant pool.
- *
- * @param b
- * a byte.
- * @param s1
- * a short.
- * @param s2
- * another short.
- */
- private void put122(final int b, final int s1, final int s2) {
- pool.put12(b, s1).putShort(s2);
- }
-
- /**
- * Puts two bytes and one short into the constant pool.
- *
- * @param b1
- * a byte.
- * @param b2
- * another byte.
- * @param s
- * a short.
- */
- private void put112(final int b1, final int b2, final int s) {
- pool.put11(b1, b2).putShort(s);
- }
-}
diff --git a/src/asm/scala/tools/asm/Context.java b/src/asm/scala/tools/asm/Context.java
deleted file mode 100644
index 24546969e3..0000000000
--- a/src/asm/scala/tools/asm/Context.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm;
-
-/**
- * Information about a class being parsed in a {@link ClassReader}.
- *
- * @author Eric Bruneton
- */
-class Context {
-
- /**
- * Prototypes of the attributes that must be parsed for this class.
- */
- Attribute[] attrs;
-
- /**
- * The {@link ClassReader} option flags for the parsing of this class.
- */
- int flags;
-
- /**
- * The buffer used to read strings.
- */
- char[] buffer;
-
- /**
- * The start index of each bootstrap method.
- */
- int[] bootstrapMethods;
-
- /**
- * The access flags of the method currently being parsed.
- */
- int access;
-
- /**
- * The name of the method currently being parsed.
- */
- String name;
-
- /**
- * The descriptor of the method currently being parsed.
- */
- String desc;
-
- /**
- * The label objects, indexed by bytecode offset, of the method currently
- * being parsed (only bytecode offsets for which a label is needed have a
- * non null associated Label object).
- */
- Label[] labels;
-
- /**
- * The target of the type annotation currently being parsed.
- */
- int typeRef;
-
- /**
- * The path of the type annotation currently being parsed.
- */
- TypePath typePath;
-
- /**
- * The offset of the latest stack map frame that has been parsed.
- */
- int offset;
-
- /**
- * The labels corresponding to the start of the local variable ranges in the
- * local variable type annotation currently being parsed.
- */
- Label[] start;
-
- /**
- * The labels corresponding to the end of the local variable ranges in the
- * local variable type annotation currently being parsed.
- */
- Label[] end;
-
- /**
- * The local variable indices for each local variable range in the local
- * variable type annotation currently being parsed.
- */
- int[] index;
-
- /**
- * The encoding of the latest stack map frame that has been parsed.
- */
- int mode;
-
- /**
- * The number of locals in the latest stack map frame that has been parsed.
- */
- int localCount;
-
- /**
- * The number locals in the latest stack map frame that has been parsed,
- * minus the number of locals in the previous frame.
- */
- int localDiff;
-
- /**
- * The local values of the latest stack map frame that has been parsed.
- */
- Object[] local;
-
- /**
- * The stack size of the latest stack map frame that has been parsed.
- */
- int stackCount;
-
- /**
- * The stack values of the latest stack map frame that has been parsed.
- */
- Object[] stack;
-}
diff --git a/src/asm/scala/tools/asm/CustomAttr.java b/src/asm/scala/tools/asm/CustomAttr.java
deleted file mode 100644
index 5ecfd283d0..0000000000
--- a/src/asm/scala/tools/asm/CustomAttr.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2012 LAMP/EPFL
- */
-
-package scala.tools.asm;
-
-import scala.tools.asm.Attribute;
-
-/**
- * A subclass of ASM's Attribute for the sole purpose of accessing a protected field there.
- *
- */
-public class CustomAttr extends Attribute {
-
- public CustomAttr(final String type, final byte[] value) {
- super(type);
- super.value = value;
- }
-
-}
diff --git a/src/asm/scala/tools/asm/Edge.java b/src/asm/scala/tools/asm/Edge.java
deleted file mode 100644
index daac1f7bb0..0000000000
--- a/src/asm/scala/tools/asm/Edge.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * An edge in the control flow graph of a method body. See {@link Label Label}.
- *
- * @author Eric Bruneton
- */
-class Edge {
-
- /**
- * Denotes a normal control flow graph edge.
- */
- static final int NORMAL = 0;
-
- /**
- * Denotes a control flow graph edge corresponding to an exception handler.
- * More precisely any {@link Edge} whose {@link #info} is strictly positive
- * corresponds to an exception handler. The actual value of {@link #info} is
- * the index, in the {@link ClassWriter} type table, of the exception that
- * is catched.
- */
- static final int EXCEPTION = 0x7FFFFFFF;
-
- /**
- * Information about this control flow graph edge. If
- * {@link ClassWriter#COMPUTE_MAXS} is used this field is the (relative)
- * stack size in the basic block from which this edge originates. This size
- * is equal to the stack size at the "jump" instruction to which this edge
- * corresponds, relatively to the stack size at the beginning of the
- * originating basic block. If {@link ClassWriter#COMPUTE_FRAMES} is used,
- * this field is the kind of this control flow graph edge (i.e. NORMAL or
- * EXCEPTION).
- */
- int info;
-
- /**
- * The successor block of the basic block from which this edge originates.
- */
- Label successor;
-
- /**
- * The next edge in the list of successors of the originating basic block.
- * See {@link Label#successors successors}.
- */
- Edge next;
-}
diff --git a/src/asm/scala/tools/asm/FieldVisitor.java b/src/asm/scala/tools/asm/FieldVisitor.java
deleted file mode 100644
index 708c1d322e..0000000000
--- a/src/asm/scala/tools/asm/FieldVisitor.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A visitor to visit a Java field. The methods of this class must be called in
- * the following order: ( <tt>visitAnnotation</tt> |
- * <tt>visitTypeAnnotation</tt> | <tt>visitAttribute</tt> )* <tt>visitEnd</tt>.
- *
- * @author Eric Bruneton
- */
-public abstract class FieldVisitor {
-
- /**
- * The ASM API version implemented by this visitor. The value of this field
- * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- protected final int api;
-
- /**
- * The field visitor to which this visitor must delegate method calls. May
- * be null.
- */
- protected FieldVisitor fv;
-
- /**
- * Constructs a new {@link FieldVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- public FieldVisitor(final int api) {
- this(api, null);
- }
-
- /**
- * Constructs a new {@link FieldVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param fv
- * the field visitor to which this visitor must delegate method
- * calls. May be null.
- */
- public FieldVisitor(final int api, final FieldVisitor fv) {
- if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
- throw new IllegalArgumentException();
- }
- this.api = api;
- this.fv = fv;
- }
-
- /**
- * Visits an annotation of the field.
- *
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- if (fv != null) {
- return fv.visitAnnotation(desc, visible);
- }
- return null;
- }
-
- /**
- * Visits an annotation on the type of the field.
- *
- * @param typeRef
- * a reference to the annotated type. The sort of this type
- * reference must be {@link TypeReference#FIELD FIELD}. See
- * {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- if (api < Opcodes.ASM5) {
- throw new RuntimeException();
- }
- if (fv != null) {
- return fv.visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
- return null;
- }
-
- /**
- * Visits a non standard attribute of the field.
- *
- * @param attr
- * an attribute.
- */
- public void visitAttribute(Attribute attr) {
- if (fv != null) {
- fv.visitAttribute(attr);
- }
- }
-
- /**
- * Visits the end of the field. This method, which is the last one to be
- * called, is used to inform the visitor that all the annotations and
- * attributes of the field have been visited.
- */
- public void visitEnd() {
- if (fv != null) {
- fv.visitEnd();
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/FieldWriter.java b/src/asm/scala/tools/asm/FieldWriter.java
deleted file mode 100644
index e640a8d406..0000000000
--- a/src/asm/scala/tools/asm/FieldWriter.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * An {@link FieldVisitor} that generates Java fields in bytecode form.
- *
- * @author Eric Bruneton
- */
-final class FieldWriter extends FieldVisitor {
-
- /**
- * The class writer to which this field must be added.
- */
- private final ClassWriter cw;
-
- /**
- * Access flags of this field.
- */
- private final int access;
-
- /**
- * The index of the constant pool item that contains the name of this
- * method.
- */
- private final int name;
-
- /**
- * The index of the constant pool item that contains the descriptor of this
- * field.
- */
- private final int desc;
-
- /**
- * The index of the constant pool item that contains the signature of this
- * field.
- */
- private int signature;
-
- /**
- * The index of the constant pool item that contains the constant value of
- * this field.
- */
- private int value;
-
- /**
- * The runtime visible annotations of this field. May be <tt>null</tt>.
- */
- private AnnotationWriter anns;
-
- /**
- * The runtime invisible annotations of this field. May be <tt>null</tt>.
- */
- private AnnotationWriter ianns;
-
- /**
- * The runtime visible type annotations of this field. May be <tt>null</tt>.
- */
- private AnnotationWriter tanns;
-
- /**
- * The runtime invisible type annotations of this field. May be
- * <tt>null</tt>.
- */
- private AnnotationWriter itanns;
-
- /**
- * The non standard attributes of this field. May be <tt>null</tt>.
- */
- private Attribute attrs;
-
- // ------------------------------------------------------------------------
- // Constructor
- // ------------------------------------------------------------------------
-
- /**
- * Constructs a new {@link FieldWriter}.
- *
- * @param cw
- * the class writer to which this field must be added.
- * @param access
- * the field's access flags (see {@link Opcodes}).
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor (see {@link Type}).
- * @param signature
- * the field's signature. May be <tt>null</tt>.
- * @param value
- * the field's constant value. May be <tt>null</tt>.
- */
- FieldWriter(final ClassWriter cw, final int access, final String name,
- final String desc, final String signature, final Object value) {
- super(Opcodes.ASM5);
- if (cw.firstField == null) {
- cw.firstField = this;
- } else {
- cw.lastField.fv = this;
- }
- cw.lastField = this;
- this.cw = cw;
- this.access = access;
- this.name = cw.newUTF8(name);
- this.desc = cw.newUTF8(desc);
- if (ClassReader.SIGNATURES && signature != null) {
- this.signature = cw.newUTF8(signature);
- }
- if (value != null) {
- this.value = cw.newConstItem(value).index;
- }
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the FieldVisitor abstract class
- // ------------------------------------------------------------------------
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- // write type, and reserve space for values count
- bv.putShort(cw.newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
- if (visible) {
- aw.next = anns;
- anns = aw;
- } else {
- aw.next = ianns;
- ianns = aw;
- }
- return aw;
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- // write target_type and target_info
- AnnotationWriter.putTarget(typeRef, typePath, bv);
- // write type, and reserve space for values count
- bv.putShort(cw.newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
- bv.length - 2);
- if (visible) {
- aw.next = tanns;
- tanns = aw;
- } else {
- aw.next = itanns;
- itanns = aw;
- }
- return aw;
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- attr.next = attrs;
- attrs = attr;
- }
-
- @Override
- public void visitEnd() {
- }
-
- // ------------------------------------------------------------------------
- // Utility methods
- // ------------------------------------------------------------------------
-
- /**
- * Returns the size of this field.
- *
- * @return the size of this field.
- */
- int getSize() {
- int size = 8;
- if (value != 0) {
- cw.newUTF8("ConstantValue");
- size += 8;
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- if ((cw.version & 0xFFFF) < Opcodes.V1_5
- || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
- cw.newUTF8("Synthetic");
- size += 6;
- }
- }
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- cw.newUTF8("Deprecated");
- size += 6;
- }
- if (ClassReader.SIGNATURES && signature != 0) {
- cw.newUTF8("Signature");
- size += 8;
- }
- if (ClassReader.ANNOTATIONS && anns != null) {
- cw.newUTF8("RuntimeVisibleAnnotations");
- size += 8 + anns.getSize();
- }
- if (ClassReader.ANNOTATIONS && ianns != null) {
- cw.newUTF8("RuntimeInvisibleAnnotations");
- size += 8 + ianns.getSize();
- }
- if (ClassReader.ANNOTATIONS && tanns != null) {
- cw.newUTF8("RuntimeVisibleTypeAnnotations");
- size += 8 + tanns.getSize();
- }
- if (ClassReader.ANNOTATIONS && itanns != null) {
- cw.newUTF8("RuntimeInvisibleTypeAnnotations");
- size += 8 + itanns.getSize();
- }
- if (attrs != null) {
- size += attrs.getSize(cw, null, 0, -1, -1);
- }
- return size;
- }
-
- /**
- * Puts the content of this field into the given byte vector.
- *
- * @param out
- * where the content of this field must be put.
- */
- void put(final ByteVector out) {
- final int FACTOR = ClassWriter.TO_ACC_SYNTHETIC;
- int mask = Opcodes.ACC_DEPRECATED | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
- | ((access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) / FACTOR);
- out.putShort(access & ~mask).putShort(name).putShort(desc);
- int attributeCount = 0;
- if (value != 0) {
- ++attributeCount;
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- if ((cw.version & 0xFFFF) < Opcodes.V1_5
- || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
- ++attributeCount;
- }
- }
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- ++attributeCount;
- }
- if (ClassReader.SIGNATURES && signature != 0) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && anns != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && ianns != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && tanns != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && itanns != null) {
- ++attributeCount;
- }
- if (attrs != null) {
- attributeCount += attrs.getCount();
- }
- out.putShort(attributeCount);
- if (value != 0) {
- out.putShort(cw.newUTF8("ConstantValue"));
- out.putInt(2).putShort(value);
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- if ((cw.version & 0xFFFF) < Opcodes.V1_5
- || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
- out.putShort(cw.newUTF8("Synthetic")).putInt(0);
- }
- }
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- out.putShort(cw.newUTF8("Deprecated")).putInt(0);
- }
- if (ClassReader.SIGNATURES && signature != 0) {
- out.putShort(cw.newUTF8("Signature"));
- out.putInt(2).putShort(signature);
- }
- if (ClassReader.ANNOTATIONS && anns != null) {
- out.putShort(cw.newUTF8("RuntimeVisibleAnnotations"));
- anns.put(out);
- }
- if (ClassReader.ANNOTATIONS && ianns != null) {
- out.putShort(cw.newUTF8("RuntimeInvisibleAnnotations"));
- ianns.put(out);
- }
- if (ClassReader.ANNOTATIONS && tanns != null) {
- out.putShort(cw.newUTF8("RuntimeVisibleTypeAnnotations"));
- tanns.put(out);
- }
- if (ClassReader.ANNOTATIONS && itanns != null) {
- out.putShort(cw.newUTF8("RuntimeInvisibleTypeAnnotations"));
- itanns.put(out);
- }
- if (attrs != null) {
- attrs.put(cw, null, 0, -1, -1, out);
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/Frame.java b/src/asm/scala/tools/asm/Frame.java
deleted file mode 100644
index 85ad3269ab..0000000000
--- a/src/asm/scala/tools/asm/Frame.java
+++ /dev/null
@@ -1,1462 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * Information about the input and output stack map frames of a basic block.
- *
- * @author Eric Bruneton
- */
-final class Frame {
-
- /*
- * Frames are computed in a two steps process: during the visit of each
- * instruction, the state of the frame at the end of current basic block is
- * updated by simulating the action of the instruction on the previous state
- * of this so called "output frame". In visitMaxs, a fix point algorithm is
- * used to compute the "input frame" of each basic block, i.e. the stack map
- * frame at the beginning of the basic block, starting from the input frame
- * of the first basic block (which is computed from the method descriptor),
- * and by using the previously computed output frames to compute the input
- * state of the other blocks.
- *
- * All output and input frames are stored as arrays of integers. Reference
- * and array types are represented by an index into a type table (which is
- * not the same as the constant pool of the class, in order to avoid adding
- * unnecessary constants in the pool - not all computed frames will end up
- * being stored in the stack map table). This allows very fast type
- * comparisons.
- *
- * Output stack map frames are computed relatively to the input frame of the
- * basic block, which is not yet known when output frames are computed. It
- * is therefore necessary to be able to represent abstract types such as
- * "the type at position x in the input frame locals" or "the type at
- * position x from the top of the input frame stack" or even "the type at
- * position x in the input frame, with y more (or less) array dimensions".
- * This explains the rather complicated type format used in output frames.
- *
- * This format is the following: DIM KIND VALUE (4, 4 and 24 bits). DIM is a
- * signed number of array dimensions (from -8 to 7). KIND is either BASE,
- * LOCAL or STACK. BASE is used for types that are not relative to the input
- * frame. LOCAL is used for types that are relative to the input local
- * variable types. STACK is used for types that are relative to the input
- * stack types. VALUE depends on KIND. For LOCAL types, it is an index in
- * the input local variable types. For STACK types, it is a position
- * relatively to the top of input frame stack. For BASE types, it is either
- * one of the constants defined below, or for OBJECT and UNINITIALIZED
- * types, a tag and an index in the type table.
- *
- * Output frames can contain types of any kind and with a positive or
- * negative dimension (and even unassigned types, represented by 0 - which
- * does not correspond to any valid type value). Input frames can only
- * contain BASE types of positive or null dimension. In all cases the type
- * table contains only internal type names (array type descriptors are
- * forbidden - dimensions must be represented through the DIM field).
- *
- * The LONG and DOUBLE types are always represented by using two slots (LONG
- * + TOP or DOUBLE + TOP), for local variable types as well as in the
- * operand stack. This is necessary to be able to simulate DUPx_y
- * instructions, whose effect would be dependent on the actual type values
- * if types were always represented by a single slot in the stack (and this
- * is not possible, since actual type values are not always known - cf LOCAL
- * and STACK type kinds).
- */
-
- /**
- * Mask to get the dimension of a frame type. This dimension is a signed
- * integer between -8 and 7.
- */
- static final int DIM = 0xF0000000;
-
- /**
- * Constant to be added to a type to get a type with one more dimension.
- */
- static final int ARRAY_OF = 0x10000000;
-
- /**
- * Constant to be added to a type to get a type with one less dimension.
- */
- static final int ELEMENT_OF = 0xF0000000;
-
- /**
- * Mask to get the kind of a frame type.
- *
- * @see #BASE
- * @see #LOCAL
- * @see #STACK
- */
- static final int KIND = 0xF000000;
-
- /**
- * Flag used for LOCAL and STACK types. Indicates that if this type happens
- * to be a long or double type (during the computations of input frames),
- * then it must be set to TOP because the second word of this value has been
- * reused to store other data in the basic block. Hence the first word no
- * longer stores a valid long or double value.
- */
- static final int TOP_IF_LONG_OR_DOUBLE = 0x800000;
-
- /**
- * Mask to get the value of a frame type.
- */
- static final int VALUE = 0x7FFFFF;
-
- /**
- * Mask to get the kind of base types.
- */
- static final int BASE_KIND = 0xFF00000;
-
- /**
- * Mask to get the value of base types.
- */
- static final int BASE_VALUE = 0xFFFFF;
-
- /**
- * Kind of the types that are not relative to an input stack map frame.
- */
- static final int BASE = 0x1000000;
-
- /**
- * Base kind of the base reference types. The BASE_VALUE of such types is an
- * index into the type table.
- */
- static final int OBJECT = BASE | 0x700000;
-
- /**
- * Base kind of the uninitialized base types. The BASE_VALUE of such types
- * in an index into the type table (the Item at that index contains both an
- * instruction offset and an internal class name).
- */
- static final int UNINITIALIZED = BASE | 0x800000;
-
- /**
- * Kind of the types that are relative to the local variable types of an
- * input stack map frame. The value of such types is a local variable index.
- */
- private static final int LOCAL = 0x2000000;
-
- /**
- * Kind of the the types that are relative to the stack of an input stack
- * map frame. The value of such types is a position relatively to the top of
- * this stack.
- */
- private static final int STACK = 0x3000000;
-
- /**
- * The TOP type. This is a BASE type.
- */
- static final int TOP = BASE | 0;
-
- /**
- * The BOOLEAN type. This is a BASE type mainly used for array types.
- */
- static final int BOOLEAN = BASE | 9;
-
- /**
- * The BYTE type. This is a BASE type mainly used for array types.
- */
- static final int BYTE = BASE | 10;
-
- /**
- * The CHAR type. This is a BASE type mainly used for array types.
- */
- static final int CHAR = BASE | 11;
-
- /**
- * The SHORT type. This is a BASE type mainly used for array types.
- */
- static final int SHORT = BASE | 12;
-
- /**
- * The INTEGER type. This is a BASE type.
- */
- static final int INTEGER = BASE | 1;
-
- /**
- * The FLOAT type. This is a BASE type.
- */
- static final int FLOAT = BASE | 2;
-
- /**
- * The DOUBLE type. This is a BASE type.
- */
- static final int DOUBLE = BASE | 3;
-
- /**
- * The LONG type. This is a BASE type.
- */
- static final int LONG = BASE | 4;
-
- /**
- * The NULL type. This is a BASE type.
- */
- static final int NULL = BASE | 5;
-
- /**
- * The UNINITIALIZED_THIS type. This is a BASE type.
- */
- static final int UNINITIALIZED_THIS = BASE | 6;
-
- /**
- * The stack size variation corresponding to each JVM instruction. This
- * stack variation is equal to the size of the values produced by an
- * instruction, minus the size of the values consumed by this instruction.
- */
- static final int[] SIZE;
-
- /**
- * Computes the stack size variation corresponding to each JVM instruction.
- */
- static {
- int i;
- int[] b = new int[202];
- String s = "EFFFFFFFFGGFFFGGFFFEEFGFGFEEEEEEEEEEEEEEEEEEEEDEDEDDDDD"
- + "CDCDEEEEEEEEEEEEEEEEEEEEBABABBBBDCFFFGGGEDCDCDCDCDCDCDCDCD"
- + "CDCEEEEDDDDDDDCDCDCEFEFDDEEFFDEDEEEBDDBBDDDDDDCCCCCCCCEFED"
- + "DDCDCDEEEEEEEEEEFEEEEEEDDEEDDEE";
- for (i = 0; i < b.length; ++i) {
- b[i] = s.charAt(i) - 'E';
- }
- SIZE = b;
-
- // code to generate the above string
- //
- // int NA = 0; // not applicable (unused opcode or variable size opcode)
- //
- // b = new int[] {
- // 0, //NOP, // visitInsn
- // 1, //ACONST_NULL, // -
- // 1, //ICONST_M1, // -
- // 1, //ICONST_0, // -
- // 1, //ICONST_1, // -
- // 1, //ICONST_2, // -
- // 1, //ICONST_3, // -
- // 1, //ICONST_4, // -
- // 1, //ICONST_5, // -
- // 2, //LCONST_0, // -
- // 2, //LCONST_1, // -
- // 1, //FCONST_0, // -
- // 1, //FCONST_1, // -
- // 1, //FCONST_2, // -
- // 2, //DCONST_0, // -
- // 2, //DCONST_1, // -
- // 1, //BIPUSH, // visitIntInsn
- // 1, //SIPUSH, // -
- // 1, //LDC, // visitLdcInsn
- // NA, //LDC_W, // -
- // NA, //LDC2_W, // -
- // 1, //ILOAD, // visitVarInsn
- // 2, //LLOAD, // -
- // 1, //FLOAD, // -
- // 2, //DLOAD, // -
- // 1, //ALOAD, // -
- // NA, //ILOAD_0, // -
- // NA, //ILOAD_1, // -
- // NA, //ILOAD_2, // -
- // NA, //ILOAD_3, // -
- // NA, //LLOAD_0, // -
- // NA, //LLOAD_1, // -
- // NA, //LLOAD_2, // -
- // NA, //LLOAD_3, // -
- // NA, //FLOAD_0, // -
- // NA, //FLOAD_1, // -
- // NA, //FLOAD_2, // -
- // NA, //FLOAD_3, // -
- // NA, //DLOAD_0, // -
- // NA, //DLOAD_1, // -
- // NA, //DLOAD_2, // -
- // NA, //DLOAD_3, // -
- // NA, //ALOAD_0, // -
- // NA, //ALOAD_1, // -
- // NA, //ALOAD_2, // -
- // NA, //ALOAD_3, // -
- // -1, //IALOAD, // visitInsn
- // 0, //LALOAD, // -
- // -1, //FALOAD, // -
- // 0, //DALOAD, // -
- // -1, //AALOAD, // -
- // -1, //BALOAD, // -
- // -1, //CALOAD, // -
- // -1, //SALOAD, // -
- // -1, //ISTORE, // visitVarInsn
- // -2, //LSTORE, // -
- // -1, //FSTORE, // -
- // -2, //DSTORE, // -
- // -1, //ASTORE, // -
- // NA, //ISTORE_0, // -
- // NA, //ISTORE_1, // -
- // NA, //ISTORE_2, // -
- // NA, //ISTORE_3, // -
- // NA, //LSTORE_0, // -
- // NA, //LSTORE_1, // -
- // NA, //LSTORE_2, // -
- // NA, //LSTORE_3, // -
- // NA, //FSTORE_0, // -
- // NA, //FSTORE_1, // -
- // NA, //FSTORE_2, // -
- // NA, //FSTORE_3, // -
- // NA, //DSTORE_0, // -
- // NA, //DSTORE_1, // -
- // NA, //DSTORE_2, // -
- // NA, //DSTORE_3, // -
- // NA, //ASTORE_0, // -
- // NA, //ASTORE_1, // -
- // NA, //ASTORE_2, // -
- // NA, //ASTORE_3, // -
- // -3, //IASTORE, // visitInsn
- // -4, //LASTORE, // -
- // -3, //FASTORE, // -
- // -4, //DASTORE, // -
- // -3, //AASTORE, // -
- // -3, //BASTORE, // -
- // -3, //CASTORE, // -
- // -3, //SASTORE, // -
- // -1, //POP, // -
- // -2, //POP2, // -
- // 1, //DUP, // -
- // 1, //DUP_X1, // -
- // 1, //DUP_X2, // -
- // 2, //DUP2, // -
- // 2, //DUP2_X1, // -
- // 2, //DUP2_X2, // -
- // 0, //SWAP, // -
- // -1, //IADD, // -
- // -2, //LADD, // -
- // -1, //FADD, // -
- // -2, //DADD, // -
- // -1, //ISUB, // -
- // -2, //LSUB, // -
- // -1, //FSUB, // -
- // -2, //DSUB, // -
- // -1, //IMUL, // -
- // -2, //LMUL, // -
- // -1, //FMUL, // -
- // -2, //DMUL, // -
- // -1, //IDIV, // -
- // -2, //LDIV, // -
- // -1, //FDIV, // -
- // -2, //DDIV, // -
- // -1, //IREM, // -
- // -2, //LREM, // -
- // -1, //FREM, // -
- // -2, //DREM, // -
- // 0, //INEG, // -
- // 0, //LNEG, // -
- // 0, //FNEG, // -
- // 0, //DNEG, // -
- // -1, //ISHL, // -
- // -1, //LSHL, // -
- // -1, //ISHR, // -
- // -1, //LSHR, // -
- // -1, //IUSHR, // -
- // -1, //LUSHR, // -
- // -1, //IAND, // -
- // -2, //LAND, // -
- // -1, //IOR, // -
- // -2, //LOR, // -
- // -1, //IXOR, // -
- // -2, //LXOR, // -
- // 0, //IINC, // visitIincInsn
- // 1, //I2L, // visitInsn
- // 0, //I2F, // -
- // 1, //I2D, // -
- // -1, //L2I, // -
- // -1, //L2F, // -
- // 0, //L2D, // -
- // 0, //F2I, // -
- // 1, //F2L, // -
- // 1, //F2D, // -
- // -1, //D2I, // -
- // 0, //D2L, // -
- // -1, //D2F, // -
- // 0, //I2B, // -
- // 0, //I2C, // -
- // 0, //I2S, // -
- // -3, //LCMP, // -
- // -1, //FCMPL, // -
- // -1, //FCMPG, // -
- // -3, //DCMPL, // -
- // -3, //DCMPG, // -
- // -1, //IFEQ, // visitJumpInsn
- // -1, //IFNE, // -
- // -1, //IFLT, // -
- // -1, //IFGE, // -
- // -1, //IFGT, // -
- // -1, //IFLE, // -
- // -2, //IF_ICMPEQ, // -
- // -2, //IF_ICMPNE, // -
- // -2, //IF_ICMPLT, // -
- // -2, //IF_ICMPGE, // -
- // -2, //IF_ICMPGT, // -
- // -2, //IF_ICMPLE, // -
- // -2, //IF_ACMPEQ, // -
- // -2, //IF_ACMPNE, // -
- // 0, //GOTO, // -
- // 1, //JSR, // -
- // 0, //RET, // visitVarInsn
- // -1, //TABLESWITCH, // visiTableSwitchInsn
- // -1, //LOOKUPSWITCH, // visitLookupSwitch
- // -1, //IRETURN, // visitInsn
- // -2, //LRETURN, // -
- // -1, //FRETURN, // -
- // -2, //DRETURN, // -
- // -1, //ARETURN, // -
- // 0, //RETURN, // -
- // NA, //GETSTATIC, // visitFieldInsn
- // NA, //PUTSTATIC, // -
- // NA, //GETFIELD, // -
- // NA, //PUTFIELD, // -
- // NA, //INVOKEVIRTUAL, // visitMethodInsn
- // NA, //INVOKESPECIAL, // -
- // NA, //INVOKESTATIC, // -
- // NA, //INVOKEINTERFACE, // -
- // NA, //INVOKEDYNAMIC, // visitInvokeDynamicInsn
- // 1, //NEW, // visitTypeInsn
- // 0, //NEWARRAY, // visitIntInsn
- // 0, //ANEWARRAY, // visitTypeInsn
- // 0, //ARRAYLENGTH, // visitInsn
- // NA, //ATHROW, // -
- // 0, //CHECKCAST, // visitTypeInsn
- // 0, //INSTANCEOF, // -
- // -1, //MONITORENTER, // visitInsn
- // -1, //MONITOREXIT, // -
- // NA, //WIDE, // NOT VISITED
- // NA, //MULTIANEWARRAY, // visitMultiANewArrayInsn
- // -1, //IFNULL, // visitJumpInsn
- // -1, //IFNONNULL, // -
- // NA, //GOTO_W, // -
- // NA, //JSR_W, // -
- // };
- // for (i = 0; i < b.length; ++i) {
- // System.err.print((char)('E' + b[i]));
- // }
- // System.err.println();
- }
-
- /**
- * The label (i.e. basic block) to which these input and output stack map
- * frames correspond.
- */
- Label owner;
-
- /**
- * The input stack map frame locals.
- */
- int[] inputLocals;
-
- /**
- * The input stack map frame stack.
- */
- int[] inputStack;
-
- /**
- * The output stack map frame locals.
- */
- private int[] outputLocals;
-
- /**
- * The output stack map frame stack.
- */
- private int[] outputStack;
-
- /**
- * Relative size of the output stack. The exact semantics of this field
- * depends on the algorithm that is used.
- *
- * When only the maximum stack size is computed, this field is the size of
- * the output stack relatively to the top of the input stack.
- *
- * When the stack map frames are completely computed, this field is the
- * actual number of types in {@link #outputStack}.
- */
- private int outputStackTop;
-
- /**
- * Number of types that are initialized in the basic block.
- *
- * @see #initializations
- */
- private int initializationCount;
-
- /**
- * The types that are initialized in the basic block. A constructor
- * invocation on an UNINITIALIZED or UNINITIALIZED_THIS type must replace
- * <i>every occurence</i> of this type in the local variables and in the
- * operand stack. This cannot be done during the first phase of the
- * algorithm since, during this phase, the local variables and the operand
- * stack are not completely computed. It is therefore necessary to store the
- * types on which constructors are invoked in the basic block, in order to
- * do this replacement during the second phase of the algorithm, where the
- * frames are fully computed. Note that this array can contain types that
- * are relative to input locals or to the input stack (see below for the
- * description of the algorithm).
- */
- private int[] initializations;
-
- /**
- * Returns the output frame local variable type at the given index.
- *
- * @param local
- * the index of the local that must be returned.
- * @return the output frame local variable type at the given index.
- */
- private int get(final int local) {
- if (outputLocals == null || local >= outputLocals.length) {
- // this local has never been assigned in this basic block,
- // so it is still equal to its value in the input frame
- return LOCAL | local;
- } else {
- int type = outputLocals[local];
- if (type == 0) {
- // this local has never been assigned in this basic block,
- // so it is still equal to its value in the input frame
- type = outputLocals[local] = LOCAL | local;
- }
- return type;
- }
- }
-
- /**
- * Sets the output frame local variable type at the given index.
- *
- * @param local
- * the index of the local that must be set.
- * @param type
- * the value of the local that must be set.
- */
- private void set(final int local, final int type) {
- // creates and/or resizes the output local variables array if necessary
- if (outputLocals == null) {
- outputLocals = new int[10];
- }
- int n = outputLocals.length;
- if (local >= n) {
- int[] t = new int[Math.max(local + 1, 2 * n)];
- System.arraycopy(outputLocals, 0, t, 0, n);
- outputLocals = t;
- }
- // sets the local variable
- outputLocals[local] = type;
- }
-
- /**
- * Pushes a new type onto the output frame stack.
- *
- * @param type
- * the type that must be pushed.
- */
- private void push(final int type) {
- // creates and/or resizes the output stack array if necessary
- if (outputStack == null) {
- outputStack = new int[10];
- }
- int n = outputStack.length;
- if (outputStackTop >= n) {
- int[] t = new int[Math.max(outputStackTop + 1, 2 * n)];
- System.arraycopy(outputStack, 0, t, 0, n);
- outputStack = t;
- }
- // pushes the type on the output stack
- outputStack[outputStackTop++] = type;
- // updates the maximun height reached by the output stack, if needed
- int top = owner.inputStackTop + outputStackTop;
- if (top > owner.outputStackMax) {
- owner.outputStackMax = top;
- }
- }
-
- /**
- * Pushes a new type onto the output frame stack.
- *
- * @param cw
- * the ClassWriter to which this label belongs.
- * @param desc
- * the descriptor of the type to be pushed. Can also be a method
- * descriptor (in this case this method pushes its return type
- * onto the output frame stack).
- */
- private void push(final ClassWriter cw, final String desc) {
- int type = type(cw, desc);
- if (type != 0) {
- push(type);
- if (type == LONG || type == DOUBLE) {
- push(TOP);
- }
- }
- }
-
- /**
- * Returns the int encoding of the given type.
- *
- * @param cw
- * the ClassWriter to which this label belongs.
- * @param desc
- * a type descriptor.
- * @return the int encoding of the given type.
- */
- private static int type(final ClassWriter cw, final String desc) {
- String t;
- int index = desc.charAt(0) == '(' ? desc.indexOf(')') + 1 : 0;
- switch (desc.charAt(index)) {
- case 'V':
- return 0;
- case 'Z':
- case 'C':
- case 'B':
- case 'S':
- case 'I':
- return INTEGER;
- case 'F':
- return FLOAT;
- case 'J':
- return LONG;
- case 'D':
- return DOUBLE;
- case 'L':
- // stores the internal name, not the descriptor!
- t = desc.substring(index + 1, desc.length() - 1);
- return OBJECT | cw.addType(t);
- // case '[':
- default:
- // extracts the dimensions and the element type
- int data;
- int dims = index + 1;
- while (desc.charAt(dims) == '[') {
- ++dims;
- }
- switch (desc.charAt(dims)) {
- case 'Z':
- data = BOOLEAN;
- break;
- case 'C':
- data = CHAR;
- break;
- case 'B':
- data = BYTE;
- break;
- case 'S':
- data = SHORT;
- break;
- case 'I':
- data = INTEGER;
- break;
- case 'F':
- data = FLOAT;
- break;
- case 'J':
- data = LONG;
- break;
- case 'D':
- data = DOUBLE;
- break;
- // case 'L':
- default:
- // stores the internal name, not the descriptor
- t = desc.substring(dims + 1, desc.length() - 1);
- data = OBJECT | cw.addType(t);
- }
- return (dims - index) << 28 | data;
- }
- }
-
- /**
- * Pops a type from the output frame stack and returns its value.
- *
- * @return the type that has been popped from the output frame stack.
- */
- private int pop() {
- if (outputStackTop > 0) {
- return outputStack[--outputStackTop];
- } else {
- // if the output frame stack is empty, pops from the input stack
- return STACK | -(--owner.inputStackTop);
- }
- }
-
- /**
- * Pops the given number of types from the output frame stack.
- *
- * @param elements
- * the number of types that must be popped.
- */
- private void pop(final int elements) {
- if (outputStackTop >= elements) {
- outputStackTop -= elements;
- } else {
- // if the number of elements to be popped is greater than the number
- // of elements in the output stack, clear it, and pops the remaining
- // elements from the input stack.
- owner.inputStackTop -= elements - outputStackTop;
- outputStackTop = 0;
- }
- }
-
- /**
- * Pops a type from the output frame stack.
- *
- * @param desc
- * the descriptor of the type to be popped. Can also be a method
- * descriptor (in this case this method pops the types
- * corresponding to the method arguments).
- */
- private void pop(final String desc) {
- char c = desc.charAt(0);
- if (c == '(') {
- pop((Type.getArgumentsAndReturnSizes(desc) >> 2) - 1);
- } else if (c == 'J' || c == 'D') {
- pop(2);
- } else {
- pop(1);
- }
- }
-
- /**
- * Adds a new type to the list of types on which a constructor is invoked in
- * the basic block.
- *
- * @param var
- * a type on a which a constructor is invoked.
- */
- private void init(final int var) {
- // creates and/or resizes the initializations array if necessary
- if (initializations == null) {
- initializations = new int[2];
- }
- int n = initializations.length;
- if (initializationCount >= n) {
- int[] t = new int[Math.max(initializationCount + 1, 2 * n)];
- System.arraycopy(initializations, 0, t, 0, n);
- initializations = t;
- }
- // stores the type to be initialized
- initializations[initializationCount++] = var;
- }
-
- /**
- * Replaces the given type with the appropriate type if it is one of the
- * types on which a constructor is invoked in the basic block.
- *
- * @param cw
- * the ClassWriter to which this label belongs.
- * @param t
- * a type
- * @return t or, if t is one of the types on which a constructor is invoked
- * in the basic block, the type corresponding to this constructor.
- */
- private int init(final ClassWriter cw, final int t) {
- int s;
- if (t == UNINITIALIZED_THIS) {
- s = OBJECT | cw.addType(cw.thisName);
- } else if ((t & (DIM | BASE_KIND)) == UNINITIALIZED) {
- String type = cw.typeTable[t & BASE_VALUE].strVal1;
- s = OBJECT | cw.addType(type);
- } else {
- return t;
- }
- for (int j = 0; j < initializationCount; ++j) {
- int u = initializations[j];
- int dim = u & DIM;
- int kind = u & KIND;
- if (kind == LOCAL) {
- u = dim + inputLocals[u & VALUE];
- } else if (kind == STACK) {
- u = dim + inputStack[inputStack.length - (u & VALUE)];
- }
- if (t == u) {
- return s;
- }
- }
- return t;
- }
-
- /**
- * Initializes the input frame of the first basic block from the method
- * descriptor.
- *
- * @param cw
- * the ClassWriter to which this label belongs.
- * @param access
- * the access flags of the method to which this label belongs.
- * @param args
- * the formal parameter types of this method.
- * @param maxLocals
- * the maximum number of local variables of this method.
- */
- void initInputFrame(final ClassWriter cw, final int access,
- final Type[] args, final int maxLocals) {
- inputLocals = new int[maxLocals];
- inputStack = new int[0];
- int i = 0;
- if ((access & Opcodes.ACC_STATIC) == 0) {
- if ((access & MethodWriter.ACC_CONSTRUCTOR) == 0) {
- inputLocals[i++] = OBJECT | cw.addType(cw.thisName);
- } else {
- inputLocals[i++] = UNINITIALIZED_THIS;
- }
- }
- for (int j = 0; j < args.length; ++j) {
- int t = type(cw, args[j].getDescriptor());
- inputLocals[i++] = t;
- if (t == LONG || t == DOUBLE) {
- inputLocals[i++] = TOP;
- }
- }
- while (i < maxLocals) {
- inputLocals[i++] = TOP;
- }
- }
-
- /**
- * Simulates the action of the given instruction on the output stack frame.
- *
- * @param opcode
- * the opcode of the instruction.
- * @param arg
- * the operand of the instruction, if any.
- * @param cw
- * the class writer to which this label belongs.
- * @param item
- * the operand of the instructions, if any.
- */
- void execute(final int opcode, final int arg, final ClassWriter cw,
- final Item item) {
- int t1, t2, t3, t4;
- switch (opcode) {
- case Opcodes.NOP:
- case Opcodes.INEG:
- case Opcodes.LNEG:
- case Opcodes.FNEG:
- case Opcodes.DNEG:
- case Opcodes.I2B:
- case Opcodes.I2C:
- case Opcodes.I2S:
- case Opcodes.GOTO:
- case Opcodes.RETURN:
- break;
- case Opcodes.ACONST_NULL:
- push(NULL);
- break;
- case Opcodes.ICONST_M1:
- case Opcodes.ICONST_0:
- case Opcodes.ICONST_1:
- case Opcodes.ICONST_2:
- case Opcodes.ICONST_3:
- case Opcodes.ICONST_4:
- case Opcodes.ICONST_5:
- case Opcodes.BIPUSH:
- case Opcodes.SIPUSH:
- case Opcodes.ILOAD:
- push(INTEGER);
- break;
- case Opcodes.LCONST_0:
- case Opcodes.LCONST_1:
- case Opcodes.LLOAD:
- push(LONG);
- push(TOP);
- break;
- case Opcodes.FCONST_0:
- case Opcodes.FCONST_1:
- case Opcodes.FCONST_2:
- case Opcodes.FLOAD:
- push(FLOAT);
- break;
- case Opcodes.DCONST_0:
- case Opcodes.DCONST_1:
- case Opcodes.DLOAD:
- push(DOUBLE);
- push(TOP);
- break;
- case Opcodes.LDC:
- switch (item.type) {
- case ClassWriter.INT:
- push(INTEGER);
- break;
- case ClassWriter.LONG:
- push(LONG);
- push(TOP);
- break;
- case ClassWriter.FLOAT:
- push(FLOAT);
- break;
- case ClassWriter.DOUBLE:
- push(DOUBLE);
- push(TOP);
- break;
- case ClassWriter.CLASS:
- push(OBJECT | cw.addType("java/lang/Class"));
- break;
- case ClassWriter.STR:
- push(OBJECT | cw.addType("java/lang/String"));
- break;
- case ClassWriter.MTYPE:
- push(OBJECT | cw.addType("java/lang/invoke/MethodType"));
- break;
- // case ClassWriter.HANDLE_BASE + [1..9]:
- default:
- push(OBJECT | cw.addType("java/lang/invoke/MethodHandle"));
- }
- break;
- case Opcodes.ALOAD:
- push(get(arg));
- break;
- case Opcodes.IALOAD:
- case Opcodes.BALOAD:
- case Opcodes.CALOAD:
- case Opcodes.SALOAD:
- pop(2);
- push(INTEGER);
- break;
- case Opcodes.LALOAD:
- case Opcodes.D2L:
- pop(2);
- push(LONG);
- push(TOP);
- break;
- case Opcodes.FALOAD:
- pop(2);
- push(FLOAT);
- break;
- case Opcodes.DALOAD:
- case Opcodes.L2D:
- pop(2);
- push(DOUBLE);
- push(TOP);
- break;
- case Opcodes.AALOAD:
- pop(1);
- t1 = pop();
- push(ELEMENT_OF + t1);
- break;
- case Opcodes.ISTORE:
- case Opcodes.FSTORE:
- case Opcodes.ASTORE:
- t1 = pop();
- set(arg, t1);
- if (arg > 0) {
- t2 = get(arg - 1);
- // if t2 is of kind STACK or LOCAL we cannot know its size!
- if (t2 == LONG || t2 == DOUBLE) {
- set(arg - 1, TOP);
- } else if ((t2 & KIND) != BASE) {
- set(arg - 1, t2 | TOP_IF_LONG_OR_DOUBLE);
- }
- }
- break;
- case Opcodes.LSTORE:
- case Opcodes.DSTORE:
- pop(1);
- t1 = pop();
- set(arg, t1);
- set(arg + 1, TOP);
- if (arg > 0) {
- t2 = get(arg - 1);
- // if t2 is of kind STACK or LOCAL we cannot know its size!
- if (t2 == LONG || t2 == DOUBLE) {
- set(arg - 1, TOP);
- } else if ((t2 & KIND) != BASE) {
- set(arg - 1, t2 | TOP_IF_LONG_OR_DOUBLE);
- }
- }
- break;
- case Opcodes.IASTORE:
- case Opcodes.BASTORE:
- case Opcodes.CASTORE:
- case Opcodes.SASTORE:
- case Opcodes.FASTORE:
- case Opcodes.AASTORE:
- pop(3);
- break;
- case Opcodes.LASTORE:
- case Opcodes.DASTORE:
- pop(4);
- break;
- case Opcodes.POP:
- case Opcodes.IFEQ:
- case Opcodes.IFNE:
- case Opcodes.IFLT:
- case Opcodes.IFGE:
- case Opcodes.IFGT:
- case Opcodes.IFLE:
- case Opcodes.IRETURN:
- case Opcodes.FRETURN:
- case Opcodes.ARETURN:
- case Opcodes.TABLESWITCH:
- case Opcodes.LOOKUPSWITCH:
- case Opcodes.ATHROW:
- case Opcodes.MONITORENTER:
- case Opcodes.MONITOREXIT:
- case Opcodes.IFNULL:
- case Opcodes.IFNONNULL:
- pop(1);
- break;
- case Opcodes.POP2:
- case Opcodes.IF_ICMPEQ:
- case Opcodes.IF_ICMPNE:
- case Opcodes.IF_ICMPLT:
- case Opcodes.IF_ICMPGE:
- case Opcodes.IF_ICMPGT:
- case Opcodes.IF_ICMPLE:
- case Opcodes.IF_ACMPEQ:
- case Opcodes.IF_ACMPNE:
- case Opcodes.LRETURN:
- case Opcodes.DRETURN:
- pop(2);
- break;
- case Opcodes.DUP:
- t1 = pop();
- push(t1);
- push(t1);
- break;
- case Opcodes.DUP_X1:
- t1 = pop();
- t2 = pop();
- push(t1);
- push(t2);
- push(t1);
- break;
- case Opcodes.DUP_X2:
- t1 = pop();
- t2 = pop();
- t3 = pop();
- push(t1);
- push(t3);
- push(t2);
- push(t1);
- break;
- case Opcodes.DUP2:
- t1 = pop();
- t2 = pop();
- push(t2);
- push(t1);
- push(t2);
- push(t1);
- break;
- case Opcodes.DUP2_X1:
- t1 = pop();
- t2 = pop();
- t3 = pop();
- push(t2);
- push(t1);
- push(t3);
- push(t2);
- push(t1);
- break;
- case Opcodes.DUP2_X2:
- t1 = pop();
- t2 = pop();
- t3 = pop();
- t4 = pop();
- push(t2);
- push(t1);
- push(t4);
- push(t3);
- push(t2);
- push(t1);
- break;
- case Opcodes.SWAP:
- t1 = pop();
- t2 = pop();
- push(t1);
- push(t2);
- break;
- case Opcodes.IADD:
- case Opcodes.ISUB:
- case Opcodes.IMUL:
- case Opcodes.IDIV:
- case Opcodes.IREM:
- case Opcodes.IAND:
- case Opcodes.IOR:
- case Opcodes.IXOR:
- case Opcodes.ISHL:
- case Opcodes.ISHR:
- case Opcodes.IUSHR:
- case Opcodes.L2I:
- case Opcodes.D2I:
- case Opcodes.FCMPL:
- case Opcodes.FCMPG:
- pop(2);
- push(INTEGER);
- break;
- case Opcodes.LADD:
- case Opcodes.LSUB:
- case Opcodes.LMUL:
- case Opcodes.LDIV:
- case Opcodes.LREM:
- case Opcodes.LAND:
- case Opcodes.LOR:
- case Opcodes.LXOR:
- pop(4);
- push(LONG);
- push(TOP);
- break;
- case Opcodes.FADD:
- case Opcodes.FSUB:
- case Opcodes.FMUL:
- case Opcodes.FDIV:
- case Opcodes.FREM:
- case Opcodes.L2F:
- case Opcodes.D2F:
- pop(2);
- push(FLOAT);
- break;
- case Opcodes.DADD:
- case Opcodes.DSUB:
- case Opcodes.DMUL:
- case Opcodes.DDIV:
- case Opcodes.DREM:
- pop(4);
- push(DOUBLE);
- push(TOP);
- break;
- case Opcodes.LSHL:
- case Opcodes.LSHR:
- case Opcodes.LUSHR:
- pop(3);
- push(LONG);
- push(TOP);
- break;
- case Opcodes.IINC:
- set(arg, INTEGER);
- break;
- case Opcodes.I2L:
- case Opcodes.F2L:
- pop(1);
- push(LONG);
- push(TOP);
- break;
- case Opcodes.I2F:
- pop(1);
- push(FLOAT);
- break;
- case Opcodes.I2D:
- case Opcodes.F2D:
- pop(1);
- push(DOUBLE);
- push(TOP);
- break;
- case Opcodes.F2I:
- case Opcodes.ARRAYLENGTH:
- case Opcodes.INSTANCEOF:
- pop(1);
- push(INTEGER);
- break;
- case Opcodes.LCMP:
- case Opcodes.DCMPL:
- case Opcodes.DCMPG:
- pop(4);
- push(INTEGER);
- break;
- case Opcodes.JSR:
- case Opcodes.RET:
- throw new RuntimeException(
- "JSR/RET are not supported with computeFrames option");
- case Opcodes.GETSTATIC:
- push(cw, item.strVal3);
- break;
- case Opcodes.PUTSTATIC:
- pop(item.strVal3);
- break;
- case Opcodes.GETFIELD:
- pop(1);
- push(cw, item.strVal3);
- break;
- case Opcodes.PUTFIELD:
- pop(item.strVal3);
- pop();
- break;
- case Opcodes.INVOKEVIRTUAL:
- case Opcodes.INVOKESPECIAL:
- case Opcodes.INVOKESTATIC:
- case Opcodes.INVOKEINTERFACE:
- pop(item.strVal3);
- if (opcode != Opcodes.INVOKESTATIC) {
- t1 = pop();
- if (opcode == Opcodes.INVOKESPECIAL
- && item.strVal2.charAt(0) == '<') {
- init(t1);
- }
- }
- push(cw, item.strVal3);
- break;
- case Opcodes.INVOKEDYNAMIC:
- pop(item.strVal2);
- push(cw, item.strVal2);
- break;
- case Opcodes.NEW:
- push(UNINITIALIZED | cw.addUninitializedType(item.strVal1, arg));
- break;
- case Opcodes.NEWARRAY:
- pop();
- switch (arg) {
- case Opcodes.T_BOOLEAN:
- push(ARRAY_OF | BOOLEAN);
- break;
- case Opcodes.T_CHAR:
- push(ARRAY_OF | CHAR);
- break;
- case Opcodes.T_BYTE:
- push(ARRAY_OF | BYTE);
- break;
- case Opcodes.T_SHORT:
- push(ARRAY_OF | SHORT);
- break;
- case Opcodes.T_INT:
- push(ARRAY_OF | INTEGER);
- break;
- case Opcodes.T_FLOAT:
- push(ARRAY_OF | FLOAT);
- break;
- case Opcodes.T_DOUBLE:
- push(ARRAY_OF | DOUBLE);
- break;
- // case Opcodes.T_LONG:
- default:
- push(ARRAY_OF | LONG);
- break;
- }
- break;
- case Opcodes.ANEWARRAY:
- String s = item.strVal1;
- pop();
- if (s.charAt(0) == '[') {
- push(cw, '[' + s);
- } else {
- push(ARRAY_OF | OBJECT | cw.addType(s));
- }
- break;
- case Opcodes.CHECKCAST:
- s = item.strVal1;
- pop();
- if (s.charAt(0) == '[') {
- push(cw, s);
- } else {
- push(OBJECT | cw.addType(s));
- }
- break;
- // case Opcodes.MULTIANEWARRAY:
- default:
- pop(arg);
- push(cw, item.strVal1);
- break;
- }
- }
-
- /**
- * Merges the input frame of the given basic block with the input and output
- * frames of this basic block. Returns <tt>true</tt> if the input frame of
- * the given label has been changed by this operation.
- *
- * @param cw
- * the ClassWriter to which this label belongs.
- * @param frame
- * the basic block whose input frame must be updated.
- * @param edge
- * the kind of the {@link Edge} between this label and 'label'.
- * See {@link Edge#info}.
- * @return <tt>true</tt> if the input frame of the given label has been
- * changed by this operation.
- */
- boolean merge(final ClassWriter cw, final Frame frame, final int edge) {
- boolean changed = false;
- int i, s, dim, kind, t;
-
- int nLocal = inputLocals.length;
- int nStack = inputStack.length;
- if (frame.inputLocals == null) {
- frame.inputLocals = new int[nLocal];
- changed = true;
- }
-
- for (i = 0; i < nLocal; ++i) {
- if (outputLocals != null && i < outputLocals.length) {
- s = outputLocals[i];
- if (s == 0) {
- t = inputLocals[i];
- } else {
- dim = s & DIM;
- kind = s & KIND;
- if (kind == BASE) {
- t = s;
- } else {
- if (kind == LOCAL) {
- t = dim + inputLocals[s & VALUE];
- } else {
- t = dim + inputStack[nStack - (s & VALUE)];
- }
- if ((s & TOP_IF_LONG_OR_DOUBLE) != 0
- && (t == LONG || t == DOUBLE)) {
- t = TOP;
- }
- }
- }
- } else {
- t = inputLocals[i];
- }
- if (initializations != null) {
- t = init(cw, t);
- }
- changed |= merge(cw, t, frame.inputLocals, i);
- }
-
- if (edge > 0) {
- for (i = 0; i < nLocal; ++i) {
- t = inputLocals[i];
- changed |= merge(cw, t, frame.inputLocals, i);
- }
- if (frame.inputStack == null) {
- frame.inputStack = new int[1];
- changed = true;
- }
- changed |= merge(cw, edge, frame.inputStack, 0);
- return changed;
- }
-
- int nInputStack = inputStack.length + owner.inputStackTop;
- if (frame.inputStack == null) {
- frame.inputStack = new int[nInputStack + outputStackTop];
- changed = true;
- }
-
- for (i = 0; i < nInputStack; ++i) {
- t = inputStack[i];
- if (initializations != null) {
- t = init(cw, t);
- }
- changed |= merge(cw, t, frame.inputStack, i);
- }
- for (i = 0; i < outputStackTop; ++i) {
- s = outputStack[i];
- dim = s & DIM;
- kind = s & KIND;
- if (kind == BASE) {
- t = s;
- } else {
- if (kind == LOCAL) {
- t = dim + inputLocals[s & VALUE];
- } else {
- t = dim + inputStack[nStack - (s & VALUE)];
- }
- if ((s & TOP_IF_LONG_OR_DOUBLE) != 0
- && (t == LONG || t == DOUBLE)) {
- t = TOP;
- }
- }
- if (initializations != null) {
- t = init(cw, t);
- }
- changed |= merge(cw, t, frame.inputStack, nInputStack + i);
- }
- return changed;
- }
-
- /**
- * Merges the type at the given index in the given type array with the given
- * type. Returns <tt>true</tt> if the type array has been modified by this
- * operation.
- *
- * @param cw
- * the ClassWriter to which this label belongs.
- * @param t
- * the type with which the type array element must be merged.
- * @param types
- * an array of types.
- * @param index
- * the index of the type that must be merged in 'types'.
- * @return <tt>true</tt> if the type array has been modified by this
- * operation.
- */
- private static boolean merge(final ClassWriter cw, int t,
- final int[] types, final int index) {
- int u = types[index];
- if (u == t) {
- // if the types are equal, merge(u,t)=u, so there is no change
- return false;
- }
- if ((t & ~DIM) == NULL) {
- if (u == NULL) {
- return false;
- }
- t = NULL;
- }
- if (u == 0) {
- // if types[index] has never been assigned, merge(u,t)=t
- types[index] = t;
- return true;
- }
- int v;
- if ((u & BASE_KIND) == OBJECT || (u & DIM) != 0) {
- // if u is a reference type of any dimension
- if (t == NULL) {
- // if t is the NULL type, merge(u,t)=u, so there is no change
- return false;
- } else if ((t & (DIM | BASE_KIND)) == (u & (DIM | BASE_KIND))) {
- // if t and u have the same dimension and same base kind
- if ((u & BASE_KIND) == OBJECT) {
- // if t is also a reference type, and if u and t have the
- // same dimension merge(u,t) = dim(t) | common parent of the
- // element types of u and t
- v = (t & DIM) | OBJECT
- | cw.getMergedType(t & BASE_VALUE, u & BASE_VALUE);
- } else {
- // if u and t are array types, but not with the same element
- // type, merge(u,t) = dim(u) - 1 | java/lang/Object
- int vdim = ELEMENT_OF + (u & DIM);
- v = vdim | OBJECT | cw.addType("java/lang/Object");
- }
- } else if ((t & BASE_KIND) == OBJECT || (t & DIM) != 0) {
- // if t is any other reference or array type, the merged type
- // is min(udim, tdim) | java/lang/Object, where udim is the
- // array dimension of u, minus 1 if u is an array type with a
- // primitive element type (and similarly for tdim).
- int tdim = (((t & DIM) == 0 || (t & BASE_KIND) == OBJECT) ? 0
- : ELEMENT_OF) + (t & DIM);
- int udim = (((u & DIM) == 0 || (u & BASE_KIND) == OBJECT) ? 0
- : ELEMENT_OF) + (u & DIM);
- v = Math.min(tdim, udim) | OBJECT
- | cw.addType("java/lang/Object");
- } else {
- // if t is any other type, merge(u,t)=TOP
- v = TOP;
- }
- } else if (u == NULL) {
- // if u is the NULL type, merge(u,t)=t,
- // or TOP if t is not a reference type
- v = (t & BASE_KIND) == OBJECT || (t & DIM) != 0 ? t : TOP;
- } else {
- // if u is any other type, merge(u,t)=TOP whatever t
- v = TOP;
- }
- if (u != v) {
- types[index] = v;
- return true;
- }
- return false;
- }
-}
diff --git a/src/asm/scala/tools/asm/Handle.java b/src/asm/scala/tools/asm/Handle.java
deleted file mode 100644
index cf12bb7613..0000000000
--- a/src/asm/scala/tools/asm/Handle.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm;
-
-/**
- * A reference to a field or a method.
- *
- * @author Remi Forax
- * @author Eric Bruneton
- */
-public final class Handle {
-
- /**
- * The kind of field or method designated by this Handle. Should be
- * {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
- * {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
- * {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC},
- * {@link Opcodes#H_INVOKESPECIAL}, {@link Opcodes#H_NEWINVOKESPECIAL} or
- * {@link Opcodes#H_INVOKEINTERFACE}.
- */
- final int tag;
-
- /**
- * The internal name of the class that owns the field or method designated
- * by this handle.
- */
- final String owner;
-
- /**
- * The name of the field or method designated by this handle.
- */
- final String name;
-
- /**
- * The descriptor of the field or method designated by this handle.
- */
- final String desc;
-
- /**
- * Constructs a new field or method handle.
- *
- * @param tag
- * the kind of field or method designated by this Handle. Must be
- * {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
- * {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
- * {@link Opcodes#H_INVOKEVIRTUAL},
- * {@link Opcodes#H_INVOKESTATIC},
- * {@link Opcodes#H_INVOKESPECIAL},
- * {@link Opcodes#H_NEWINVOKESPECIAL} or
- * {@link Opcodes#H_INVOKEINTERFACE}.
- * @param owner
- * the internal name of the class that owns the field or method
- * designated by this handle.
- * @param name
- * the name of the field or method designated by this handle.
- * @param desc
- * the descriptor of the field or method designated by this
- * handle.
- */
- public Handle(int tag, String owner, String name, String desc) {
- this.tag = tag;
- this.owner = owner;
- this.name = name;
- this.desc = desc;
- }
-
- /**
- * Returns the kind of field or method designated by this handle.
- *
- * @return {@link Opcodes#H_GETFIELD}, {@link Opcodes#H_GETSTATIC},
- * {@link Opcodes#H_PUTFIELD}, {@link Opcodes#H_PUTSTATIC},
- * {@link Opcodes#H_INVOKEVIRTUAL}, {@link Opcodes#H_INVOKESTATIC},
- * {@link Opcodes#H_INVOKESPECIAL},
- * {@link Opcodes#H_NEWINVOKESPECIAL} or
- * {@link Opcodes#H_INVOKEINTERFACE}.
- */
- public int getTag() {
- return tag;
- }
-
- /**
- * Returns the internal name of the class that owns the field or method
- * designated by this handle.
- *
- * @return the internal name of the class that owns the field or method
- * designated by this handle.
- */
- public String getOwner() {
- return owner;
- }
-
- /**
- * Returns the name of the field or method designated by this handle.
- *
- * @return the name of the field or method designated by this handle.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Returns the descriptor of the field or method designated by this handle.
- *
- * @return the descriptor of the field or method designated by this handle.
- */
- public String getDesc() {
- return desc;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
- }
- if (!(obj instanceof Handle)) {
- return false;
- }
- Handle h = (Handle) obj;
- return tag == h.tag && owner.equals(h.owner) && name.equals(h.name)
- && desc.equals(h.desc);
- }
-
- @Override
- public int hashCode() {
- return tag + owner.hashCode() * name.hashCode() * desc.hashCode();
- }
-
- /**
- * Returns the textual representation of this handle. The textual
- * representation is:
- *
- * <pre>
- * owner '.' name desc ' ' '(' tag ')'
- * </pre>
- *
- * . As this format is unambiguous, it can be parsed if necessary.
- */
- @Override
- public String toString() {
- return owner + '.' + name + desc + " (" + tag + ')';
- }
-}
diff --git a/src/asm/scala/tools/asm/Handler.java b/src/asm/scala/tools/asm/Handler.java
deleted file mode 100644
index a06cb8152a..0000000000
--- a/src/asm/scala/tools/asm/Handler.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * Information about an exception handler block.
- *
- * @author Eric Bruneton
- */
-class Handler {
-
- /**
- * Beginning of the exception handler's scope (inclusive).
- */
- Label start;
-
- /**
- * End of the exception handler's scope (exclusive).
- */
- Label end;
-
- /**
- * Beginning of the exception handler's code.
- */
- Label handler;
-
- /**
- * Internal name of the type of exceptions handled by this handler, or
- * <tt>null</tt> to catch any exceptions.
- */
- String desc;
-
- /**
- * Constant pool index of the internal name of the type of exceptions
- * handled by this handler, or 0 to catch any exceptions.
- */
- int type;
-
- /**
- * Next exception handler block info.
- */
- Handler next;
-
- /**
- * Removes the range between start and end from the given exception
- * handlers.
- *
- * @param h
- * an exception handler list.
- * @param start
- * the start of the range to be removed.
- * @param end
- * the end of the range to be removed. Maybe null.
- * @return the exception handler list with the start-end range removed.
- */
- static Handler remove(Handler h, Label start, Label end) {
- if (h == null) {
- return null;
- } else {
- h.next = remove(h.next, start, end);
- }
- int hstart = h.start.position;
- int hend = h.end.position;
- int s = start.position;
- int e = end == null ? Integer.MAX_VALUE : end.position;
- // if [hstart,hend[ and [s,e[ intervals intersect...
- if (s < hend && e > hstart) {
- if (s <= hstart) {
- if (e >= hend) {
- // [hstart,hend[ fully included in [s,e[, h removed
- h = h.next;
- } else {
- // [hstart,hend[ minus [s,e[ = [e,hend[
- h.start = end;
- }
- } else if (e >= hend) {
- // [hstart,hend[ minus [s,e[ = [hstart,s[
- h.end = start;
- } else {
- // [hstart,hend[ minus [s,e[ = [hstart,s[ + [e,hend[
- Handler g = new Handler();
- g.start = end;
- g.end = h.end;
- g.handler = h.handler;
- g.desc = h.desc;
- g.type = h.type;
- g.next = h.next;
- h.end = start;
- h.next = g;
- }
- }
- return h;
- }
-}
diff --git a/src/asm/scala/tools/asm/Item.java b/src/asm/scala/tools/asm/Item.java
deleted file mode 100644
index 4693f5ae99..0000000000
--- a/src/asm/scala/tools/asm/Item.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A constant pool item. Constant pool items can be created with the 'newXXX'
- * methods in the {@link ClassWriter} class.
- *
- * @author Eric Bruneton
- */
-final class Item {
-
- /**
- * Index of this item in the constant pool.
- */
- int index;
-
- /**
- * Type of this constant pool item. A single class is used to represent all
- * constant pool item types, in order to minimize the bytecode size of this
- * package. The value of this field is one of {@link ClassWriter#INT},
- * {@link ClassWriter#LONG}, {@link ClassWriter#FLOAT},
- * {@link ClassWriter#DOUBLE}, {@link ClassWriter#UTF8},
- * {@link ClassWriter#STR}, {@link ClassWriter#CLASS},
- * {@link ClassWriter#NAME_TYPE}, {@link ClassWriter#FIELD},
- * {@link ClassWriter#METH}, {@link ClassWriter#IMETH},
- * {@link ClassWriter#MTYPE}, {@link ClassWriter#INDY}.
- *
- * MethodHandle constant 9 variations are stored using a range of 9 values
- * from {@link ClassWriter#HANDLE_BASE} + 1 to
- * {@link ClassWriter#HANDLE_BASE} + 9.
- *
- * Special Item types are used for Items that are stored in the ClassWriter
- * {@link ClassWriter#typeTable}, instead of the constant pool, in order to
- * avoid clashes with normal constant pool items in the ClassWriter constant
- * pool's hash table. These special item types are
- * {@link ClassWriter#TYPE_NORMAL}, {@link ClassWriter#TYPE_UNINIT} and
- * {@link ClassWriter#TYPE_MERGED}.
- */
- int type;
-
- /**
- * Value of this item, for an integer item.
- */
- int intVal;
-
- /**
- * Value of this item, for a long item.
- */
- long longVal;
-
- /**
- * First part of the value of this item, for items that do not hold a
- * primitive value.
- */
- String strVal1;
-
- /**
- * Second part of the value of this item, for items that do not hold a
- * primitive value.
- */
- String strVal2;
-
- /**
- * Third part of the value of this item, for items that do not hold a
- * primitive value.
- */
- String strVal3;
-
- /**
- * The hash code value of this constant pool item.
- */
- int hashCode;
-
- /**
- * Link to another constant pool item, used for collision lists in the
- * constant pool's hash table.
- */
- Item next;
-
- /**
- * Constructs an uninitialized {@link Item}.
- */
- Item() {
- }
-
- /**
- * Constructs an uninitialized {@link Item} for constant pool element at
- * given position.
- *
- * @param index
- * index of the item to be constructed.
- */
- Item(final int index) {
- this.index = index;
- }
-
- /**
- * Constructs a copy of the given item.
- *
- * @param index
- * index of the item to be constructed.
- * @param i
- * the item that must be copied into the item to be constructed.
- */
- Item(final int index, final Item i) {
- this.index = index;
- type = i.type;
- intVal = i.intVal;
- longVal = i.longVal;
- strVal1 = i.strVal1;
- strVal2 = i.strVal2;
- strVal3 = i.strVal3;
- hashCode = i.hashCode;
- }
-
- /**
- * Sets this item to an integer item.
- *
- * @param intVal
- * the value of this item.
- */
- void set(final int intVal) {
- this.type = ClassWriter.INT;
- this.intVal = intVal;
- this.hashCode = 0x7FFFFFFF & (type + intVal);
- }
-
- /**
- * Sets this item to a long item.
- *
- * @param longVal
- * the value of this item.
- */
- void set(final long longVal) {
- this.type = ClassWriter.LONG;
- this.longVal = longVal;
- this.hashCode = 0x7FFFFFFF & (type + (int) longVal);
- }
-
- /**
- * Sets this item to a float item.
- *
- * @param floatVal
- * the value of this item.
- */
- void set(final float floatVal) {
- this.type = ClassWriter.FLOAT;
- this.intVal = Float.floatToRawIntBits(floatVal);
- this.hashCode = 0x7FFFFFFF & (type + (int) floatVal);
- }
-
- /**
- * Sets this item to a double item.
- *
- * @param doubleVal
- * the value of this item.
- */
- void set(final double doubleVal) {
- this.type = ClassWriter.DOUBLE;
- this.longVal = Double.doubleToRawLongBits(doubleVal);
- this.hashCode = 0x7FFFFFFF & (type + (int) doubleVal);
- }
-
- /**
- * Sets this item to an item that do not hold a primitive value.
- *
- * @param type
- * the type of this item.
- * @param strVal1
- * first part of the value of this item.
- * @param strVal2
- * second part of the value of this item.
- * @param strVal3
- * third part of the value of this item.
- */
- void set(final int type, final String strVal1, final String strVal2,
- final String strVal3) {
- this.type = type;
- this.strVal1 = strVal1;
- this.strVal2 = strVal2;
- this.strVal3 = strVal3;
- switch (type) {
- case ClassWriter.CLASS:
- this.intVal = 0; // intVal of a class must be zero, see visitInnerClass
- case ClassWriter.UTF8:
- case ClassWriter.STR:
- case ClassWriter.MTYPE:
- case ClassWriter.TYPE_NORMAL:
- hashCode = 0x7FFFFFFF & (type + strVal1.hashCode());
- return;
- case ClassWriter.NAME_TYPE: {
- hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()
- * strVal2.hashCode());
- return;
- }
- // ClassWriter.FIELD:
- // ClassWriter.METH:
- // ClassWriter.IMETH:
- // ClassWriter.HANDLE_BASE + 1..9
- default:
- hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()
- * strVal2.hashCode() * strVal3.hashCode());
- }
- }
-
- /**
- * Sets the item to an InvokeDynamic item.
- *
- * @param name
- * invokedynamic's name.
- * @param desc
- * invokedynamic's desc.
- * @param bsmIndex
- * zero based index into the class attribute BootrapMethods.
- */
- void set(String name, String desc, int bsmIndex) {
- this.type = ClassWriter.INDY;
- this.longVal = bsmIndex;
- this.strVal1 = name;
- this.strVal2 = desc;
- this.hashCode = 0x7FFFFFFF & (ClassWriter.INDY + bsmIndex
- * strVal1.hashCode() * strVal2.hashCode());
- }
-
- /**
- * Sets the item to a BootstrapMethod item.
- *
- * @param position
- * position in byte in the class attribute BootrapMethods.
- * @param hashCode
- * hashcode of the item. This hashcode is processed from the
- * hashcode of the bootstrap method and the hashcode of all
- * bootstrap arguments.
- */
- void set(int position, int hashCode) {
- this.type = ClassWriter.BSM;
- this.intVal = position;
- this.hashCode = hashCode;
- }
-
- /**
- * Indicates if the given item is equal to this one. <i>This method assumes
- * that the two items have the same {@link #type}</i>.
- *
- * @param i
- * the item to be compared to this one. Both items must have the
- * same {@link #type}.
- * @return <tt>true</tt> if the given item if equal to this one,
- * <tt>false</tt> otherwise.
- */
- boolean isEqualTo(final Item i) {
- switch (type) {
- case ClassWriter.UTF8:
- case ClassWriter.STR:
- case ClassWriter.CLASS:
- case ClassWriter.MTYPE:
- case ClassWriter.TYPE_NORMAL:
- return i.strVal1.equals(strVal1);
- case ClassWriter.TYPE_MERGED:
- case ClassWriter.LONG:
- case ClassWriter.DOUBLE:
- return i.longVal == longVal;
- case ClassWriter.INT:
- case ClassWriter.FLOAT:
- return i.intVal == intVal;
- case ClassWriter.TYPE_UNINIT:
- return i.intVal == intVal && i.strVal1.equals(strVal1);
- case ClassWriter.NAME_TYPE:
- return i.strVal1.equals(strVal1) && i.strVal2.equals(strVal2);
- case ClassWriter.INDY: {
- return i.longVal == longVal && i.strVal1.equals(strVal1)
- && i.strVal2.equals(strVal2);
- }
- // case ClassWriter.FIELD:
- // case ClassWriter.METH:
- // case ClassWriter.IMETH:
- // case ClassWriter.HANDLE_BASE + 1..9
- default:
- return i.strVal1.equals(strVal1) && i.strVal2.equals(strVal2)
- && i.strVal3.equals(strVal3);
- }
- }
-
-}
diff --git a/src/asm/scala/tools/asm/Label.java b/src/asm/scala/tools/asm/Label.java
deleted file mode 100644
index 22b6798fb5..0000000000
--- a/src/asm/scala/tools/asm/Label.java
+++ /dev/null
@@ -1,560 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A label represents a position in the bytecode of a method. Labels are used
- * for jump, goto, and switch instructions, and for try catch blocks. A label
- * designates the <i>instruction</i> that is just after. Note however that there
- * can be other elements between a label and the instruction it designates (such
- * as other labels, stack map frames, line numbers, etc.).
- *
- * @author Eric Bruneton
- */
-public class Label {
-
- /**
- * Indicates if this label is only used for debug attributes. Such a label
- * is not the start of a basic block, the target of a jump instruction, or
- * an exception handler. It can be safely ignored in control flow graph
- * analysis algorithms (for optimization purposes).
- */
- static final int DEBUG = 1;
-
- /**
- * Indicates if the position of this label is known.
- */
- static final int RESOLVED = 2;
-
- /**
- * Indicates if this label has been updated, after instruction resizing.
- */
- static final int RESIZED = 4;
-
- /**
- * Indicates if this basic block has been pushed in the basic block stack.
- * See {@link MethodWriter#visitMaxs visitMaxs}.
- */
- static final int PUSHED = 8;
-
- /**
- * Indicates if this label is the target of a jump instruction, or the start
- * of an exception handler.
- */
- static final int TARGET = 16;
-
- /**
- * Indicates if a stack map frame must be stored for this label.
- */
- static final int STORE = 32;
-
- /**
- * Indicates if this label corresponds to a reachable basic block.
- */
- static final int REACHABLE = 64;
-
- /**
- * Indicates if this basic block ends with a JSR instruction.
- */
- static final int JSR = 128;
-
- /**
- * Indicates if this basic block ends with a RET instruction.
- */
- static final int RET = 256;
-
- /**
- * Indicates if this basic block is the start of a subroutine.
- */
- static final int SUBROUTINE = 512;
-
- /**
- * Indicates if this subroutine basic block has been visited by a
- * visitSubroutine(null, ...) call.
- */
- static final int VISITED = 1024;
-
- /**
- * Indicates if this subroutine basic block has been visited by a
- * visitSubroutine(!null, ...) call.
- */
- static final int VISITED2 = 2048;
-
- /**
- * Field used to associate user information to a label. Warning: this field
- * is used by the ASM tree package. In order to use it with the ASM tree
- * package you must override the
- * {@link scala.tools.asm.tree.MethodNode#getLabelNode} method.
- */
- public Object info;
-
- /**
- * Flags that indicate the status of this label.
- *
- * @see #DEBUG
- * @see #RESOLVED
- * @see #RESIZED
- * @see #PUSHED
- * @see #TARGET
- * @see #STORE
- * @see #REACHABLE
- * @see #JSR
- * @see #RET
- */
- int status;
-
- /**
- * The line number corresponding to this label, if known.
- */
- int line;
-
- /**
- * The position of this label in the code, if known.
- */
- int position;
-
- /**
- * Number of forward references to this label, times two.
- */
- private int referenceCount;
-
- /**
- * Informations about forward references. Each forward reference is
- * described by two consecutive integers in this array: the first one is the
- * position of the first byte of the bytecode instruction that contains the
- * forward reference, while the second is the position of the first byte of
- * the forward reference itself. In fact the sign of the first integer
- * indicates if this reference uses 2 or 4 bytes, and its absolute value
- * gives the position of the bytecode instruction. This array is also used
- * as a bitset to store the subroutines to which a basic block belongs. This
- * information is needed in {@linked MethodWriter#visitMaxs}, after all
- * forward references have been resolved. Hence the same array can be used
- * for both purposes without problems.
- */
- private int[] srcAndRefPositions;
-
- // ------------------------------------------------------------------------
-
- /*
- * Fields for the control flow and data flow graph analysis algorithms (used
- * to compute the maximum stack size or the stack map frames). A control
- * flow graph contains one node per "basic block", and one edge per "jump"
- * from one basic block to another. Each node (i.e., each basic block) is
- * represented by the Label object that corresponds to the first instruction
- * of this basic block. Each node also stores the list of its successors in
- * the graph, as a linked list of Edge objects.
- *
- * The control flow analysis algorithms used to compute the maximum stack
- * size or the stack map frames are similar and use two steps. The first
- * step, during the visit of each instruction, builds information about the
- * state of the local variables and the operand stack at the end of each
- * basic block, called the "output frame", <i>relatively</i> to the frame
- * state at the beginning of the basic block, which is called the "input
- * frame", and which is <i>unknown</i> during this step. The second step, in
- * {@link MethodWriter#visitMaxs}, is a fix point algorithm that computes
- * information about the input frame of each basic block, from the input
- * state of the first basic block (known from the method signature), and by
- * the using the previously computed relative output frames.
- *
- * The algorithm used to compute the maximum stack size only computes the
- * relative output and absolute input stack heights, while the algorithm
- * used to compute stack map frames computes relative output frames and
- * absolute input frames.
- */
-
- /**
- * Start of the output stack relatively to the input stack. The exact
- * semantics of this field depends on the algorithm that is used.
- *
- * When only the maximum stack size is computed, this field is the number of
- * elements in the input stack.
- *
- * When the stack map frames are completely computed, this field is the
- * offset of the first output stack element relatively to the top of the
- * input stack. This offset is always negative or null. A null offset means
- * that the output stack must be appended to the input stack. A -n offset
- * means that the first n output stack elements must replace the top n input
- * stack elements, and that the other elements must be appended to the input
- * stack.
- */
- int inputStackTop;
-
- /**
- * Maximum height reached by the output stack, relatively to the top of the
- * input stack. This maximum is always positive or null.
- */
- int outputStackMax;
-
- /**
- * Information about the input and output stack map frames of this basic
- * block. This field is only used when {@link ClassWriter#COMPUTE_FRAMES}
- * option is used.
- */
- Frame frame;
-
- /**
- * The successor of this label, in the order they are visited. This linked
- * list does not include labels used for debug info only. If
- * {@link ClassWriter#COMPUTE_FRAMES} option is used then, in addition, it
- * does not contain successive labels that denote the same bytecode position
- * (in this case only the first label appears in this list).
- */
- Label successor;
-
- /**
- * The successors of this node in the control flow graph. These successors
- * are stored in a linked list of {@link Edge Edge} objects, linked to each
- * other by their {@link Edge#next} field.
- */
- Edge successors;
-
- /**
- * The next basic block in the basic block stack. This stack is used in the
- * main loop of the fix point algorithm used in the second step of the
- * control flow analysis algorithms. It is also used in
- * {@link #visitSubroutine} to avoid using a recursive method.
- *
- * @see MethodWriter#visitMaxs
- */
- Label next;
-
- // ------------------------------------------------------------------------
- // Constructor
- // ------------------------------------------------------------------------
-
- /**
- * Constructs a new label.
- */
- public Label() {
- }
-
- // ------------------------------------------------------------------------
- // Methods to compute offsets and to manage forward references
- // ------------------------------------------------------------------------
-
- /**
- * Returns the offset corresponding to this label. This offset is computed
- * from the start of the method's bytecode. <i>This method is intended for
- * {@link Attribute} sub classes, and is normally not needed by class
- * generators or adapters.</i>
- *
- * @return the offset corresponding to this label.
- * @throws IllegalStateException
- * if this label is not resolved yet.
- */
- public int getOffset() {
- if ((status & RESOLVED) == 0) {
- throw new IllegalStateException(
- "Label offset position has not been resolved yet");
- }
- return position;
- }
-
- /**
- * Puts a reference to this label in the bytecode of a method. If the
- * position of the label is known, the offset is computed and written
- * directly. Otherwise, a null offset is written and a new forward reference
- * is declared for this label.
- *
- * @param owner
- * the code writer that calls this method.
- * @param out
- * the bytecode of the method.
- * @param source
- * the position of first byte of the bytecode instruction that
- * contains this label.
- * @param wideOffset
- * <tt>true</tt> if the reference must be stored in 4 bytes, or
- * <tt>false</tt> if it must be stored with 2 bytes.
- * @throws IllegalArgumentException
- * if this label has not been created by the given code writer.
- */
- void put(final MethodWriter owner, final ByteVector out, final int source,
- final boolean wideOffset) {
- if ((status & RESOLVED) == 0) {
- if (wideOffset) {
- addReference(-1 - source, out.length);
- out.putInt(-1);
- } else {
- addReference(source, out.length);
- out.putShort(-1);
- }
- } else {
- if (wideOffset) {
- out.putInt(position - source);
- } else {
- out.putShort(position - source);
- }
- }
- }
-
- /**
- * Adds a forward reference to this label. This method must be called only
- * for a true forward reference, i.e. only if this label is not resolved
- * yet. For backward references, the offset of the reference can be, and
- * must be, computed and stored directly.
- *
- * @param sourcePosition
- * the position of the referencing instruction. This position
- * will be used to compute the offset of this forward reference.
- * @param referencePosition
- * the position where the offset for this forward reference must
- * be stored.
- */
- private void addReference(final int sourcePosition,
- final int referencePosition) {
- if (srcAndRefPositions == null) {
- srcAndRefPositions = new int[6];
- }
- if (referenceCount >= srcAndRefPositions.length) {
- int[] a = new int[srcAndRefPositions.length + 6];
- System.arraycopy(srcAndRefPositions, 0, a, 0,
- srcAndRefPositions.length);
- srcAndRefPositions = a;
- }
- srcAndRefPositions[referenceCount++] = sourcePosition;
- srcAndRefPositions[referenceCount++] = referencePosition;
- }
-
- /**
- * Resolves all forward references to this label. This method must be called
- * when this label is added to the bytecode of the method, i.e. when its
- * position becomes known. This method fills in the blanks that where left
- * in the bytecode by each forward reference previously added to this label.
- *
- * @param owner
- * the code writer that calls this method.
- * @param position
- * the position of this label in the bytecode.
- * @param data
- * the bytecode of the method.
- * @return <tt>true</tt> if a blank that was left for this label was to
- * small to store the offset. In such a case the corresponding jump
- * instruction is replaced with a pseudo instruction (using unused
- * opcodes) using an unsigned two bytes offset. These pseudo
- * instructions will need to be replaced with true instructions with
- * wider offsets (4 bytes instead of 2). This is done in
- * {@link MethodWriter#resizeInstructions}.
- * @throws IllegalArgumentException
- * if this label has already been resolved, or if it has not
- * been created by the given code writer.
- */
- boolean resolve(final MethodWriter owner, final int position,
- final byte[] data) {
- boolean needUpdate = false;
- this.status |= RESOLVED;
- this.position = position;
- int i = 0;
- while (i < referenceCount) {
- int source = srcAndRefPositions[i++];
- int reference = srcAndRefPositions[i++];
- int offset;
- if (source >= 0) {
- offset = position - source;
- if (offset < Short.MIN_VALUE || offset > Short.MAX_VALUE) {
- /*
- * changes the opcode of the jump instruction, in order to
- * be able to find it later (see resizeInstructions in
- * MethodWriter). These temporary opcodes are similar to
- * jump instruction opcodes, except that the 2 bytes offset
- * is unsigned (and can therefore represent values from 0 to
- * 65535, which is sufficient since the size of a method is
- * limited to 65535 bytes).
- */
- int opcode = data[reference - 1] & 0xFF;
- if (opcode <= Opcodes.JSR) {
- // changes IFEQ ... JSR to opcodes 202 to 217
- data[reference - 1] = (byte) (opcode + 49);
- } else {
- // changes IFNULL and IFNONNULL to opcodes 218 and 219
- data[reference - 1] = (byte) (opcode + 20);
- }
- needUpdate = true;
- }
- data[reference++] = (byte) (offset >>> 8);
- data[reference] = (byte) offset;
- } else {
- offset = position + source + 1;
- data[reference++] = (byte) (offset >>> 24);
- data[reference++] = (byte) (offset >>> 16);
- data[reference++] = (byte) (offset >>> 8);
- data[reference] = (byte) offset;
- }
- }
- return needUpdate;
- }
-
- /**
- * Returns the first label of the series to which this label belongs. For an
- * isolated label or for the first label in a series of successive labels,
- * this method returns the label itself. For other labels it returns the
- * first label of the series.
- *
- * @return the first label of the series to which this label belongs.
- */
- Label getFirst() {
- return !ClassReader.FRAMES || frame == null ? this : frame.owner;
- }
-
- // ------------------------------------------------------------------------
- // Methods related to subroutines
- // ------------------------------------------------------------------------
-
- /**
- * Returns true is this basic block belongs to the given subroutine.
- *
- * @param id
- * a subroutine id.
- * @return true is this basic block belongs to the given subroutine.
- */
- boolean inSubroutine(final long id) {
- if ((status & Label.VISITED) != 0) {
- return (srcAndRefPositions[(int) (id >>> 32)] & (int) id) != 0;
- }
- return false;
- }
-
- /**
- * Returns true if this basic block and the given one belong to a common
- * subroutine.
- *
- * @param block
- * another basic block.
- * @return true if this basic block and the given one belong to a common
- * subroutine.
- */
- boolean inSameSubroutine(final Label block) {
- if ((status & VISITED) == 0 || (block.status & VISITED) == 0) {
- return false;
- }
- for (int i = 0; i < srcAndRefPositions.length; ++i) {
- if ((srcAndRefPositions[i] & block.srcAndRefPositions[i]) != 0) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Marks this basic block as belonging to the given subroutine.
- *
- * @param id
- * a subroutine id.
- * @param nbSubroutines
- * the total number of subroutines in the method.
- */
- void addToSubroutine(final long id, final int nbSubroutines) {
- if ((status & VISITED) == 0) {
- status |= VISITED;
- srcAndRefPositions = new int[nbSubroutines / 32 + 1];
- }
- srcAndRefPositions[(int) (id >>> 32)] |= (int) id;
- }
-
- /**
- * Finds the basic blocks that belong to a given subroutine, and marks these
- * blocks as belonging to this subroutine. This method follows the control
- * flow graph to find all the blocks that are reachable from the current
- * block WITHOUT following any JSR target.
- *
- * @param JSR
- * a JSR block that jumps to this subroutine. If this JSR is not
- * null it is added to the successor of the RET blocks found in
- * the subroutine.
- * @param id
- * the id of this subroutine.
- * @param nbSubroutines
- * the total number of subroutines in the method.
- */
- void visitSubroutine(final Label JSR, final long id, final int nbSubroutines) {
- // user managed stack of labels, to avoid using a recursive method
- // (recursivity can lead to stack overflow with very large methods)
- Label stack = this;
- while (stack != null) {
- // removes a label l from the stack
- Label l = stack;
- stack = l.next;
- l.next = null;
-
- if (JSR != null) {
- if ((l.status & VISITED2) != 0) {
- continue;
- }
- l.status |= VISITED2;
- // adds JSR to the successors of l, if it is a RET block
- if ((l.status & RET) != 0) {
- if (!l.inSameSubroutine(JSR)) {
- Edge e = new Edge();
- e.info = l.inputStackTop;
- e.successor = JSR.successors.successor;
- e.next = l.successors;
- l.successors = e;
- }
- }
- } else {
- // if the l block already belongs to subroutine 'id', continue
- if (l.inSubroutine(id)) {
- continue;
- }
- // marks the l block as belonging to subroutine 'id'
- l.addToSubroutine(id, nbSubroutines);
- }
- // pushes each successor of l on the stack, except JSR targets
- Edge e = l.successors;
- while (e != null) {
- // if the l block is a JSR block, then 'l.successors.next' leads
- // to the JSR target (see {@link #visitJumpInsn}) and must
- // therefore not be followed
- if ((l.status & Label.JSR) == 0 || e != l.successors.next) {
- // pushes e.successor on the stack if it not already added
- if (e.successor.next == null) {
- e.successor.next = stack;
- stack = e.successor;
- }
- }
- e = e.next;
- }
- }
- }
-
- // ------------------------------------------------------------------------
- // Overridden Object methods
- // ------------------------------------------------------------------------
-
- /**
- * Returns a string representation of this label.
- *
- * @return a string representation of this label.
- */
- @Override
- public String toString() {
- return "L" + System.identityHashCode(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/MethodVisitor.java b/src/asm/scala/tools/asm/MethodVisitor.java
deleted file mode 100644
index bddc325020..0000000000
--- a/src/asm/scala/tools/asm/MethodVisitor.java
+++ /dev/null
@@ -1,880 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A visitor to visit a Java method. The methods of this class must be called in
- * the following order: ( <tt>visitParameter</tt> )* [
- * <tt>visitAnnotationDefault</tt> ] ( <tt>visitAnnotation</tt> |
- * <tt>visitTypeAnnotation</tt> | <tt>visitAttribute</tt> )* [
- * <tt>visitCode</tt> ( <tt>visitFrame</tt> | <tt>visit<i>X</i>Insn</tt> |
- * <tt>visitLabel</tt> | <tt>visitInsnAnnotation</tt> |
- * <tt>visitTryCatchBlock</tt> | <tt>visitTryCatchBlockAnnotation</tt> |
- * <tt>visitLocalVariable</tt> | <tt>visitLocalVariableAnnotation</tt> |
- * <tt>visitLineNumber</tt> )* <tt>visitMaxs</tt> ] <tt>visitEnd</tt>. In
- * addition, the <tt>visit<i>X</i>Insn</tt> and <tt>visitLabel</tt> methods must
- * be called in the sequential order of the bytecode instructions of the visited
- * code, <tt>visitInsnAnnotation</tt> must be called <i>after</i> the annotated
- * instruction, <tt>visitTryCatchBlock</tt> must be called <i>before</i> the
- * labels passed as arguments have been visited,
- * <tt>visitTryCatchBlockAnnotation</tt> must be called <i>after</i> the
- * corresponding try catch block has been visited, and the
- * <tt>visitLocalVariable</tt>, <tt>visitLocalVariableAnnotation</tt> and
- * <tt>visitLineNumber</tt> methods must be called <i>after</i> the labels
- * passed as arguments have been visited.
- *
- * @author Eric Bruneton
- */
-public abstract class MethodVisitor {
-
- /**
- * The ASM API version implemented by this visitor. The value of this field
- * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- protected final int api;
-
- /**
- * The method visitor to which this visitor must delegate method calls. May
- * be null.
- */
- protected MethodVisitor mv;
-
- /**
- * Constructs a new {@link MethodVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- public MethodVisitor(final int api) {
- this(api, null);
- }
-
- /**
- * Constructs a new {@link MethodVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param mv
- * the method visitor to which this visitor must delegate method
- * calls. May be null.
- */
- public MethodVisitor(final int api, final MethodVisitor mv) {
- if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
- throw new IllegalArgumentException();
- }
- this.api = api;
- this.mv = mv;
- }
-
- // -------------------------------------------------------------------------
- // Parameters, annotations and non standard attributes
- // -------------------------------------------------------------------------
-
- /**
- * Visits a parameter of this method.
- *
- * @param name
- * parameter name or null if none is provided.
- * @param access
- * the parameter's access flags, only <tt>ACC_FINAL</tt>,
- * <tt>ACC_SYNTHETIC</tt> or/and <tt>ACC_MANDATED</tt> are
- * allowed (see {@link Opcodes}).
- */
- public void visitParameter(String name, int access) {
- if (api < Opcodes.ASM5) {
- throw new RuntimeException();
- }
- if (mv != null) {
- mv.visitParameter(name, access);
- }
- }
-
- /**
- * Visits the default value of this annotation interface method.
- *
- * @return a visitor to the visit the actual default value of this
- * annotation interface method, or <tt>null</tt> if this visitor is
- * not interested in visiting this default value. The 'name'
- * parameters passed to the methods of this annotation visitor are
- * ignored. Moreover, exacly one visit method must be called on this
- * annotation visitor, followed by visitEnd.
- */
- public AnnotationVisitor visitAnnotationDefault() {
- if (mv != null) {
- return mv.visitAnnotationDefault();
- }
- return null;
- }
-
- /**
- * Visits an annotation of this method.
- *
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- if (mv != null) {
- return mv.visitAnnotation(desc, visible);
- }
- return null;
- }
-
- /**
- * Visits an annotation on a type in the method signature.
- *
- * @param typeRef
- * a reference to the annotated type. The sort of this type
- * reference must be {@link TypeReference#METHOD_TYPE_PARAMETER
- * METHOD_TYPE_PARAMETER},
- * {@link TypeReference#METHOD_TYPE_PARAMETER_BOUND
- * METHOD_TYPE_PARAMETER_BOUND},
- * {@link TypeReference#METHOD_RETURN METHOD_RETURN},
- * {@link TypeReference#METHOD_RECEIVER METHOD_RECEIVER},
- * {@link TypeReference#METHOD_FORMAL_PARAMETER
- * METHOD_FORMAL_PARAMETER} or {@link TypeReference#THROWS
- * THROWS}. See {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- if (api < Opcodes.ASM5) {
- throw new RuntimeException();
- }
- if (mv != null) {
- return mv.visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
- return null;
- }
-
- /**
- * Visits an annotation of a parameter this method.
- *
- * @param parameter
- * the parameter index.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitParameterAnnotation(int parameter,
- String desc, boolean visible) {
- if (mv != null) {
- return mv.visitParameterAnnotation(parameter, desc, visible);
- }
- return null;
- }
-
- /**
- * Visits a non standard attribute of this method.
- *
- * @param attr
- * an attribute.
- */
- public void visitAttribute(Attribute attr) {
- if (mv != null) {
- mv.visitAttribute(attr);
- }
- }
-
- /**
- * Starts the visit of the method's code, if any (i.e. non abstract method).
- */
- public void visitCode() {
- if (mv != null) {
- mv.visitCode();
- }
- }
-
- /**
- * Visits the current state of the local variables and operand stack
- * elements. This method must(*) be called <i>just before</i> any
- * instruction <b>i</b> that follows an unconditional branch instruction
- * such as GOTO or THROW, that is the target of a jump instruction, or that
- * starts an exception handler block. The visited types must describe the
- * values of the local variables and of the operand stack elements <i>just
- * before</i> <b>i</b> is executed.<br>
- * <br>
- * (*) this is mandatory only for classes whose version is greater than or
- * equal to {@link Opcodes#V1_6 V1_6}. <br>
- * <br>
- * The frames of a method must be given either in expanded form, or in
- * compressed form (all frames must use the same format, i.e. you must not
- * mix expanded and compressed frames within a single method):
- * <ul>
- * <li>In expanded form, all frames must have the F_NEW type.</li>
- * <li>In compressed form, frames are basically "deltas" from the state of
- * the previous frame:
- * <ul>
- * <li>{@link Opcodes#F_SAME} representing frame with exactly the same
- * locals as the previous frame and with the empty stack.</li>
- * <li>{@link Opcodes#F_SAME1} representing frame with exactly the same
- * locals as the previous frame and with single value on the stack (
- * <code>nStack</code> is 1 and <code>stack[0]</code> contains value for the
- * type of the stack item).</li>
- * <li>{@link Opcodes#F_APPEND} representing frame with current locals are
- * the same as the locals in the previous frame, except that additional
- * locals are defined (<code>nLocal</code> is 1, 2 or 3 and
- * <code>local</code> elements contains values representing added types).</li>
- * <li>{@link Opcodes#F_CHOP} representing frame with current locals are the
- * same as the locals in the previous frame, except that the last 1-3 locals
- * are absent and with the empty stack (<code>nLocals</code> is 1, 2 or 3).</li>
- * <li>{@link Opcodes#F_FULL} representing complete frame data.</li>
- * </ul>
- * </li>
- * </ul>
- * <br>
- * In both cases the first frame, corresponding to the method's parameters
- * and access flags, is implicit and must not be visited. Also, it is
- * illegal to visit two or more frames for the same code location (i.e., at
- * least one instruction must be visited between two calls to visitFrame).
- *
- * @param type
- * the type of this stack map frame. Must be
- * {@link Opcodes#F_NEW} for expanded frames, or
- * {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND},
- * {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or
- * {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for
- * compressed frames.
- * @param nLocal
- * the number of local variables in the visited frame.
- * @param local
- * the local variable types in this frame. This array must not be
- * modified. Primitive types are represented by
- * {@link Opcodes#TOP}, {@link Opcodes#INTEGER},
- * {@link Opcodes#FLOAT}, {@link Opcodes#LONG},
- * {@link Opcodes#DOUBLE},{@link Opcodes#NULL} or
- * {@link Opcodes#UNINITIALIZED_THIS} (long and double are
- * represented by a single element). Reference types are
- * represented by String objects (representing internal names),
- * and uninitialized types by Label objects (this label
- * designates the NEW instruction that created this uninitialized
- * value).
- * @param nStack
- * the number of operand stack elements in the visited frame.
- * @param stack
- * the operand stack types in this frame. This array must not be
- * modified. Its content has the same format as the "local"
- * array.
- * @throws IllegalStateException
- * if a frame is visited just after another one, without any
- * instruction between the two (unless this frame is a
- * Opcodes#F_SAME frame, in which case it is silently ignored).
- */
- public void visitFrame(int type, int nLocal, Object[] local, int nStack,
- Object[] stack) {
- if (mv != null) {
- mv.visitFrame(type, nLocal, local, nStack, stack);
- }
- }
-
- // -------------------------------------------------------------------------
- // Normal instructions
- // -------------------------------------------------------------------------
-
- /**
- * Visits a zero operand instruction.
- *
- * @param opcode
- * the opcode of the instruction to be visited. This opcode is
- * either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1,
- * ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1,
- * FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD,
- * LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD,
- * IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE,
- * SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
- * DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB,
- * IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM,
- * FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR,
- * IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
- * L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
- * LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
- * DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER,
- * or MONITOREXIT.
- */
- public void visitInsn(int opcode) {
- if (mv != null) {
- mv.visitInsn(opcode);
- }
- }
-
- /**
- * Visits an instruction with a single int operand.
- *
- * @param opcode
- * the opcode of the instruction to be visited. This opcode is
- * either BIPUSH, SIPUSH or NEWARRAY.
- * @param operand
- * the operand of the instruction to be visited.<br>
- * When opcode is BIPUSH, operand value should be between
- * Byte.MIN_VALUE and Byte.MAX_VALUE.<br>
- * When opcode is SIPUSH, operand value should be between
- * Short.MIN_VALUE and Short.MAX_VALUE.<br>
- * When opcode is NEWARRAY, operand value should be one of
- * {@link Opcodes#T_BOOLEAN}, {@link Opcodes#T_CHAR},
- * {@link Opcodes#T_FLOAT}, {@link Opcodes#T_DOUBLE},
- * {@link Opcodes#T_BYTE}, {@link Opcodes#T_SHORT},
- * {@link Opcodes#T_INT} or {@link Opcodes#T_LONG}.
- */
- public void visitIntInsn(int opcode, int operand) {
- if (mv != null) {
- mv.visitIntInsn(opcode, operand);
- }
- }
-
- /**
- * Visits a local variable instruction. A local variable instruction is an
- * instruction that loads or stores the value of a local variable.
- *
- * @param opcode
- * the opcode of the local variable instruction to be visited.
- * This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD,
- * ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
- * @param var
- * the operand of the instruction to be visited. This operand is
- * the index of a local variable.
- */
- public void visitVarInsn(int opcode, int var) {
- if (mv != null) {
- mv.visitVarInsn(opcode, var);
- }
- }
-
- /**
- * Visits a type instruction. A type instruction is an instruction that
- * takes the internal name of a class as parameter.
- *
- * @param opcode
- * the opcode of the type instruction to be visited. This opcode
- * is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
- * @param type
- * the operand of the instruction to be visited. This operand
- * must be the internal name of an object or array class (see
- * {@link Type#getInternalName() getInternalName}).
- */
- public void visitTypeInsn(int opcode, String type) {
- if (mv != null) {
- mv.visitTypeInsn(opcode, type);
- }
- }
-
- /**
- * Visits a field instruction. A field instruction is an instruction that
- * loads or stores the value of a field of an object.
- *
- * @param opcode
- * the opcode of the type instruction to be visited. This opcode
- * is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
- * @param owner
- * the internal name of the field's owner class (see
- * {@link Type#getInternalName() getInternalName}).
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor (see {@link Type Type}).
- */
- public void visitFieldInsn(int opcode, String owner, String name,
- String desc) {
- if (mv != null) {
- mv.visitFieldInsn(opcode, owner, name, desc);
- }
- }
-
- /**
- * Visits a method instruction. A method instruction is an instruction that
- * invokes a method.
- *
- * @param opcode
- * the opcode of the type instruction to be visited. This opcode
- * is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
- * INVOKEINTERFACE.
- * @param owner
- * the internal name of the method's owner class (see
- * {@link Type#getInternalName() getInternalName}).
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link Type Type}).
- */
- @Deprecated
- public void visitMethodInsn(int opcode, String owner, String name,
- String desc) {
- if (api >= Opcodes.ASM5) {
- boolean itf = opcode == Opcodes.INVOKEINTERFACE;
- visitMethodInsn(opcode, owner, name, desc, itf);
- return;
- }
- if (mv != null) {
- mv.visitMethodInsn(opcode, owner, name, desc);
- }
- }
-
- /**
- * Visits a method instruction. A method instruction is an instruction that
- * invokes a method.
- *
- * @param opcode
- * the opcode of the type instruction to be visited. This opcode
- * is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
- * INVOKEINTERFACE.
- * @param owner
- * the internal name of the method's owner class (see
- * {@link Type#getInternalName() getInternalName}).
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link Type Type}).
- * @param itf
- * if the method's owner class is an interface.
- */
- public void visitMethodInsn(int opcode, String owner, String name,
- String desc, boolean itf) {
- if (api < Opcodes.ASM5) {
- if (itf != (opcode == Opcodes.INVOKEINTERFACE)) {
- throw new IllegalArgumentException(
- "INVOKESPECIAL/STATIC on interfaces require ASM 5");
- }
- visitMethodInsn(opcode, owner, name, desc);
- return;
- }
- if (mv != null) {
- mv.visitMethodInsn(opcode, owner, name, desc, itf);
- }
- }
-
- /**
- * Visits an invokedynamic instruction.
- *
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link Type Type}).
- * @param bsm
- * the bootstrap method.
- * @param bsmArgs
- * the bootstrap method constant arguments. Each argument must be
- * an {@link Integer}, {@link Float}, {@link Long},
- * {@link Double}, {@link String}, {@link Type} or {@link Handle}
- * value. This method is allowed to modify the content of the
- * array so a caller should expect that this array may change.
- */
- public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
- Object... bsmArgs) {
- if (mv != null) {
- mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
- }
- }
-
- /**
- * Visits a jump instruction. A jump instruction is an instruction that may
- * jump to another instruction.
- *
- * @param opcode
- * the opcode of the type instruction to be visited. This opcode
- * is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ,
- * IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
- * IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
- * @param label
- * the operand of the instruction to be visited. This operand is
- * a label that designates the instruction to which the jump
- * instruction may jump.
- */
- public void visitJumpInsn(int opcode, Label label) {
- if (mv != null) {
- mv.visitJumpInsn(opcode, label);
- }
- }
-
- /**
- * Visits a label. A label designates the instruction that will be visited
- * just after it.
- *
- * @param label
- * a {@link Label Label} object.
- */
- public void visitLabel(Label label) {
- if (mv != null) {
- mv.visitLabel(label);
- }
- }
-
- // -------------------------------------------------------------------------
- // Special instructions
- // -------------------------------------------------------------------------
-
- /**
- * Visits a LDC instruction. Note that new constant types may be added in
- * future versions of the Java Virtual Machine. To easily detect new
- * constant types, implementations of this method should check for
- * unexpected constant types, like this:
- *
- * <pre>
- * if (cst instanceof Integer) {
- * // ...
- * } else if (cst instanceof Float) {
- * // ...
- * } else if (cst instanceof Long) {
- * // ...
- * } else if (cst instanceof Double) {
- * // ...
- * } else if (cst instanceof String) {
- * // ...
- * } else if (cst instanceof Type) {
- * int sort = ((Type) cst).getSort();
- * if (sort == Type.OBJECT) {
- * // ...
- * } else if (sort == Type.ARRAY) {
- * // ...
- * } else if (sort == Type.METHOD) {
- * // ...
- * } else {
- * // throw an exception
- * }
- * } else if (cst instanceof Handle) {
- * // ...
- * } else {
- * // throw an exception
- * }
- * </pre>
- *
- * @param cst
- * the constant to be loaded on the stack. This parameter must be
- * a non null {@link Integer}, a {@link Float}, a {@link Long}, a
- * {@link Double}, a {@link String}, a {@link Type} of OBJECT or
- * ARRAY sort for <tt>.class</tt> constants, for classes whose
- * version is 49.0, a {@link Type} of METHOD sort or a
- * {@link Handle} for MethodType and MethodHandle constants, for
- * classes whose version is 51.0.
- */
- public void visitLdcInsn(Object cst) {
- if (mv != null) {
- mv.visitLdcInsn(cst);
- }
- }
-
- /**
- * Visits an IINC instruction.
- *
- * @param var
- * index of the local variable to be incremented.
- * @param increment
- * amount to increment the local variable by.
- */
- public void visitIincInsn(int var, int increment) {
- if (mv != null) {
- mv.visitIincInsn(var, increment);
- }
- }
-
- /**
- * Visits a TABLESWITCH instruction.
- *
- * @param min
- * the minimum key value.
- * @param max
- * the maximum key value.
- * @param dflt
- * beginning of the default handler block.
- * @param labels
- * beginnings of the handler blocks. <tt>labels[i]</tt> is the
- * beginning of the handler block for the <tt>min + i</tt> key.
- */
- public void visitTableSwitchInsn(int min, int max, Label dflt,
- Label... labels) {
- if (mv != null) {
- mv.visitTableSwitchInsn(min, max, dflt, labels);
- }
- }
-
- /**
- * Visits a LOOKUPSWITCH instruction.
- *
- * @param dflt
- * beginning of the default handler block.
- * @param keys
- * the values of the keys.
- * @param labels
- * beginnings of the handler blocks. <tt>labels[i]</tt> is the
- * beginning of the handler block for the <tt>keys[i]</tt> key.
- */
- public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
- if (mv != null) {
- mv.visitLookupSwitchInsn(dflt, keys, labels);
- }
- }
-
- /**
- * Visits a MULTIANEWARRAY instruction.
- *
- * @param desc
- * an array type descriptor (see {@link Type Type}).
- * @param dims
- * number of dimensions of the array to allocate.
- */
- public void visitMultiANewArrayInsn(String desc, int dims) {
- if (mv != null) {
- mv.visitMultiANewArrayInsn(desc, dims);
- }
- }
-
- /**
- * Visits an annotation on an instruction. This method must be called just
- * <i>after</i> the annotated instruction. It can be called several times
- * for the same instruction.
- *
- * @param typeRef
- * a reference to the annotated type. The sort of this type
- * reference must be {@link TypeReference#INSTANCEOF INSTANCEOF},
- * {@link TypeReference#NEW NEW},
- * {@link TypeReference#CONSTRUCTOR_REFERENCE
- * CONSTRUCTOR_REFERENCE}, {@link TypeReference#METHOD_REFERENCE
- * METHOD_REFERENCE}, {@link TypeReference#CAST CAST},
- * {@link TypeReference#CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
- * CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
- * {@link TypeReference#METHOD_INVOCATION_TYPE_ARGUMENT
- * METHOD_INVOCATION_TYPE_ARGUMENT},
- * {@link TypeReference#CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
- * CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
- * {@link TypeReference#METHOD_REFERENCE_TYPE_ARGUMENT
- * METHOD_REFERENCE_TYPE_ARGUMENT}. See {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitInsnAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- if (api < Opcodes.ASM5) {
- throw new RuntimeException();
- }
- if (mv != null) {
- return mv.visitInsnAnnotation(typeRef, typePath, desc, visible);
- }
- return null;
- }
-
- // -------------------------------------------------------------------------
- // Exceptions table entries, debug information, max stack and max locals
- // -------------------------------------------------------------------------
-
- /**
- * Visits a try catch block.
- *
- * @param start
- * beginning of the exception handler's scope (inclusive).
- * @param end
- * end of the exception handler's scope (exclusive).
- * @param handler
- * beginning of the exception handler's code.
- * @param type
- * internal name of the type of exceptions handled by the
- * handler, or <tt>null</tt> to catch any exceptions (for
- * "finally" blocks).
- * @throws IllegalArgumentException
- * if one of the labels has already been visited by this visitor
- * (by the {@link #visitLabel visitLabel} method).
- */
- public void visitTryCatchBlock(Label start, Label end, Label handler,
- String type) {
- if (mv != null) {
- mv.visitTryCatchBlock(start, end, handler, type);
- }
- }
-
- /**
- * Visits an annotation on an exception handler type. This method must be
- * called <i>after</i> the {@link #visitTryCatchBlock} for the annotated
- * exception handler. It can be called several times for the same exception
- * handler.
- *
- * @param typeRef
- * a reference to the annotated type. The sort of this type
- * reference must be {@link TypeReference#EXCEPTION_PARAMETER
- * EXCEPTION_PARAMETER}. See {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitTryCatchAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- if (api < Opcodes.ASM5) {
- throw new RuntimeException();
- }
- if (mv != null) {
- return mv.visitTryCatchAnnotation(typeRef, typePath, desc, visible);
- }
- return null;
- }
-
- /**
- * Visits a local variable declaration.
- *
- * @param name
- * the name of a local variable.
- * @param desc
- * the type descriptor of this local variable.
- * @param signature
- * the type signature of this local variable. May be
- * <tt>null</tt> if the local variable type does not use generic
- * types.
- * @param start
- * the first instruction corresponding to the scope of this local
- * variable (inclusive).
- * @param end
- * the last instruction corresponding to the scope of this local
- * variable (exclusive).
- * @param index
- * the local variable's index.
- * @throws IllegalArgumentException
- * if one of the labels has not already been visited by this
- * visitor (by the {@link #visitLabel visitLabel} method).
- */
- public void visitLocalVariable(String name, String desc, String signature,
- Label start, Label end, int index) {
- if (mv != null) {
- mv.visitLocalVariable(name, desc, signature, start, end, index);
- }
- }
-
- /**
- * Visits an annotation on a local variable type.
- *
- * @param typeRef
- * a reference to the annotated type. The sort of this type
- * reference must be {@link TypeReference#LOCAL_VARIABLE
- * LOCAL_VARIABLE} or {@link TypeReference#RESOURCE_VARIABLE
- * RESOURCE_VARIABLE}. See {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param start
- * the fist instructions corresponding to the continuous ranges
- * that make the scope of this local variable (inclusive).
- * @param end
- * the last instructions corresponding to the continuous ranges
- * that make the scope of this local variable (exclusive). This
- * array must have the same size as the 'start' array.
- * @param index
- * the local variable's index in each range. This array must have
- * the same size as the 'start' array.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values, or <tt>null</tt> if
- * this visitor is not interested in visiting this annotation.
- */
- public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
- TypePath typePath, Label[] start, Label[] end, int[] index,
- String desc, boolean visible) {
- if (api < Opcodes.ASM5) {
- throw new RuntimeException();
- }
- if (mv != null) {
- return mv.visitLocalVariableAnnotation(typeRef, typePath, start,
- end, index, desc, visible);
- }
- return null;
- }
-
- /**
- * Visits a line number declaration.
- *
- * @param line
- * a line number. This number refers to the source file from
- * which the class was compiled.
- * @param start
- * the first instruction corresponding to this line number.
- * @throws IllegalArgumentException
- * if <tt>start</tt> has not already been visited by this
- * visitor (by the {@link #visitLabel visitLabel} method).
- */
- public void visitLineNumber(int line, Label start) {
- if (mv != null) {
- mv.visitLineNumber(line, start);
- }
- }
-
- /**
- * Visits the maximum stack size and the maximum number of local variables
- * of the method.
- *
- * @param maxStack
- * maximum stack size of the method.
- * @param maxLocals
- * maximum number of local variables for the method.
- */
- public void visitMaxs(int maxStack, int maxLocals) {
- if (mv != null) {
- mv.visitMaxs(maxStack, maxLocals);
- }
- }
-
- /**
- * Visits the end of the method. This method, which is the last one to be
- * called, is used to inform the visitor that all the annotations and
- * attributes of the method have been visited.
- */
- public void visitEnd() {
- if (mv != null) {
- mv.visitEnd();
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/MethodWriter.java b/src/asm/scala/tools/asm/MethodWriter.java
deleted file mode 100644
index 9c72ead61d..0000000000
--- a/src/asm/scala/tools/asm/MethodWriter.java
+++ /dev/null
@@ -1,2924 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * A {@link MethodVisitor} that generates methods in bytecode form. Each visit
- * method of this class appends the bytecode corresponding to the visited
- * instruction to a byte vector, in the order these methods are called.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public class MethodWriter extends MethodVisitor {
-
- /**
- * Pseudo access flag used to denote constructors.
- */
- static final int ACC_CONSTRUCTOR = 0x80000;
-
- /**
- * Frame has exactly the same locals as the previous stack map frame and
- * number of stack items is zero.
- */
- static final int SAME_FRAME = 0; // to 63 (0-3f)
-
- /**
- * Frame has exactly the same locals as the previous stack map frame and
- * number of stack items is 1
- */
- static final int SAME_LOCALS_1_STACK_ITEM_FRAME = 64; // to 127 (40-7f)
-
- /**
- * Reserved for future use
- */
- static final int RESERVED = 128;
-
- /**
- * Frame has exactly the same locals as the previous stack map frame and
- * number of stack items is 1. Offset is bigger then 63;
- */
- static final int SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED = 247; // f7
-
- /**
- * Frame where current locals are the same as the locals in the previous
- * frame, except that the k last locals are absent. The value of k is given
- * by the formula 251-frame_type.
- */
- static final int CHOP_FRAME = 248; // to 250 (f8-fA)
-
- /**
- * Frame has exactly the same locals as the previous stack map frame and
- * number of stack items is zero. Offset is bigger then 63;
- */
- static final int SAME_FRAME_EXTENDED = 251; // fb
-
- /**
- * Frame where current locals are the same as the locals in the previous
- * frame, except that k additional locals are defined. The value of k is
- * given by the formula frame_type-251.
- */
- static final int APPEND_FRAME = 252; // to 254 // fc-fe
-
- /**
- * Full frame
- */
- static final int FULL_FRAME = 255; // ff
-
- /**
- * Indicates that the stack map frames must be recomputed from scratch. In
- * this case the maximum stack size and number of local variables is also
- * recomputed from scratch.
- *
- * @see #compute
- */
- private static final int FRAMES = 0;
-
- /**
- * Indicates that the maximum stack size and number of local variables must
- * be automatically computed.
- *
- * @see #compute
- */
- private static final int MAXS = 1;
-
- /**
- * Indicates that nothing must be automatically computed.
- *
- * @see #compute
- */
- private static final int NOTHING = 2;
-
- /**
- * The class writer to which this method must be added.
- */
- final ClassWriter cw;
-
- /**
- * Access flags of this method.
- */
- private int access;
-
- /**
- * The index of the constant pool item that contains the name of this
- * method.
- */
- private final int name;
-
- /**
- * The index of the constant pool item that contains the descriptor of this
- * method.
- */
- private final int desc;
-
- /**
- * The descriptor of this method.
- */
- private final String descriptor;
-
- /**
- * The signature of this method.
- */
- String signature;
-
- /**
- * If not zero, indicates that the code of this method must be copied from
- * the ClassReader associated to this writer in <code>cw.cr</code>. More
- * precisely, this field gives the index of the first byte to copied from
- * <code>cw.cr.b</code>.
- */
- int classReaderOffset;
-
- /**
- * If not zero, indicates that the code of this method must be copied from
- * the ClassReader associated to this writer in <code>cw.cr</code>. More
- * precisely, this field gives the number of bytes to copied from
- * <code>cw.cr.b</code>.
- */
- int classReaderLength;
-
- /**
- * Number of exceptions that can be thrown by this method.
- */
- int exceptionCount;
-
- /**
- * The exceptions that can be thrown by this method. More precisely, this
- * array contains the indexes of the constant pool items that contain the
- * internal names of these exception classes.
- */
- int[] exceptions;
-
- /**
- * The annotation default attribute of this method. May be <tt>null</tt>.
- */
- private ByteVector annd;
-
- /**
- * The runtime visible annotations of this method. May be <tt>null</tt>.
- */
- private AnnotationWriter anns;
-
- /**
- * The runtime invisible annotations of this method. May be <tt>null</tt>.
- */
- private AnnotationWriter ianns;
-
- /**
- * The runtime visible type annotations of this method. May be <tt>null</tt>
- * .
- */
- private AnnotationWriter tanns;
-
- /**
- * The runtime invisible type annotations of this method. May be
- * <tt>null</tt>.
- */
- private AnnotationWriter itanns;
-
- /**
- * The runtime visible parameter annotations of this method. May be
- * <tt>null</tt>.
- */
- private AnnotationWriter[] panns;
-
- /**
- * The runtime invisible parameter annotations of this method. May be
- * <tt>null</tt>.
- */
- private AnnotationWriter[] ipanns;
-
- /**
- * The number of synthetic parameters of this method.
- */
- private int synthetics;
-
- /**
- * The non standard attributes of the method.
- */
- private Attribute attrs;
-
- /**
- * The bytecode of this method.
- */
- private ByteVector code = new ByteVector();
-
- /**
- * Maximum stack size of this method.
- */
- private int maxStack;
-
- public int getMaxStack() {
- return maxStack;
- }
-
- /**
- * Maximum number of local variables for this method.
- */
- private int maxLocals;
-
- public int getMaxLocals() {
- return maxLocals;
- }
-
- /**
- * Number of local variables in the current stack map frame.
- */
- private int currentLocals;
-
- /**
- * Number of stack map frames in the StackMapTable attribute.
- */
- private int frameCount;
-
- /**
- * The StackMapTable attribute.
- */
- private ByteVector stackMap;
-
- /**
- * The offset of the last frame that was written in the StackMapTable
- * attribute.
- */
- private int previousFrameOffset;
-
- /**
- * The last frame that was written in the StackMapTable attribute.
- *
- * @see #frame
- */
- private int[] previousFrame;
-
- /**
- * The current stack map frame. The first element contains the offset of the
- * instruction to which the frame corresponds, the second element is the
- * number of locals and the third one is the number of stack elements. The
- * local variables start at index 3 and are followed by the operand stack
- * values. In summary frame[0] = offset, frame[1] = nLocal, frame[2] =
- * nStack, frame[3] = nLocal. All types are encoded as integers, with the
- * same format as the one used in {@link Label}, but limited to BASE types.
- */
- private int[] frame;
-
- /**
- * Number of elements in the exception handler list.
- */
- private int handlerCount;
-
- /**
- * The first element in the exception handler list.
- */
- private Handler firstHandler;
-
- /**
- * The last element in the exception handler list.
- */
- private Handler lastHandler;
-
- /**
- * Number of entries in the MethodParameters attribute.
- */
- private int methodParametersCount;
-
- /**
- * The MethodParameters attribute.
- */
- private ByteVector methodParameters;
-
- /**
- * Number of entries in the LocalVariableTable attribute.
- */
- private int localVarCount;
-
- /**
- * The LocalVariableTable attribute.
- */
- private ByteVector localVar;
-
- /**
- * Number of entries in the LocalVariableTypeTable attribute.
- */
- private int localVarTypeCount;
-
- /**
- * The LocalVariableTypeTable attribute.
- */
- private ByteVector localVarType;
-
- /**
- * Number of entries in the LineNumberTable attribute.
- */
- private int lineNumberCount;
-
- /**
- * The LineNumberTable attribute.
- */
- private ByteVector lineNumber;
-
- /**
- * The start offset of the last visited instruction.
- */
- private int lastCodeOffset;
-
- /**
- * The runtime visible type annotations of the code. May be <tt>null</tt>.
- */
- private AnnotationWriter ctanns;
-
- /**
- * The runtime invisible type annotations of the code. May be <tt>null</tt>.
- */
- private AnnotationWriter ictanns;
-
- /**
- * The non standard attributes of the method's code.
- */
- private Attribute cattrs;
-
- /**
- * Indicates if some jump instructions are too small and need to be resized.
- */
- private boolean resize;
-
- /**
- * The number of subroutines in this method.
- */
- private int subroutines;
-
- // ------------------------------------------------------------------------
-
- /*
- * Fields for the control flow graph analysis algorithm (used to compute the
- * maximum stack size). A control flow graph contains one node per "basic
- * block", and one edge per "jump" from one basic block to another. Each
- * node (i.e., each basic block) is represented by the Label object that
- * corresponds to the first instruction of this basic block. Each node also
- * stores the list of its successors in the graph, as a linked list of Edge
- * objects.
- */
-
- /**
- * Indicates what must be automatically computed.
- *
- * @see #FRAMES
- * @see #MAXS
- * @see #NOTHING
- */
- private final int compute;
-
- /**
- * A list of labels. This list is the list of basic blocks in the method,
- * i.e. a list of Label objects linked to each other by their
- * {@link Label#successor} field, in the order they are visited by
- * {@link MethodVisitor#visitLabel}, and starting with the first basic
- * block.
- */
- private Label labels;
-
- /**
- * The previous basic block.
- */
- private Label previousBlock;
-
- /**
- * The current basic block.
- */
- private Label currentBlock;
-
- /**
- * The (relative) stack size after the last visited instruction. This size
- * is relative to the beginning of the current basic block, i.e., the true
- * stack size after the last visited instruction is equal to the
- * {@link Label#inputStackTop beginStackSize} of the current basic block
- * plus <tt>stackSize</tt>.
- */
- private int stackSize;
-
- /**
- * The (relative) maximum stack size after the last visited instruction.
- * This size is relative to the beginning of the current basic block, i.e.,
- * the true maximum stack size after the last visited instruction is equal
- * to the {@link Label#inputStackTop beginStackSize} of the current basic
- * block plus <tt>stackSize</tt>.
- */
- private int maxStackSize;
-
- // ------------------------------------------------------------------------
- // Constructor
- // ------------------------------------------------------------------------
-
- /**
- * Constructs a new {@link MethodWriter}.
- *
- * @param cw
- * the class writer in which the method must be added.
- * @param access
- * the method's access flags (see {@link Opcodes}).
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link Type}).
- * @param signature
- * the method's signature. May be <tt>null</tt>.
- * @param exceptions
- * the internal names of the method's exceptions. May be
- * <tt>null</tt>.
- * @param computeMaxs
- * <tt>true</tt> if the maximum stack size and number of local
- * variables must be automatically computed.
- * @param computeFrames
- * <tt>true</tt> if the stack map tables must be recomputed from
- * scratch.
- */
- MethodWriter(final ClassWriter cw, final int access, final String name,
- final String desc, final String signature,
- final String[] exceptions, final boolean computeMaxs,
- final boolean computeFrames) {
- super(Opcodes.ASM5);
- if (cw.firstMethod == null) {
- cw.firstMethod = this;
- } else {
- cw.lastMethod.mv = this;
- }
- cw.lastMethod = this;
- this.cw = cw;
- this.access = access;
- if ("<init>".equals(name)) {
- this.access |= ACC_CONSTRUCTOR;
- }
- this.name = cw.newUTF8(name);
- this.desc = cw.newUTF8(desc);
- this.descriptor = desc;
- if (ClassReader.SIGNATURES) {
- this.signature = signature;
- }
- if (exceptions != null && exceptions.length > 0) {
- exceptionCount = exceptions.length;
- this.exceptions = new int[exceptionCount];
- for (int i = 0; i < exceptionCount; ++i) {
- this.exceptions[i] = cw.newClass(exceptions[i]);
- }
- }
- this.compute = computeFrames ? FRAMES : (computeMaxs ? MAXS : NOTHING);
- if (computeMaxs || computeFrames) {
- // updates maxLocals
- int size = Type.getArgumentsAndReturnSizes(descriptor) >> 2;
- if ((access & Opcodes.ACC_STATIC) != 0) {
- --size;
- }
- maxLocals = size;
- currentLocals = size;
- // creates and visits the label for the first basic block
- labels = new Label();
- labels.status |= Label.PUSHED;
- visitLabel(labels);
- }
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the MethodVisitor abstract class
- // ------------------------------------------------------------------------
-
- @Override
- public void visitParameter(String name, int access) {
- if (methodParameters == null) {
- methodParameters = new ByteVector();
- }
- ++methodParametersCount;
- methodParameters.putShort((name == null) ? 0 : cw.newUTF8(name))
- .putShort(access);
- }
-
- @Override
- public AnnotationVisitor visitAnnotationDefault() {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- annd = new ByteVector();
- return new AnnotationWriter(cw, false, annd, null, 0);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- // write type, and reserve space for values count
- bv.putShort(cw.newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
- if (visible) {
- aw.next = anns;
- anns = aw;
- } else {
- aw.next = ianns;
- ianns = aw;
- }
- return aw;
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- // write target_type and target_info
- AnnotationWriter.putTarget(typeRef, typePath, bv);
- // write type, and reserve space for values count
- bv.putShort(cw.newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
- bv.length - 2);
- if (visible) {
- aw.next = tanns;
- tanns = aw;
- } else {
- aw.next = itanns;
- itanns = aw;
- }
- return aw;
- }
-
- @Override
- public AnnotationVisitor visitParameterAnnotation(final int parameter,
- final String desc, final boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- if ("Ljava/lang/Synthetic;".equals(desc)) {
- // workaround for a bug in javac with synthetic parameters
- // see ClassReader.readParameterAnnotations
- synthetics = Math.max(synthetics, parameter + 1);
- return new AnnotationWriter(cw, false, bv, null, 0);
- }
- // write type, and reserve space for values count
- bv.putShort(cw.newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
- if (visible) {
- if (panns == null) {
- panns = new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
- }
- aw.next = panns[parameter];
- panns[parameter] = aw;
- } else {
- if (ipanns == null) {
- ipanns = new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
- }
- aw.next = ipanns[parameter];
- ipanns[parameter] = aw;
- }
- return aw;
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- if (attr.isCodeAttribute()) {
- attr.next = cattrs;
- cattrs = attr;
- } else {
- attr.next = attrs;
- attrs = attr;
- }
- }
-
- @Override
- public void visitCode() {
- }
-
- @Override
- public void visitFrame(final int type, final int nLocal,
- final Object[] local, final int nStack, final Object[] stack) {
- if (!ClassReader.FRAMES || compute == FRAMES) {
- return;
- }
-
- if (type == Opcodes.F_NEW) {
- if (previousFrame == null) {
- visitImplicitFirstFrame();
- }
- currentLocals = nLocal;
- int frameIndex = startFrame(code.length, nLocal, nStack);
- for (int i = 0; i < nLocal; ++i) {
- if (local[i] instanceof String) {
- frame[frameIndex++] = Frame.OBJECT
- | cw.addType((String) local[i]);
- } else if (local[i] instanceof Integer) {
- frame[frameIndex++] = ((Integer) local[i]).intValue();
- } else {
- frame[frameIndex++] = Frame.UNINITIALIZED
- | cw.addUninitializedType("",
- ((Label) local[i]).position);
- }
- }
- for (int i = 0; i < nStack; ++i) {
- if (stack[i] instanceof String) {
- frame[frameIndex++] = Frame.OBJECT
- | cw.addType((String) stack[i]);
- } else if (stack[i] instanceof Integer) {
- frame[frameIndex++] = ((Integer) stack[i]).intValue();
- } else {
- frame[frameIndex++] = Frame.UNINITIALIZED
- | cw.addUninitializedType("",
- ((Label) stack[i]).position);
- }
- }
- endFrame();
- } else {
- int delta;
- if (stackMap == null) {
- stackMap = new ByteVector();
- delta = code.length;
- } else {
- delta = code.length - previousFrameOffset - 1;
- if (delta < 0) {
- if (type == Opcodes.F_SAME) {
- return;
- } else {
- throw new IllegalStateException();
- }
- }
- }
-
- switch (type) {
- case Opcodes.F_FULL:
- currentLocals = nLocal;
- stackMap.putByte(FULL_FRAME).putShort(delta).putShort(nLocal);
- for (int i = 0; i < nLocal; ++i) {
- writeFrameType(local[i]);
- }
- stackMap.putShort(nStack);
- for (int i = 0; i < nStack; ++i) {
- writeFrameType(stack[i]);
- }
- break;
- case Opcodes.F_APPEND:
- currentLocals += nLocal;
- stackMap.putByte(SAME_FRAME_EXTENDED + nLocal).putShort(delta);
- for (int i = 0; i < nLocal; ++i) {
- writeFrameType(local[i]);
- }
- break;
- case Opcodes.F_CHOP:
- currentLocals -= nLocal;
- stackMap.putByte(SAME_FRAME_EXTENDED - nLocal).putShort(delta);
- break;
- case Opcodes.F_SAME:
- if (delta < 64) {
- stackMap.putByte(delta);
- } else {
- stackMap.putByte(SAME_FRAME_EXTENDED).putShort(delta);
- }
- break;
- case Opcodes.F_SAME1:
- if (delta < 64) {
- stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME + delta);
- } else {
- stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED)
- .putShort(delta);
- }
- writeFrameType(stack[0]);
- break;
- }
-
- previousFrameOffset = code.length;
- ++frameCount;
- }
-
- maxStack = Math.max(maxStack, nStack);
- maxLocals = Math.max(maxLocals, currentLocals);
- }
-
- @Override
- public void visitInsn(final int opcode) {
- lastCodeOffset = code.length;
- // adds the instruction to the bytecode of the method
- code.putByte(opcode);
- // update currentBlock
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(opcode, 0, null, null);
- } else {
- // updates current and max stack sizes
- int size = stackSize + Frame.SIZE[opcode];
- if (size > maxStackSize) {
- maxStackSize = size;
- }
- stackSize = size;
- }
- // if opcode == ATHROW or xRETURN, ends current block (no successor)
- if ((opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN)
- || opcode == Opcodes.ATHROW) {
- noSuccessor();
- }
- }
- }
-
- @Override
- public void visitIntInsn(final int opcode, final int operand) {
- lastCodeOffset = code.length;
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(opcode, operand, null, null);
- } else if (opcode != Opcodes.NEWARRAY) {
- // updates current and max stack sizes only for NEWARRAY
- // (stack size variation = 0 for BIPUSH or SIPUSH)
- int size = stackSize + 1;
- if (size > maxStackSize) {
- maxStackSize = size;
- }
- stackSize = size;
- }
- }
- // adds the instruction to the bytecode of the method
- if (opcode == Opcodes.SIPUSH) {
- code.put12(opcode, operand);
- } else { // BIPUSH or NEWARRAY
- code.put11(opcode, operand);
- }
- }
-
- @Override
- public void visitVarInsn(final int opcode, final int var) {
- lastCodeOffset = code.length;
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(opcode, var, null, null);
- } else {
- // updates current and max stack sizes
- if (opcode == Opcodes.RET) {
- // no stack change, but end of current block (no successor)
- currentBlock.status |= Label.RET;
- // save 'stackSize' here for future use
- // (see {@link #findSubroutineSuccessors})
- currentBlock.inputStackTop = stackSize;
- noSuccessor();
- } else { // xLOAD or xSTORE
- int size = stackSize + Frame.SIZE[opcode];
- if (size > maxStackSize) {
- maxStackSize = size;
- }
- stackSize = size;
- }
- }
- }
- if (compute != NOTHING) {
- // updates max locals
- int n;
- if (opcode == Opcodes.LLOAD || opcode == Opcodes.DLOAD
- || opcode == Opcodes.LSTORE || opcode == Opcodes.DSTORE) {
- n = var + 2;
- } else {
- n = var + 1;
- }
- if (n > maxLocals) {
- maxLocals = n;
- }
- }
- // adds the instruction to the bytecode of the method
- if (var < 4 && opcode != Opcodes.RET) {
- int opt;
- if (opcode < Opcodes.ISTORE) {
- /* ILOAD_0 */
- opt = 26 + ((opcode - Opcodes.ILOAD) << 2) + var;
- } else {
- /* ISTORE_0 */
- opt = 59 + ((opcode - Opcodes.ISTORE) << 2) + var;
- }
- code.putByte(opt);
- } else if (var >= 256) {
- code.putByte(196 /* WIDE */).put12(opcode, var);
- } else {
- code.put11(opcode, var);
- }
- if (opcode >= Opcodes.ISTORE && compute == FRAMES && handlerCount > 0) {
- visitLabel(new Label());
- }
- }
-
- @Override
- public void visitTypeInsn(final int opcode, final String type) {
- lastCodeOffset = code.length;
- Item i = cw.newClassItem(type);
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(opcode, code.length, cw, i);
- } else if (opcode == Opcodes.NEW) {
- // updates current and max stack sizes only if opcode == NEW
- // (no stack change for ANEWARRAY, CHECKCAST, INSTANCEOF)
- int size = stackSize + 1;
- if (size > maxStackSize) {
- maxStackSize = size;
- }
- stackSize = size;
- }
- }
- // adds the instruction to the bytecode of the method
- code.put12(opcode, i.index);
- }
-
- @Override
- public void visitFieldInsn(final int opcode, final String owner,
- final String name, final String desc) {
- lastCodeOffset = code.length;
- Item i = cw.newFieldItem(owner, name, desc);
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(opcode, 0, cw, i);
- } else {
- int size;
- // computes the stack size variation
- char c = desc.charAt(0);
- switch (opcode) {
- case Opcodes.GETSTATIC:
- size = stackSize + (c == 'D' || c == 'J' ? 2 : 1);
- break;
- case Opcodes.PUTSTATIC:
- size = stackSize + (c == 'D' || c == 'J' ? -2 : -1);
- break;
- case Opcodes.GETFIELD:
- size = stackSize + (c == 'D' || c == 'J' ? 1 : 0);
- break;
- // case Constants.PUTFIELD:
- default:
- size = stackSize + (c == 'D' || c == 'J' ? -3 : -2);
- break;
- }
- // updates current and max stack sizes
- if (size > maxStackSize) {
- maxStackSize = size;
- }
- stackSize = size;
- }
- }
- // adds the instruction to the bytecode of the method
- code.put12(opcode, i.index);
- }
-
- @Override
- public void visitMethodInsn(final int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- lastCodeOffset = code.length;
- Item i = cw.newMethodItem(owner, name, desc, itf);
- int argSize = i.intVal;
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(opcode, 0, cw, i);
- } else {
- /*
- * computes the stack size variation. In order not to recompute
- * several times this variation for the same Item, we use the
- * intVal field of this item to store this variation, once it
- * has been computed. More precisely this intVal field stores
- * the sizes of the arguments and of the return value
- * corresponding to desc.
- */
- if (argSize == 0) {
- // the above sizes have not been computed yet,
- // so we compute them...
- argSize = Type.getArgumentsAndReturnSizes(desc);
- // ... and we save them in order
- // not to recompute them in the future
- i.intVal = argSize;
- }
- int size;
- if (opcode == Opcodes.INVOKESTATIC) {
- size = stackSize - (argSize >> 2) + (argSize & 0x03) + 1;
- } else {
- size = stackSize - (argSize >> 2) + (argSize & 0x03);
- }
- // updates current and max stack sizes
- if (size > maxStackSize) {
- maxStackSize = size;
- }
- stackSize = size;
- }
- }
- // adds the instruction to the bytecode of the method
- if (opcode == Opcodes.INVOKEINTERFACE) {
- if (argSize == 0) {
- argSize = Type.getArgumentsAndReturnSizes(desc);
- i.intVal = argSize;
- }
- code.put12(Opcodes.INVOKEINTERFACE, i.index).put11(argSize >> 2, 0);
- } else {
- code.put12(opcode, i.index);
- }
- }
-
- @Override
- public void visitInvokeDynamicInsn(final String name, final String desc,
- final Handle bsm, final Object... bsmArgs) {
- lastCodeOffset = code.length;
- Item i = cw.newInvokeDynamicItem(name, desc, bsm, bsmArgs);
- int argSize = i.intVal;
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(Opcodes.INVOKEDYNAMIC, 0, cw, i);
- } else {
- /*
- * computes the stack size variation. In order not to recompute
- * several times this variation for the same Item, we use the
- * intVal field of this item to store this variation, once it
- * has been computed. More precisely this intVal field stores
- * the sizes of the arguments and of the return value
- * corresponding to desc.
- */
- if (argSize == 0) {
- // the above sizes have not been computed yet,
- // so we compute them...
- argSize = Type.getArgumentsAndReturnSizes(desc);
- // ... and we save them in order
- // not to recompute them in the future
- i.intVal = argSize;
- }
- int size = stackSize - (argSize >> 2) + (argSize & 0x03) + 1;
-
- // updates current and max stack sizes
- if (size > maxStackSize) {
- maxStackSize = size;
- }
- stackSize = size;
- }
- }
- // adds the instruction to the bytecode of the method
- code.put12(Opcodes.INVOKEDYNAMIC, i.index);
- code.putShort(0);
- }
-
- @Override
- public void visitJumpInsn(final int opcode, final Label label) {
- lastCodeOffset = code.length;
- Label nextInsn = null;
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(opcode, 0, null, null);
- // 'label' is the target of a jump instruction
- label.getFirst().status |= Label.TARGET;
- // adds 'label' as a successor of this basic block
- addSuccessor(Edge.NORMAL, label);
- if (opcode != Opcodes.GOTO) {
- // creates a Label for the next basic block
- nextInsn = new Label();
- }
- } else {
- if (opcode == Opcodes.JSR) {
- if ((label.status & Label.SUBROUTINE) == 0) {
- label.status |= Label.SUBROUTINE;
- ++subroutines;
- }
- currentBlock.status |= Label.JSR;
- addSuccessor(stackSize + 1, label);
- // creates a Label for the next basic block
- nextInsn = new Label();
- /*
- * note that, by construction in this method, a JSR block
- * has at least two successors in the control flow graph:
- * the first one leads the next instruction after the JSR,
- * while the second one leads to the JSR target.
- */
- } else {
- // updates current stack size (max stack size unchanged
- // because stack size variation always negative in this
- // case)
- stackSize += Frame.SIZE[opcode];
- addSuccessor(stackSize, label);
- }
- }
- }
- // adds the instruction to the bytecode of the method
- if ((label.status & Label.RESOLVED) != 0
- && label.position - code.length < Short.MIN_VALUE) {
- /*
- * case of a backward jump with an offset < -32768. In this case we
- * automatically replace GOTO with GOTO_W, JSR with JSR_W and IFxxx
- * <l> with IFNOTxxx <l'> GOTO_W <l>, where IFNOTxxx is the
- * "opposite" opcode of IFxxx (i.e., IFNE for IFEQ) and where <l'>
- * designates the instruction just after the GOTO_W.
- */
- if (opcode == Opcodes.GOTO) {
- code.putByte(200); // GOTO_W
- } else if (opcode == Opcodes.JSR) {
- code.putByte(201); // JSR_W
- } else {
- // if the IF instruction is transformed into IFNOT GOTO_W the
- // next instruction becomes the target of the IFNOT instruction
- if (nextInsn != null) {
- nextInsn.status |= Label.TARGET;
- }
- code.putByte(opcode <= 166 ? ((opcode + 1) ^ 1) - 1
- : opcode ^ 1);
- code.putShort(8); // jump offset
- code.putByte(200); // GOTO_W
- }
- label.put(this, code, code.length - 1, true);
- } else {
- /*
- * case of a backward jump with an offset >= -32768, or of a forward
- * jump with, of course, an unknown offset. In these cases we store
- * the offset in 2 bytes (which will be increased in
- * resizeInstructions, if needed).
- */
- code.putByte(opcode);
- label.put(this, code, code.length - 1, false);
- }
- if (currentBlock != null) {
- if (nextInsn != null) {
- // if the jump instruction is not a GOTO, the next instruction
- // is also a successor of this instruction. Calling visitLabel
- // adds the label of this next instruction as a successor of the
- // current block, and starts a new basic block
- visitLabel(nextInsn);
- }
- if (opcode == Opcodes.GOTO) {
- noSuccessor();
- }
- }
- }
-
- @Override
- public void visitLabel(final Label label) {
- // resolves previous forward references to label, if any
- resize |= label.resolve(this, code.length, code.data);
- // updates currentBlock
- if ((label.status & Label.DEBUG) != 0) {
- return;
- }
- if (compute == FRAMES) {
- if (currentBlock != null) {
- if (label.position == currentBlock.position) {
- // successive labels, do not start a new basic block
- currentBlock.status |= (label.status & Label.TARGET);
- label.frame = currentBlock.frame;
- return;
- }
- // ends current block (with one new successor)
- addSuccessor(Edge.NORMAL, label);
- }
- // begins a new current block
- currentBlock = label;
- if (label.frame == null) {
- label.frame = new Frame();
- label.frame.owner = label;
- }
- // updates the basic block list
- if (previousBlock != null) {
- if (label.position == previousBlock.position) {
- previousBlock.status |= (label.status & Label.TARGET);
- label.frame = previousBlock.frame;
- currentBlock = previousBlock;
- return;
- }
- previousBlock.successor = label;
- }
- previousBlock = label;
- } else if (compute == MAXS) {
- if (currentBlock != null) {
- // ends current block (with one new successor)
- currentBlock.outputStackMax = maxStackSize;
- addSuccessor(stackSize, label);
- }
- // begins a new current block
- currentBlock = label;
- // resets the relative current and max stack sizes
- stackSize = 0;
- maxStackSize = 0;
- // updates the basic block list
- if (previousBlock != null) {
- previousBlock.successor = label;
- }
- previousBlock = label;
- }
- }
-
- @Override
- public void visitLdcInsn(final Object cst) {
- lastCodeOffset = code.length;
- Item i = cw.newConstItem(cst);
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(Opcodes.LDC, 0, cw, i);
- } else {
- int size;
- // computes the stack size variation
- if (i.type == ClassWriter.LONG || i.type == ClassWriter.DOUBLE) {
- size = stackSize + 2;
- } else {
- size = stackSize + 1;
- }
- // updates current and max stack sizes
- if (size > maxStackSize) {
- maxStackSize = size;
- }
- stackSize = size;
- }
- }
- // adds the instruction to the bytecode of the method
- int index = i.index;
- if (i.type == ClassWriter.LONG || i.type == ClassWriter.DOUBLE) {
- code.put12(20 /* LDC2_W */, index);
- } else if (index >= 256) {
- code.put12(19 /* LDC_W */, index);
- } else {
- code.put11(Opcodes.LDC, index);
- }
- }
-
- @Override
- public void visitIincInsn(final int var, final int increment) {
- lastCodeOffset = code.length;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(Opcodes.IINC, var, null, null);
- }
- }
- if (compute != NOTHING) {
- // updates max locals
- int n = var + 1;
- if (n > maxLocals) {
- maxLocals = n;
- }
- }
- // adds the instruction to the bytecode of the method
- if ((var > 255) || (increment > 127) || (increment < -128)) {
- code.putByte(196 /* WIDE */).put12(Opcodes.IINC, var)
- .putShort(increment);
- } else {
- code.putByte(Opcodes.IINC).put11(var, increment);
- }
- }
-
- @Override
- public void visitTableSwitchInsn(final int min, final int max,
- final Label dflt, final Label... labels) {
- lastCodeOffset = code.length;
- // adds the instruction to the bytecode of the method
- int source = code.length;
- code.putByte(Opcodes.TABLESWITCH);
- code.putByteArray(null, 0, (4 - code.length % 4) % 4);
- dflt.put(this, code, source, true);
- code.putInt(min).putInt(max);
- for (int i = 0; i < labels.length; ++i) {
- labels[i].put(this, code, source, true);
- }
- // updates currentBlock
- visitSwitchInsn(dflt, labels);
- }
-
- @Override
- public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
- final Label[] labels) {
- lastCodeOffset = code.length;
- // adds the instruction to the bytecode of the method
- int source = code.length;
- code.putByte(Opcodes.LOOKUPSWITCH);
- code.putByteArray(null, 0, (4 - code.length % 4) % 4);
- dflt.put(this, code, source, true);
- code.putInt(labels.length);
- for (int i = 0; i < labels.length; ++i) {
- code.putInt(keys[i]);
- labels[i].put(this, code, source, true);
- }
- // updates currentBlock
- visitSwitchInsn(dflt, labels);
- }
-
- private void visitSwitchInsn(final Label dflt, final Label[] labels) {
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(Opcodes.LOOKUPSWITCH, 0, null, null);
- // adds current block successors
- addSuccessor(Edge.NORMAL, dflt);
- dflt.getFirst().status |= Label.TARGET;
- for (int i = 0; i < labels.length; ++i) {
- addSuccessor(Edge.NORMAL, labels[i]);
- labels[i].getFirst().status |= Label.TARGET;
- }
- } else {
- // updates current stack size (max stack size unchanged)
- --stackSize;
- // adds current block successors
- addSuccessor(stackSize, dflt);
- for (int i = 0; i < labels.length; ++i) {
- addSuccessor(stackSize, labels[i]);
- }
- }
- // ends current block
- noSuccessor();
- }
- }
-
- @Override
- public void visitMultiANewArrayInsn(final String desc, final int dims) {
- lastCodeOffset = code.length;
- Item i = cw.newClassItem(desc);
- // Label currentBlock = this.currentBlock;
- if (currentBlock != null) {
- if (compute == FRAMES) {
- currentBlock.frame.execute(Opcodes.MULTIANEWARRAY, dims, cw, i);
- } else {
- // updates current stack size (max stack size unchanged because
- // stack size variation always negative or null)
- stackSize += 1 - dims;
- }
- }
- // adds the instruction to the bytecode of the method
- code.put12(Opcodes.MULTIANEWARRAY, i.index).putByte(dims);
- }
-
- @Override
- public AnnotationVisitor visitInsnAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- // write target_type and target_info
- typeRef = (typeRef & 0xFF0000FF) | (lastCodeOffset << 8);
- AnnotationWriter.putTarget(typeRef, typePath, bv);
- // write type, and reserve space for values count
- bv.putShort(cw.newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
- bv.length - 2);
- if (visible) {
- aw.next = ctanns;
- ctanns = aw;
- } else {
- aw.next = ictanns;
- ictanns = aw;
- }
- return aw;
- }
-
- @Override
- public void visitTryCatchBlock(final Label start, final Label end,
- final Label handler, final String type) {
- ++handlerCount;
- Handler h = new Handler();
- h.start = start;
- h.end = end;
- h.handler = handler;
- h.desc = type;
- h.type = type != null ? cw.newClass(type) : 0;
- if (lastHandler == null) {
- firstHandler = h;
- } else {
- lastHandler.next = h;
- }
- lastHandler = h;
- }
-
- @Override
- public AnnotationVisitor visitTryCatchAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- // write target_type and target_info
- AnnotationWriter.putTarget(typeRef, typePath, bv);
- // write type, and reserve space for values count
- bv.putShort(cw.newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
- bv.length - 2);
- if (visible) {
- aw.next = ctanns;
- ctanns = aw;
- } else {
- aw.next = ictanns;
- ictanns = aw;
- }
- return aw;
- }
-
- @Override
- public void visitLocalVariable(final String name, final String desc,
- final String signature, final Label start, final Label end,
- final int index) {
- if (signature != null) {
- if (localVarType == null) {
- localVarType = new ByteVector();
- }
- ++localVarTypeCount;
- localVarType.putShort(start.position)
- .putShort(end.position - start.position)
- .putShort(cw.newUTF8(name)).putShort(cw.newUTF8(signature))
- .putShort(index);
- }
- if (localVar == null) {
- localVar = new ByteVector();
- }
- ++localVarCount;
- localVar.putShort(start.position)
- .putShort(end.position - start.position)
- .putShort(cw.newUTF8(name)).putShort(cw.newUTF8(desc))
- .putShort(index);
- if (compute != NOTHING) {
- // updates max locals
- char c = desc.charAt(0);
- int n = index + (c == 'J' || c == 'D' ? 2 : 1);
- if (n > maxLocals) {
- maxLocals = n;
- }
- }
- }
-
- @Override
- public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
- TypePath typePath, Label[] start, Label[] end, int[] index,
- String desc, boolean visible) {
- if (!ClassReader.ANNOTATIONS) {
- return null;
- }
- ByteVector bv = new ByteVector();
- // write target_type and target_info
- bv.putByte(typeRef >>> 24).putShort(start.length);
- for (int i = 0; i < start.length; ++i) {
- bv.putShort(start[i].position)
- .putShort(end[i].position - start[i].position)
- .putShort(index[i]);
- }
- if (typePath == null) {
- bv.putByte(0);
- } else {
- int length = typePath.b[typePath.offset] * 2 + 1;
- bv.putByteArray(typePath.b, typePath.offset, length);
- }
- // write type, and reserve space for values count
- bv.putShort(cw.newUTF8(desc)).putShort(0);
- AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
- bv.length - 2);
- if (visible) {
- aw.next = ctanns;
- ctanns = aw;
- } else {
- aw.next = ictanns;
- ictanns = aw;
- }
- return aw;
- }
-
- @Override
- public void visitLineNumber(final int line, final Label start) {
- if (lineNumber == null) {
- lineNumber = new ByteVector();
- }
- ++lineNumberCount;
- lineNumber.putShort(start.position);
- lineNumber.putShort(line);
- }
-
- @Override
- public void visitMaxs(final int maxStack, final int maxLocals) {
- if (resize) {
- // replaces the temporary jump opcodes introduced by Label.resolve.
- if (ClassReader.RESIZE) {
- resizeInstructions();
- } else {
- throw new RuntimeException("Method code too large!");
- }
- }
- if (ClassReader.FRAMES && compute == FRAMES) {
- // completes the control flow graph with exception handler blocks
- Handler handler = firstHandler;
- while (handler != null) {
- Label l = handler.start.getFirst();
- Label h = handler.handler.getFirst();
- Label e = handler.end.getFirst();
- // computes the kind of the edges to 'h'
- String t = handler.desc == null ? "java/lang/Throwable"
- : handler.desc;
- int kind = Frame.OBJECT | cw.addType(t);
- // h is an exception handler
- h.status |= Label.TARGET;
- // adds 'h' as a successor of labels between 'start' and 'end'
- while (l != e) {
- // creates an edge to 'h'
- Edge b = new Edge();
- b.info = kind;
- b.successor = h;
- // adds it to the successors of 'l'
- b.next = l.successors;
- l.successors = b;
- // goes to the next label
- l = l.successor;
- }
- handler = handler.next;
- }
-
- // creates and visits the first (implicit) frame
- Frame f = labels.frame;
- Type[] args = Type.getArgumentTypes(descriptor);
- f.initInputFrame(cw, access, args, this.maxLocals);
- visitFrame(f);
-
- /*
- * fix point algorithm: mark the first basic block as 'changed'
- * (i.e. put it in the 'changed' list) and, while there are changed
- * basic blocks, choose one, mark it as unchanged, and update its
- * successors (which can be changed in the process).
- */
- int max = 0;
- Label changed = labels;
- while (changed != null) {
- // removes a basic block from the list of changed basic blocks
- Label l = changed;
- changed = changed.next;
- l.next = null;
- f = l.frame;
- // a reachable jump target must be stored in the stack map
- if ((l.status & Label.TARGET) != 0) {
- l.status |= Label.STORE;
- }
- // all visited labels are reachable, by definition
- l.status |= Label.REACHABLE;
- // updates the (absolute) maximum stack size
- int blockMax = f.inputStack.length + l.outputStackMax;
- if (blockMax > max) {
- max = blockMax;
- }
- // updates the successors of the current basic block
- Edge e = l.successors;
- while (e != null) {
- Label n = e.successor.getFirst();
- boolean change = f.merge(cw, n.frame, e.info);
- if (change && n.next == null) {
- // if n has changed and is not already in the 'changed'
- // list, adds it to this list
- n.next = changed;
- changed = n;
- }
- e = e.next;
- }
- }
-
- // visits all the frames that must be stored in the stack map
- Label l = labels;
- while (l != null) {
- f = l.frame;
- if ((l.status & Label.STORE) != 0) {
- visitFrame(f);
- }
- if ((l.status & Label.REACHABLE) == 0) {
- // finds start and end of dead basic block
- Label k = l.successor;
- int start = l.position;
- int end = (k == null ? code.length : k.position) - 1;
- // if non empty basic block
- if (end >= start) {
- max = Math.max(max, 1);
- // replaces instructions with NOP ... NOP ATHROW
- for (int i = start; i < end; ++i) {
- code.data[i] = Opcodes.NOP;
- }
- code.data[end] = (byte) Opcodes.ATHROW;
- // emits a frame for this unreachable block
- int frameIndex = startFrame(start, 0, 1);
- frame[frameIndex] = Frame.OBJECT
- | cw.addType("java/lang/Throwable");
- endFrame();
- // removes the start-end range from the exception
- // handlers
- firstHandler = Handler.remove(firstHandler, l, k);
- }
- }
- l = l.successor;
- }
-
- handler = firstHandler;
- handlerCount = 0;
- while (handler != null) {
- handlerCount += 1;
- handler = handler.next;
- }
-
- this.maxStack = max;
- } else if (compute == MAXS) {
- // completes the control flow graph with exception handler blocks
- Handler handler = firstHandler;
- while (handler != null) {
- Label l = handler.start;
- Label h = handler.handler;
- Label e = handler.end;
- // adds 'h' as a successor of labels between 'start' and 'end'
- while (l != e) {
- // creates an edge to 'h'
- Edge b = new Edge();
- b.info = Edge.EXCEPTION;
- b.successor = h;
- // adds it to the successors of 'l'
- if ((l.status & Label.JSR) == 0) {
- b.next = l.successors;
- l.successors = b;
- } else {
- // if l is a JSR block, adds b after the first two edges
- // to preserve the hypothesis about JSR block successors
- // order (see {@link #visitJumpInsn})
- b.next = l.successors.next.next;
- l.successors.next.next = b;
- }
- // goes to the next label
- l = l.successor;
- }
- handler = handler.next;
- }
-
- if (subroutines > 0) {
- // completes the control flow graph with the RET successors
- /*
- * first step: finds the subroutines. This step determines, for
- * each basic block, to which subroutine(s) it belongs.
- */
- // finds the basic blocks that belong to the "main" subroutine
- int id = 0;
- labels.visitSubroutine(null, 1, subroutines);
- // finds the basic blocks that belong to the real subroutines
- Label l = labels;
- while (l != null) {
- if ((l.status & Label.JSR) != 0) {
- // the subroutine is defined by l's TARGET, not by l
- Label subroutine = l.successors.next.successor;
- // if this subroutine has not been visited yet...
- if ((subroutine.status & Label.VISITED) == 0) {
- // ...assigns it a new id and finds its basic blocks
- id += 1;
- subroutine.visitSubroutine(null, (id / 32L) << 32
- | (1L << (id % 32)), subroutines);
- }
- }
- l = l.successor;
- }
- // second step: finds the successors of RET blocks
- l = labels;
- while (l != null) {
- if ((l.status & Label.JSR) != 0) {
- Label L = labels;
- while (L != null) {
- L.status &= ~Label.VISITED2;
- L = L.successor;
- }
- // the subroutine is defined by l's TARGET, not by l
- Label subroutine = l.successors.next.successor;
- subroutine.visitSubroutine(l, 0, subroutines);
- }
- l = l.successor;
- }
- }
-
- /*
- * control flow analysis algorithm: while the block stack is not
- * empty, pop a block from this stack, update the max stack size,
- * compute the true (non relative) begin stack size of the
- * successors of this block, and push these successors onto the
- * stack (unless they have already been pushed onto the stack).
- * Note: by hypothesis, the {@link Label#inputStackTop} of the
- * blocks in the block stack are the true (non relative) beginning
- * stack sizes of these blocks.
- */
- int max = 0;
- Label stack = labels;
- while (stack != null) {
- // pops a block from the stack
- Label l = stack;
- stack = stack.next;
- // computes the true (non relative) max stack size of this block
- int start = l.inputStackTop;
- int blockMax = start + l.outputStackMax;
- // updates the global max stack size
- if (blockMax > max) {
- max = blockMax;
- }
- // analyzes the successors of the block
- Edge b = l.successors;
- if ((l.status & Label.JSR) != 0) {
- // ignores the first edge of JSR blocks (virtual successor)
- b = b.next;
- }
- while (b != null) {
- l = b.successor;
- // if this successor has not already been pushed...
- if ((l.status & Label.PUSHED) == 0) {
- // computes its true beginning stack size...
- l.inputStackTop = b.info == Edge.EXCEPTION ? 1 : start
- + b.info;
- // ...and pushes it onto the stack
- l.status |= Label.PUSHED;
- l.next = stack;
- stack = l;
- }
- b = b.next;
- }
- }
- this.maxStack = Math.max(maxStack, max);
- } else {
- this.maxStack = maxStack;
- this.maxLocals = maxLocals;
- }
- }
-
- @Override
- public void visitEnd() {
- }
-
- // ------------------------------------------------------------------------
- // Utility methods: control flow analysis algorithm
- // ------------------------------------------------------------------------
-
- /**
- * Adds a successor to the {@link #currentBlock currentBlock} block.
- *
- * @param info
- * information about the control flow edge to be added.
- * @param successor
- * the successor block to be added to the current block.
- */
- private void addSuccessor(final int info, final Label successor) {
- // creates and initializes an Edge object...
- Edge b = new Edge();
- b.info = info;
- b.successor = successor;
- // ...and adds it to the successor list of the currentBlock block
- b.next = currentBlock.successors;
- currentBlock.successors = b;
- }
-
- /**
- * Ends the current basic block. This method must be used in the case where
- * the current basic block does not have any successor.
- */
- private void noSuccessor() {
- if (compute == FRAMES) {
- Label l = new Label();
- l.frame = new Frame();
- l.frame.owner = l;
- l.resolve(this, code.length, code.data);
- previousBlock.successor = l;
- previousBlock = l;
- } else {
- currentBlock.outputStackMax = maxStackSize;
- }
- currentBlock = null;
- }
-
- // ------------------------------------------------------------------------
- // Utility methods: stack map frames
- // ------------------------------------------------------------------------
-
- /**
- * Visits a frame that has been computed from scratch.
- *
- * @param f
- * the frame that must be visited.
- */
- private void visitFrame(final Frame f) {
- int i, t;
- int nTop = 0;
- int nLocal = 0;
- int nStack = 0;
- int[] locals = f.inputLocals;
- int[] stacks = f.inputStack;
- // computes the number of locals (ignores TOP types that are just after
- // a LONG or a DOUBLE, and all trailing TOP types)
- for (i = 0; i < locals.length; ++i) {
- t = locals[i];
- if (t == Frame.TOP) {
- ++nTop;
- } else {
- nLocal += nTop + 1;
- nTop = 0;
- }
- if (t == Frame.LONG || t == Frame.DOUBLE) {
- ++i;
- }
- }
- // computes the stack size (ignores TOP types that are just after
- // a LONG or a DOUBLE)
- for (i = 0; i < stacks.length; ++i) {
- t = stacks[i];
- ++nStack;
- if (t == Frame.LONG || t == Frame.DOUBLE) {
- ++i;
- }
- }
- // visits the frame and its content
- int frameIndex = startFrame(f.owner.position, nLocal, nStack);
- for (i = 0; nLocal > 0; ++i, --nLocal) {
- t = locals[i];
- frame[frameIndex++] = t;
- if (t == Frame.LONG || t == Frame.DOUBLE) {
- ++i;
- }
- }
- for (i = 0; i < stacks.length; ++i) {
- t = stacks[i];
- frame[frameIndex++] = t;
- if (t == Frame.LONG || t == Frame.DOUBLE) {
- ++i;
- }
- }
- endFrame();
- }
-
- /**
- * Visit the implicit first frame of this method.
- */
- private void visitImplicitFirstFrame() {
- // There can be at most descriptor.length() + 1 locals
- int frameIndex = startFrame(0, descriptor.length() + 1, 0);
- if ((access & Opcodes.ACC_STATIC) == 0) {
- if ((access & ACC_CONSTRUCTOR) == 0) {
- frame[frameIndex++] = Frame.OBJECT | cw.addType(cw.thisName);
- } else {
- frame[frameIndex++] = 6; // Opcodes.UNINITIALIZED_THIS;
- }
- }
- int i = 1;
- loop: while (true) {
- int j = i;
- switch (descriptor.charAt(i++)) {
- case 'Z':
- case 'C':
- case 'B':
- case 'S':
- case 'I':
- frame[frameIndex++] = 1; // Opcodes.INTEGER;
- break;
- case 'F':
- frame[frameIndex++] = 2; // Opcodes.FLOAT;
- break;
- case 'J':
- frame[frameIndex++] = 4; // Opcodes.LONG;
- break;
- case 'D':
- frame[frameIndex++] = 3; // Opcodes.DOUBLE;
- break;
- case '[':
- while (descriptor.charAt(i) == '[') {
- ++i;
- }
- if (descriptor.charAt(i) == 'L') {
- ++i;
- while (descriptor.charAt(i) != ';') {
- ++i;
- }
- }
- frame[frameIndex++] = Frame.OBJECT
- | cw.addType(descriptor.substring(j, ++i));
- break;
- case 'L':
- while (descriptor.charAt(i) != ';') {
- ++i;
- }
- frame[frameIndex++] = Frame.OBJECT
- | cw.addType(descriptor.substring(j + 1, i++));
- break;
- default:
- break loop;
- }
- }
- frame[1] = frameIndex - 3;
- endFrame();
- }
-
- /**
- * Starts the visit of a stack map frame.
- *
- * @param offset
- * the offset of the instruction to which the frame corresponds.
- * @param nLocal
- * the number of local variables in the frame.
- * @param nStack
- * the number of stack elements in the frame.
- * @return the index of the next element to be written in this frame.
- */
- private int startFrame(final int offset, final int nLocal, final int nStack) {
- int n = 3 + nLocal + nStack;
- if (frame == null || frame.length < n) {
- frame = new int[n];
- }
- frame[0] = offset;
- frame[1] = nLocal;
- frame[2] = nStack;
- return 3;
- }
-
- /**
- * Checks if the visit of the current frame {@link #frame} is finished, and
- * if yes, write it in the StackMapTable attribute.
- */
- private void endFrame() {
- if (previousFrame != null) { // do not write the first frame
- if (stackMap == null) {
- stackMap = new ByteVector();
- }
- writeFrame();
- ++frameCount;
- }
- previousFrame = frame;
- frame = null;
- }
-
- /**
- * Compress and writes the current frame {@link #frame} in the StackMapTable
- * attribute.
- */
- private void writeFrame() {
- int clocalsSize = frame[1];
- int cstackSize = frame[2];
- if ((cw.version & 0xFFFF) < Opcodes.V1_6) {
- stackMap.putShort(frame[0]).putShort(clocalsSize);
- writeFrameTypes(3, 3 + clocalsSize);
- stackMap.putShort(cstackSize);
- writeFrameTypes(3 + clocalsSize, 3 + clocalsSize + cstackSize);
- return;
- }
- int localsSize = previousFrame[1];
- int type = FULL_FRAME;
- int k = 0;
- int delta;
- if (frameCount == 0) {
- delta = frame[0];
- } else {
- delta = frame[0] - previousFrame[0] - 1;
- }
- if (cstackSize == 0) {
- k = clocalsSize - localsSize;
- switch (k) {
- case -3:
- case -2:
- case -1:
- type = CHOP_FRAME;
- localsSize = clocalsSize;
- break;
- case 0:
- type = delta < 64 ? SAME_FRAME : SAME_FRAME_EXTENDED;
- break;
- case 1:
- case 2:
- case 3:
- type = APPEND_FRAME;
- break;
- }
- } else if (clocalsSize == localsSize && cstackSize == 1) {
- type = delta < 63 ? SAME_LOCALS_1_STACK_ITEM_FRAME
- : SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED;
- }
- if (type != FULL_FRAME) {
- // verify if locals are the same
- int l = 3;
- for (int j = 0; j < localsSize; j++) {
- if (frame[l] != previousFrame[l]) {
- type = FULL_FRAME;
- break;
- }
- l++;
- }
- }
- switch (type) {
- case SAME_FRAME:
- stackMap.putByte(delta);
- break;
- case SAME_LOCALS_1_STACK_ITEM_FRAME:
- stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME + delta);
- writeFrameTypes(3 + clocalsSize, 4 + clocalsSize);
- break;
- case SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED:
- stackMap.putByte(SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED).putShort(
- delta);
- writeFrameTypes(3 + clocalsSize, 4 + clocalsSize);
- break;
- case SAME_FRAME_EXTENDED:
- stackMap.putByte(SAME_FRAME_EXTENDED).putShort(delta);
- break;
- case CHOP_FRAME:
- stackMap.putByte(SAME_FRAME_EXTENDED + k).putShort(delta);
- break;
- case APPEND_FRAME:
- stackMap.putByte(SAME_FRAME_EXTENDED + k).putShort(delta);
- writeFrameTypes(3 + localsSize, 3 + clocalsSize);
- break;
- // case FULL_FRAME:
- default:
- stackMap.putByte(FULL_FRAME).putShort(delta).putShort(clocalsSize);
- writeFrameTypes(3, 3 + clocalsSize);
- stackMap.putShort(cstackSize);
- writeFrameTypes(3 + clocalsSize, 3 + clocalsSize + cstackSize);
- }
- }
-
- /**
- * Writes some types of the current frame {@link #frame} into the
- * StackMapTableAttribute. This method converts types from the format used
- * in {@link Label} to the format used in StackMapTable attributes. In
- * particular, it converts type table indexes to constant pool indexes.
- *
- * @param start
- * index of the first type in {@link #frame} to write.
- * @param end
- * index of last type in {@link #frame} to write (exclusive).
- */
- private void writeFrameTypes(final int start, final int end) {
- for (int i = start; i < end; ++i) {
- int t = frame[i];
- int d = t & Frame.DIM;
- if (d == 0) {
- int v = t & Frame.BASE_VALUE;
- switch (t & Frame.BASE_KIND) {
- case Frame.OBJECT:
- stackMap.putByte(7).putShort(
- cw.newClass(cw.typeTable[v].strVal1));
- break;
- case Frame.UNINITIALIZED:
- stackMap.putByte(8).putShort(cw.typeTable[v].intVal);
- break;
- default:
- stackMap.putByte(v);
- }
- } else {
- StringBuilder sb = new StringBuilder();
- d >>= 28;
- while (d-- > 0) {
- sb.append('[');
- }
- if ((t & Frame.BASE_KIND) == Frame.OBJECT) {
- sb.append('L');
- sb.append(cw.typeTable[t & Frame.BASE_VALUE].strVal1);
- sb.append(';');
- } else {
- switch (t & 0xF) {
- case 1:
- sb.append('I');
- break;
- case 2:
- sb.append('F');
- break;
- case 3:
- sb.append('D');
- break;
- case 9:
- sb.append('Z');
- break;
- case 10:
- sb.append('B');
- break;
- case 11:
- sb.append('C');
- break;
- case 12:
- sb.append('S');
- break;
- default:
- sb.append('J');
- }
- }
- stackMap.putByte(7).putShort(cw.newClass(sb.toString()));
- }
- }
- }
-
- private void writeFrameType(final Object type) {
- if (type instanceof String) {
- stackMap.putByte(7).putShort(cw.newClass((String) type));
- } else if (type instanceof Integer) {
- stackMap.putByte(((Integer) type).intValue());
- } else {
- stackMap.putByte(8).putShort(((Label) type).position);
- }
- }
-
- // ------------------------------------------------------------------------
- // Utility methods: dump bytecode array
- // ------------------------------------------------------------------------
-
- /**
- * Returns the size of the bytecode of this method.
- *
- * @return the size of the bytecode of this method.
- */
- final int getSize() {
- if (classReaderOffset != 0) {
- return 6 + classReaderLength;
- }
- int size = 8;
- if (code.length > 0) {
- if (code.length > 65536) {
- String nameString = "";
- Item nameItem = cw.findItemByIndex(name);
- if (nameItem != null) nameString = nameItem.strVal1 +"'s ";
- throw new RuntimeException("Method "+ nameString +"code too large!");
- }
- cw.newUTF8("Code");
- size += 18 + code.length + 8 * handlerCount;
- if (localVar != null) {
- cw.newUTF8("LocalVariableTable");
- size += 8 + localVar.length;
- }
- if (localVarType != null) {
- cw.newUTF8("LocalVariableTypeTable");
- size += 8 + localVarType.length;
- }
- if (lineNumber != null) {
- cw.newUTF8("LineNumberTable");
- size += 8 + lineNumber.length;
- }
- if (stackMap != null) {
- boolean zip = (cw.version & 0xFFFF) >= Opcodes.V1_6;
- cw.newUTF8(zip ? "StackMapTable" : "StackMap");
- size += 8 + stackMap.length;
- }
- if (ClassReader.ANNOTATIONS && ctanns != null) {
- cw.newUTF8("RuntimeVisibleTypeAnnotations");
- size += 8 + ctanns.getSize();
- }
- if (ClassReader.ANNOTATIONS && ictanns != null) {
- cw.newUTF8("RuntimeInvisibleTypeAnnotations");
- size += 8 + ictanns.getSize();
- }
- if (cattrs != null) {
- size += cattrs.getSize(cw, code.data, code.length, maxStack,
- maxLocals);
- }
- }
- if (exceptionCount > 0) {
- cw.newUTF8("Exceptions");
- size += 8 + 2 * exceptionCount;
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- if ((cw.version & 0xFFFF) < Opcodes.V1_5
- || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
- cw.newUTF8("Synthetic");
- size += 6;
- }
- }
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- cw.newUTF8("Deprecated");
- size += 6;
- }
- if (ClassReader.SIGNATURES && signature != null) {
- cw.newUTF8("Signature");
- cw.newUTF8(signature);
- size += 8;
- }
- if (methodParameters != null) {
- cw.newUTF8("MethodParameters");
- size += 7 + methodParameters.length;
- }
- if (ClassReader.ANNOTATIONS && annd != null) {
- cw.newUTF8("AnnotationDefault");
- size += 6 + annd.length;
- }
- if (ClassReader.ANNOTATIONS && anns != null) {
- cw.newUTF8("RuntimeVisibleAnnotations");
- size += 8 + anns.getSize();
- }
- if (ClassReader.ANNOTATIONS && ianns != null) {
- cw.newUTF8("RuntimeInvisibleAnnotations");
- size += 8 + ianns.getSize();
- }
- if (ClassReader.ANNOTATIONS && tanns != null) {
- cw.newUTF8("RuntimeVisibleTypeAnnotations");
- size += 8 + tanns.getSize();
- }
- if (ClassReader.ANNOTATIONS && itanns != null) {
- cw.newUTF8("RuntimeInvisibleTypeAnnotations");
- size += 8 + itanns.getSize();
- }
- if (ClassReader.ANNOTATIONS && panns != null) {
- cw.newUTF8("RuntimeVisibleParameterAnnotations");
- size += 7 + 2 * (panns.length - synthetics);
- for (int i = panns.length - 1; i >= synthetics; --i) {
- size += panns[i] == null ? 0 : panns[i].getSize();
- }
- }
- if (ClassReader.ANNOTATIONS && ipanns != null) {
- cw.newUTF8("RuntimeInvisibleParameterAnnotations");
- size += 7 + 2 * (ipanns.length - synthetics);
- for (int i = ipanns.length - 1; i >= synthetics; --i) {
- size += ipanns[i] == null ? 0 : ipanns[i].getSize();
- }
- }
- if (attrs != null) {
- size += attrs.getSize(cw, null, 0, -1, -1);
- }
- return size;
- }
-
- /**
- * Puts the bytecode of this method in the given byte vector.
- *
- * @param out
- * the byte vector into which the bytecode of this method must be
- * copied.
- */
- final void put(final ByteVector out) {
- final int FACTOR = ClassWriter.TO_ACC_SYNTHETIC;
- int mask = ACC_CONSTRUCTOR | Opcodes.ACC_DEPRECATED
- | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
- | ((access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) / FACTOR);
- out.putShort(access & ~mask).putShort(name).putShort(desc);
- if (classReaderOffset != 0) {
- out.putByteArray(cw.cr.b, classReaderOffset, classReaderLength);
- return;
- }
- int attributeCount = 0;
- if (code.length > 0) {
- ++attributeCount;
- }
- if (exceptionCount > 0) {
- ++attributeCount;
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- if ((cw.version & 0xFFFF) < Opcodes.V1_5
- || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
- ++attributeCount;
- }
- }
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- ++attributeCount;
- }
- if (ClassReader.SIGNATURES && signature != null) {
- ++attributeCount;
- }
- if (methodParameters != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && annd != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && anns != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && ianns != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && tanns != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && itanns != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && panns != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && ipanns != null) {
- ++attributeCount;
- }
- if (attrs != null) {
- attributeCount += attrs.getCount();
- }
- out.putShort(attributeCount);
- if (code.length > 0) {
- int size = 12 + code.length + 8 * handlerCount;
- if (localVar != null) {
- size += 8 + localVar.length;
- }
- if (localVarType != null) {
- size += 8 + localVarType.length;
- }
- if (lineNumber != null) {
- size += 8 + lineNumber.length;
- }
- if (stackMap != null) {
- size += 8 + stackMap.length;
- }
- if (ClassReader.ANNOTATIONS && ctanns != null) {
- size += 8 + ctanns.getSize();
- }
- if (ClassReader.ANNOTATIONS && ictanns != null) {
- size += 8 + ictanns.getSize();
- }
- if (cattrs != null) {
- size += cattrs.getSize(cw, code.data, code.length, maxStack,
- maxLocals);
- }
- out.putShort(cw.newUTF8("Code")).putInt(size);
- out.putShort(maxStack).putShort(maxLocals);
- out.putInt(code.length).putByteArray(code.data, 0, code.length);
- out.putShort(handlerCount);
- if (handlerCount > 0) {
- Handler h = firstHandler;
- while (h != null) {
- out.putShort(h.start.position).putShort(h.end.position)
- .putShort(h.handler.position).putShort(h.type);
- h = h.next;
- }
- }
- attributeCount = 0;
- if (localVar != null) {
- ++attributeCount;
- }
- if (localVarType != null) {
- ++attributeCount;
- }
- if (lineNumber != null) {
- ++attributeCount;
- }
- if (stackMap != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && ctanns != null) {
- ++attributeCount;
- }
- if (ClassReader.ANNOTATIONS && ictanns != null) {
- ++attributeCount;
- }
- if (cattrs != null) {
- attributeCount += cattrs.getCount();
- }
- out.putShort(attributeCount);
- if (localVar != null) {
- out.putShort(cw.newUTF8("LocalVariableTable"));
- out.putInt(localVar.length + 2).putShort(localVarCount);
- out.putByteArray(localVar.data, 0, localVar.length);
- }
- if (localVarType != null) {
- out.putShort(cw.newUTF8("LocalVariableTypeTable"));
- out.putInt(localVarType.length + 2).putShort(localVarTypeCount);
- out.putByteArray(localVarType.data, 0, localVarType.length);
- }
- if (lineNumber != null) {
- out.putShort(cw.newUTF8("LineNumberTable"));
- out.putInt(lineNumber.length + 2).putShort(lineNumberCount);
- out.putByteArray(lineNumber.data, 0, lineNumber.length);
- }
- if (stackMap != null) {
- boolean zip = (cw.version & 0xFFFF) >= Opcodes.V1_6;
- out.putShort(cw.newUTF8(zip ? "StackMapTable" : "StackMap"));
- out.putInt(stackMap.length + 2).putShort(frameCount);
- out.putByteArray(stackMap.data, 0, stackMap.length);
- }
- if (ClassReader.ANNOTATIONS && ctanns != null) {
- out.putShort(cw.newUTF8("RuntimeVisibleTypeAnnotations"));
- ctanns.put(out);
- }
- if (ClassReader.ANNOTATIONS && ictanns != null) {
- out.putShort(cw.newUTF8("RuntimeInvisibleTypeAnnotations"));
- ictanns.put(out);
- }
- if (cattrs != null) {
- cattrs.put(cw, code.data, code.length, maxLocals, maxStack, out);
- }
- }
- if (exceptionCount > 0) {
- out.putShort(cw.newUTF8("Exceptions")).putInt(
- 2 * exceptionCount + 2);
- out.putShort(exceptionCount);
- for (int i = 0; i < exceptionCount; ++i) {
- out.putShort(exceptions[i]);
- }
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- if ((cw.version & 0xFFFF) < Opcodes.V1_5
- || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
- out.putShort(cw.newUTF8("Synthetic")).putInt(0);
- }
- }
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- out.putShort(cw.newUTF8("Deprecated")).putInt(0);
- }
- if (ClassReader.SIGNATURES && signature != null) {
- out.putShort(cw.newUTF8("Signature")).putInt(2)
- .putShort(cw.newUTF8(signature));
- }
- if (methodParameters != null) {
- out.putShort(cw.newUTF8("MethodParameters"));
- out.putInt(methodParameters.length + 1).putByte(
- methodParametersCount);
- out.putByteArray(methodParameters.data, 0, methodParameters.length);
- }
- if (ClassReader.ANNOTATIONS && annd != null) {
- out.putShort(cw.newUTF8("AnnotationDefault"));
- out.putInt(annd.length);
- out.putByteArray(annd.data, 0, annd.length);
- }
- if (ClassReader.ANNOTATIONS && anns != null) {
- out.putShort(cw.newUTF8("RuntimeVisibleAnnotations"));
- anns.put(out);
- }
- if (ClassReader.ANNOTATIONS && ianns != null) {
- out.putShort(cw.newUTF8("RuntimeInvisibleAnnotations"));
- ianns.put(out);
- }
- if (ClassReader.ANNOTATIONS && tanns != null) {
- out.putShort(cw.newUTF8("RuntimeVisibleTypeAnnotations"));
- tanns.put(out);
- }
- if (ClassReader.ANNOTATIONS && itanns != null) {
- out.putShort(cw.newUTF8("RuntimeInvisibleTypeAnnotations"));
- itanns.put(out);
- }
- if (ClassReader.ANNOTATIONS && panns != null) {
- out.putShort(cw.newUTF8("RuntimeVisibleParameterAnnotations"));
- AnnotationWriter.put(panns, synthetics, out);
- }
- if (ClassReader.ANNOTATIONS && ipanns != null) {
- out.putShort(cw.newUTF8("RuntimeInvisibleParameterAnnotations"));
- AnnotationWriter.put(ipanns, synthetics, out);
- }
- if (attrs != null) {
- attrs.put(cw, null, 0, -1, -1, out);
- }
- }
-
- // ------------------------------------------------------------------------
- // Utility methods: instruction resizing (used to handle GOTO_W and JSR_W)
- // ------------------------------------------------------------------------
-
- /**
- * Resizes and replaces the temporary instructions inserted by
- * {@link Label#resolve} for wide forward jumps, while keeping jump offsets
- * and instruction addresses consistent. This may require to resize other
- * existing instructions, or even to introduce new instructions: for
- * example, increasing the size of an instruction by 2 at the middle of a
- * method can increases the offset of an IFEQ instruction from 32766 to
- * 32768, in which case IFEQ 32766 must be replaced with IFNEQ 8 GOTO_W
- * 32765. This, in turn, may require to increase the size of another jump
- * instruction, and so on... All these operations are handled automatically
- * by this method.
- * <p>
- * <i>This method must be called after all the method that is being built
- * has been visited</i>. In particular, the {@link Label Label} objects used
- * to construct the method are no longer valid after this method has been
- * called.
- */
- private void resizeInstructions() {
- byte[] b = code.data; // bytecode of the method
- int u, v, label; // indexes in b
- int i, j; // loop indexes
- /*
- * 1st step: As explained above, resizing an instruction may require to
- * resize another one, which may require to resize yet another one, and
- * so on. The first step of the algorithm consists in finding all the
- * instructions that need to be resized, without modifying the code.
- * This is done by the following "fix point" algorithm:
- *
- * Parse the code to find the jump instructions whose offset will need
- * more than 2 bytes to be stored (the future offset is computed from
- * the current offset and from the number of bytes that will be inserted
- * or removed between the source and target instructions). For each such
- * instruction, adds an entry in (a copy of) the indexes and sizes
- * arrays (if this has not already been done in a previous iteration!).
- *
- * If at least one entry has been added during the previous step, go
- * back to the beginning, otherwise stop.
- *
- * In fact the real algorithm is complicated by the fact that the size
- * of TABLESWITCH and LOOKUPSWITCH instructions depends on their
- * position in the bytecode (because of padding). In order to ensure the
- * convergence of the algorithm, the number of bytes to be added or
- * removed from these instructions is over estimated during the previous
- * loop, and computed exactly only after the loop is finished (this
- * requires another pass to parse the bytecode of the method).
- */
- int[] allIndexes = new int[0]; // copy of indexes
- int[] allSizes = new int[0]; // copy of sizes
- boolean[] resize; // instructions to be resized
- int newOffset; // future offset of a jump instruction
-
- resize = new boolean[code.length];
-
- // 3 = loop again, 2 = loop ended, 1 = last pass, 0 = done
- int state = 3;
- do {
- if (state == 3) {
- state = 2;
- }
- u = 0;
- while (u < b.length) {
- int opcode = b[u] & 0xFF; // opcode of current instruction
- int insert = 0; // bytes to be added after this instruction
-
- switch (ClassWriter.TYPE[opcode]) {
- case ClassWriter.NOARG_INSN:
- case ClassWriter.IMPLVAR_INSN:
- u += 1;
- break;
- case ClassWriter.LABEL_INSN:
- if (opcode > 201) {
- // converts temporary opcodes 202 to 217, 218 and
- // 219 to IFEQ ... JSR (inclusive), IFNULL and
- // IFNONNULL
- opcode = opcode < 218 ? opcode - 49 : opcode - 20;
- label = u + readUnsignedShort(b, u + 1);
- } else {
- label = u + readShort(b, u + 1);
- }
- newOffset = getNewOffset(allIndexes, allSizes, u, label);
- if (newOffset < Short.MIN_VALUE
- || newOffset > Short.MAX_VALUE) {
- if (!resize[u]) {
- if (opcode == Opcodes.GOTO || opcode == Opcodes.JSR) {
- // two additional bytes will be required to
- // replace this GOTO or JSR instruction with
- // a GOTO_W or a JSR_W
- insert = 2;
- } else {
- // five additional bytes will be required to
- // replace this IFxxx <l> instruction with
- // IFNOTxxx <l'> GOTO_W <l>, where IFNOTxxx
- // is the "opposite" opcode of IFxxx (i.e.,
- // IFNE for IFEQ) and where <l'> designates
- // the instruction just after the GOTO_W.
- insert = 5;
- }
- resize[u] = true;
- }
- }
- u += 3;
- break;
- case ClassWriter.LABELW_INSN:
- u += 5;
- break;
- case ClassWriter.TABL_INSN:
- if (state == 1) {
- // true number of bytes to be added (or removed)
- // from this instruction = (future number of padding
- // bytes - current number of padding byte) -
- // previously over estimated variation =
- // = ((3 - newOffset%4) - (3 - u%4)) - u%4
- // = (-newOffset%4 + u%4) - u%4
- // = -(newOffset & 3)
- newOffset = getNewOffset(allIndexes, allSizes, 0, u);
- insert = -(newOffset & 3);
- } else if (!resize[u]) {
- // over estimation of the number of bytes to be
- // added to this instruction = 3 - current number
- // of padding bytes = 3 - (3 - u%4) = u%4 = u & 3
- insert = u & 3;
- resize[u] = true;
- }
- // skips instruction
- u = u + 4 - (u & 3);
- u += 4 * (readInt(b, u + 8) - readInt(b, u + 4) + 1) + 12;
- break;
- case ClassWriter.LOOK_INSN:
- if (state == 1) {
- // like TABL_INSN
- newOffset = getNewOffset(allIndexes, allSizes, 0, u);
- insert = -(newOffset & 3);
- } else if (!resize[u]) {
- // like TABL_INSN
- insert = u & 3;
- resize[u] = true;
- }
- // skips instruction
- u = u + 4 - (u & 3);
- u += 8 * readInt(b, u + 4) + 8;
- break;
- case ClassWriter.WIDE_INSN:
- opcode = b[u + 1] & 0xFF;
- if (opcode == Opcodes.IINC) {
- u += 6;
- } else {
- u += 4;
- }
- break;
- case ClassWriter.VAR_INSN:
- case ClassWriter.SBYTE_INSN:
- case ClassWriter.LDC_INSN:
- u += 2;
- break;
- case ClassWriter.SHORT_INSN:
- case ClassWriter.LDCW_INSN:
- case ClassWriter.FIELDORMETH_INSN:
- case ClassWriter.TYPE_INSN:
- case ClassWriter.IINC_INSN:
- u += 3;
- break;
- case ClassWriter.ITFMETH_INSN:
- case ClassWriter.INDYMETH_INSN:
- u += 5;
- break;
- // case ClassWriter.MANA_INSN:
- default:
- u += 4;
- break;
- }
- if (insert != 0) {
- // adds a new (u, insert) entry in the allIndexes and
- // allSizes arrays
- int[] newIndexes = new int[allIndexes.length + 1];
- int[] newSizes = new int[allSizes.length + 1];
- System.arraycopy(allIndexes, 0, newIndexes, 0,
- allIndexes.length);
- System.arraycopy(allSizes, 0, newSizes, 0, allSizes.length);
- newIndexes[allIndexes.length] = u;
- newSizes[allSizes.length] = insert;
- allIndexes = newIndexes;
- allSizes = newSizes;
- if (insert > 0) {
- state = 3;
- }
- }
- }
- if (state < 3) {
- --state;
- }
- } while (state != 0);
-
- // 2nd step:
- // copies the bytecode of the method into a new bytevector, updates the
- // offsets, and inserts (or removes) bytes as requested.
-
- ByteVector newCode = new ByteVector(code.length);
-
- u = 0;
- while (u < code.length) {
- int opcode = b[u] & 0xFF;
- switch (ClassWriter.TYPE[opcode]) {
- case ClassWriter.NOARG_INSN:
- case ClassWriter.IMPLVAR_INSN:
- newCode.putByte(opcode);
- u += 1;
- break;
- case ClassWriter.LABEL_INSN:
- if (opcode > 201) {
- // changes temporary opcodes 202 to 217 (inclusive), 218
- // and 219 to IFEQ ... JSR (inclusive), IFNULL and
- // IFNONNULL
- opcode = opcode < 218 ? opcode - 49 : opcode - 20;
- label = u + readUnsignedShort(b, u + 1);
- } else {
- label = u + readShort(b, u + 1);
- }
- newOffset = getNewOffset(allIndexes, allSizes, u, label);
- if (resize[u]) {
- // replaces GOTO with GOTO_W, JSR with JSR_W and IFxxx
- // <l> with IFNOTxxx <l'> GOTO_W <l>, where IFNOTxxx is
- // the "opposite" opcode of IFxxx (i.e., IFNE for IFEQ)
- // and where <l'> designates the instruction just after
- // the GOTO_W.
- if (opcode == Opcodes.GOTO) {
- newCode.putByte(200); // GOTO_W
- } else if (opcode == Opcodes.JSR) {
- newCode.putByte(201); // JSR_W
- } else {
- newCode.putByte(opcode <= 166 ? ((opcode + 1) ^ 1) - 1
- : opcode ^ 1);
- newCode.putShort(8); // jump offset
- newCode.putByte(200); // GOTO_W
- // newOffset now computed from start of GOTO_W
- newOffset -= 3;
- }
- newCode.putInt(newOffset);
- } else {
- newCode.putByte(opcode);
- newCode.putShort(newOffset);
- }
- u += 3;
- break;
- case ClassWriter.LABELW_INSN:
- label = u + readInt(b, u + 1);
- newOffset = getNewOffset(allIndexes, allSizes, u, label);
- newCode.putByte(opcode);
- newCode.putInt(newOffset);
- u += 5;
- break;
- case ClassWriter.TABL_INSN:
- // skips 0 to 3 padding bytes
- v = u;
- u = u + 4 - (v & 3);
- // reads and copies instruction
- newCode.putByte(Opcodes.TABLESWITCH);
- newCode.putByteArray(null, 0, (4 - newCode.length % 4) % 4);
- label = v + readInt(b, u);
- u += 4;
- newOffset = getNewOffset(allIndexes, allSizes, v, label);
- newCode.putInt(newOffset);
- j = readInt(b, u);
- u += 4;
- newCode.putInt(j);
- j = readInt(b, u) - j + 1;
- u += 4;
- newCode.putInt(readInt(b, u - 4));
- for (; j > 0; --j) {
- label = v + readInt(b, u);
- u += 4;
- newOffset = getNewOffset(allIndexes, allSizes, v, label);
- newCode.putInt(newOffset);
- }
- break;
- case ClassWriter.LOOK_INSN:
- // skips 0 to 3 padding bytes
- v = u;
- u = u + 4 - (v & 3);
- // reads and copies instruction
- newCode.putByte(Opcodes.LOOKUPSWITCH);
- newCode.putByteArray(null, 0, (4 - newCode.length % 4) % 4);
- label = v + readInt(b, u);
- u += 4;
- newOffset = getNewOffset(allIndexes, allSizes, v, label);
- newCode.putInt(newOffset);
- j = readInt(b, u);
- u += 4;
- newCode.putInt(j);
- for (; j > 0; --j) {
- newCode.putInt(readInt(b, u));
- u += 4;
- label = v + readInt(b, u);
- u += 4;
- newOffset = getNewOffset(allIndexes, allSizes, v, label);
- newCode.putInt(newOffset);
- }
- break;
- case ClassWriter.WIDE_INSN:
- opcode = b[u + 1] & 0xFF;
- if (opcode == Opcodes.IINC) {
- newCode.putByteArray(b, u, 6);
- u += 6;
- } else {
- newCode.putByteArray(b, u, 4);
- u += 4;
- }
- break;
- case ClassWriter.VAR_INSN:
- case ClassWriter.SBYTE_INSN:
- case ClassWriter.LDC_INSN:
- newCode.putByteArray(b, u, 2);
- u += 2;
- break;
- case ClassWriter.SHORT_INSN:
- case ClassWriter.LDCW_INSN:
- case ClassWriter.FIELDORMETH_INSN:
- case ClassWriter.TYPE_INSN:
- case ClassWriter.IINC_INSN:
- newCode.putByteArray(b, u, 3);
- u += 3;
- break;
- case ClassWriter.ITFMETH_INSN:
- case ClassWriter.INDYMETH_INSN:
- newCode.putByteArray(b, u, 5);
- u += 5;
- break;
- // case MANA_INSN:
- default:
- newCode.putByteArray(b, u, 4);
- u += 4;
- break;
- }
- }
-
- // updates the stack map frame labels
- if (compute == FRAMES) {
- Label l = labels;
- while (l != null) {
- /*
- * Detects the labels that are just after an IF instruction that
- * has been resized with the IFNOT GOTO_W pattern. These labels
- * are now the target of a jump instruction (the IFNOT
- * instruction). Note that we need the original label position
- * here. getNewOffset must therefore never have been called for
- * this label.
- */
- u = l.position - 3;
- if (u >= 0 && resize[u]) {
- l.status |= Label.TARGET;
- }
- getNewOffset(allIndexes, allSizes, l);
- l = l.successor;
- }
- // Update the offsets in the uninitialized types
- for (i = 0; i < cw.typeTable.length; ++i) {
- Item item = cw.typeTable[i];
- if (item != null && item.type == ClassWriter.TYPE_UNINIT) {
- item.intVal = getNewOffset(allIndexes, allSizes, 0,
- item.intVal);
- }
- }
- // The stack map frames are not serialized yet, so we don't need
- // to update them. They will be serialized in visitMaxs.
- } else if (frameCount > 0) {
- /*
- * Resizing an existing stack map frame table is really hard. Not
- * only the table must be parsed to update the offets, but new
- * frames may be needed for jump instructions that were inserted by
- * this method. And updating the offsets or inserting frames can
- * change the format of the following frames, in case of packed
- * frames. In practice the whole table must be recomputed. For this
- * the frames are marked as potentially invalid. This will cause the
- * whole class to be reread and rewritten with the COMPUTE_FRAMES
- * option (see the ClassWriter.toByteArray method). This is not very
- * efficient but is much easier and requires much less code than any
- * other method I can think of.
- */
- cw.invalidFrames = true;
- }
- // updates the exception handler block labels
- Handler h = firstHandler;
- while (h != null) {
- getNewOffset(allIndexes, allSizes, h.start);
- getNewOffset(allIndexes, allSizes, h.end);
- getNewOffset(allIndexes, allSizes, h.handler);
- h = h.next;
- }
- // updates the instructions addresses in the
- // local var and line number tables
- for (i = 0; i < 2; ++i) {
- ByteVector bv = i == 0 ? localVar : localVarType;
- if (bv != null) {
- b = bv.data;
- u = 0;
- while (u < bv.length) {
- label = readUnsignedShort(b, u);
- newOffset = getNewOffset(allIndexes, allSizes, 0, label);
- writeShort(b, u, newOffset);
- label += readUnsignedShort(b, u + 2);
- newOffset = getNewOffset(allIndexes, allSizes, 0, label)
- - newOffset;
- writeShort(b, u + 2, newOffset);
- u += 10;
- }
- }
- }
- if (lineNumber != null) {
- b = lineNumber.data;
- u = 0;
- while (u < lineNumber.length) {
- writeShort(
- b,
- u,
- getNewOffset(allIndexes, allSizes, 0,
- readUnsignedShort(b, u)));
- u += 4;
- }
- }
- // updates the labels of the other attributes
- Attribute attr = cattrs;
- while (attr != null) {
- Label[] labels = attr.getLabels();
- if (labels != null) {
- for (i = labels.length - 1; i >= 0; --i) {
- getNewOffset(allIndexes, allSizes, labels[i]);
- }
- }
- attr = attr.next;
- }
-
- // replaces old bytecodes with new ones
- code = newCode;
- }
-
- /**
- * Reads an unsigned short value in the given byte array.
- *
- * @param b
- * a byte array.
- * @param index
- * the start index of the value to be read.
- * @return the read value.
- */
- static int readUnsignedShort(final byte[] b, final int index) {
- return ((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF);
- }
-
- /**
- * Reads a signed short value in the given byte array.
- *
- * @param b
- * a byte array.
- * @param index
- * the start index of the value to be read.
- * @return the read value.
- */
- static short readShort(final byte[] b, final int index) {
- return (short) (((b[index] & 0xFF) << 8) | (b[index + 1] & 0xFF));
- }
-
- /**
- * Reads a signed int value in the given byte array.
- *
- * @param b
- * a byte array.
- * @param index
- * the start index of the value to be read.
- * @return the read value.
- */
- static int readInt(final byte[] b, final int index) {
- return ((b[index] & 0xFF) << 24) | ((b[index + 1] & 0xFF) << 16)
- | ((b[index + 2] & 0xFF) << 8) | (b[index + 3] & 0xFF);
- }
-
- /**
- * Writes a short value in the given byte array.
- *
- * @param b
- * a byte array.
- * @param index
- * where the first byte of the short value must be written.
- * @param s
- * the value to be written in the given byte array.
- */
- static void writeShort(final byte[] b, final int index, final int s) {
- b[index] = (byte) (s >>> 8);
- b[index + 1] = (byte) s;
- }
-
- /**
- * Computes the future value of a bytecode offset.
- * <p>
- * Note: it is possible to have several entries for the same instruction in
- * the <tt>indexes</tt> and <tt>sizes</tt>: two entries (index=a,size=b) and
- * (index=a,size=b') are equivalent to a single entry (index=a,size=b+b').
- *
- * @param indexes
- * current positions of the instructions to be resized. Each
- * instruction must be designated by the index of its <i>last</i>
- * byte, plus one (or, in other words, by the index of the
- * <i>first</i> byte of the <i>next</i> instruction).
- * @param sizes
- * the number of bytes to be <i>added</i> to the above
- * instructions. More precisely, for each i < <tt>len</tt>,
- * <tt>sizes</tt>[i] bytes will be added at the end of the
- * instruction designated by <tt>indexes</tt>[i] or, if
- * <tt>sizes</tt>[i] is negative, the <i>last</i> |
- * <tt>sizes[i]</tt>| bytes of the instruction will be removed
- * (the instruction size <i>must not</i> become negative or
- * null).
- * @param begin
- * index of the first byte of the source instruction.
- * @param end
- * index of the first byte of the target instruction.
- * @return the future value of the given bytecode offset.
- */
- static int getNewOffset(final int[] indexes, final int[] sizes,
- final int begin, final int end) {
- int offset = end - begin;
- for (int i = 0; i < indexes.length; ++i) {
- if (begin < indexes[i] && indexes[i] <= end) {
- // forward jump
- offset += sizes[i];
- } else if (end < indexes[i] && indexes[i] <= begin) {
- // backward jump
- offset -= sizes[i];
- }
- }
- return offset;
- }
-
- /**
- * Updates the offset of the given label.
- *
- * @param indexes
- * current positions of the instructions to be resized. Each
- * instruction must be designated by the index of its <i>last</i>
- * byte, plus one (or, in other words, by the index of the
- * <i>first</i> byte of the <i>next</i> instruction).
- * @param sizes
- * the number of bytes to be <i>added</i> to the above
- * instructions. More precisely, for each i < <tt>len</tt>,
- * <tt>sizes</tt>[i] bytes will be added at the end of the
- * instruction designated by <tt>indexes</tt>[i] or, if
- * <tt>sizes</tt>[i] is negative, the <i>last</i> |
- * <tt>sizes[i]</tt>| bytes of the instruction will be removed
- * (the instruction size <i>must not</i> become negative or
- * null).
- * @param label
- * the label whose offset must be updated.
- */
- static void getNewOffset(final int[] indexes, final int[] sizes,
- final Label label) {
- if ((label.status & Label.RESIZED) == 0) {
- label.position = getNewOffset(indexes, sizes, 0, label.position);
- label.status |= Label.RESIZED;
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/Opcodes.java b/src/asm/scala/tools/asm/Opcodes.java
deleted file mode 100644
index 24eaffa717..0000000000
--- a/src/asm/scala/tools/asm/Opcodes.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-/**
- * Defines the JVM opcodes, access flags and array type codes. This interface
- * does not define all the JVM opcodes because some opcodes are automatically
- * handled. For example, the xLOAD and xSTORE opcodes are automatically replaced
- * by xLOAD_n and xSTORE_n opcodes when possible. The xLOAD_n and xSTORE_n
- * opcodes are therefore not defined in this interface. Likewise for LDC,
- * automatically replaced by LDC_W or LDC2_W when necessary, WIDE, GOTO_W and
- * JSR_W.
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public interface Opcodes {
-
- // ASM API versions
-
- int ASM4 = 4 << 16 | 0 << 8 | 0;
- int ASM5 = 5 << 16 | 0 << 8 | 0;
-
- // versions
-
- int V1_1 = 3 << 16 | 45;
- int V1_2 = 0 << 16 | 46;
- int V1_3 = 0 << 16 | 47;
- int V1_4 = 0 << 16 | 48;
- int V1_5 = 0 << 16 | 49;
- int V1_6 = 0 << 16 | 50;
- int V1_7 = 0 << 16 | 51;
- int V1_8 = 0 << 16 | 52;
-
- // access flags
-
- int ACC_PUBLIC = 0x0001; // class, field, method
- int ACC_PRIVATE = 0x0002; // class, field, method
- int ACC_PROTECTED = 0x0004; // class, field, method
- int ACC_STATIC = 0x0008; // field, method
- int ACC_FINAL = 0x0010; // class, field, method, parameter
- int ACC_SUPER = 0x0020; // class
- int ACC_SYNCHRONIZED = 0x0020; // method
- int ACC_VOLATILE = 0x0040; // field
- int ACC_BRIDGE = 0x0040; // method
- int ACC_VARARGS = 0x0080; // method
- int ACC_TRANSIENT = 0x0080; // field
- int ACC_NATIVE = 0x0100; // method
- int ACC_INTERFACE = 0x0200; // class
- int ACC_ABSTRACT = 0x0400; // class, method
- int ACC_STRICT = 0x0800; // method
- int ACC_SYNTHETIC = 0x1000; // class, field, method, parameter
- int ACC_ANNOTATION = 0x2000; // class
- int ACC_ENUM = 0x4000; // class(?) field inner
- int ACC_MANDATED = 0x8000; // parameter
-
- // ASM specific pseudo access flags
-
- int ACC_DEPRECATED = 0x20000; // class, field, method
-
- // types for NEWARRAY
-
- int T_BOOLEAN = 4;
- int T_CHAR = 5;
- int T_FLOAT = 6;
- int T_DOUBLE = 7;
- int T_BYTE = 8;
- int T_SHORT = 9;
- int T_INT = 10;
- int T_LONG = 11;
-
- // tags for Handle
-
- int H_GETFIELD = 1;
- int H_GETSTATIC = 2;
- int H_PUTFIELD = 3;
- int H_PUTSTATIC = 4;
- int H_INVOKEVIRTUAL = 5;
- int H_INVOKESTATIC = 6;
- int H_INVOKESPECIAL = 7;
- int H_NEWINVOKESPECIAL = 8;
- int H_INVOKEINTERFACE = 9;
-
- // stack map frame types
-
- /**
- * Represents an expanded frame. See {@link ClassReader#EXPAND_FRAMES}.
- */
- int F_NEW = -1;
-
- /**
- * Represents a compressed frame with complete frame data.
- */
- int F_FULL = 0;
-
- /**
- * Represents a compressed frame where locals are the same as the locals in
- * the previous frame, except that additional 1-3 locals are defined, and
- * with an empty stack.
- */
- int F_APPEND = 1;
-
- /**
- * Represents a compressed frame where locals are the same as the locals in
- * the previous frame, except that the last 1-3 locals are absent and with
- * an empty stack.
- */
- int F_CHOP = 2;
-
- /**
- * Represents a compressed frame with exactly the same locals as the
- * previous frame and with an empty stack.
- */
- int F_SAME = 3;
-
- /**
- * Represents a compressed frame with exactly the same locals as the
- * previous frame and with a single value on the stack.
- */
- int F_SAME1 = 4;
-
- Integer TOP = new Integer(0);
- Integer INTEGER = new Integer(1);
- Integer FLOAT = new Integer(2);
- Integer DOUBLE = new Integer(3);
- Integer LONG = new Integer(4);
- Integer NULL = new Integer(5);
- Integer UNINITIALIZED_THIS = new Integer(6);
-
- // opcodes // visit method (- = idem)
-
- int NOP = 0; // visitInsn
- int ACONST_NULL = 1; // -
- int ICONST_M1 = 2; // -
- int ICONST_0 = 3; // -
- int ICONST_1 = 4; // -
- int ICONST_2 = 5; // -
- int ICONST_3 = 6; // -
- int ICONST_4 = 7; // -
- int ICONST_5 = 8; // -
- int LCONST_0 = 9; // -
- int LCONST_1 = 10; // -
- int FCONST_0 = 11; // -
- int FCONST_1 = 12; // -
- int FCONST_2 = 13; // -
- int DCONST_0 = 14; // -
- int DCONST_1 = 15; // -
- int BIPUSH = 16; // visitIntInsn
- int SIPUSH = 17; // -
- int LDC = 18; // visitLdcInsn
- // int LDC_W = 19; // -
- // int LDC2_W = 20; // -
- int ILOAD = 21; // visitVarInsn
- int LLOAD = 22; // -
- int FLOAD = 23; // -
- int DLOAD = 24; // -
- int ALOAD = 25; // -
- // int ILOAD_0 = 26; // -
- // int ILOAD_1 = 27; // -
- // int ILOAD_2 = 28; // -
- // int ILOAD_3 = 29; // -
- // int LLOAD_0 = 30; // -
- // int LLOAD_1 = 31; // -
- // int LLOAD_2 = 32; // -
- // int LLOAD_3 = 33; // -
- // int FLOAD_0 = 34; // -
- // int FLOAD_1 = 35; // -
- // int FLOAD_2 = 36; // -
- // int FLOAD_3 = 37; // -
- // int DLOAD_0 = 38; // -
- // int DLOAD_1 = 39; // -
- // int DLOAD_2 = 40; // -
- // int DLOAD_3 = 41; // -
- // int ALOAD_0 = 42; // -
- // int ALOAD_1 = 43; // -
- // int ALOAD_2 = 44; // -
- // int ALOAD_3 = 45; // -
- int IALOAD = 46; // visitInsn
- int LALOAD = 47; // -
- int FALOAD = 48; // -
- int DALOAD = 49; // -
- int AALOAD = 50; // -
- int BALOAD = 51; // -
- int CALOAD = 52; // -
- int SALOAD = 53; // -
- int ISTORE = 54; // visitVarInsn
- int LSTORE = 55; // -
- int FSTORE = 56; // -
- int DSTORE = 57; // -
- int ASTORE = 58; // -
- // int ISTORE_0 = 59; // -
- // int ISTORE_1 = 60; // -
- // int ISTORE_2 = 61; // -
- // int ISTORE_3 = 62; // -
- // int LSTORE_0 = 63; // -
- // int LSTORE_1 = 64; // -
- // int LSTORE_2 = 65; // -
- // int LSTORE_3 = 66; // -
- // int FSTORE_0 = 67; // -
- // int FSTORE_1 = 68; // -
- // int FSTORE_2 = 69; // -
- // int FSTORE_3 = 70; // -
- // int DSTORE_0 = 71; // -
- // int DSTORE_1 = 72; // -
- // int DSTORE_2 = 73; // -
- // int DSTORE_3 = 74; // -
- // int ASTORE_0 = 75; // -
- // int ASTORE_1 = 76; // -
- // int ASTORE_2 = 77; // -
- // int ASTORE_3 = 78; // -
- int IASTORE = 79; // visitInsn
- int LASTORE = 80; // -
- int FASTORE = 81; // -
- int DASTORE = 82; // -
- int AASTORE = 83; // -
- int BASTORE = 84; // -
- int CASTORE = 85; // -
- int SASTORE = 86; // -
- int POP = 87; // -
- int POP2 = 88; // -
- int DUP = 89; // -
- int DUP_X1 = 90; // -
- int DUP_X2 = 91; // -
- int DUP2 = 92; // -
- int DUP2_X1 = 93; // -
- int DUP2_X2 = 94; // -
- int SWAP = 95; // -
- int IADD = 96; // -
- int LADD = 97; // -
- int FADD = 98; // -
- int DADD = 99; // -
- int ISUB = 100; // -
- int LSUB = 101; // -
- int FSUB = 102; // -
- int DSUB = 103; // -
- int IMUL = 104; // -
- int LMUL = 105; // -
- int FMUL = 106; // -
- int DMUL = 107; // -
- int IDIV = 108; // -
- int LDIV = 109; // -
- int FDIV = 110; // -
- int DDIV = 111; // -
- int IREM = 112; // -
- int LREM = 113; // -
- int FREM = 114; // -
- int DREM = 115; // -
- int INEG = 116; // -
- int LNEG = 117; // -
- int FNEG = 118; // -
- int DNEG = 119; // -
- int ISHL = 120; // -
- int LSHL = 121; // -
- int ISHR = 122; // -
- int LSHR = 123; // -
- int IUSHR = 124; // -
- int LUSHR = 125; // -
- int IAND = 126; // -
- int LAND = 127; // -
- int IOR = 128; // -
- int LOR = 129; // -
- int IXOR = 130; // -
- int LXOR = 131; // -
- int IINC = 132; // visitIincInsn
- int I2L = 133; // visitInsn
- int I2F = 134; // -
- int I2D = 135; // -
- int L2I = 136; // -
- int L2F = 137; // -
- int L2D = 138; // -
- int F2I = 139; // -
- int F2L = 140; // -
- int F2D = 141; // -
- int D2I = 142; // -
- int D2L = 143; // -
- int D2F = 144; // -
- int I2B = 145; // -
- int I2C = 146; // -
- int I2S = 147; // -
- int LCMP = 148; // -
- int FCMPL = 149; // -
- int FCMPG = 150; // -
- int DCMPL = 151; // -
- int DCMPG = 152; // -
- int IFEQ = 153; // visitJumpInsn
- int IFNE = 154; // -
- int IFLT = 155; // -
- int IFGE = 156; // -
- int IFGT = 157; // -
- int IFLE = 158; // -
- int IF_ICMPEQ = 159; // -
- int IF_ICMPNE = 160; // -
- int IF_ICMPLT = 161; // -
- int IF_ICMPGE = 162; // -
- int IF_ICMPGT = 163; // -
- int IF_ICMPLE = 164; // -
- int IF_ACMPEQ = 165; // -
- int IF_ACMPNE = 166; // -
- int GOTO = 167; // -
- int JSR = 168; // -
- int RET = 169; // visitVarInsn
- int TABLESWITCH = 170; // visiTableSwitchInsn
- int LOOKUPSWITCH = 171; // visitLookupSwitch
- int IRETURN = 172; // visitInsn
- int LRETURN = 173; // -
- int FRETURN = 174; // -
- int DRETURN = 175; // -
- int ARETURN = 176; // -
- int RETURN = 177; // -
- int GETSTATIC = 178; // visitFieldInsn
- int PUTSTATIC = 179; // -
- int GETFIELD = 180; // -
- int PUTFIELD = 181; // -
- int INVOKEVIRTUAL = 182; // visitMethodInsn
- int INVOKESPECIAL = 183; // -
- int INVOKESTATIC = 184; // -
- int INVOKEINTERFACE = 185; // -
- int INVOKEDYNAMIC = 186; // visitInvokeDynamicInsn
- int NEW = 187; // visitTypeInsn
- int NEWARRAY = 188; // visitIntInsn
- int ANEWARRAY = 189; // visitTypeInsn
- int ARRAYLENGTH = 190; // visitInsn
- int ATHROW = 191; // -
- int CHECKCAST = 192; // visitTypeInsn
- int INSTANCEOF = 193; // -
- int MONITORENTER = 194; // visitInsn
- int MONITOREXIT = 195; // -
- // int WIDE = 196; // NOT VISITED
- int MULTIANEWARRAY = 197; // visitMultiANewArrayInsn
- int IFNULL = 198; // visitJumpInsn
- int IFNONNULL = 199; // -
- // int GOTO_W = 200; // -
- // int JSR_W = 201; // -
-}
diff --git a/src/asm/scala/tools/asm/Type.java b/src/asm/scala/tools/asm/Type.java
deleted file mode 100644
index c8f0048588..0000000000
--- a/src/asm/scala/tools/asm/Type.java
+++ /dev/null
@@ -1,896 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-
-/**
- * A Java field or method type. This class can be used to make it easier to
- * manipulate type and method descriptors.
- *
- * @author Eric Bruneton
- * @author Chris Nokleberg
- */
-public class Type {
-
- /**
- * The sort of the <tt>void</tt> type. See {@link #getSort getSort}.
- */
- public static final int VOID = 0;
-
- /**
- * The sort of the <tt>boolean</tt> type. See {@link #getSort getSort}.
- */
- public static final int BOOLEAN = 1;
-
- /**
- * The sort of the <tt>char</tt> type. See {@link #getSort getSort}.
- */
- public static final int CHAR = 2;
-
- /**
- * The sort of the <tt>byte</tt> type. See {@link #getSort getSort}.
- */
- public static final int BYTE = 3;
-
- /**
- * The sort of the <tt>short</tt> type. See {@link #getSort getSort}.
- */
- public static final int SHORT = 4;
-
- /**
- * The sort of the <tt>int</tt> type. See {@link #getSort getSort}.
- */
- public static final int INT = 5;
-
- /**
- * The sort of the <tt>float</tt> type. See {@link #getSort getSort}.
- */
- public static final int FLOAT = 6;
-
- /**
- * The sort of the <tt>long</tt> type. See {@link #getSort getSort}.
- */
- public static final int LONG = 7;
-
- /**
- * The sort of the <tt>double</tt> type. See {@link #getSort getSort}.
- */
- public static final int DOUBLE = 8;
-
- /**
- * The sort of array reference types. See {@link #getSort getSort}.
- */
- public static final int ARRAY = 9;
-
- /**
- * The sort of object reference types. See {@link #getSort getSort}.
- */
- public static final int OBJECT = 10;
-
- /**
- * The sort of method types. See {@link #getSort getSort}.
- */
- public static final int METHOD = 11;
-
- /**
- * The <tt>void</tt> type.
- */
- public static final Type VOID_TYPE = new Type(VOID, null, ('V' << 24)
- | (5 << 16) | (0 << 8) | 0, 1);
-
- /**
- * The <tt>boolean</tt> type.
- */
- public static final Type BOOLEAN_TYPE = new Type(BOOLEAN, null, ('Z' << 24)
- | (0 << 16) | (5 << 8) | 1, 1);
-
- /**
- * The <tt>char</tt> type.
- */
- public static final Type CHAR_TYPE = new Type(CHAR, null, ('C' << 24)
- | (0 << 16) | (6 << 8) | 1, 1);
-
- /**
- * The <tt>byte</tt> type.
- */
- public static final Type BYTE_TYPE = new Type(BYTE, null, ('B' << 24)
- | (0 << 16) | (5 << 8) | 1, 1);
-
- /**
- * The <tt>short</tt> type.
- */
- public static final Type SHORT_TYPE = new Type(SHORT, null, ('S' << 24)
- | (0 << 16) | (7 << 8) | 1, 1);
-
- /**
- * The <tt>int</tt> type.
- */
- public static final Type INT_TYPE = new Type(INT, null, ('I' << 24)
- | (0 << 16) | (0 << 8) | 1, 1);
-
- /**
- * The <tt>float</tt> type.
- */
- public static final Type FLOAT_TYPE = new Type(FLOAT, null, ('F' << 24)
- | (2 << 16) | (2 << 8) | 1, 1);
-
- /**
- * The <tt>long</tt> type.
- */
- public static final Type LONG_TYPE = new Type(LONG, null, ('J' << 24)
- | (1 << 16) | (1 << 8) | 2, 1);
-
- /**
- * The <tt>double</tt> type.
- */
- public static final Type DOUBLE_TYPE = new Type(DOUBLE, null, ('D' << 24)
- | (3 << 16) | (3 << 8) | 2, 1);
-
- // ------------------------------------------------------------------------
- // Fields
- // ------------------------------------------------------------------------
-
- /**
- * The sort of this Java type.
- */
- private final int sort;
-
- /**
- * A buffer containing the internal name of this Java type. This field is
- * only used for reference types.
- */
- private final char[] buf;
-
- /**
- * The offset of the internal name of this Java type in {@link #buf buf} or,
- * for primitive types, the size, descriptor and getOpcode offsets for this
- * type (byte 0 contains the size, byte 1 the descriptor, byte 2 the offset
- * for IALOAD or IASTORE, byte 3 the offset for all other instructions).
- */
- private final int off;
-
- /**
- * The length of the internal name of this Java type.
- */
- private final int len;
-
- // ------------------------------------------------------------------------
- // Constructors
- // ------------------------------------------------------------------------
-
- /**
- * Constructs a reference type.
- *
- * @param sort
- * the sort of the reference type to be constructed.
- * @param buf
- * a buffer containing the descriptor of the previous type.
- * @param off
- * the offset of this descriptor in the previous buffer.
- * @param len
- * the length of this descriptor.
- */
- private Type(final int sort, final char[] buf, final int off, final int len) {
- this.sort = sort;
- this.buf = buf;
- this.off = off;
- this.len = len;
- }
-
- /**
- * Returns the Java type corresponding to the given type descriptor.
- *
- * @param typeDescriptor
- * a field or method type descriptor.
- * @return the Java type corresponding to the given type descriptor.
- */
- public static Type getType(final String typeDescriptor) {
- return getType(typeDescriptor.toCharArray(), 0);
- }
-
- /**
- * Returns the Java type corresponding to the given internal name.
- *
- * @param internalName
- * an internal name.
- * @return the Java type corresponding to the given internal name.
- */
- public static Type getObjectType(final String internalName) {
- char[] buf = internalName.toCharArray();
- return new Type(buf[0] == '[' ? ARRAY : OBJECT, buf, 0, buf.length);
- }
-
- /**
- * Returns the Java type corresponding to the given method descriptor.
- * Equivalent to <code>Type.getType(methodDescriptor)</code>.
- *
- * @param methodDescriptor
- * a method descriptor.
- * @return the Java type corresponding to the given method descriptor.
- */
- public static Type getMethodType(final String methodDescriptor) {
- return getType(methodDescriptor.toCharArray(), 0);
- }
-
- /**
- * Returns the Java method type corresponding to the given argument and
- * return types.
- *
- * @param returnType
- * the return type of the method.
- * @param argumentTypes
- * the argument types of the method.
- * @return the Java type corresponding to the given argument and return
- * types.
- */
- public static Type getMethodType(final Type returnType,
- final Type... argumentTypes) {
- return getType(getMethodDescriptor(returnType, argumentTypes));
- }
-
- /**
- * Returns the Java type corresponding to the given class.
- *
- * @param c
- * a class.
- * @return the Java type corresponding to the given class.
- */
- public static Type getType(final Class<?> c) {
- if (c.isPrimitive()) {
- if (c == Integer.TYPE) {
- return INT_TYPE;
- } else if (c == Void.TYPE) {
- return VOID_TYPE;
- } else if (c == Boolean.TYPE) {
- return BOOLEAN_TYPE;
- } else if (c == Byte.TYPE) {
- return BYTE_TYPE;
- } else if (c == Character.TYPE) {
- return CHAR_TYPE;
- } else if (c == Short.TYPE) {
- return SHORT_TYPE;
- } else if (c == Double.TYPE) {
- return DOUBLE_TYPE;
- } else if (c == Float.TYPE) {
- return FLOAT_TYPE;
- } else /* if (c == Long.TYPE) */{
- return LONG_TYPE;
- }
- } else {
- return getType(getDescriptor(c));
- }
- }
-
- /**
- * Returns the Java method type corresponding to the given constructor.
- *
- * @param c
- * a {@link Constructor Constructor} object.
- * @return the Java method type corresponding to the given constructor.
- */
- public static Type getType(final Constructor<?> c) {
- return getType(getConstructorDescriptor(c));
- }
-
- /**
- * Returns the Java method type corresponding to the given method.
- *
- * @param m
- * a {@link Method Method} object.
- * @return the Java method type corresponding to the given method.
- */
- public static Type getType(final Method m) {
- return getType(getMethodDescriptor(m));
- }
-
- /**
- * Returns the Java types corresponding to the argument types of the given
- * method descriptor.
- *
- * @param methodDescriptor
- * a method descriptor.
- * @return the Java types corresponding to the argument types of the given
- * method descriptor.
- */
- public static Type[] getArgumentTypes(final String methodDescriptor) {
- char[] buf = methodDescriptor.toCharArray();
- int off = 1;
- int size = 0;
- while (true) {
- char car = buf[off++];
- if (car == ')') {
- break;
- } else if (car == 'L') {
- while (buf[off++] != ';') {
- }
- ++size;
- } else if (car != '[') {
- ++size;
- }
- }
- Type[] args = new Type[size];
- off = 1;
- size = 0;
- while (buf[off] != ')') {
- args[size] = getType(buf, off);
- off += args[size].len + (args[size].sort == OBJECT ? 2 : 0);
- size += 1;
- }
- return args;
- }
-
- /**
- * Returns the Java types corresponding to the argument types of the given
- * method.
- *
- * @param method
- * a method.
- * @return the Java types corresponding to the argument types of the given
- * method.
- */
- public static Type[] getArgumentTypes(final Method method) {
- Class<?>[] classes = method.getParameterTypes();
- Type[] types = new Type[classes.length];
- for (int i = classes.length - 1; i >= 0; --i) {
- types[i] = getType(classes[i]);
- }
- return types;
- }
-
- /**
- * Returns the Java type corresponding to the return type of the given
- * method descriptor.
- *
- * @param methodDescriptor
- * a method descriptor.
- * @return the Java type corresponding to the return type of the given
- * method descriptor.
- */
- public static Type getReturnType(final String methodDescriptor) {
- char[] buf = methodDescriptor.toCharArray();
- return getType(buf, methodDescriptor.indexOf(')') + 1);
- }
-
- /**
- * Returns the Java type corresponding to the return type of the given
- * method.
- *
- * @param method
- * a method.
- * @return the Java type corresponding to the return type of the given
- * method.
- */
- public static Type getReturnType(final Method method) {
- return getType(method.getReturnType());
- }
-
- /**
- * Computes the size of the arguments and of the return value of a method.
- *
- * @param desc
- * the descriptor of a method.
- * @return the size of the arguments of the method (plus one for the
- * implicit this argument), argSize, and the size of its return
- * value, retSize, packed into a single int i =
- * <tt>(argSize &lt;&lt; 2) | retSize</tt> (argSize is therefore equal to
- * <tt>i &gt;&gt; 2</tt>, and retSize to <tt>i &amp; 0x03</tt>).
- */
- public static int getArgumentsAndReturnSizes(final String desc) {
- int n = 1;
- int c = 1;
- while (true) {
- char car = desc.charAt(c++);
- if (car == ')') {
- car = desc.charAt(c);
- return n << 2
- | (car == 'V' ? 0 : (car == 'D' || car == 'J' ? 2 : 1));
- } else if (car == 'L') {
- while (desc.charAt(c++) != ';') {
- }
- n += 1;
- } else if (car == '[') {
- while ((car = desc.charAt(c)) == '[') {
- ++c;
- }
- if (car == 'D' || car == 'J') {
- n -= 1;
- }
- } else if (car == 'D' || car == 'J') {
- n += 2;
- } else {
- n += 1;
- }
- }
- }
-
- /**
- * Returns the Java type corresponding to the given type descriptor. For
- * method descriptors, buf is supposed to contain nothing more than the
- * descriptor itself.
- *
- * @param buf
- * a buffer containing a type descriptor.
- * @param off
- * the offset of this descriptor in the previous buffer.
- * @return the Java type corresponding to the given type descriptor.
- */
- private static Type getType(final char[] buf, final int off) {
- int len;
- switch (buf[off]) {
- case 'V':
- return VOID_TYPE;
- case 'Z':
- return BOOLEAN_TYPE;
- case 'C':
- return CHAR_TYPE;
- case 'B':
- return BYTE_TYPE;
- case 'S':
- return SHORT_TYPE;
- case 'I':
- return INT_TYPE;
- case 'F':
- return FLOAT_TYPE;
- case 'J':
- return LONG_TYPE;
- case 'D':
- return DOUBLE_TYPE;
- case '[':
- len = 1;
- while (buf[off + len] == '[') {
- ++len;
- }
- if (buf[off + len] == 'L') {
- ++len;
- while (buf[off + len] != ';') {
- ++len;
- }
- }
- return new Type(ARRAY, buf, off, len + 1);
- case 'L':
- len = 1;
- while (buf[off + len] != ';') {
- ++len;
- }
- return new Type(OBJECT, buf, off + 1, len - 1);
- // case '(':
- default:
- return new Type(METHOD, buf, off, buf.length - off);
- }
- }
-
- // ------------------------------------------------------------------------
- // Accessors
- // ------------------------------------------------------------------------
-
- /**
- * Returns the sort of this Java type.
- *
- * @return {@link #VOID VOID}, {@link #BOOLEAN BOOLEAN}, {@link #CHAR CHAR},
- * {@link #BYTE BYTE}, {@link #SHORT SHORT}, {@link #INT INT},
- * {@link #FLOAT FLOAT}, {@link #LONG LONG}, {@link #DOUBLE DOUBLE},
- * {@link #ARRAY ARRAY}, {@link #OBJECT OBJECT} or {@link #METHOD
- * METHOD}.
- */
- public int getSort() {
- return sort;
- }
-
- /**
- * Returns the number of dimensions of this array type. This method should
- * only be used for an array type.
- *
- * @return the number of dimensions of this array type.
- */
- public int getDimensions() {
- int i = 1;
- while (buf[off + i] == '[') {
- ++i;
- }
- return i;
- }
-
- /**
- * Returns the type of the elements of this array type. This method should
- * only be used for an array type.
- *
- * @return Returns the type of the elements of this array type.
- */
- public Type getElementType() {
- return getType(buf, off + getDimensions());
- }
-
- /**
- * Returns the binary name of the class corresponding to this type. This
- * method must not be used on method types.
- *
- * @return the binary name of the class corresponding to this type.
- */
- public String getClassName() {
- switch (sort) {
- case VOID:
- return "void";
- case BOOLEAN:
- return "boolean";
- case CHAR:
- return "char";
- case BYTE:
- return "byte";
- case SHORT:
- return "short";
- case INT:
- return "int";
- case FLOAT:
- return "float";
- case LONG:
- return "long";
- case DOUBLE:
- return "double";
- case ARRAY:
- StringBuilder sb = new StringBuilder(getElementType().getClassName());
- for (int i = getDimensions(); i > 0; --i) {
- sb.append("[]");
- }
- return sb.toString();
- case OBJECT:
- return new String(buf, off, len).replace('/', '.');
- default:
- return null;
- }
- }
-
- /**
- * Returns the internal name of the class corresponding to this object or
- * array type. The internal name of a class is its fully qualified name (as
- * returned by Class.getName(), where '.' are replaced by '/'. This method
- * should only be used for an object or array type.
- *
- * @return the internal name of the class corresponding to this object type.
- */
- public String getInternalName() {
- return new String(buf, off, len);
- }
-
- /**
- * Returns the argument types of methods of this type. This method should
- * only be used for method types.
- *
- * @return the argument types of methods of this type.
- */
- public Type[] getArgumentTypes() {
- return getArgumentTypes(getDescriptor());
- }
-
- /**
- * Returns the return type of methods of this type. This method should only
- * be used for method types.
- *
- * @return the return type of methods of this type.
- */
- public Type getReturnType() {
- return getReturnType(getDescriptor());
- }
-
- /**
- * Returns the size of the arguments and of the return value of methods of
- * this type. This method should only be used for method types.
- *
- * @return the size of the arguments (plus one for the implicit this
- * argument), argSize, and the size of the return value, retSize,
- * packed into a single
- * int i = <tt>(argSize &lt;&lt; 2) | retSize</tt>
- * (argSize is therefore equal to <tt>i &gt;&gt; 2</tt>,
- * and retSize to <tt>i &amp; 0x03</tt>).
- */
- public int getArgumentsAndReturnSizes() {
- return getArgumentsAndReturnSizes(getDescriptor());
- }
-
- // ------------------------------------------------------------------------
- // Conversion to type descriptors
- // ------------------------------------------------------------------------
-
- /**
- * Returns the descriptor corresponding to this Java type.
- *
- * @return the descriptor corresponding to this Java type.
- */
- public String getDescriptor() {
- StringBuffer buf = new StringBuffer();
- getDescriptor(buf);
- return buf.toString();
- }
-
- /**
- * Returns the descriptor corresponding to the given argument and return
- * types.
- *
- * @param returnType
- * the return type of the method.
- * @param argumentTypes
- * the argument types of the method.
- * @return the descriptor corresponding to the given argument and return
- * types.
- */
- public static String getMethodDescriptor(final Type returnType,
- final Type... argumentTypes) {
- StringBuffer buf = new StringBuffer();
- buf.append('(');
- for (int i = 0; i < argumentTypes.length; ++i) {
- argumentTypes[i].getDescriptor(buf);
- }
- buf.append(')');
- returnType.getDescriptor(buf);
- return buf.toString();
- }
-
- /**
- * Appends the descriptor corresponding to this Java type to the given
- * string buffer.
- *
- * @param buf
- * the string buffer to which the descriptor must be appended.
- */
- private void getDescriptor(final StringBuffer buf) {
- if (this.buf == null) {
- // descriptor is in byte 3 of 'off' for primitive types (buf ==
- // null)
- buf.append((char) ((off & 0xFF000000) >>> 24));
- } else if (sort == OBJECT) {
- buf.append('L');
- buf.append(this.buf, off, len);
- buf.append(';');
- } else { // sort == ARRAY || sort == METHOD
- buf.append(this.buf, off, len);
- }
- }
-
- // ------------------------------------------------------------------------
- // Direct conversion from classes to type descriptors,
- // without intermediate Type objects
- // ------------------------------------------------------------------------
-
- /**
- * Returns the internal name of the given class. The internal name of a
- * class is its fully qualified name, as returned by Class.getName(), where
- * '.' are replaced by '/'.
- *
- * @param c
- * an object or array class.
- * @return the internal name of the given class.
- */
- public static String getInternalName(final Class<?> c) {
- return c.getName().replace('.', '/');
- }
-
- /**
- * Returns the descriptor corresponding to the given Java type.
- *
- * @param c
- * an object class, a primitive class or an array class.
- * @return the descriptor corresponding to the given class.
- */
- public static String getDescriptor(final Class<?> c) {
- StringBuffer buf = new StringBuffer();
- getDescriptor(buf, c);
- return buf.toString();
- }
-
- /**
- * Returns the descriptor corresponding to the given constructor.
- *
- * @param c
- * a {@link Constructor Constructor} object.
- * @return the descriptor of the given constructor.
- */
- public static String getConstructorDescriptor(final Constructor<?> c) {
- Class<?>[] parameters = c.getParameterTypes();
- StringBuffer buf = new StringBuffer();
- buf.append('(');
- for (int i = 0; i < parameters.length; ++i) {
- getDescriptor(buf, parameters[i]);
- }
- return buf.append(")V").toString();
- }
-
- /**
- * Returns the descriptor corresponding to the given method.
- *
- * @param m
- * a {@link Method Method} object.
- * @return the descriptor of the given method.
- */
- public static String getMethodDescriptor(final Method m) {
- Class<?>[] parameters = m.getParameterTypes();
- StringBuffer buf = new StringBuffer();
- buf.append('(');
- for (int i = 0; i < parameters.length; ++i) {
- getDescriptor(buf, parameters[i]);
- }
- buf.append(')');
- getDescriptor(buf, m.getReturnType());
- return buf.toString();
- }
-
- /**
- * Appends the descriptor of the given class to the given string buffer.
- *
- * @param buf
- * the string buffer to which the descriptor must be appended.
- * @param c
- * the class whose descriptor must be computed.
- */
- private static void getDescriptor(final StringBuffer buf, final Class<?> c) {
- Class<?> d = c;
- while (true) {
- if (d.isPrimitive()) {
- char car;
- if (d == Integer.TYPE) {
- car = 'I';
- } else if (d == Void.TYPE) {
- car = 'V';
- } else if (d == Boolean.TYPE) {
- car = 'Z';
- } else if (d == Byte.TYPE) {
- car = 'B';
- } else if (d == Character.TYPE) {
- car = 'C';
- } else if (d == Short.TYPE) {
- car = 'S';
- } else if (d == Double.TYPE) {
- car = 'D';
- } else if (d == Float.TYPE) {
- car = 'F';
- } else /* if (d == Long.TYPE) */{
- car = 'J';
- }
- buf.append(car);
- return;
- } else if (d.isArray()) {
- buf.append('[');
- d = d.getComponentType();
- } else {
- buf.append('L');
- String name = d.getName();
- int len = name.length();
- for (int i = 0; i < len; ++i) {
- char car = name.charAt(i);
- buf.append(car == '.' ? '/' : car);
- }
- buf.append(';');
- return;
- }
- }
- }
-
- // ------------------------------------------------------------------------
- // Corresponding size and opcodes
- // ------------------------------------------------------------------------
-
- /**
- * Returns the size of values of this type. This method must not be used for
- * method types.
- *
- * @return the size of values of this type, i.e., 2 for <tt>long</tt> and
- * <tt>double</tt>, 0 for <tt>void</tt> and 1 otherwise.
- */
- public int getSize() {
- // the size is in byte 0 of 'off' for primitive types (buf == null)
- return buf == null ? (off & 0xFF) : 1;
- }
-
- /**
- * Returns a JVM instruction opcode adapted to this Java type. This method
- * must not be used for method types.
- *
- * @param opcode
- * a JVM instruction opcode. This opcode must be one of ILOAD,
- * ISTORE, IALOAD, IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG,
- * ISHL, ISHR, IUSHR, IAND, IOR, IXOR and IRETURN.
- * @return an opcode that is similar to the given opcode, but adapted to
- * this Java type. For example, if this type is <tt>float</tt> and
- * <tt>opcode</tt> is IRETURN, this method returns FRETURN.
- */
- public int getOpcode(final int opcode) {
- if (opcode == Opcodes.IALOAD || opcode == Opcodes.IASTORE) {
- // the offset for IALOAD or IASTORE is in byte 1 of 'off' for
- // primitive types (buf == null)
- return opcode + (buf == null ? (off & 0xFF00) >> 8 : 4);
- } else {
- // the offset for other instructions is in byte 2 of 'off' for
- // primitive types (buf == null)
- return opcode + (buf == null ? (off & 0xFF0000) >> 16 : 4);
- }
- }
-
- // ------------------------------------------------------------------------
- // Equals, hashCode and toString
- // ------------------------------------------------------------------------
-
- /**
- * Tests if the given object is equal to this type.
- *
- * @param o
- * the object to be compared to this type.
- * @return <tt>true</tt> if the given object is equal to this type.
- */
- @Override
- public boolean equals(final Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof Type)) {
- return false;
- }
- Type t = (Type) o;
- if (sort != t.sort) {
- return false;
- }
- if (sort >= ARRAY) {
- if (len != t.len) {
- return false;
- }
- for (int i = off, j = t.off, end = i + len; i < end; i++, j++) {
- if (buf[i] != t.buf[j]) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * Returns a hash code value for this type.
- *
- * @return a hash code value for this type.
- */
- @Override
- public int hashCode() {
- int hc = 13 * sort;
- if (sort >= ARRAY) {
- for (int i = off, end = i + len; i < end; i++) {
- hc = 17 * (hc + buf[i]);
- }
- }
- return hc;
- }
-
- /**
- * Returns a string representation of this type.
- *
- * @return the descriptor of this type.
- */
- @Override
- public String toString() {
- return getDescriptor();
- }
-}
diff --git a/src/asm/scala/tools/asm/TypePath.java b/src/asm/scala/tools/asm/TypePath.java
deleted file mode 100644
index d4c6f0d857..0000000000
--- a/src/asm/scala/tools/asm/TypePath.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2013 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm;
-
-/**
- * The path to a type argument, wildcard bound, array element type, or static
- * inner type within an enclosing type.
- *
- * @author Eric Bruneton
- */
-public class TypePath {
-
- /**
- * A type path step that steps into the element type of an array type. See
- * {@link #getStep getStep}.
- */
- public final static int ARRAY_ELEMENT = 0;
-
- /**
- * A type path step that steps into the nested type of a class type. See
- * {@link #getStep getStep}.
- */
- public final static int INNER_TYPE = 1;
-
- /**
- * A type path step that steps into the bound of a wildcard type. See
- * {@link #getStep getStep}.
- */
- public final static int WILDCARD_BOUND = 2;
-
- /**
- * A type path step that steps into a type argument of a generic type. See
- * {@link #getStep getStep}.
- */
- public final static int TYPE_ARGUMENT = 3;
-
- /**
- * The byte array where the path is stored, in Java class file format.
- */
- byte[] b;
-
- /**
- * The offset of the first byte of the type path in 'b'.
- */
- int offset;
-
- /**
- * Creates a new type path.
- *
- * @param b
- * the byte array containing the type path in Java class file
- * format.
- * @param offset
- * the offset of the first byte of the type path in 'b'.
- */
- TypePath(byte[] b, int offset) {
- this.b = b;
- this.offset = offset;
- }
-
- /**
- * Returns the length of this path.
- *
- * @return the length of this path.
- */
- public int getLength() {
- return b[offset];
- }
-
- /**
- * Returns the value of the given step of this path.
- *
- * @param index
- * an index between 0 and {@link #getLength()}, exclusive.
- * @return {@link #ARRAY_ELEMENT ARRAY_ELEMENT}, {@link #INNER_TYPE
- * INNER_TYPE}, {@link #WILDCARD_BOUND WILDCARD_BOUND}, or
- * {@link #TYPE_ARGUMENT TYPE_ARGUMENT}.
- */
- public int getStep(int index) {
- return b[offset + 2 * index + 1];
- }
-
- /**
- * Returns the index of the type argument that the given step is stepping
- * into. This method should only be used for steps whose value is
- * {@link #TYPE_ARGUMENT TYPE_ARGUMENT}.
- *
- * @param index
- * an index between 0 and {@link #getLength()}, exclusive.
- * @return the index of the type argument that the given step is stepping
- * into.
- */
- public int getStepArgument(int index) {
- return b[offset + 2 * index + 2];
- }
-
- /**
- * Converts a type path in string form, in the format used by
- * {@link #toString()}, into a TypePath object.
- *
- * @param typePath
- * a type path in string form, in the format used by
- * {@link #toString()}. May be null or empty.
- * @return the corresponding TypePath object, or null if the path is empty.
- */
- public static TypePath fromString(final String typePath) {
- if (typePath == null || typePath.length() == 0) {
- return null;
- }
- int n = typePath.length();
- ByteVector out = new ByteVector(n);
- out.putByte(0);
- for (int i = 0; i < n;) {
- char c = typePath.charAt(i++);
- if (c == '[') {
- out.put11(ARRAY_ELEMENT, 0);
- } else if (c == '.') {
- out.put11(INNER_TYPE, 0);
- } else if (c == '*') {
- out.put11(WILDCARD_BOUND, 0);
- } else if (c >= '0' && c <= '9') {
- int typeArg = c - '0';
- while (i < n && (c = typePath.charAt(i)) >= '0' && c <= '9') {
- typeArg = typeArg * 10 + c - '0';
- i += 1;
- }
- out.put11(TYPE_ARGUMENT, typeArg);
- }
- }
- out.data[0] = (byte) (out.length / 2);
- return new TypePath(out.data, 0);
- }
-
- /**
- * Returns a string representation of this type path. {@link #ARRAY_ELEMENT
- * ARRAY_ELEMENT} steps are represented with '[', {@link #INNER_TYPE
- * INNER_TYPE} steps with '.', {@link #WILDCARD_BOUND WILDCARD_BOUND} steps
- * with '*' and {@link #TYPE_ARGUMENT TYPE_ARGUMENT} steps with their type
- * argument index in decimal form.
- */
- @Override
- public String toString() {
- int length = getLength();
- StringBuilder result = new StringBuilder(length * 2);
- for (int i = 0; i < length; ++i) {
- switch (getStep(i)) {
- case ARRAY_ELEMENT:
- result.append('[');
- break;
- case INNER_TYPE:
- result.append('.');
- break;
- case WILDCARD_BOUND:
- result.append('*');
- break;
- case TYPE_ARGUMENT:
- result.append(getStepArgument(i));
- break;
- default:
- result.append('_');
- }
- }
- return result.toString();
- }
-}
diff --git a/src/asm/scala/tools/asm/TypeReference.java b/src/asm/scala/tools/asm/TypeReference.java
deleted file mode 100644
index 118b0f6529..0000000000
--- a/src/asm/scala/tools/asm/TypeReference.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2013 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm;
-
-/**
- * A reference to a type appearing in a class, field or method declaration, or
- * on an instruction. Such a reference designates the part of the class where
- * the referenced type is appearing (e.g. an 'extends', 'implements' or 'throws'
- * clause, a 'new' instruction, a 'catch' clause, a type cast, a local variable
- * declaration, etc).
- *
- * @author Eric Bruneton
- */
-public class TypeReference {
-
- /**
- * The sort of type references that target a type parameter of a generic
- * class. See {@link #getSort getSort}.
- */
- public final static int CLASS_TYPE_PARAMETER = 0x00;
-
- /**
- * The sort of type references that target a type parameter of a generic
- * method. See {@link #getSort getSort}.
- */
- public final static int METHOD_TYPE_PARAMETER = 0x01;
-
- /**
- * The sort of type references that target the super class of a class or one
- * of the interfaces it implements. See {@link #getSort getSort}.
- */
- public final static int CLASS_EXTENDS = 0x10;
-
- /**
- * The sort of type references that target a bound of a type parameter of a
- * generic class. See {@link #getSort getSort}.
- */
- public final static int CLASS_TYPE_PARAMETER_BOUND = 0x11;
-
- /**
- * The sort of type references that target a bound of a type parameter of a
- * generic method. See {@link #getSort getSort}.
- */
- public final static int METHOD_TYPE_PARAMETER_BOUND = 0x12;
-
- /**
- * The sort of type references that target the type of a field. See
- * {@link #getSort getSort}.
- */
- public final static int FIELD = 0x13;
-
- /**
- * The sort of type references that target the return type of a method. See
- * {@link #getSort getSort}.
- */
- public final static int METHOD_RETURN = 0x14;
-
- /**
- * The sort of type references that target the receiver type of a method.
- * See {@link #getSort getSort}.
- */
- public final static int METHOD_RECEIVER = 0x15;
-
- /**
- * The sort of type references that target the type of a formal parameter of
- * a method. See {@link #getSort getSort}.
- */
- public final static int METHOD_FORMAL_PARAMETER = 0x16;
-
- /**
- * The sort of type references that target the type of an exception declared
- * in the throws clause of a method. See {@link #getSort getSort}.
- */
- public final static int THROWS = 0x17;
-
- /**
- * The sort of type references that target the type of a local variable in a
- * method. See {@link #getSort getSort}.
- */
- public final static int LOCAL_VARIABLE = 0x40;
-
- /**
- * The sort of type references that target the type of a resource variable
- * in a method. See {@link #getSort getSort}.
- */
- public final static int RESOURCE_VARIABLE = 0x41;
-
- /**
- * The sort of type references that target the type of the exception of a
- * 'catch' clause in a method. See {@link #getSort getSort}.
- */
- public final static int EXCEPTION_PARAMETER = 0x42;
-
- /**
- * The sort of type references that target the type declared in an
- * 'instanceof' instruction. See {@link #getSort getSort}.
- */
- public final static int INSTANCEOF = 0x43;
-
- /**
- * The sort of type references that target the type of the object created by
- * a 'new' instruction. See {@link #getSort getSort}.
- */
- public final static int NEW = 0x44;
-
- /**
- * The sort of type references that target the receiver type of a
- * constructor reference. See {@link #getSort getSort}.
- */
- public final static int CONSTRUCTOR_REFERENCE = 0x45;
-
- /**
- * The sort of type references that target the receiver type of a method
- * reference. See {@link #getSort getSort}.
- */
- public final static int METHOD_REFERENCE = 0x46;
-
- /**
- * The sort of type references that target the type declared in an explicit
- * or implicit cast instruction. See {@link #getSort getSort}.
- */
- public final static int CAST = 0x47;
-
- /**
- * The sort of type references that target a type parameter of a generic
- * constructor in a constructor call. See {@link #getSort getSort}.
- */
- public final static int CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT = 0x48;
-
- /**
- * The sort of type references that target a type parameter of a generic
- * method in a method call. See {@link #getSort getSort}.
- */
- public final static int METHOD_INVOCATION_TYPE_ARGUMENT = 0x49;
-
- /**
- * The sort of type references that target a type parameter of a generic
- * constructor in a constructor reference. See {@link #getSort getSort}.
- */
- public final static int CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT = 0x4A;
-
- /**
- * The sort of type references that target a type parameter of a generic
- * method in a method reference. See {@link #getSort getSort}.
- */
- public final static int METHOD_REFERENCE_TYPE_ARGUMENT = 0x4B;
-
- /**
- * The type reference value in Java class file format.
- */
- private int value;
-
- /**
- * Creates a new TypeReference.
- *
- * @param typeRef
- * the int encoded value of the type reference, as received in a
- * visit method related to type annotations, like
- * visitTypeAnnotation.
- */
- public TypeReference(int typeRef) {
- this.value = typeRef;
- }
-
- /**
- * Returns a type reference of the given sort.
- *
- * @param sort
- * {@link #FIELD FIELD}, {@link #METHOD_RETURN METHOD_RETURN},
- * {@link #METHOD_RECEIVER METHOD_RECEIVER},
- * {@link #LOCAL_VARIABLE LOCAL_VARIABLE},
- * {@link #RESOURCE_VARIABLE RESOURCE_VARIABLE},
- * {@link #INSTANCEOF INSTANCEOF}, {@link #NEW NEW},
- * {@link #CONSTRUCTOR_REFERENCE CONSTRUCTOR_REFERENCE}, or
- * {@link #METHOD_REFERENCE METHOD_REFERENCE}.
- * @return a type reference of the given sort.
- */
- public static TypeReference newTypeReference(int sort) {
- return new TypeReference(sort << 24);
- }
-
- /**
- * Returns a reference to a type parameter of a generic class or method.
- *
- * @param sort
- * {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER} or
- * {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER}.
- * @param paramIndex
- * the type parameter index.
- * @return a reference to the given generic class or method type parameter.
- */
- public static TypeReference newTypeParameterReference(int sort,
- int paramIndex) {
- return new TypeReference((sort << 24) | (paramIndex << 16));
- }
-
- /**
- * Returns a reference to a type parameter bound of a generic class or
- * method.
- *
- * @param sort
- * {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER} or
- * {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER}.
- * @param paramIndex
- * the type parameter index.
- * @param boundIndex
- * the type bound index within the above type parameters.
- * @return a reference to the given generic class or method type parameter
- * bound.
- */
- public static TypeReference newTypeParameterBoundReference(int sort,
- int paramIndex, int boundIndex) {
- return new TypeReference((sort << 24) | (paramIndex << 16)
- | (boundIndex << 8));
- }
-
- /**
- * Returns a reference to the super class or to an interface of the
- * 'implements' clause of a class.
- *
- * @param itfIndex
- * the index of an interface in the 'implements' clause of a
- * class, or -1 to reference the super class of the class.
- * @return a reference to the given super type of a class.
- */
- public static TypeReference newSuperTypeReference(int itfIndex) {
- itfIndex &= 0xFFFF;
- return new TypeReference((CLASS_EXTENDS << 24) | (itfIndex << 8));
- }
-
- /**
- * Returns a reference to the type of a formal parameter of a method.
- *
- * @param paramIndex
- * the formal parameter index.
- *
- * @return a reference to the type of the given method formal parameter.
- */
- public static TypeReference newFormalParameterReference(int paramIndex) {
- return new TypeReference((METHOD_FORMAL_PARAMETER << 24)
- | (paramIndex << 16));
- }
-
- /**
- * Returns a reference to the type of an exception, in a 'throws' clause of
- * a method.
- *
- * @param exceptionIndex
- * the index of an exception in a 'throws' clause of a method.
- *
- * @return a reference to the type of the given exception.
- */
- public static TypeReference newExceptionReference(int exceptionIndex) {
- return new TypeReference((THROWS << 24) | (exceptionIndex << 8));
- }
-
- /**
- * Returns a reference to the type of the exception declared in a 'catch'
- * clause of a method.
- *
- * @param tryCatchBlockIndex
- * the index of a try catch block (using the order in which they
- * are visited with visitTryCatchBlock).
- *
- * @return a reference to the type of the given exception.
- */
- public static TypeReference newTryCatchReference(int tryCatchBlockIndex) {
- return new TypeReference((EXCEPTION_PARAMETER << 24)
- | (tryCatchBlockIndex << 8));
- }
-
- /**
- * Returns a reference to the type of a type argument in a constructor or
- * method call or reference.
- *
- * @param sort
- * {@link #CAST CAST},
- * {@link #CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
- * CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
- * {@link #METHOD_INVOCATION_TYPE_ARGUMENT
- * METHOD_INVOCATION_TYPE_ARGUMENT},
- * {@link #CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
- * CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
- * {@link #METHOD_REFERENCE_TYPE_ARGUMENT
- * METHOD_REFERENCE_TYPE_ARGUMENT}.
- * @param argIndex
- * the type argument index.
- *
- * @return a reference to the type of the given type argument.
- */
- public static TypeReference newTypeArgumentReference(int sort, int argIndex) {
- return new TypeReference((sort << 24) | argIndex);
- }
-
- /**
- * Returns the sort of this type reference.
- *
- * @return {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER},
- * {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER},
- * {@link #CLASS_EXTENDS CLASS_EXTENDS},
- * {@link #CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND},
- * {@link #METHOD_TYPE_PARAMETER_BOUND METHOD_TYPE_PARAMETER_BOUND},
- * {@link #FIELD FIELD}, {@link #METHOD_RETURN METHOD_RETURN},
- * {@link #METHOD_RECEIVER METHOD_RECEIVER},
- * {@link #METHOD_FORMAL_PARAMETER METHOD_FORMAL_PARAMETER},
- * {@link #THROWS THROWS}, {@link #LOCAL_VARIABLE LOCAL_VARIABLE},
- * {@link #RESOURCE_VARIABLE RESOURCE_VARIABLE},
- * {@link #EXCEPTION_PARAMETER EXCEPTION_PARAMETER},
- * {@link #INSTANCEOF INSTANCEOF}, {@link #NEW NEW},
- * {@link #CONSTRUCTOR_REFERENCE CONSTRUCTOR_REFERENCE},
- * {@link #METHOD_REFERENCE METHOD_REFERENCE}, {@link #CAST CAST},
- * {@link #CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
- * CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
- * {@link #METHOD_INVOCATION_TYPE_ARGUMENT
- * METHOD_INVOCATION_TYPE_ARGUMENT},
- * {@link #CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
- * CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
- * {@link #METHOD_REFERENCE_TYPE_ARGUMENT
- * METHOD_REFERENCE_TYPE_ARGUMENT}.
- */
- public int getSort() {
- return value >>> 24;
- }
-
- /**
- * Returns the index of the type parameter referenced by this type
- * reference. This method must only be used for type references whose sort
- * is {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER},
- * {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER},
- * {@link #CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND} or
- * {@link #METHOD_TYPE_PARAMETER_BOUND METHOD_TYPE_PARAMETER_BOUND}.
- *
- * @return a type parameter index.
- */
- public int getTypeParameterIndex() {
- return (value & 0x00FF0000) >> 16;
- }
-
- /**
- * Returns the index of the type parameter bound, within the type parameter
- * {@link #getTypeParameterIndex}, referenced by this type reference. This
- * method must only be used for type references whose sort is
- * {@link #CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND} or
- * {@link #METHOD_TYPE_PARAMETER_BOUND METHOD_TYPE_PARAMETER_BOUND}.
- *
- * @return a type parameter bound index.
- */
- public int getTypeParameterBoundIndex() {
- return (value & 0x0000FF00) >> 8;
- }
-
- /**
- * Returns the index of the "super type" of a class that is referenced by
- * this type reference. This method must only be used for type references
- * whose sort is {@link #CLASS_EXTENDS CLASS_EXTENDS}.
- *
- * @return the index of an interface in the 'implements' clause of a class,
- * or -1 if this type reference references the type of the super
- * class.
- */
- public int getSuperTypeIndex() {
- return (short) ((value & 0x00FFFF00) >> 8);
- }
-
- /**
- * Returns the index of the formal parameter whose type is referenced by
- * this type reference. This method must only be used for type references
- * whose sort is {@link #METHOD_FORMAL_PARAMETER METHOD_FORMAL_PARAMETER}.
- *
- * @return a formal parameter index.
- */
- public int getFormalParameterIndex() {
- return (value & 0x00FF0000) >> 16;
- }
-
- /**
- * Returns the index of the exception, in a 'throws' clause of a method,
- * whose type is referenced by this type reference. This method must only be
- * used for type references whose sort is {@link #THROWS THROWS}.
- *
- * @return the index of an exception in the 'throws' clause of a method.
- */
- public int getExceptionIndex() {
- return (value & 0x00FFFF00) >> 8;
- }
-
- /**
- * Returns the index of the try catch block (using the order in which they
- * are visited with visitTryCatchBlock), whose 'catch' type is referenced by
- * this type reference. This method must only be used for type references
- * whose sort is {@link #EXCEPTION_PARAMETER EXCEPTION_PARAMETER} .
- *
- * @return the index of an exception in the 'throws' clause of a method.
- */
- public int getTryCatchBlockIndex() {
- return (value & 0x00FFFF00) >> 8;
- }
-
- /**
- * Returns the index of the type argument referenced by this type reference.
- * This method must only be used for type references whose sort is
- * {@link #CAST CAST}, {@link #CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
- * CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
- * {@link #METHOD_INVOCATION_TYPE_ARGUMENT METHOD_INVOCATION_TYPE_ARGUMENT},
- * {@link #CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
- * CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
- * {@link #METHOD_REFERENCE_TYPE_ARGUMENT METHOD_REFERENCE_TYPE_ARGUMENT}.
- *
- * @return a type parameter index.
- */
- public int getTypeArgumentIndex() {
- return value & 0xFF;
- }
-
- /**
- * Returns the int encoded value of this type reference, suitable for use in
- * visit methods related to type annotations, like visitTypeAnnotation.
- *
- * @return the int encoded value of this type reference.
- */
- public int getValue() {
- return value;
- }
-}
diff --git a/src/asm/scala/tools/asm/commons/CodeSizeEvaluator.java b/src/asm/scala/tools/asm/commons/CodeSizeEvaluator.java
deleted file mode 100644
index 80c07bdae0..0000000000
--- a/src/asm/scala/tools/asm/commons/CodeSizeEvaluator.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.commons;
-
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A {@link MethodVisitor} that can be used to approximate method size.
- *
- * @author Eugene Kuleshov
- */
-public class CodeSizeEvaluator extends MethodVisitor implements Opcodes {
-
- private int minSize;
-
- private int maxSize;
-
- public CodeSizeEvaluator(final MethodVisitor mv) {
- this(Opcodes.ASM5, mv);
- }
-
- protected CodeSizeEvaluator(final int api, final MethodVisitor mv) {
- super(api, mv);
- }
-
- public int getMinSize() {
- return this.minSize;
- }
-
- public int getMaxSize() {
- return this.maxSize;
- }
-
- @Override
- public void visitInsn(final int opcode) {
- minSize += 1;
- maxSize += 1;
- if (mv != null) {
- mv.visitInsn(opcode);
- }
- }
-
- @Override
- public void visitIntInsn(final int opcode, final int operand) {
- if (opcode == SIPUSH) {
- minSize += 3;
- maxSize += 3;
- } else {
- minSize += 2;
- maxSize += 2;
- }
- if (mv != null) {
- mv.visitIntInsn(opcode, operand);
- }
- }
-
- @Override
- public void visitVarInsn(final int opcode, final int var) {
- if (var < 4 && opcode != RET) {
- minSize += 1;
- maxSize += 1;
- } else if (var >= 256) {
- minSize += 4;
- maxSize += 4;
- } else {
- minSize += 2;
- maxSize += 2;
- }
- if (mv != null) {
- mv.visitVarInsn(opcode, var);
- }
- }
-
- @Override
- public void visitTypeInsn(final int opcode, final String type) {
- minSize += 3;
- maxSize += 3;
- if (mv != null) {
- mv.visitTypeInsn(opcode, type);
- }
- }
-
- @Override
- public void visitFieldInsn(final int opcode, final String owner,
- final String name, final String desc) {
- minSize += 3;
- maxSize += 3;
- if (mv != null) {
- mv.visitFieldInsn(opcode, owner, name, desc);
- }
- }
-
- @Deprecated
- @Override
- public void visitMethodInsn(final int opcode, final String owner,
- final String name, final String desc) {
- if (api >= Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc);
- return;
- }
- doVisitMethodInsn(opcode, owner, name, desc,
- opcode == Opcodes.INVOKEINTERFACE);
- }
-
- @Override
- public void visitMethodInsn(final int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- if (api < Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc, itf);
- return;
- }
- doVisitMethodInsn(opcode, owner, name, desc, itf);
- }
-
- private void doVisitMethodInsn(int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- if (opcode == INVOKEINTERFACE) {
- minSize += 5;
- maxSize += 5;
- } else {
- minSize += 3;
- maxSize += 3;
- }
- if (mv != null) {
- mv.visitMethodInsn(opcode, owner, name, desc, itf);
- }
- }
-
- @Override
- public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
- Object... bsmArgs) {
- minSize += 5;
- maxSize += 5;
- if (mv != null) {
- mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
- }
- }
-
- @Override
- public void visitJumpInsn(final int opcode, final Label label) {
- minSize += 3;
- if (opcode == GOTO || opcode == JSR) {
- maxSize += 5;
- } else {
- maxSize += 8;
- }
- if (mv != null) {
- mv.visitJumpInsn(opcode, label);
- }
- }
-
- @Override
- public void visitLdcInsn(final Object cst) {
- if (cst instanceof Long || cst instanceof Double) {
- minSize += 3;
- maxSize += 3;
- } else {
- minSize += 2;
- maxSize += 3;
- }
- if (mv != null) {
- mv.visitLdcInsn(cst);
- }
- }
-
- @Override
- public void visitIincInsn(final int var, final int increment) {
- if (var > 255 || increment > 127 || increment < -128) {
- minSize += 6;
- maxSize += 6;
- } else {
- minSize += 3;
- maxSize += 3;
- }
- if (mv != null) {
- mv.visitIincInsn(var, increment);
- }
- }
-
- @Override
- public void visitTableSwitchInsn(final int min, final int max,
- final Label dflt, final Label... labels) {
- minSize += 13 + labels.length * 4;
- maxSize += 16 + labels.length * 4;
- if (mv != null) {
- mv.visitTableSwitchInsn(min, max, dflt, labels);
- }
- }
-
- @Override
- public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
- final Label[] labels) {
- minSize += 9 + keys.length * 8;
- maxSize += 12 + keys.length * 8;
- if (mv != null) {
- mv.visitLookupSwitchInsn(dflt, keys, labels);
- }
- }
-
- @Override
- public void visitMultiANewArrayInsn(final String desc, final int dims) {
- minSize += 4;
- maxSize += 4;
- if (mv != null) {
- mv.visitMultiANewArrayInsn(desc, dims);
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/signature/SignatureReader.java b/src/asm/scala/tools/asm/signature/SignatureReader.java
deleted file mode 100644
index 9c7c3880d9..0000000000
--- a/src/asm/scala/tools/asm/signature/SignatureReader.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.signature;
-
-/**
- * A type signature parser to make a signature visitor visit an existing
- * signature.
- *
- * @author Thomas Hallgren
- * @author Eric Bruneton
- */
-public class SignatureReader {
-
- /**
- * The signature to be read.
- */
- private final String signature;
-
- /**
- * Constructs a {@link SignatureReader} for the given signature.
- *
- * @param signature
- * A <i>ClassSignature</i>, <i>MethodTypeSignature</i>, or
- * <i>FieldTypeSignature</i>.
- */
- public SignatureReader(final String signature) {
- this.signature = signature;
- }
-
- /**
- * Makes the given visitor visit the signature of this
- * {@link SignatureReader}. This signature is the one specified in the
- * constructor (see {@link #SignatureReader(String) SignatureReader}). This
- * method is intended to be called on a {@link SignatureReader} that was
- * created using a <i>ClassSignature</i> (such as the <code>signature</code>
- * parameter of the {@link scala.tools.asm.ClassVisitor#visit
- * ClassVisitor.visit} method) or a <i>MethodTypeSignature</i> (such as the
- * <code>signature</code> parameter of the
- * {@link scala.tools.asm.ClassVisitor#visitMethod
- * ClassVisitor.visitMethod} method).
- *
- * @param v
- * the visitor that must visit this signature.
- */
- public void accept(final SignatureVisitor v) {
- String signature = this.signature;
- int len = signature.length();
- int pos;
- char c;
-
- if (signature.charAt(0) == '<') {
- pos = 2;
- do {
- int end = signature.indexOf(':', pos);
- v.visitFormalTypeParameter(signature.substring(pos - 1, end));
- pos = end + 1;
-
- c = signature.charAt(pos);
- if (c == 'L' || c == '[' || c == 'T') {
- pos = parseType(signature, pos, v.visitClassBound());
- }
-
- while ((c = signature.charAt(pos++)) == ':') {
- pos = parseType(signature, pos, v.visitInterfaceBound());
- }
- } while (c != '>');
- } else {
- pos = 0;
- }
-
- if (signature.charAt(pos) == '(') {
- pos++;
- while (signature.charAt(pos) != ')') {
- pos = parseType(signature, pos, v.visitParameterType());
- }
- pos = parseType(signature, pos + 1, v.visitReturnType());
- while (pos < len) {
- pos = parseType(signature, pos + 1, v.visitExceptionType());
- }
- } else {
- pos = parseType(signature, pos, v.visitSuperclass());
- while (pos < len) {
- pos = parseType(signature, pos, v.visitInterface());
- }
- }
- }
-
- /**
- * Makes the given visitor visit the signature of this
- * {@link SignatureReader}. This signature is the one specified in the
- * constructor (see {@link #SignatureReader(String) SignatureReader}). This
- * method is intended to be called on a {@link SignatureReader} that was
- * created using a <i>FieldTypeSignature</i>, such as the
- * <code>signature</code> parameter of the
- * {@link scala.tools.asm.ClassVisitor#visitField ClassVisitor.visitField}
- * or {@link scala.tools.asm.MethodVisitor#visitLocalVariable
- * MethodVisitor.visitLocalVariable} methods.
- *
- * @param v
- * the visitor that must visit this signature.
- */
- public void acceptType(final SignatureVisitor v) {
- parseType(this.signature, 0, v);
- }
-
- /**
- * Parses a field type signature and makes the given visitor visit it.
- *
- * @param signature
- * a string containing the signature that must be parsed.
- * @param pos
- * index of the first character of the signature to parsed.
- * @param v
- * the visitor that must visit this signature.
- * @return the index of the first character after the parsed signature.
- */
- private static int parseType(final String signature, int pos,
- final SignatureVisitor v) {
- char c;
- int start, end;
- boolean visited, inner;
- String name;
-
- switch (c = signature.charAt(pos++)) {
- case 'Z':
- case 'C':
- case 'B':
- case 'S':
- case 'I':
- case 'F':
- case 'J':
- case 'D':
- case 'V':
- v.visitBaseType(c);
- return pos;
-
- case '[':
- return parseType(signature, pos, v.visitArrayType());
-
- case 'T':
- end = signature.indexOf(';', pos);
- v.visitTypeVariable(signature.substring(pos, end));
- return end + 1;
-
- default: // case 'L':
- start = pos;
- visited = false;
- inner = false;
- for (;;) {
- switch (c = signature.charAt(pos++)) {
- case '.':
- case ';':
- if (!visited) {
- name = signature.substring(start, pos - 1);
- if (inner) {
- v.visitInnerClassType(name);
- } else {
- v.visitClassType(name);
- }
- }
- if (c == ';') {
- v.visitEnd();
- return pos;
- }
- start = pos;
- visited = false;
- inner = true;
- break;
-
- case '<':
- name = signature.substring(start, pos - 1);
- if (inner) {
- v.visitInnerClassType(name);
- } else {
- v.visitClassType(name);
- }
- visited = true;
- top: for (;;) {
- switch (c = signature.charAt(pos)) {
- case '>':
- break top;
- case '*':
- ++pos;
- v.visitTypeArgument();
- break;
- case '+':
- case '-':
- pos = parseType(signature, pos + 1,
- v.visitTypeArgument(c));
- break;
- default:
- pos = parseType(signature, pos,
- v.visitTypeArgument('='));
- break;
- }
- }
- }
- }
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/signature/SignatureVisitor.java b/src/asm/scala/tools/asm/signature/SignatureVisitor.java
deleted file mode 100644
index 1e16bd3f7c..0000000000
--- a/src/asm/scala/tools/asm/signature/SignatureVisitor.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.signature;
-
-import scala.tools.asm.Opcodes;
-
-/**
- * A visitor to visit a generic signature. The methods of this interface must be
- * called in one of the three following orders (the last one is the only valid
- * order for a {@link SignatureVisitor} that is returned by a method of this
- * interface):
- * <ul>
- * <li><i>ClassSignature</i> = ( <tt>visitFormalTypeParameter</tt>
- * <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* (
- * <tt>visitSuperClass</tt> <tt>visitInterface</tt>* )</li>
- * <li><i>MethodSignature</i> = ( <tt>visitFormalTypeParameter</tt>
- * <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* (
- * <tt>visitParameterType</tt>* <tt>visitReturnType</tt>
- * <tt>visitExceptionType</tt>* )</li>
- * <li><i>TypeSignature</i> = <tt>visitBaseType</tt> |
- * <tt>visitTypeVariable</tt> | <tt>visitArrayType</tt> | (
- * <tt>visitClassType</tt> <tt>visitTypeArgument</tt>* (
- * <tt>visitInnerClassType</tt> <tt>visitTypeArgument</tt>* )* <tt>visitEnd</tt>
- * ) )</li>
- * </ul>
- *
- * @author Thomas Hallgren
- * @author Eric Bruneton
- */
-public abstract class SignatureVisitor {
-
- /**
- * Wildcard for an "extends" type argument.
- */
- public final static char EXTENDS = '+';
-
- /**
- * Wildcard for a "super" type argument.
- */
- public final static char SUPER = '-';
-
- /**
- * Wildcard for a normal type argument.
- */
- public final static char INSTANCEOF = '=';
-
- /**
- * The ASM API version implemented by this visitor. The value of this field
- * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- protected final int api;
-
- /**
- * Constructs a new {@link SignatureVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- public SignatureVisitor(final int api) {
- if (api != Opcodes.ASM4 && api != Opcodes.ASM5) {
- throw new IllegalArgumentException();
- }
- this.api = api;
- }
-
- /**
- * Visits a formal type parameter.
- *
- * @param name
- * the name of the formal parameter.
- */
- public void visitFormalTypeParameter(String name) {
- }
-
- /**
- * Visits the class bound of the last visited formal type parameter.
- *
- * @return a non null visitor to visit the signature of the class bound.
- */
- public SignatureVisitor visitClassBound() {
- return this;
- }
-
- /**
- * Visits an interface bound of the last visited formal type parameter.
- *
- * @return a non null visitor to visit the signature of the interface bound.
- */
- public SignatureVisitor visitInterfaceBound() {
- return this;
- }
-
- /**
- * Visits the type of the super class.
- *
- * @return a non null visitor to visit the signature of the super class
- * type.
- */
- public SignatureVisitor visitSuperclass() {
- return this;
- }
-
- /**
- * Visits the type of an interface implemented by the class.
- *
- * @return a non null visitor to visit the signature of the interface type.
- */
- public SignatureVisitor visitInterface() {
- return this;
- }
-
- /**
- * Visits the type of a method parameter.
- *
- * @return a non null visitor to visit the signature of the parameter type.
- */
- public SignatureVisitor visitParameterType() {
- return this;
- }
-
- /**
- * Visits the return type of the method.
- *
- * @return a non null visitor to visit the signature of the return type.
- */
- public SignatureVisitor visitReturnType() {
- return this;
- }
-
- /**
- * Visits the type of a method exception.
- *
- * @return a non null visitor to visit the signature of the exception type.
- */
- public SignatureVisitor visitExceptionType() {
- return this;
- }
-
- /**
- * Visits a signature corresponding to a primitive type.
- *
- * @param descriptor
- * the descriptor of the primitive type, or 'V' for <tt>void</tt>
- * .
- */
- public void visitBaseType(char descriptor) {
- }
-
- /**
- * Visits a signature corresponding to a type variable.
- *
- * @param name
- * the name of the type variable.
- */
- public void visitTypeVariable(String name) {
- }
-
- /**
- * Visits a signature corresponding to an array type.
- *
- * @return a non null visitor to visit the signature of the array element
- * type.
- */
- public SignatureVisitor visitArrayType() {
- return this;
- }
-
- /**
- * Starts the visit of a signature corresponding to a class or interface
- * type.
- *
- * @param name
- * the internal name of the class or interface.
- */
- public void visitClassType(String name) {
- }
-
- /**
- * Visits an inner class.
- *
- * @param name
- * the local name of the inner class in its enclosing class.
- */
- public void visitInnerClassType(String name) {
- }
-
- /**
- * Visits an unbounded type argument of the last visited class or inner
- * class type.
- */
- public void visitTypeArgument() {
- }
-
- /**
- * Visits a type argument of the last visited class or inner class type.
- *
- * @param wildcard
- * '+', '-' or '='.
- * @return a non null visitor to visit the signature of the type argument.
- */
- public SignatureVisitor visitTypeArgument(char wildcard) {
- return this;
- }
-
- /**
- * Ends the visit of a signature corresponding to a class or interface type.
- */
- public void visitEnd() {
- }
-}
diff --git a/src/asm/scala/tools/asm/signature/SignatureWriter.java b/src/asm/scala/tools/asm/signature/SignatureWriter.java
deleted file mode 100644
index 65756eee51..0000000000
--- a/src/asm/scala/tools/asm/signature/SignatureWriter.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.signature;
-
-import scala.tools.asm.Opcodes;
-
-/**
- * A signature visitor that generates signatures in string format.
- *
- * @author Thomas Hallgren
- * @author Eric Bruneton
- */
-public class SignatureWriter extends SignatureVisitor {
-
- /**
- * Buffer used to construct the signature.
- */
- private final StringBuffer buf = new StringBuffer();
-
- /**
- * Indicates if the signature contains formal type parameters.
- */
- private boolean hasFormals;
-
- /**
- * Indicates if the signature contains method parameter types.
- */
- private boolean hasParameters;
-
- /**
- * Stack used to keep track of class types that have arguments. Each element
- * of this stack is a boolean encoded in one bit. The top of the stack is
- * the lowest order bit. Pushing false = *2, pushing true = *2+1, popping =
- * /2.
- */
- private int argumentStack;
-
- /**
- * Constructs a new {@link SignatureWriter} object.
- */
- public SignatureWriter() {
- super(Opcodes.ASM5);
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the SignatureVisitor interface
- // ------------------------------------------------------------------------
-
- @Override
- public void visitFormalTypeParameter(final String name) {
- if (!hasFormals) {
- hasFormals = true;
- buf.append('<');
- }
- buf.append(name);
- buf.append(':');
- }
-
- @Override
- public SignatureVisitor visitClassBound() {
- return this;
- }
-
- @Override
- public SignatureVisitor visitInterfaceBound() {
- buf.append(':');
- return this;
- }
-
- @Override
- public SignatureVisitor visitSuperclass() {
- endFormals();
- return this;
- }
-
- @Override
- public SignatureVisitor visitInterface() {
- return this;
- }
-
- @Override
- public SignatureVisitor visitParameterType() {
- endFormals();
- if (!hasParameters) {
- hasParameters = true;
- buf.append('(');
- }
- return this;
- }
-
- @Override
- public SignatureVisitor visitReturnType() {
- endFormals();
- if (!hasParameters) {
- buf.append('(');
- }
- buf.append(')');
- return this;
- }
-
- @Override
- public SignatureVisitor visitExceptionType() {
- buf.append('^');
- return this;
- }
-
- @Override
- public void visitBaseType(final char descriptor) {
- buf.append(descriptor);
- }
-
- @Override
- public void visitTypeVariable(final String name) {
- buf.append('T');
- buf.append(name);
- buf.append(';');
- }
-
- @Override
- public SignatureVisitor visitArrayType() {
- buf.append('[');
- return this;
- }
-
- @Override
- public void visitClassType(final String name) {
- buf.append('L');
- buf.append(name);
- argumentStack *= 2;
- }
-
- @Override
- public void visitInnerClassType(final String name) {
- endArguments();
- buf.append('.');
- buf.append(name);
- argumentStack *= 2;
- }
-
- @Override
- public void visitTypeArgument() {
- if (argumentStack % 2 == 0) {
- ++argumentStack;
- buf.append('<');
- }
- buf.append('*');
- }
-
- @Override
- public SignatureVisitor visitTypeArgument(final char wildcard) {
- if (argumentStack % 2 == 0) {
- ++argumentStack;
- buf.append('<');
- }
- if (wildcard != '=') {
- buf.append(wildcard);
- }
- return this;
- }
-
- @Override
- public void visitEnd() {
- endArguments();
- buf.append(';');
- }
-
- /**
- * Returns the signature that was built by this signature writer.
- *
- * @return the signature that was built by this signature writer.
- */
- @Override
- public String toString() {
- return buf.toString();
- }
-
- // ------------------------------------------------------------------------
- // Utility methods
- // ------------------------------------------------------------------------
-
- /**
- * Ends the formal type parameters section of the signature.
- */
- private void endFormals() {
- if (hasFormals) {
- hasFormals = false;
- buf.append('>');
- }
- }
-
- /**
- * Ends the type arguments of a class or inner class type.
- */
- private void endArguments() {
- if (argumentStack % 2 != 0) {
- buf.append('>');
- }
- argumentStack /= 2;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/AbstractInsnNode.java b/src/asm/scala/tools/asm/tree/AbstractInsnNode.java
deleted file mode 100644
index 2ce0c8b6ee..0000000000
--- a/src/asm/scala/tools/asm/tree/AbstractInsnNode.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a bytecode instruction. <i>An instruction can appear
- * at most once in at most one {@link InsnList} at a time</i>.
- *
- * @author Eric Bruneton
- */
-public abstract class AbstractInsnNode {
-
- /**
- * The type of {@link InsnNode} instructions.
- */
- public static final int INSN = 0;
-
- /**
- * The type of {@link IntInsnNode} instructions.
- */
- public static final int INT_INSN = 1;
-
- /**
- * The type of {@link VarInsnNode} instructions.
- */
- public static final int VAR_INSN = 2;
-
- /**
- * The type of {@link TypeInsnNode} instructions.
- */
- public static final int TYPE_INSN = 3;
-
- /**
- * The type of {@link FieldInsnNode} instructions.
- */
- public static final int FIELD_INSN = 4;
-
- /**
- * The type of {@link MethodInsnNode} instructions.
- */
- public static final int METHOD_INSN = 5;
-
- /**
- * The type of {@link InvokeDynamicInsnNode} instructions.
- */
- public static final int INVOKE_DYNAMIC_INSN = 6;
-
- /**
- * The type of {@link JumpInsnNode} instructions.
- */
- public static final int JUMP_INSN = 7;
-
- /**
- * The type of {@link LabelNode} "instructions".
- */
- public static final int LABEL = 8;
-
- /**
- * The type of {@link LdcInsnNode} instructions.
- */
- public static final int LDC_INSN = 9;
-
- /**
- * The type of {@link IincInsnNode} instructions.
- */
- public static final int IINC_INSN = 10;
-
- /**
- * The type of {@link TableSwitchInsnNode} instructions.
- */
- public static final int TABLESWITCH_INSN = 11;
-
- /**
- * The type of {@link LookupSwitchInsnNode} instructions.
- */
- public static final int LOOKUPSWITCH_INSN = 12;
-
- /**
- * The type of {@link MultiANewArrayInsnNode} instructions.
- */
- public static final int MULTIANEWARRAY_INSN = 13;
-
- /**
- * The type of {@link FrameNode} "instructions".
- */
- public static final int FRAME = 14;
-
- /**
- * The type of {@link LineNumberNode} "instructions".
- */
- public static final int LINE = 15;
-
- /**
- * The opcode of this instruction.
- */
- protected int opcode;
-
- /**
- * The runtime visible type annotations of this instruction. This field is
- * only used for real instructions (i.e. not for labels, frames, or line
- * number nodes). This list is a list of {@link TypeAnnotationNode} objects.
- * May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label visible
- */
- public List<TypeAnnotationNode> visibleTypeAnnotations;
-
- /**
- * The runtime invisible type annotations of this instruction. This field is
- * only used for real instructions (i.e. not for labels, frames, or line
- * number nodes). This list is a list of {@link TypeAnnotationNode} objects.
- * May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label invisible
- */
- public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
- /**
- * Previous instruction in the list to which this instruction belongs.
- */
- AbstractInsnNode prev;
-
- /**
- * Next instruction in the list to which this instruction belongs.
- */
- AbstractInsnNode next;
-
- /**
- * Index of this instruction in the list to which it belongs. The value of
- * this field is correct only when {@link InsnList#cache} is not null. A
- * value of -1 indicates that this instruction does not belong to any
- * {@link InsnList}.
- */
- int index;
-
- /**
- * Constructs a new {@link AbstractInsnNode}.
- *
- * @param opcode
- * the opcode of the instruction to be constructed.
- */
- protected AbstractInsnNode(final int opcode) {
- this.opcode = opcode;
- this.index = -1;
- }
-
- /**
- * Returns the opcode of this instruction.
- *
- * @return the opcode of this instruction.
- */
- public int getOpcode() {
- return opcode;
- }
-
- /**
- * Returns the type of this instruction.
- *
- * @return the type of this instruction, i.e. one the constants defined in
- * this class.
- */
- public abstract int getType();
-
- /**
- * Returns the previous instruction in the list to which this instruction
- * belongs, if any.
- *
- * @return the previous instruction in the list to which this instruction
- * belongs, if any. May be <tt>null</tt>.
- */
- public AbstractInsnNode getPrevious() {
- return prev;
- }
-
- /**
- * Returns the next instruction in the list to which this instruction
- * belongs, if any.
- *
- * @return the next instruction in the list to which this instruction
- * belongs, if any. May be <tt>null</tt>.
- */
- public AbstractInsnNode getNext() {
- return next;
- }
-
- /**
- * Makes the given code visitor visit this instruction.
- *
- * @param cv
- * a code visitor.
- */
- public abstract void accept(final MethodVisitor cv);
-
- /**
- * Makes the given visitor visit the annotations of this instruction.
- *
- * @param mv
- * a method visitor.
- */
- protected final void acceptAnnotations(final MethodVisitor mv) {
- int n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations
- .size();
- for (int i = 0; i < n; ++i) {
- TypeAnnotationNode an = visibleTypeAnnotations.get(i);
- an.accept(mv.visitInsnAnnotation(an.typeRef, an.typePath, an.desc,
- true));
- }
- n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
- .size();
- for (int i = 0; i < n; ++i) {
- TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
- an.accept(mv.visitInsnAnnotation(an.typeRef, an.typePath, an.desc,
- false));
- }
- }
-
- /**
- * Returns a copy of this instruction.
- *
- * @param labels
- * a map from LabelNodes to cloned LabelNodes.
- * @return a copy of this instruction. The returned instruction does not
- * belong to any {@link InsnList}.
- */
- public abstract AbstractInsnNode clone(
- final Map<LabelNode, LabelNode> labels);
-
- /**
- * Returns the clone of the given label.
- *
- * @param label
- * a label.
- * @param map
- * a map from LabelNodes to cloned LabelNodes.
- * @return the clone of the given label.
- */
- static LabelNode clone(final LabelNode label,
- final Map<LabelNode, LabelNode> map) {
- return map.get(label);
- }
-
- /**
- * Returns the clones of the given labels.
- *
- * @param labels
- * a list of labels.
- * @param map
- * a map from LabelNodes to cloned LabelNodes.
- * @return the clones of the given labels.
- */
- static LabelNode[] clone(final List<LabelNode> labels,
- final Map<LabelNode, LabelNode> map) {
- LabelNode[] clones = new LabelNode[labels.size()];
- for (int i = 0; i < clones.length; ++i) {
- clones[i] = map.get(labels.get(i));
- }
- return clones;
- }
-
- /**
- * Clones the annotations of the given instruction into this instruction.
- *
- * @param insn
- * the source instruction.
- * @return this instruction.
- */
- protected final AbstractInsnNode cloneAnnotations(
- final AbstractInsnNode insn) {
- if (insn.visibleTypeAnnotations != null) {
- this.visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>();
- for (int i = 0; i < insn.visibleTypeAnnotations.size(); ++i) {
- TypeAnnotationNode src = insn.visibleTypeAnnotations.get(i);
- TypeAnnotationNode ann = new TypeAnnotationNode(src.typeRef,
- src.typePath, src.desc);
- src.accept(ann);
- this.visibleTypeAnnotations.add(ann);
- }
- }
- if (insn.invisibleTypeAnnotations != null) {
- this.invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>();
- for (int i = 0; i < insn.invisibleTypeAnnotations.size(); ++i) {
- TypeAnnotationNode src = insn.invisibleTypeAnnotations.get(i);
- TypeAnnotationNode ann = new TypeAnnotationNode(src.typeRef,
- src.typePath, src.desc);
- src.accept(ann);
- this.invisibleTypeAnnotations.add(ann);
- }
- }
- return this;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/AnnotationNode.java b/src/asm/scala/tools/asm/tree/AnnotationNode.java
deleted file mode 100644
index b8d5988066..0000000000
--- a/src/asm/scala/tools/asm/tree/AnnotationNode.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents an annotationn.
- *
- * @author Eric Bruneton
- */
-public class AnnotationNode extends AnnotationVisitor {
-
- /**
- * The class descriptor of the annotation class.
- */
- public String desc;
-
- /**
- * The name value pairs of this annotation. Each name value pair is stored
- * as two consecutive elements in the list. The name is a {@link String},
- * and the value may be a {@link Byte}, {@link Boolean}, {@link Character},
- * {@link Short}, {@link Integer}, {@link Long}, {@link Float},
- * {@link Double}, {@link String} or {@link scala.tools.asm.Type}, or an
- * two elements String array (for enumeration values), a
- * {@link AnnotationNode}, or a {@link List} of values of one of the
- * preceding types. The list may be <tt>null</tt> if there is no name value
- * pair.
- */
- public List<Object> values;
-
- /**
- * Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this
- * constructor</i>. Instead, they must use the
- * {@link #AnnotationNode(int, String)} version.
- *
- * @param desc
- * the class descriptor of the annotation class.
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public AnnotationNode(final String desc) {
- this(Opcodes.ASM5, desc);
- if (getClass() != AnnotationNode.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link AnnotationNode}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param desc
- * the class descriptor of the annotation class.
- */
- public AnnotationNode(final int api, final String desc) {
- super(api);
- this.desc = desc;
- }
-
- /**
- * Constructs a new {@link AnnotationNode} to visit an array value.
- *
- * @param values
- * where the visited values must be stored.
- */
- AnnotationNode(final List<Object> values) {
- super(Opcodes.ASM5);
- this.values = values;
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the AnnotationVisitor abstract class
- // ------------------------------------------------------------------------
-
- @Override
- public void visit(final String name, final Object value) {
- if (values == null) {
- values = new ArrayList<Object>(this.desc != null ? 2 : 1);
- }
- if (this.desc != null) {
- values.add(name);
- }
- values.add(value);
- }
-
- @Override
- public void visitEnum(final String name, final String desc,
- final String value) {
- if (values == null) {
- values = new ArrayList<Object>(this.desc != null ? 2 : 1);
- }
- if (this.desc != null) {
- values.add(name);
- }
- values.add(new String[] { desc, value });
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String name,
- final String desc) {
- if (values == null) {
- values = new ArrayList<Object>(this.desc != null ? 2 : 1);
- }
- if (this.desc != null) {
- values.add(name);
- }
- AnnotationNode annotation = new AnnotationNode(desc);
- values.add(annotation);
- return annotation;
- }
-
- @Override
- public AnnotationVisitor visitArray(final String name) {
- if (values == null) {
- values = new ArrayList<Object>(this.desc != null ? 2 : 1);
- }
- if (this.desc != null) {
- values.add(name);
- }
- List<Object> array = new ArrayList<Object>();
- values.add(array);
- return new AnnotationNode(array);
- }
-
- @Override
- public void visitEnd() {
- }
-
- // ------------------------------------------------------------------------
- // Accept methods
- // ------------------------------------------------------------------------
-
- /**
- * Checks that this annotation node is compatible with the given ASM API
- * version. This methods checks that this node, and all its nodes
- * recursively, do not contain elements that were introduced in more recent
- * versions of the ASM API than the given version.
- *
- * @param api
- * an ASM API version. Must be one of {@link Opcodes#ASM4} or
- * {@link Opcodes#ASM5}.
- */
- public void check(final int api) {
- // nothing to do
- }
-
- /**
- * Makes the given visitor visit this annotation.
- *
- * @param av
- * an annotation visitor. Maybe <tt>null</tt>.
- */
- public void accept(final AnnotationVisitor av) {
- if (av != null) {
- if (values != null) {
- for (int i = 0; i < values.size(); i += 2) {
- String name = (String) values.get(i);
- Object value = values.get(i + 1);
- accept(av, name, value);
- }
- }
- av.visitEnd();
- }
- }
-
- /**
- * Makes the given visitor visit a given annotation value.
- *
- * @param av
- * an annotation visitor. Maybe <tt>null</tt>.
- * @param name
- * the value name.
- * @param value
- * the actual value.
- */
- static void accept(final AnnotationVisitor av, final String name,
- final Object value) {
- if (av != null) {
- if (value instanceof String[]) {
- String[] typeconst = (String[]) value;
- av.visitEnum(name, typeconst[0], typeconst[1]);
- } else if (value instanceof AnnotationNode) {
- AnnotationNode an = (AnnotationNode) value;
- an.accept(av.visitAnnotation(name, an.desc));
- } else if (value instanceof List) {
- AnnotationVisitor v = av.visitArray(name);
- List<?> array = (List<?>) value;
- for (int j = 0; j < array.size(); ++j) {
- accept(v, null, array.get(j));
- }
- v.visitEnd();
- } else {
- av.visit(name, value);
- }
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/ClassNode.java b/src/asm/scala/tools/asm/tree/ClassNode.java
deleted file mode 100644
index 304b4ec9f5..0000000000
--- a/src/asm/scala/tools/asm/tree/ClassNode.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A node that represents a class.
- *
- * @author Eric Bruneton
- */
-public class ClassNode extends ClassVisitor {
-
- /**
- * The class version.
- */
- public int version;
-
- /**
- * The class's access flags (see {@link scala.tools.asm.Opcodes}). This
- * field also indicates if the class is deprecated.
- */
- public int access;
-
- /**
- * The internal name of the class (see
- * {@link scala.tools.asm.Type#getInternalName() getInternalName}).
- */
- public String name;
-
- /**
- * The signature of the class. May be <tt>null</tt>.
- */
- public String signature;
-
- /**
- * The internal of name of the super class (see
- * {@link scala.tools.asm.Type#getInternalName() getInternalName}). For
- * interfaces, the super class is {@link Object}. May be <tt>null</tt>, but
- * only for the {@link Object} class.
- */
- public String superName;
-
- /**
- * The internal names of the class's interfaces (see
- * {@link scala.tools.asm.Type#getInternalName() getInternalName}). This
- * list is a list of {@link String} objects.
- */
- public List<String> interfaces;
-
- /**
- * The name of the source file from which this class was compiled. May be
- * <tt>null</tt>.
- */
- public String sourceFile;
-
- /**
- * Debug information to compute the correspondence between source and
- * compiled elements of the class. May be <tt>null</tt>.
- */
- public String sourceDebug;
-
- /**
- * The internal name of the enclosing class of the class. May be
- * <tt>null</tt>.
- */
- public String outerClass;
-
- /**
- * The name of the method that contains the class, or <tt>null</tt> if the
- * class is not enclosed in a method.
- */
- public String outerMethod;
-
- /**
- * The descriptor of the method that contains the class, or <tt>null</tt> if
- * the class is not enclosed in a method.
- */
- public String outerMethodDesc;
-
- /**
- * The runtime visible annotations of this class. This list is a list of
- * {@link AnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.AnnotationNode
- * @label visible
- */
- public List<AnnotationNode> visibleAnnotations;
-
- /**
- * The runtime invisible annotations of this class. This list is a list of
- * {@link AnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.AnnotationNode
- * @label invisible
- */
- public List<AnnotationNode> invisibleAnnotations;
-
- /**
- * The runtime visible type annotations of this class. This list is a list
- * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label visible
- */
- public List<TypeAnnotationNode> visibleTypeAnnotations;
-
- /**
- * The runtime invisible type annotations of this class. This list is a list
- * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label invisible
- */
- public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
- /**
- * The non standard attributes of this class. This list is a list of
- * {@link Attribute} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.Attribute
- */
- public List<Attribute> attrs;
-
- /**
- * Informations about the inner classes of this class. This list is a list
- * of {@link InnerClassNode} objects.
- *
- * @associates scala.tools.asm.tree.InnerClassNode
- */
- public List<InnerClassNode> innerClasses;
-
- /**
- * The fields of this class. This list is a list of {@link FieldNode}
- * objects.
- *
- * @associates scala.tools.asm.tree.FieldNode
- */
- public List<FieldNode> fields;
-
- /**
- * The methods of this class. This list is a list of {@link MethodNode}
- * objects.
- *
- * @associates scala.tools.asm.tree.MethodNode
- */
- public List<MethodNode> methods;
-
- /**
- * Constructs a new {@link ClassNode}. <i>Subclasses must not use this
- * constructor</i>. Instead, they must use the {@link #ClassNode(int)}
- * version.
- *
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public ClassNode() {
- this(Opcodes.ASM5);
- if (getClass() != ClassNode.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link ClassNode}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- public ClassNode(final int api) {
- super(api);
- this.interfaces = new ArrayList<String>();
- this.innerClasses = new ArrayList<InnerClassNode>();
- this.fields = new ArrayList<FieldNode>();
- this.methods = new ArrayList<MethodNode>();
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the ClassVisitor abstract class
- // ------------------------------------------------------------------------
-
- @Override
- public void visit(final int version, final int access, final String name,
- final String signature, final String superName,
- final String[] interfaces) {
- this.version = version;
- this.access = access;
- this.name = name;
- this.signature = signature;
- this.superName = superName;
- if (interfaces != null) {
- this.interfaces.addAll(Arrays.asList(interfaces));
- }
- }
-
- @Override
- public void visitSource(final String file, final String debug) {
- sourceFile = file;
- sourceDebug = debug;
- }
-
- @Override
- public void visitOuterClass(final String owner, final String name,
- final String desc) {
- outerClass = owner;
- outerMethod = name;
- outerMethodDesc = desc;
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- AnnotationNode an = new AnnotationNode(desc);
- if (visible) {
- if (visibleAnnotations == null) {
- visibleAnnotations = new ArrayList<AnnotationNode>(1);
- }
- visibleAnnotations.add(an);
- } else {
- if (invisibleAnnotations == null) {
- invisibleAnnotations = new ArrayList<AnnotationNode>(1);
- }
- invisibleAnnotations.add(an);
- }
- return an;
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
- if (visible) {
- if (visibleTypeAnnotations == null) {
- visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
- }
- visibleTypeAnnotations.add(an);
- } else {
- if (invisibleTypeAnnotations == null) {
- invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
- }
- invisibleTypeAnnotations.add(an);
- }
- return an;
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- if (attrs == null) {
- attrs = new ArrayList<Attribute>(1);
- }
- attrs.add(attr);
- }
-
- @Override
- public void visitInnerClass(final String name, final String outerName,
- final String innerName, final int access) {
- InnerClassNode icn = new InnerClassNode(name, outerName, innerName,
- access);
- innerClasses.add(icn);
- }
-
- @Override
- public FieldVisitor visitField(final int access, final String name,
- final String desc, final String signature, final Object value) {
- FieldNode fn = new FieldNode(access, name, desc, signature, value);
- fields.add(fn);
- return fn;
- }
-
- @Override
- public MethodVisitor visitMethod(final int access, final String name,
- final String desc, final String signature, final String[] exceptions) {
- MethodNode mn = new MethodNode(access, name, desc, signature,
- exceptions);
- methods.add(mn);
- return mn;
- }
-
- @Override
- public void visitEnd() {
- }
-
- // ------------------------------------------------------------------------
- // Accept method
- // ------------------------------------------------------------------------
-
- /**
- * Checks that this class node is compatible with the given ASM API version.
- * This methods checks that this node, and all its nodes recursively, do not
- * contain elements that were introduced in more recent versions of the ASM
- * API than the given version.
- *
- * @param api
- * an ASM API version. Must be one of {@link Opcodes#ASM4} or
- * {@link Opcodes#ASM5}.
- */
- public void check(final int api) {
- if (api == Opcodes.ASM4) {
- if (visibleTypeAnnotations != null
- && visibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- if (invisibleTypeAnnotations != null
- && invisibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- for (FieldNode f : fields) {
- f.check(api);
- }
- for (MethodNode m : methods) {
- m.check(api);
- }
- }
- }
-
- /**
- * Makes the given class visitor visit this class.
- *
- * @param cv
- * a class visitor.
- */
- public void accept(final ClassVisitor cv) {
- // visits header
- String[] interfaces = new String[this.interfaces.size()];
- this.interfaces.toArray(interfaces);
- cv.visit(version, access, name, signature, superName, interfaces);
- // visits source
- if (sourceFile != null || sourceDebug != null) {
- cv.visitSource(sourceFile, sourceDebug);
- }
- // visits outer class
- if (outerClass != null) {
- cv.visitOuterClass(outerClass, outerMethod, outerMethodDesc);
- }
- // visits attributes
- int i, n;
- n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
- for (i = 0; i < n; ++i) {
- AnnotationNode an = visibleAnnotations.get(i);
- an.accept(cv.visitAnnotation(an.desc, true));
- }
- n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
- for (i = 0; i < n; ++i) {
- AnnotationNode an = invisibleAnnotations.get(i);
- an.accept(cv.visitAnnotation(an.desc, false));
- }
- n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations.size();
- for (i = 0; i < n; ++i) {
- TypeAnnotationNode an = visibleTypeAnnotations.get(i);
- an.accept(cv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
- true));
- }
- n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
- .size();
- for (i = 0; i < n; ++i) {
- TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
- an.accept(cv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
- false));
- }
- n = attrs == null ? 0 : attrs.size();
- for (i = 0; i < n; ++i) {
- cv.visitAttribute(attrs.get(i));
- }
- // visits inner classes
- for (i = 0; i < innerClasses.size(); ++i) {
- innerClasses.get(i).accept(cv);
- }
- // visits fields
- for (i = 0; i < fields.size(); ++i) {
- fields.get(i).accept(cv);
- }
- // visits methods
- for (i = 0; i < methods.size(); ++i) {
- methods.get(i).accept(cv);
- }
- // visits end
- cv.visitEnd();
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/FieldInsnNode.java b/src/asm/scala/tools/asm/tree/FieldInsnNode.java
deleted file mode 100644
index c027de109b..0000000000
--- a/src/asm/scala/tools/asm/tree/FieldInsnNode.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a field instruction. A field instruction is an
- * instruction that loads or stores the value of a field of an object.
- *
- * @author Eric Bruneton
- */
-public class FieldInsnNode extends AbstractInsnNode {
-
- /**
- * The internal name of the field's owner class (see
- * {@link scala.tools.asm.Type#getInternalName() getInternalName}).
- */
- public String owner;
-
- /**
- * The field's name.
- */
- public String name;
-
- /**
- * The field's descriptor (see {@link scala.tools.asm.Type}).
- */
- public String desc;
-
- /**
- * Constructs a new {@link FieldInsnNode}.
- *
- * @param opcode
- * the opcode of the type instruction to be constructed. This
- * opcode must be GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
- * @param owner
- * the internal name of the field's owner class (see
- * {@link scala.tools.asm.Type#getInternalName()
- * getInternalName}).
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor (see {@link scala.tools.asm.Type}).
- */
- public FieldInsnNode(final int opcode, final String owner,
- final String name, final String desc) {
- super(opcode);
- this.owner = owner;
- this.name = name;
- this.desc = desc;
- }
-
- /**
- * Sets the opcode of this instruction.
- *
- * @param opcode
- * the new instruction opcode. This opcode must be GETSTATIC,
- * PUTSTATIC, GETFIELD or PUTFIELD.
- */
- public void setOpcode(final int opcode) {
- this.opcode = opcode;
- }
-
- @Override
- public int getType() {
- return FIELD_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitFieldInsn(opcode, owner, name, desc);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new FieldInsnNode(opcode, owner, name, desc)
- .cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/FieldNode.java b/src/asm/scala/tools/asm/tree/FieldNode.java
deleted file mode 100644
index 3fb14dac4f..0000000000
--- a/src/asm/scala/tools/asm/tree/FieldNode.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A node that represents a field.
- *
- * @author Eric Bruneton
- */
-public class FieldNode extends FieldVisitor {
-
- /**
- * The field's access flags (see {@link scala.tools.asm.Opcodes}). This
- * field also indicates if the field is synthetic and/or deprecated.
- */
- public int access;
-
- /**
- * The field's name.
- */
- public String name;
-
- /**
- * The field's descriptor (see {@link scala.tools.asm.Type}).
- */
- public String desc;
-
- /**
- * The field's signature. May be <tt>null</tt>.
- */
- public String signature;
-
- /**
- * The field's initial value. This field, which may be <tt>null</tt> if the
- * field does not have an initial value, must be an {@link Integer}, a
- * {@link Float}, a {@link Long}, a {@link Double} or a {@link String}.
- */
- public Object value;
-
- /**
- * The runtime visible annotations of this field. This list is a list of
- * {@link AnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.AnnotationNode
- * @label visible
- */
- public List<AnnotationNode> visibleAnnotations;
-
- /**
- * The runtime invisible annotations of this field. This list is a list of
- * {@link AnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.AnnotationNode
- * @label invisible
- */
- public List<AnnotationNode> invisibleAnnotations;
-
- /**
- * The runtime visible type annotations of this field. This list is a list
- * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label visible
- */
- public List<TypeAnnotationNode> visibleTypeAnnotations;
-
- /**
- * The runtime invisible type annotations of this field. This list is a list
- * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label invisible
- */
- public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
- /**
- * The non standard attributes of this field. This list is a list of
- * {@link Attribute} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.Attribute
- */
- public List<Attribute> attrs;
-
- /**
- * Constructs a new {@link FieldNode}. <i>Subclasses must not use this
- * constructor</i>. Instead, they must use the
- * {@link #FieldNode(int, int, String, String, String, Object)} version.
- *
- * @param access
- * the field's access flags (see
- * {@link scala.tools.asm.Opcodes}). This parameter also
- * indicates if the field is synthetic and/or deprecated.
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor (see {@link scala.tools.asm.Type
- * Type}).
- * @param signature
- * the field's signature.
- * @param value
- * the field's initial value. This parameter, which may be
- * <tt>null</tt> if the field does not have an initial value,
- * must be an {@link Integer}, a {@link Float}, a {@link Long}, a
- * {@link Double} or a {@link String}.
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public FieldNode(final int access, final String name, final String desc,
- final String signature, final Object value) {
- this(Opcodes.ASM5, access, name, desc, signature, value);
- if (getClass() != FieldNode.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link FieldNode}. <i>Subclasses must not use this
- * constructor</i>.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param access
- * the field's access flags (see
- * {@link scala.tools.asm.Opcodes}). This parameter also
- * indicates if the field is synthetic and/or deprecated.
- * @param name
- * the field's name.
- * @param desc
- * the field's descriptor (see {@link scala.tools.asm.Type
- * Type}).
- * @param signature
- * the field's signature.
- * @param value
- * the field's initial value. This parameter, which may be
- * <tt>null</tt> if the field does not have an initial value,
- * must be an {@link Integer}, a {@link Float}, a {@link Long}, a
- * {@link Double} or a {@link String}.
- */
- public FieldNode(final int api, final int access, final String name,
- final String desc, final String signature, final Object value) {
- super(api);
- this.access = access;
- this.name = name;
- this.desc = desc;
- this.signature = signature;
- this.value = value;
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the FieldVisitor abstract class
- // ------------------------------------------------------------------------
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- AnnotationNode an = new AnnotationNode(desc);
- if (visible) {
- if (visibleAnnotations == null) {
- visibleAnnotations = new ArrayList<AnnotationNode>(1);
- }
- visibleAnnotations.add(an);
- } else {
- if (invisibleAnnotations == null) {
- invisibleAnnotations = new ArrayList<AnnotationNode>(1);
- }
- invisibleAnnotations.add(an);
- }
- return an;
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
- if (visible) {
- if (visibleTypeAnnotations == null) {
- visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
- }
- visibleTypeAnnotations.add(an);
- } else {
- if (invisibleTypeAnnotations == null) {
- invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
- }
- invisibleTypeAnnotations.add(an);
- }
- return an;
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- if (attrs == null) {
- attrs = new ArrayList<Attribute>(1);
- }
- attrs.add(attr);
- }
-
- @Override
- public void visitEnd() {
- }
-
- // ------------------------------------------------------------------------
- // Accept methods
- // ------------------------------------------------------------------------
-
- /**
- * Checks that this field node is compatible with the given ASM API version.
- * This methods checks that this node, and all its nodes recursively, do not
- * contain elements that were introduced in more recent versions of the ASM
- * API than the given version.
- *
- * @param api
- * an ASM API version. Must be one of {@link Opcodes#ASM4} or
- * {@link Opcodes#ASM5}.
- */
- public void check(final int api) {
- if (api == Opcodes.ASM4) {
- if (visibleTypeAnnotations != null
- && visibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- if (invisibleTypeAnnotations != null
- && invisibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- }
- }
-
- /**
- * Makes the given class visitor visit this field.
- *
- * @param cv
- * a class visitor.
- */
- public void accept(final ClassVisitor cv) {
- FieldVisitor fv = cv.visitField(access, name, desc, signature, value);
- if (fv == null) {
- return;
- }
- int i, n;
- n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
- for (i = 0; i < n; ++i) {
- AnnotationNode an = visibleAnnotations.get(i);
- an.accept(fv.visitAnnotation(an.desc, true));
- }
- n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
- for (i = 0; i < n; ++i) {
- AnnotationNode an = invisibleAnnotations.get(i);
- an.accept(fv.visitAnnotation(an.desc, false));
- }
- n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations.size();
- for (i = 0; i < n; ++i) {
- TypeAnnotationNode an = visibleTypeAnnotations.get(i);
- an.accept(fv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
- true));
- }
- n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
- .size();
- for (i = 0; i < n; ++i) {
- TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
- an.accept(fv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
- false));
- }
- n = attrs == null ? 0 : attrs.size();
- for (i = 0; i < n; ++i) {
- fv.visitAttribute(attrs.get(i));
- }
- fv.visitEnd();
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/FrameNode.java b/src/asm/scala/tools/asm/tree/FrameNode.java
deleted file mode 100644
index f13fc66749..0000000000
--- a/src/asm/scala/tools/asm/tree/FrameNode.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a stack map frame. These nodes are pseudo instruction
- * nodes in order to be inserted in an instruction list. In fact these nodes
- * must(*) be inserted <i>just before</i> any instruction node <b>i</b> that
- * follows an unconditionnal branch instruction such as GOTO or THROW, that is
- * the target of a jump instruction, or that starts an exception handler block.
- * The stack map frame types must describe the values of the local variables and
- * of the operand stack elements <i>just before</i> <b>i</b> is executed. <br>
- * <br>
- * (*) this is mandatory only for classes whose version is greater than or equal
- * to {@link Opcodes#V1_6 V1_6}.
- *
- * @author Eric Bruneton
- */
-public class FrameNode extends AbstractInsnNode {
-
- /**
- * The type of this frame. Must be {@link Opcodes#F_NEW} for expanded
- * frames, or {@link Opcodes#F_FULL}, {@link Opcodes#F_APPEND},
- * {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or
- * {@link Opcodes#F_APPEND}, {@link Opcodes#F_SAME1} for compressed frames.
- */
- public int type;
-
- /**
- * The types of the local variables of this stack map frame. Elements of
- * this list can be Integer, String or LabelNode objects (for primitive,
- * reference and uninitialized types respectively - see
- * {@link MethodVisitor}).
- */
- public List<Object> local;
-
- /**
- * The types of the operand stack elements of this stack map frame. Elements
- * of this list can be Integer, String or LabelNode objects (for primitive,
- * reference and uninitialized types respectively - see
- * {@link MethodVisitor}).
- */
- public List<Object> stack;
-
- private FrameNode() {
- super(-1);
- }
-
- /**
- * Constructs a new {@link FrameNode}.
- *
- * @param type
- * the type of this frame. Must be {@link Opcodes#F_NEW} for
- * expanded frames, or {@link Opcodes#F_FULL},
- * {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP},
- * {@link Opcodes#F_SAME} or {@link Opcodes#F_APPEND},
- * {@link Opcodes#F_SAME1} for compressed frames.
- * @param nLocal
- * number of local variables of this stack map frame.
- * @param local
- * the types of the local variables of this stack map frame.
- * Elements of this list can be Integer, String or LabelNode
- * objects (for primitive, reference and uninitialized types
- * respectively - see {@link MethodVisitor}).
- * @param nStack
- * number of operand stack elements of this stack map frame.
- * @param stack
- * the types of the operand stack elements of this stack map
- * frame. Elements of this list can be Integer, String or
- * LabelNode objects (for primitive, reference and uninitialized
- * types respectively - see {@link MethodVisitor}).
- */
- public FrameNode(final int type, final int nLocal, final Object[] local,
- final int nStack, final Object[] stack) {
- super(-1);
- this.type = type;
- switch (type) {
- case Opcodes.F_NEW:
- case Opcodes.F_FULL:
- this.local = asList(nLocal, local);
- this.stack = asList(nStack, stack);
- break;
- case Opcodes.F_APPEND:
- this.local = asList(nLocal, local);
- break;
- case Opcodes.F_CHOP:
- this.local = Arrays.asList(new Object[nLocal]);
- break;
- case Opcodes.F_SAME:
- break;
- case Opcodes.F_SAME1:
- this.stack = asList(1, stack);
- break;
- }
- }
-
- @Override
- public int getType() {
- return FRAME;
- }
-
- /**
- * Makes the given visitor visit this stack map frame.
- *
- * @param mv
- * a method visitor.
- */
- @Override
- public void accept(final MethodVisitor mv) {
- switch (type) {
- case Opcodes.F_NEW:
- case Opcodes.F_FULL:
- mv.visitFrame(type, local.size(), asArray(local), stack.size(),
- asArray(stack));
- break;
- case Opcodes.F_APPEND:
- mv.visitFrame(type, local.size(), asArray(local), 0, null);
- break;
- case Opcodes.F_CHOP:
- mv.visitFrame(type, local.size(), null, 0, null);
- break;
- case Opcodes.F_SAME:
- mv.visitFrame(type, 0, null, 0, null);
- break;
- case Opcodes.F_SAME1:
- mv.visitFrame(type, 0, null, 1, asArray(stack));
- break;
- }
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- FrameNode clone = new FrameNode();
- clone.type = type;
- if (local != null) {
- clone.local = new ArrayList<Object>();
- for (int i = 0; i < local.size(); ++i) {
- Object l = local.get(i);
- if (l instanceof LabelNode) {
- l = labels.get(l);
- }
- clone.local.add(l);
- }
- }
- if (stack != null) {
- clone.stack = new ArrayList<Object>();
- for (int i = 0; i < stack.size(); ++i) {
- Object s = stack.get(i);
- if (s instanceof LabelNode) {
- s = labels.get(s);
- }
- clone.stack.add(s);
- }
- }
- return clone;
- }
-
- // ------------------------------------------------------------------------
-
- private static List<Object> asList(final int n, final Object[] o) {
- return Arrays.asList(o).subList(0, n);
- }
-
- private static Object[] asArray(final List<Object> l) {
- Object[] objs = new Object[l.size()];
- for (int i = 0; i < objs.length; ++i) {
- Object o = l.get(i);
- if (o instanceof LabelNode) {
- o = ((LabelNode) o).getLabel();
- }
- objs[i] = o;
- }
- return objs;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/IincInsnNode.java b/src/asm/scala/tools/asm/tree/IincInsnNode.java
deleted file mode 100644
index c37ac91c27..0000000000
--- a/src/asm/scala/tools/asm/tree/IincInsnNode.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents an IINC instruction.
- *
- * @author Eric Bruneton
- */
-public class IincInsnNode extends AbstractInsnNode {
-
- /**
- * Index of the local variable to be incremented.
- */
- public int var;
-
- /**
- * Amount to increment the local variable by.
- */
- public int incr;
-
- /**
- * Constructs a new {@link IincInsnNode}.
- *
- * @param var
- * index of the local variable to be incremented.
- * @param incr
- * increment amount to increment the local variable by.
- */
- public IincInsnNode(final int var, final int incr) {
- super(Opcodes.IINC);
- this.var = var;
- this.incr = incr;
- }
-
- @Override
- public int getType() {
- return IINC_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitIincInsn(var, incr);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new IincInsnNode(var, incr).cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/InnerClassNode.java b/src/asm/scala/tools/asm/tree/InnerClassNode.java
deleted file mode 100644
index aa3810c759..0000000000
--- a/src/asm/scala/tools/asm/tree/InnerClassNode.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import scala.tools.asm.ClassVisitor;
-
-/**
- * A node that represents an inner class.
- *
- * @author Eric Bruneton
- */
-public class InnerClassNode {
-
- /**
- * The internal name of an inner class (see
- * {@link scala.tools.asm.Type#getInternalName() getInternalName}).
- */
- public String name;
-
- /**
- * The internal name of the class to which the inner class belongs (see
- * {@link scala.tools.asm.Type#getInternalName() getInternalName}). May be
- * <tt>null</tt>.
- */
- public String outerName;
-
- /**
- * The (simple) name of the inner class inside its enclosing class. May be
- * <tt>null</tt> for anonymous inner classes.
- */
- public String innerName;
-
- /**
- * The access flags of the inner class as originally declared in the
- * enclosing class.
- */
- public int access;
-
- /**
- * Constructs a new {@link InnerClassNode}.
- *
- * @param name
- * the internal name of an inner class (see
- * {@link scala.tools.asm.Type#getInternalName()
- * getInternalName}).
- * @param outerName
- * the internal name of the class to which the inner class
- * belongs (see {@link scala.tools.asm.Type#getInternalName()
- * getInternalName}). May be <tt>null</tt>.
- * @param innerName
- * the (simple) name of the inner class inside its enclosing
- * class. May be <tt>null</tt> for anonymous inner classes.
- * @param access
- * the access flags of the inner class as originally declared in
- * the enclosing class.
- */
- public InnerClassNode(final String name, final String outerName,
- final String innerName, final int access) {
- this.name = name;
- this.outerName = outerName;
- this.innerName = innerName;
- this.access = access;
- }
-
- /**
- * Makes the given class visitor visit this inner class.
- *
- * @param cv
- * a class visitor.
- */
- public void accept(final ClassVisitor cv) {
- cv.visitInnerClass(name, outerName, innerName, access);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/InsnList.java b/src/asm/scala/tools/asm/tree/InsnList.java
deleted file mode 100644
index e808712e78..0000000000
--- a/src/asm/scala/tools/asm/tree/InsnList.java
+++ /dev/null
@@ -1,622 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ListIterator;
-import java.util.NoSuchElementException;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A doubly linked list of {@link AbstractInsnNode} objects. <i>This
- * implementation is not thread safe</i>.
- */
-public class InsnList {
-
- /**
- * The number of instructions in this list.
- */
- private int size;
-
- /**
- * The first instruction in this list. May be <tt>null</tt>.
- */
- private AbstractInsnNode first;
-
- /**
- * The last instruction in this list. May be <tt>null</tt>.
- */
- private AbstractInsnNode last;
-
- /**
- * A cache of the instructions of this list. This cache is used to improve
- * the performance of the {@link #get} method.
- */
- AbstractInsnNode[] cache;
-
- /**
- * Returns the number of instructions in this list.
- *
- * @return the number of instructions in this list.
- */
- public int size() {
- return size;
- }
-
- /**
- * Returns the first instruction in this list.
- *
- * @return the first instruction in this list, or <tt>null</tt> if the list
- * is empty.
- */
- public AbstractInsnNode getFirst() {
- return first;
- }
-
- /**
- * Returns the last instruction in this list.
- *
- * @return the last instruction in this list, or <tt>null</tt> if the list
- * is empty.
- */
- public AbstractInsnNode getLast() {
- return last;
- }
-
- /**
- * Returns the instruction whose index is given. This method builds a cache
- * of the instructions in this list to avoid scanning the whole list each
- * time it is called. Once the cache is built, this method run in constant
- * time. This cache is invalidated by all the methods that modify the list.
- *
- * @param index
- * the index of the instruction that must be returned.
- * @return the instruction whose index is given.
- * @throws IndexOutOfBoundsException
- * if (index &lt; 0 || index &gt;= size()).
- */
- public AbstractInsnNode get(final int index) {
- if (index < 0 || index >= size) {
- throw new IndexOutOfBoundsException();
- }
- if (cache == null) {
- cache = toArray();
- }
- return cache[index];
- }
-
- /**
- * Returns <tt>true</tt> if the given instruction belongs to this list. This
- * method always scans the instructions of this list until it finds the
- * given instruction or reaches the end of the list.
- *
- * @param insn
- * an instruction.
- * @return <tt>true</tt> if the given instruction belongs to this list.
- */
- public boolean contains(final AbstractInsnNode insn) {
- AbstractInsnNode i = first;
- while (i != null && i != insn) {
- i = i.next;
- }
- return i != null;
- }
-
- /**
- * Returns the index of the given instruction in this list. This method
- * builds a cache of the instruction indexes to avoid scanning the whole
- * list each time it is called. Once the cache is built, this method run in
- * constant time. The cache is invalidated by all the methods that modify
- * the list.
- *
- * @param insn
- * an instruction <i>of this list</i>.
- * @return the index of the given instruction in this list. <i>The result of
- * this method is undefined if the given instruction does not belong
- * to this list</i>. Use {@link #contains contains} to test if an
- * instruction belongs to an instruction list or not.
- */
- public int indexOf(final AbstractInsnNode insn) {
- if (cache == null) {
- cache = toArray();
- }
- return insn.index;
- }
-
- /**
- * Makes the given visitor visit all of the instructions in this list.
- *
- * @param mv
- * the method visitor that must visit the instructions.
- */
- public void accept(final MethodVisitor mv) {
- AbstractInsnNode insn = first;
- while (insn != null) {
- insn.accept(mv);
- insn = insn.next;
- }
- }
-
- /**
- * Returns an iterator over the instructions in this list.
- *
- * @return an iterator over the instructions in this list.
- */
- public ListIterator<AbstractInsnNode> iterator() {
- return iterator(0);
- }
-
- /**
- * Returns an iterator over the instructions in this list.
- *
- * @return an iterator over the instructions in this list.
- */
- @SuppressWarnings("unchecked")
- public ListIterator<AbstractInsnNode> iterator(int index) {
- return new InsnListIterator(index);
- }
-
- /**
- * Returns an array containing all of the instructions in this list.
- *
- * @return an array containing all of the instructions in this list.
- */
- public AbstractInsnNode[] toArray() {
- int i = 0;
- AbstractInsnNode elem = first;
- AbstractInsnNode[] insns = new AbstractInsnNode[size];
- while (elem != null) {
- insns[i] = elem;
- elem.index = i++;
- elem = elem.next;
- }
- return insns;
- }
-
- /**
- * Replaces an instruction of this list with another instruction.
- *
- * @param location
- * an instruction <i>of this list</i>.
- * @param insn
- * another instruction, <i>which must not belong to any
- * {@link InsnList}</i>.
- */
- public void set(final AbstractInsnNode location, final AbstractInsnNode insn) {
- AbstractInsnNode next = location.next;
- insn.next = next;
- if (next != null) {
- next.prev = insn;
- } else {
- last = insn;
- }
- AbstractInsnNode prev = location.prev;
- insn.prev = prev;
- if (prev != null) {
- prev.next = insn;
- } else {
- first = insn;
- }
- if (cache != null) {
- int index = location.index;
- cache[index] = insn;
- insn.index = index;
- } else {
- insn.index = 0; // insn now belongs to an InsnList
- }
- location.index = -1; // i no longer belongs to an InsnList
- location.prev = null;
- location.next = null;
- }
-
- /**
- * Adds the given instruction to the end of this list.
- *
- * @param insn
- * an instruction, <i>which must not belong to any
- * {@link InsnList}</i>.
- */
- public void add(final AbstractInsnNode insn) {
- if(insn.prev != null || insn.next != null) {
- // Adding an instruction that still refers to others (in the same or another InsnList) leads to hard to debug bugs.
- // Initially everything may look ok (e.g. iteration follows `next` thus a stale `prev` isn't noticed).
- // However, a stale link brings the doubly-linked into disarray e.g. upon removing an element,
- // which results in the `next` of a stale `prev` being updated, among other failure scenarios.
- // Better fail early.
- throw new RuntimeException("Instruction " + insn + " already belongs to some InsnList.");
- }
- ++size;
- if (last == null) {
- first = insn;
- last = insn;
- } else {
- last.next = insn;
- insn.prev = last;
- }
- last = insn;
- cache = null;
- insn.index = 0; // insn now belongs to an InsnList
- }
-
- /**
- * Adds the given instructions to the end of this list.
- *
- * @param insns
- * an instruction list, which is cleared during the process. This
- * list must be different from 'this'.
- */
- public void add(final InsnList insns) {
- if (insns.size == 0) {
- return;
- }
- size += insns.size;
- if (last == null) {
- first = insns.first;
- last = insns.last;
- } else {
- AbstractInsnNode elem = insns.first;
- last.next = elem;
- elem.prev = last;
- last = insns.last;
- }
- cache = null;
- insns.removeAll(false);
- }
-
- /**
- * Inserts the given instruction at the begining of this list.
- *
- * @param insn
- * an instruction, <i>which must not belong to any
- * {@link InsnList}</i>.
- */
- public void insert(final AbstractInsnNode insn) {
- ++size;
- if (first == null) {
- first = insn;
- last = insn;
- } else {
- first.prev = insn;
- insn.next = first;
- }
- first = insn;
- cache = null;
- insn.index = 0; // insn now belongs to an InsnList
- }
-
- /**
- * Inserts the given instructions at the begining of this list.
- *
- * @param insns
- * an instruction list, which is cleared during the process. This
- * list must be different from 'this'.
- */
- public void insert(final InsnList insns) {
- if (insns.size == 0) {
- return;
- }
- size += insns.size;
- if (first == null) {
- first = insns.first;
- last = insns.last;
- } else {
- AbstractInsnNode elem = insns.last;
- first.prev = elem;
- elem.next = first;
- first = insns.first;
- }
- cache = null;
- insns.removeAll(false);
- }
-
- /**
- * Inserts the given instruction after the specified instruction.
- *
- * @param location
- * an instruction <i>of this list</i> after which insn must be
- * inserted.
- * @param insn
- * the instruction to be inserted, <i>which must not belong to
- * any {@link InsnList}</i>.
- */
- public void insert(final AbstractInsnNode location,
- final AbstractInsnNode insn) {
- ++size;
- AbstractInsnNode next = location.next;
- if (next == null) {
- last = insn;
- } else {
- next.prev = insn;
- }
- location.next = insn;
- insn.next = next;
- insn.prev = location;
- cache = null;
- insn.index = 0; // insn now belongs to an InsnList
- }
-
- /**
- * Inserts the given instructions after the specified instruction.
- *
- * @param location
- * an instruction <i>of this list</i> after which the
- * instructions must be inserted.
- * @param insns
- * the instruction list to be inserted, which is cleared during
- * the process. This list must be different from 'this'.
- */
- public void insert(final AbstractInsnNode location, final InsnList insns) {
- if (insns.size == 0) {
- return;
- }
- size += insns.size;
- AbstractInsnNode ifirst = insns.first;
- AbstractInsnNode ilast = insns.last;
- AbstractInsnNode next = location.next;
- if (next == null) {
- last = ilast;
- } else {
- next.prev = ilast;
- }
- location.next = ifirst;
- ilast.next = next;
- ifirst.prev = location;
- cache = null;
- insns.removeAll(false);
- }
-
- /**
- * Inserts the given instruction before the specified instruction.
- *
- * @param location
- * an instruction <i>of this list</i> before which insn must be
- * inserted.
- * @param insn
- * the instruction to be inserted, <i>which must not belong to
- * any {@link InsnList}</i>.
- */
- public void insertBefore(final AbstractInsnNode location,
- final AbstractInsnNode insn) {
- ++size;
- AbstractInsnNode prev = location.prev;
- if (prev == null) {
- first = insn;
- } else {
- prev.next = insn;
- }
- location.prev = insn;
- insn.next = location;
- insn.prev = prev;
- cache = null;
- insn.index = 0; // insn now belongs to an InsnList
- }
-
- /**
- * Inserts the given instructions before the specified instruction.
- *
- * @param location
- * an instruction <i>of this list</i> before which the
- * instructions must be inserted.
- * @param insns
- * the instruction list to be inserted, which is cleared during
- * the process. This list must be different from 'this'.
- */
- public void insertBefore(final AbstractInsnNode location,
- final InsnList insns) {
- if (insns.size == 0) {
- return;
- }
- size += insns.size;
- AbstractInsnNode ifirst = insns.first;
- AbstractInsnNode ilast = insns.last;
- AbstractInsnNode prev = location.prev;
- if (prev == null) {
- first = ifirst;
- } else {
- prev.next = ifirst;
- }
- location.prev = ilast;
- ilast.next = location;
- ifirst.prev = prev;
- cache = null;
- insns.removeAll(false);
- }
-
- /**
- * Removes the given instruction from this list.
- *
- * @param insn
- * the instruction <i>of this list</i> that must be removed.
- */
- public void remove(final AbstractInsnNode insn) {
- --size;
- AbstractInsnNode next = insn.next;
- AbstractInsnNode prev = insn.prev;
- if (next == null) {
- if (prev == null) {
- first = null;
- last = null;
- } else {
- prev.next = null;
- last = prev;
- }
- } else {
- if (prev == null) {
- first = next;
- next.prev = null;
- } else {
- prev.next = next;
- next.prev = prev;
- }
- }
- cache = null;
- insn.index = -1; // insn no longer belongs to an InsnList
- insn.prev = null;
- insn.next = null;
- }
-
- /**
- * Removes all of the instructions of this list.
- *
- * @param mark
- * if the instructions must be marked as no longer belonging to
- * any {@link InsnList}.
- */
- void removeAll(final boolean mark) {
- if (mark) {
- AbstractInsnNode insn = first;
- while (insn != null) {
- AbstractInsnNode next = insn.next;
- insn.index = -1; // insn no longer belongs to an InsnList
- insn.prev = null;
- insn.next = null;
- insn = next;
- }
- }
- size = 0;
- first = null;
- last = null;
- cache = null;
- }
-
- /**
- * Removes all of the instructions of this list.
- */
- public void clear() {
- removeAll(false);
- }
-
- /**
- * Reset all labels in the instruction list. This method should be called
- * before reusing same instructions list between several
- * <code>ClassWriter</code>s.
- */
- public void resetLabels() {
- AbstractInsnNode insn = first;
- while (insn != null) {
- if (insn instanceof LabelNode) {
- ((LabelNode) insn).resetLabel();
- }
- insn = insn.next;
- }
- }
-
- // this class is not generified because it will create bridges
- private final class InsnListIterator implements ListIterator {
-
- AbstractInsnNode next;
-
- AbstractInsnNode prev;
-
- AbstractInsnNode remove;
-
- InsnListIterator(int index) {
- if (index == size()) {
- next = null;
- prev = getLast();
- } else {
- next = get(index);
- prev = next.prev;
- }
- }
-
- public boolean hasNext() {
- return next != null;
- }
-
- public Object next() {
- if (next == null) {
- throw new NoSuchElementException();
- }
- AbstractInsnNode result = next;
- prev = result;
- next = result.next;
- remove = result;
- return result;
- }
-
- public void remove() {
- if (remove != null) {
- if (remove == next) {
- next = next.next;
- } else {
- prev = prev.prev;
- }
- InsnList.this.remove(remove);
- remove = null;
- } else {
- throw new IllegalStateException();
- }
- }
-
- public boolean hasPrevious() {
- return prev != null;
- }
-
- public Object previous() {
- AbstractInsnNode result = prev;
- next = result;
- prev = result.prev;
- remove = result;
- return result;
- }
-
- public int nextIndex() {
- if (next == null) {
- return size();
- }
- if (cache == null) {
- cache = toArray();
- }
- return next.index;
- }
-
- public int previousIndex() {
- if (prev == null) {
- return -1;
- }
- if (cache == null) {
- cache = toArray();
- }
- return prev.index;
- }
-
- public void add(Object o) {
- InsnList.this.insertBefore(next, (AbstractInsnNode) o);
- prev = (AbstractInsnNode) o;
- remove = null;
- }
-
- public void set(Object o) {
- InsnList.this.set(next.prev, (AbstractInsnNode) o);
- prev = (AbstractInsnNode) o;
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/InsnNode.java b/src/asm/scala/tools/asm/tree/InsnNode.java
deleted file mode 100644
index f5313929ee..0000000000
--- a/src/asm/scala/tools/asm/tree/InsnNode.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a zero operand instruction.
- *
- * @author Eric Bruneton
- */
-public class InsnNode extends AbstractInsnNode {
-
- /**
- * Constructs a new {@link InsnNode}.
- *
- * @param opcode
- * the opcode of the instruction to be constructed. This opcode
- * must be NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1,
- * ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1,
- * FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD,
- * LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD,
- * IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE,
- * SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1,
- * DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB,
- * IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM,
- * FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR,
- * IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D,
- * L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S,
- * LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN,
- * DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER,
- * or MONITOREXIT.
- */
- public InsnNode(final int opcode) {
- super(opcode);
- }
-
- @Override
- public int getType() {
- return INSN;
- }
-
- /**
- * Makes the given visitor visit this instruction.
- *
- * @param mv
- * a method visitor.
- */
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitInsn(opcode);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new InsnNode(opcode).cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/IntInsnNode.java b/src/asm/scala/tools/asm/tree/IntInsnNode.java
deleted file mode 100644
index 6bbe8d845c..0000000000
--- a/src/asm/scala/tools/asm/tree/IntInsnNode.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents an instruction with a single int operand.
- *
- * @author Eric Bruneton
- */
-public class IntInsnNode extends AbstractInsnNode {
-
- /**
- * The operand of this instruction.
- */
- public int operand;
-
- /**
- * Constructs a new {@link IntInsnNode}.
- *
- * @param opcode
- * the opcode of the instruction to be constructed. This opcode
- * must be BIPUSH, SIPUSH or NEWARRAY.
- * @param operand
- * the operand of the instruction to be constructed.
- */
- public IntInsnNode(final int opcode, final int operand) {
- super(opcode);
- this.operand = operand;
- }
-
- /**
- * Sets the opcode of this instruction.
- *
- * @param opcode
- * the new instruction opcode. This opcode must be BIPUSH, SIPUSH
- * or NEWARRAY.
- */
- public void setOpcode(final int opcode) {
- this.opcode = opcode;
- }
-
- @Override
- public int getType() {
- return INT_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitIntInsn(opcode, operand);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new IntInsnNode(opcode, operand).cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/InvokeDynamicInsnNode.java b/src/asm/scala/tools/asm/tree/InvokeDynamicInsnNode.java
deleted file mode 100644
index 0f85e60291..0000000000
--- a/src/asm/scala/tools/asm/tree/InvokeDynamicInsnNode.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.Handle;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents an invokedynamic instruction.
- *
- * @author Remi Forax
- */
-public class InvokeDynamicInsnNode extends AbstractInsnNode {
-
- /**
- * Invokedynamic name.
- */
- public String name;
-
- /**
- * Invokedynamic descriptor.
- */
- public String desc;
-
- /**
- * Bootstrap method
- */
- public Handle bsm;
-
- /**
- * Bootstrap constant arguments
- */
- public Object[] bsmArgs;
-
- /**
- * Constructs a new {@link InvokeDynamicInsnNode}.
- *
- * @param name
- * invokedynamic name.
- * @param desc
- * invokedynamic descriptor (see {@link scala.tools.asm.Type}).
- * @param bsm
- * the bootstrap method.
- * @param bsmArgs
- * the boostrap constant arguments.
- */
- public InvokeDynamicInsnNode(final String name, final String desc,
- final Handle bsm, final Object... bsmArgs) {
- super(Opcodes.INVOKEDYNAMIC);
- this.name = name;
- this.desc = desc;
- this.bsm = bsm;
- this.bsmArgs = bsmArgs;
- }
-
- @Override
- public int getType() {
- return INVOKE_DYNAMIC_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs)
- .cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/JumpInsnNode.java b/src/asm/scala/tools/asm/tree/JumpInsnNode.java
deleted file mode 100644
index 8b8a769204..0000000000
--- a/src/asm/scala/tools/asm/tree/JumpInsnNode.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a jump instruction. A jump instruction is an
- * instruction that may jump to another instruction.
- *
- * @author Eric Bruneton
- */
-public class JumpInsnNode extends AbstractInsnNode {
-
- /**
- * The operand of this instruction. This operand is a label that designates
- * the instruction to which this instruction may jump.
- */
- public LabelNode label;
-
- /**
- * Constructs a new {@link JumpInsnNode}.
- *
- * @param opcode
- * the opcode of the type instruction to be constructed. This
- * opcode must be IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ,
- * IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
- * IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
- * @param label
- * the operand of the instruction to be constructed. This operand
- * is a label that designates the instruction to which the jump
- * instruction may jump.
- */
- public JumpInsnNode(final int opcode, final LabelNode label) {
- super(opcode);
- this.label = label;
- }
-
- /**
- * Sets the opcode of this instruction.
- *
- * @param opcode
- * the new instruction opcode. This opcode must be IFEQ, IFNE,
- * IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT,
- * IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO,
- * JSR, IFNULL or IFNONNULL.
- */
- public void setOpcode(final int opcode) {
- this.opcode = opcode;
- }
-
- @Override
- public int getType() {
- return JUMP_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitJumpInsn(opcode, label.getLabel());
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new JumpInsnNode(opcode, clone(label, labels))
- .cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/LabelNode.java b/src/asm/scala/tools/asm/tree/LabelNode.java
deleted file mode 100644
index 44c48c1160..0000000000
--- a/src/asm/scala/tools/asm/tree/LabelNode.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-
-/**
- * An {@link AbstractInsnNode} that encapsulates a {@link Label}.
- */
-public class LabelNode extends AbstractInsnNode {
-
- private Label label;
-
- public LabelNode() {
- super(-1);
- }
-
- public LabelNode(final Label label) {
- super(-1);
- this.label = label;
- }
-
- @Override
- public int getType() {
- return LABEL;
- }
-
- public Label getLabel() {
- if (label == null) {
- label = new Label();
- }
- return label;
- }
-
- @Override
- public void accept(final MethodVisitor cv) {
- cv.visitLabel(getLabel());
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return labels.get(this);
- }
-
- public void resetLabel() {
- label = null;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/LdcInsnNode.java b/src/asm/scala/tools/asm/tree/LdcInsnNode.java
deleted file mode 100644
index 1cc850bb31..0000000000
--- a/src/asm/scala/tools/asm/tree/LdcInsnNode.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents an LDC instruction.
- *
- * @author Eric Bruneton
- */
-public class LdcInsnNode extends AbstractInsnNode {
-
- /**
- * The constant to be loaded on the stack. This parameter must be a non null
- * {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}, a
- * {@link String} or a {@link scala.tools.asm.Type}.
- */
- public Object cst;
-
- /**
- * Constructs a new {@link LdcInsnNode}.
- *
- * @param cst
- * the constant to be loaded on the stack. This parameter must be
- * a non null {@link Integer}, a {@link Float}, a {@link Long}, a
- * {@link Double} or a {@link String}.
- */
- public LdcInsnNode(final Object cst) {
- super(Opcodes.LDC);
- this.cst = cst;
- }
-
- @Override
- public int getType() {
- return LDC_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitLdcInsn(cst);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new LdcInsnNode(cst).cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/LineNumberNode.java b/src/asm/scala/tools/asm/tree/LineNumberNode.java
deleted file mode 100644
index 9947aa70a9..0000000000
--- a/src/asm/scala/tools/asm/tree/LineNumberNode.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a line number declaration. These nodes are pseudo
- * instruction nodes in order to be inserted in an instruction list.
- *
- * @author Eric Bruneton
- */
-public class LineNumberNode extends AbstractInsnNode {
-
- /**
- * A line number. This number refers to the source file from which the class
- * was compiled.
- */
- public int line;
-
- /**
- * The first instruction corresponding to this line number.
- */
- public LabelNode start;
-
- /**
- * Constructs a new {@link LineNumberNode}.
- *
- * @param line
- * a line number. This number refers to the source file from
- * which the class was compiled.
- * @param start
- * the first instruction corresponding to this line number.
- */
- public LineNumberNode(final int line, final LabelNode start) {
- super(-1);
- this.line = line;
- this.start = start;
- }
-
- @Override
- public int getType() {
- return LINE;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitLineNumber(line, start.getLabel());
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new LineNumberNode(line, clone(start, labels));
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/LocalVariableAnnotationNode.java b/src/asm/scala/tools/asm/tree/LocalVariableAnnotationNode.java
deleted file mode 100644
index d05b808171..0000000000
--- a/src/asm/scala/tools/asm/tree/LocalVariableAnnotationNode.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-
-/**
- * A node that represents a type annotation on a local or resource variable.
- *
- * @author Eric Bruneton
- */
-public class LocalVariableAnnotationNode extends TypeAnnotationNode {
-
- /**
- * The fist instructions corresponding to the continuous ranges that make
- * the scope of this local variable (inclusive). Must not be <tt>null</tt>.
- */
- public List<LabelNode> start;
-
- /**
- * The last instructions corresponding to the continuous ranges that make
- * the scope of this local variable (exclusive). This list must have the
- * same size as the 'start' list. Must not be <tt>null</tt>.
- */
- public List<LabelNode> end;
-
- /**
- * The local variable's index in each range. This list must have the same
- * size as the 'start' list. Must not be <tt>null</tt>.
- */
- public List<Integer> index;
-
- /**
- * Constructs a new {@link LocalVariableAnnotationNode}. <i>Subclasses must
- * not use this constructor</i>. Instead, they must use the
- * {@link #LocalVariableAnnotationNode(int, TypePath, LabelNode[], LabelNode[], int[], String)}
- * version.
- *
- * @param typeRef
- * a reference to the annotated type. See {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param start
- * the fist instructions corresponding to the continuous ranges
- * that make the scope of this local variable (inclusive).
- * @param end
- * the last instructions corresponding to the continuous ranges
- * that make the scope of this local variable (exclusive). This
- * array must have the same size as the 'start' array.
- * @param index
- * the local variable's index in each range. This array must have
- * the same size as the 'start' array.
- * @param desc
- * the class descriptor of the annotation class.
- */
- public LocalVariableAnnotationNode(int typeRef, TypePath typePath,
- LabelNode[] start, LabelNode[] end, int[] index, String desc) {
- this(Opcodes.ASM5, typeRef, typePath, start, end, index, desc);
- }
-
- /**
- * Constructs a new {@link LocalVariableAnnotationNode}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param typeRef
- * a reference to the annotated type. See {@link TypeReference}.
- * @param start
- * the fist instructions corresponding to the continuous ranges
- * that make the scope of this local variable (inclusive).
- * @param end
- * the last instructions corresponding to the continuous ranges
- * that make the scope of this local variable (exclusive). This
- * array must have the same size as the 'start' array.
- * @param index
- * the local variable's index in each range. This array must have
- * the same size as the 'start' array.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- */
- public LocalVariableAnnotationNode(int api, int typeRef, TypePath typePath,
- LabelNode[] start, LabelNode[] end, int[] index, String desc) {
- super(api, typeRef, typePath, desc);
- this.start = new ArrayList<LabelNode>(start.length);
- this.start.addAll(Arrays.asList(start));
- this.end = new ArrayList<LabelNode>(end.length);
- this.end.addAll(Arrays.asList(end));
- this.index = new ArrayList<Integer>(index.length);
- for (int i : index) {
- this.index.add(i);
- }
- }
-
- /**
- * Makes the given visitor visit this type annotation.
- *
- * @param mv
- * the visitor that must visit this annotation.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- */
- public void accept(final MethodVisitor mv, boolean visible) {
- Label[] start = new Label[this.start.size()];
- Label[] end = new Label[this.end.size()];
- int[] index = new int[this.index.size()];
- for (int i = 0; i < start.length; ++i) {
- start[i] = this.start.get(i).getLabel();
- end[i] = this.end.get(i).getLabel();
- index[i] = this.index.get(i);
- }
- accept(mv.visitLocalVariableAnnotation(typeRef, typePath, start, end,
- index, desc, true));
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/LocalVariableNode.java b/src/asm/scala/tools/asm/tree/LocalVariableNode.java
deleted file mode 100644
index 0d8e27356f..0000000000
--- a/src/asm/scala/tools/asm/tree/LocalVariableNode.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a local variable declaration.
- *
- * @author Eric Bruneton
- */
-public class LocalVariableNode {
-
- /**
- * The name of a local variable.
- */
- public String name;
-
- /**
- * The type descriptor of this local variable.
- */
- public String desc;
-
- /**
- * The signature of this local variable. May be <tt>null</tt>.
- */
- public String signature;
-
- /**
- * The first instruction corresponding to the scope of this local variable
- * (inclusive).
- */
- public LabelNode start;
-
- /**
- * The last instruction corresponding to the scope of this local variable
- * (exclusive).
- */
- public LabelNode end;
-
- /**
- * The local variable's index.
- */
- public int index;
-
- /**
- * Constructs a new {@link LocalVariableNode}.
- *
- * @param name
- * the name of a local variable.
- * @param desc
- * the type descriptor of this local variable.
- * @param signature
- * the signature of this local variable. May be <tt>null</tt>.
- * @param start
- * the first instruction corresponding to the scope of this local
- * variable (inclusive).
- * @param end
- * the last instruction corresponding to the scope of this local
- * variable (exclusive).
- * @param index
- * the local variable's index.
- */
- public LocalVariableNode(final String name, final String desc,
- final String signature, final LabelNode start, final LabelNode end,
- final int index) {
- this.name = name;
- this.desc = desc;
- this.signature = signature;
- this.start = start;
- this.end = end;
- this.index = index;
- }
-
- /**
- * Makes the given visitor visit this local variable declaration.
- *
- * @param mv
- * a method visitor.
- */
- public void accept(final MethodVisitor mv) {
- mv.visitLocalVariable(name, desc, signature, start.getLabel(),
- end.getLabel(), index);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/LookupSwitchInsnNode.java b/src/asm/scala/tools/asm/tree/LookupSwitchInsnNode.java
deleted file mode 100644
index 7db2f53ff4..0000000000
--- a/src/asm/scala/tools/asm/tree/LookupSwitchInsnNode.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a LOOKUPSWITCH instruction.
- *
- * @author Eric Bruneton
- */
-public class LookupSwitchInsnNode extends AbstractInsnNode {
-
- /**
- * Beginning of the default handler block.
- */
- public LabelNode dflt;
-
- /**
- * The values of the keys. This list is a list of {@link Integer} objects.
- */
- public List<Integer> keys;
-
- /**
- * Beginnings of the handler blocks. This list is a list of
- * {@link LabelNode} objects.
- */
- public List<LabelNode> labels;
-
- /**
- * Constructs a new {@link LookupSwitchInsnNode}.
- *
- * @param dflt
- * beginning of the default handler block.
- * @param keys
- * the values of the keys.
- * @param labels
- * beginnings of the handler blocks. <tt>labels[i]</tt> is the
- * beginning of the handler block for the <tt>keys[i]</tt> key.
- */
- public LookupSwitchInsnNode(final LabelNode dflt, final int[] keys,
- final LabelNode[] labels) {
- super(Opcodes.LOOKUPSWITCH);
- this.dflt = dflt;
- this.keys = new ArrayList<Integer>(keys == null ? 0 : keys.length);
- this.labels = new ArrayList<LabelNode>(labels == null ? 0
- : labels.length);
- if (keys != null) {
- for (int i = 0; i < keys.length; ++i) {
- this.keys.add(new Integer(keys[i]));
- }
- }
- if (labels != null) {
- this.labels.addAll(Arrays.asList(labels));
- }
- }
-
- @Override
- public int getType() {
- return LOOKUPSWITCH_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- int[] keys = new int[this.keys.size()];
- for (int i = 0; i < keys.length; ++i) {
- keys[i] = this.keys.get(i).intValue();
- }
- Label[] labels = new Label[this.labels.size()];
- for (int i = 0; i < labels.length; ++i) {
- labels[i] = this.labels.get(i).getLabel();
- }
- mv.visitLookupSwitchInsn(dflt.getLabel(), keys, labels);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- LookupSwitchInsnNode clone = new LookupSwitchInsnNode(clone(dflt,
- labels), null, clone(this.labels, labels));
- clone.keys.addAll(keys);
- return clone.cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/MethodInsnNode.java b/src/asm/scala/tools/asm/tree/MethodInsnNode.java
deleted file mode 100644
index 30c7854646..0000000000
--- a/src/asm/scala/tools/asm/tree/MethodInsnNode.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a method instruction. A method instruction is an
- * instruction that invokes a method.
- *
- * @author Eric Bruneton
- */
-public class MethodInsnNode extends AbstractInsnNode {
-
- /**
- * The internal name of the method's owner class (see
- * {@link scala.tools.asm.Type#getInternalName() getInternalName}).
- * For methods of arrays, e.g., clone(), the array type descriptor.
- */
- public String owner;
-
- /**
- * The method's name.
- */
- public String name;
-
- /**
- * The method's descriptor (see {@link scala.tools.asm.Type}).
- */
- public String desc;
-
- /**
- * If the method's owner class if an interface.
- */
- public boolean itf;
-
- /**
- * Constructs a new {@link MethodInsnNode}.
- *
- * @param opcode
- * the opcode of the type instruction to be constructed. This
- * opcode must be INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
- * INVOKEINTERFACE.
- * @param owner
- * the internal name of the method's owner class (see
- * {@link scala.tools.asm.Type#getInternalName()
- * getInternalName}).
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link scala.tools.asm.Type}).
- */
- @Deprecated
- public MethodInsnNode(final int opcode, final String owner,
- final String name, final String desc) {
- this(opcode, owner, name, desc, opcode == Opcodes.INVOKEINTERFACE);
- }
-
- /**
- * Constructs a new {@link MethodInsnNode}.
- *
- * @param opcode
- * the opcode of the type instruction to be constructed. This
- * opcode must be INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or
- * INVOKEINTERFACE.
- * @param owner
- * the internal name of the method's owner class (see
- * {@link scala.tools.asm.Type#getInternalName()
- * getInternalName}).
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link scala.tools.asm.Type}).
- * @param itf
- * if the method's owner class is an interface.
- */
- public MethodInsnNode(final int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- super(opcode);
- this.owner = owner;
- this.name = name;
- this.desc = desc;
- this.itf = itf;
- }
-
- /**
- * Sets the opcode of this instruction.
- *
- * @param opcode
- * the new instruction opcode. This opcode must be INVOKEVIRTUAL,
- * INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
- */
- public void setOpcode(final int opcode) {
- this.opcode = opcode;
- }
-
- @Override
- public int getType() {
- return METHOD_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitMethodInsn(opcode, owner, name, desc, itf);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new MethodInsnNode(opcode, owner, name, desc, itf);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/MethodNode.java b/src/asm/scala/tools/asm/tree/MethodNode.java
deleted file mode 100644
index 3dec50e02c..0000000000
--- a/src/asm/scala/tools/asm/tree/MethodNode.java
+++ /dev/null
@@ -1,839 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-
-/**
- * A node that represents a method.
- *
- * @author Eric Bruneton
- */
-public class MethodNode extends MethodVisitor {
-
- /**
- * The method's access flags (see {@link Opcodes}). This field also
- * indicates if the method is synthetic and/or deprecated.
- */
- public int access;
-
- /**
- * The method's name.
- */
- public String name;
-
- /**
- * The method's descriptor (see {@link Type}).
- */
- public String desc;
-
- /**
- * The method's signature. May be <tt>null</tt>.
- */
- public String signature;
-
- /**
- * The internal names of the method's exception classes (see
- * {@link Type#getInternalName() getInternalName}). This list is a list of
- * {@link String} objects.
- */
- public List<String> exceptions;
-
- /**
- * The method parameter info (access flags and name)
- */
- public List<ParameterNode> parameters;
-
- /**
- * The runtime visible annotations of this method. This list is a list of
- * {@link AnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.AnnotationNode
- * @label visible
- */
- public List<AnnotationNode> visibleAnnotations;
-
- /**
- * The runtime invisible annotations of this method. This list is a list of
- * {@link AnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.AnnotationNode
- * @label invisible
- */
- public List<AnnotationNode> invisibleAnnotations;
-
- /**
- * The runtime visible type annotations of this method. This list is a list
- * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label visible
- */
- public List<TypeAnnotationNode> visibleTypeAnnotations;
-
- /**
- * The runtime invisible type annotations of this method. This list is a
- * list of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label invisible
- */
- public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
- /**
- * The non standard attributes of this method. This list is a list of
- * {@link Attribute} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.Attribute
- */
- public List<Attribute> attrs;
-
- /**
- * The default value of this annotation interface method. This field must be
- * a {@link Byte}, {@link Boolean}, {@link Character}, {@link Short},
- * {@link Integer}, {@link Long}, {@link Float}, {@link Double},
- * {@link String} or {@link Type}, or an two elements String array (for
- * enumeration values), a {@link AnnotationNode}, or a {@link List} of
- * values of one of the preceding types. May be <tt>null</tt>.
- */
- public Object annotationDefault;
-
- /**
- * The runtime visible parameter annotations of this method. These lists are
- * lists of {@link AnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.AnnotationNode
- * @label invisible parameters
- */
- public List<AnnotationNode>[] visibleParameterAnnotations;
-
- /**
- * The runtime invisible parameter annotations of this method. These lists
- * are lists of {@link AnnotationNode} objects. May be <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.AnnotationNode
- * @label visible parameters
- */
- public List<AnnotationNode>[] invisibleParameterAnnotations;
-
- /**
- * The instructions of this method. This list is a list of
- * {@link AbstractInsnNode} objects.
- *
- * @associates scala.tools.asm.tree.AbstractInsnNode
- * @label instructions
- */
- public InsnList instructions;
-
- /**
- * The try catch blocks of this method. This list is a list of
- * {@link TryCatchBlockNode} objects.
- *
- * @associates scala.tools.asm.tree.TryCatchBlockNode
- */
- public List<TryCatchBlockNode> tryCatchBlocks;
-
- /**
- * The maximum stack size of this method.
- */
- public int maxStack;
-
- /**
- * The maximum number of local variables of this method.
- */
- public int maxLocals;
-
- /**
- * The local variables of this method. This list is a list of
- * {@link LocalVariableNode} objects. May be <tt>null</tt>
- *
- * @associates scala.tools.asm.tree.LocalVariableNode
- */
- public List<LocalVariableNode> localVariables;
-
- /**
- * The visible local variable annotations of this method. This list is a
- * list of {@link LocalVariableAnnotationNode} objects. May be <tt>null</tt>
- *
- * @associates scala.tools.asm.tree.LocalVariableAnnotationNode
- */
- public List<LocalVariableAnnotationNode> visibleLocalVariableAnnotations;
-
- /**
- * The invisible local variable annotations of this method. This list is a
- * list of {@link LocalVariableAnnotationNode} objects. May be <tt>null</tt>
- *
- * @associates scala.tools.asm.tree.LocalVariableAnnotationNode
- */
- public List<LocalVariableAnnotationNode> invisibleLocalVariableAnnotations;
-
- /**
- * If the accept method has been called on this object.
- */
- private boolean visited;
-
- /**
- * Constructs an uninitialized {@link MethodNode}. <i>Subclasses must not
- * use this constructor</i>. Instead, they must use the
- * {@link #MethodNode(int)} version.
- *
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public MethodNode() {
- this(Opcodes.ASM5);
- if (getClass() != MethodNode.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs an uninitialized {@link MethodNode}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- public MethodNode(final int api) {
- super(api);
- this.instructions = new InsnList();
- }
-
- /**
- * Constructs a new {@link MethodNode}. <i>Subclasses must not use this
- * constructor</i>. Instead, they must use the
- * {@link #MethodNode(int, int, String, String, String, String[])} version.
- *
- * @param access
- * the method's access flags (see {@link Opcodes}). This
- * parameter also indicates if the method is synthetic and/or
- * deprecated.
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link Type}).
- * @param signature
- * the method's signature. May be <tt>null</tt>.
- * @param exceptions
- * the internal names of the method's exception classes (see
- * {@link Type#getInternalName() getInternalName}). May be
- * <tt>null</tt>.
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public MethodNode(final int access, final String name, final String desc,
- final String signature, final String[] exceptions) {
- this(Opcodes.ASM5, access, name, desc, signature, exceptions);
- if (getClass() != MethodNode.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link MethodNode}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param access
- * the method's access flags (see {@link Opcodes}). This
- * parameter also indicates if the method is synthetic and/or
- * deprecated.
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link Type}).
- * @param signature
- * the method's signature. May be <tt>null</tt>.
- * @param exceptions
- * the internal names of the method's exception classes (see
- * {@link Type#getInternalName() getInternalName}). May be
- * <tt>null</tt>.
- */
- public MethodNode(final int api, final int access, final String name,
- final String desc, final String signature, final String[] exceptions) {
- super(api);
- this.access = access;
- this.name = name;
- this.desc = desc;
- this.signature = signature;
- this.exceptions = new ArrayList<String>(exceptions == null ? 0
- : exceptions.length);
- boolean isAbstract = (access & Opcodes.ACC_ABSTRACT) != 0;
- if (!isAbstract) {
- this.localVariables = new ArrayList<LocalVariableNode>(5);
- }
- this.tryCatchBlocks = new ArrayList<TryCatchBlockNode>();
- if (exceptions != null) {
- this.exceptions.addAll(Arrays.asList(exceptions));
- }
- this.instructions = new InsnList();
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the MethodVisitor abstract class
- // ------------------------------------------------------------------------
-
- @Override
- public void visitParameter(String name, int access) {
- if (parameters == null) {
- parameters = new ArrayList<ParameterNode>(5);
- }
- parameters.add(new ParameterNode(name, access));
- }
-
- @Override
- @SuppressWarnings("serial")
- public AnnotationVisitor visitAnnotationDefault() {
- return new AnnotationNode(new ArrayList<Object>(0) {
- @Override
- public boolean add(final Object o) {
- annotationDefault = o;
- return super.add(o);
- }
- });
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- AnnotationNode an = new AnnotationNode(desc);
- if (visible) {
- if (visibleAnnotations == null) {
- visibleAnnotations = new ArrayList<AnnotationNode>(1);
- }
- visibleAnnotations.add(an);
- } else {
- if (invisibleAnnotations == null) {
- invisibleAnnotations = new ArrayList<AnnotationNode>(1);
- }
- invisibleAnnotations.add(an);
- }
- return an;
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
- if (visible) {
- if (visibleTypeAnnotations == null) {
- visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
- }
- visibleTypeAnnotations.add(an);
- } else {
- if (invisibleTypeAnnotations == null) {
- invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
- }
- invisibleTypeAnnotations.add(an);
- }
- return an;
- }
-
- @Override
- public AnnotationVisitor visitParameterAnnotation(final int parameter,
- final String desc, final boolean visible) {
- AnnotationNode an = new AnnotationNode(desc);
- if (visible) {
- if (visibleParameterAnnotations == null) {
- int params = Type.getArgumentTypes(this.desc).length;
- visibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params];
- }
- if (visibleParameterAnnotations[parameter] == null) {
- visibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(
- 1);
- }
- visibleParameterAnnotations[parameter].add(an);
- } else {
- if (invisibleParameterAnnotations == null) {
- int params = Type.getArgumentTypes(this.desc).length;
- invisibleParameterAnnotations = (List<AnnotationNode>[]) new List<?>[params];
- }
- if (invisibleParameterAnnotations[parameter] == null) {
- invisibleParameterAnnotations[parameter] = new ArrayList<AnnotationNode>(
- 1);
- }
- invisibleParameterAnnotations[parameter].add(an);
- }
- return an;
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- if (attrs == null) {
- attrs = new ArrayList<Attribute>(1);
- }
- attrs.add(attr);
- }
-
- @Override
- public void visitCode() {
- }
-
- @Override
- public void visitFrame(final int type, final int nLocal,
- final Object[] local, final int nStack, final Object[] stack) {
- instructions.add(new FrameNode(type, nLocal, local == null ? null
- : getLabelNodes(local), nStack, stack == null ? null
- : getLabelNodes(stack)));
- }
-
- @Override
- public void visitInsn(final int opcode) {
- instructions.add(new InsnNode(opcode));
- }
-
- @Override
- public void visitIntInsn(final int opcode, final int operand) {
- instructions.add(new IntInsnNode(opcode, operand));
- }
-
- @Override
- public void visitVarInsn(final int opcode, final int var) {
- instructions.add(new VarInsnNode(opcode, var));
- }
-
- @Override
- public void visitTypeInsn(final int opcode, final String type) {
- instructions.add(new TypeInsnNode(opcode, type));
- }
-
- @Override
- public void visitFieldInsn(final int opcode, final String owner,
- final String name, final String desc) {
- instructions.add(new FieldInsnNode(opcode, owner, name, desc));
- }
-
- @Deprecated
- @Override
- public void visitMethodInsn(int opcode, String owner, String name,
- String desc) {
- if (api >= Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc);
- return;
- }
- instructions.add(new MethodInsnNode(opcode, owner, name, desc));
- }
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name,
- String desc, boolean itf) {
- if (api < Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc, itf);
- return;
- }
- instructions.add(new MethodInsnNode(opcode, owner, name, desc, itf));
- }
-
- @Override
- public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
- Object... bsmArgs) {
- instructions.add(new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs));
- }
-
- @Override
- public void visitJumpInsn(final int opcode, final Label label) {
- instructions.add(new JumpInsnNode(opcode, getLabelNode(label)));
- }
-
- @Override
- public void visitLabel(final Label label) {
- instructions.add(getLabelNode(label));
- }
-
- @Override
- public void visitLdcInsn(final Object cst) {
- instructions.add(new LdcInsnNode(cst));
- }
-
- @Override
- public void visitIincInsn(final int var, final int increment) {
- instructions.add(new IincInsnNode(var, increment));
- }
-
- @Override
- public void visitTableSwitchInsn(final int min, final int max,
- final Label dflt, final Label... labels) {
- instructions.add(new TableSwitchInsnNode(min, max, getLabelNode(dflt),
- getLabelNodes(labels)));
- }
-
- @Override
- public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
- final Label[] labels) {
- instructions.add(new LookupSwitchInsnNode(getLabelNode(dflt), keys,
- getLabelNodes(labels)));
- }
-
- @Override
- public void visitMultiANewArrayInsn(final String desc, final int dims) {
- instructions.add(new MultiANewArrayInsnNode(desc, dims));
- }
-
- @Override
- public AnnotationVisitor visitInsnAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- // Finds the last real instruction, i.e. the instruction targeted by
- // this annotation.
- AbstractInsnNode insn = instructions.getLast();
- while (insn.getOpcode() == -1) {
- insn = insn.getPrevious();
- }
- // Adds the annotation to this instruction.
- TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
- if (visible) {
- if (insn.visibleTypeAnnotations == null) {
- insn.visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(
- 1);
- }
- insn.visibleTypeAnnotations.add(an);
- } else {
- if (insn.invisibleTypeAnnotations == null) {
- insn.invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(
- 1);
- }
- insn.invisibleTypeAnnotations.add(an);
- }
- return an;
- }
-
- @Override
- public void visitTryCatchBlock(final Label start, final Label end,
- final Label handler, final String type) {
- tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(start),
- getLabelNode(end), getLabelNode(handler), type));
- }
-
- @Override
- public AnnotationVisitor visitTryCatchAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- TryCatchBlockNode tcb = tryCatchBlocks.get((typeRef & 0x00FFFF00) >> 8);
- TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
- if (visible) {
- if (tcb.visibleTypeAnnotations == null) {
- tcb.visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(
- 1);
- }
- tcb.visibleTypeAnnotations.add(an);
- } else {
- if (tcb.invisibleTypeAnnotations == null) {
- tcb.invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(
- 1);
- }
- tcb.invisibleTypeAnnotations.add(an);
- }
- return an;
- }
-
- @Override
- public void visitLocalVariable(final String name, final String desc,
- final String signature, final Label start, final Label end,
- final int index) {
- localVariables.add(new LocalVariableNode(name, desc, signature,
- getLabelNode(start), getLabelNode(end), index));
- }
-
- @Override
- public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
- TypePath typePath, Label[] start, Label[] end, int[] index,
- String desc, boolean visible) {
- LocalVariableAnnotationNode an = new LocalVariableAnnotationNode(
- typeRef, typePath, getLabelNodes(start), getLabelNodes(end),
- index, desc);
- if (visible) {
- if (visibleLocalVariableAnnotations == null) {
- visibleLocalVariableAnnotations = new ArrayList<LocalVariableAnnotationNode>(
- 1);
- }
- visibleLocalVariableAnnotations.add(an);
- } else {
- if (invisibleLocalVariableAnnotations == null) {
- invisibleLocalVariableAnnotations = new ArrayList<LocalVariableAnnotationNode>(
- 1);
- }
- invisibleLocalVariableAnnotations.add(an);
- }
- return an;
- }
-
- @Override
- public void visitLineNumber(final int line, final Label start) {
- instructions.add(new LineNumberNode(line, getLabelNode(start)));
- }
-
- @Override
- public void visitMaxs(final int maxStack, final int maxLocals) {
- this.maxStack = maxStack;
- this.maxLocals = maxLocals;
- }
-
- @Override
- public void visitEnd() {
- }
-
- /**
- * Returns the LabelNode corresponding to the given Label. Creates a new
- * LabelNode if necessary. The default implementation of this method uses
- * the {@link Label#info} field to store associations between labels and
- * label nodes.
- *
- * @param l
- * a Label.
- * @return the LabelNode corresponding to l.
- */
- protected LabelNode getLabelNode(final Label l) {
- if (!(l.info instanceof LabelNode)) {
- l.info = new LabelNode(l);
- }
- return (LabelNode) l.info;
- }
-
- private LabelNode[] getLabelNodes(final Label[] l) {
- LabelNode[] nodes = new LabelNode[l.length];
- for (int i = 0; i < l.length; ++i) {
- nodes[i] = getLabelNode(l[i]);
- }
- return nodes;
- }
-
- private Object[] getLabelNodes(final Object[] objs) {
- Object[] nodes = new Object[objs.length];
- for (int i = 0; i < objs.length; ++i) {
- Object o = objs[i];
- if (o instanceof Label) {
- o = getLabelNode((Label) o);
- }
- nodes[i] = o;
- }
- return nodes;
- }
-
- // ------------------------------------------------------------------------
- // Accept method
- // ------------------------------------------------------------------------
-
- /**
- * Checks that this method node is compatible with the given ASM API
- * version. This methods checks that this node, and all its nodes
- * recursively, do not contain elements that were introduced in more recent
- * versions of the ASM API than the given version.
- *
- * @param api
- * an ASM API version. Must be one of {@link Opcodes#ASM4} or
- * {@link Opcodes#ASM5}.
- */
- public void check(final int api) {
- if (api == Opcodes.ASM4) {
- if (visibleTypeAnnotations != null
- && visibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- if (invisibleTypeAnnotations != null
- && invisibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- int n = tryCatchBlocks == null ? 0 : tryCatchBlocks.size();
- for (int i = 0; i < n; ++i) {
- TryCatchBlockNode tcb = tryCatchBlocks.get(i);
- if (tcb.visibleTypeAnnotations != null
- && tcb.visibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- if (tcb.invisibleTypeAnnotations != null
- && tcb.invisibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- }
- for (int i = 0; i < instructions.size(); ++i) {
- AbstractInsnNode insn = instructions.get(i);
- if (insn.visibleTypeAnnotations != null
- && insn.visibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- if (insn.invisibleTypeAnnotations != null
- && insn.invisibleTypeAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- if (insn instanceof MethodInsnNode) {
- boolean itf = ((MethodInsnNode) insn).itf;
- if (itf != (insn.opcode == Opcodes.INVOKEINTERFACE)) {
- throw new RuntimeException();
- }
- }
- }
- if (visibleLocalVariableAnnotations != null
- && visibleLocalVariableAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- if (invisibleLocalVariableAnnotations != null
- && invisibleLocalVariableAnnotations.size() > 0) {
- throw new RuntimeException();
- }
- }
- }
-
- /**
- * Makes the given class visitor visit this method.
- *
- * @param cv
- * a class visitor.
- */
- public void accept(final ClassVisitor cv) {
- String[] exceptions = new String[this.exceptions.size()];
- this.exceptions.toArray(exceptions);
- MethodVisitor mv = cv.visitMethod(access, name, desc, signature,
- exceptions);
- if (mv != null) {
- accept(mv);
- }
- }
-
- /**
- * Makes the given method visitor visit this method.
- *
- * @param mv
- * a method visitor.
- */
- public void accept(final MethodVisitor mv) {
- // visits the method parameters
- int i, j, n;
- n = parameters == null ? 0 : parameters.size();
- for (i = 0; i < n; i++) {
- ParameterNode parameter = parameters.get(i);
- mv.visitParameter(parameter.name, parameter.access);
- }
- // visits the method attributes
- if (annotationDefault != null) {
- AnnotationVisitor av = mv.visitAnnotationDefault();
- AnnotationNode.accept(av, null, annotationDefault);
- if (av != null) {
- av.visitEnd();
- }
- }
- n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
- for (i = 0; i < n; ++i) {
- AnnotationNode an = visibleAnnotations.get(i);
- an.accept(mv.visitAnnotation(an.desc, true));
- }
- n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
- for (i = 0; i < n; ++i) {
- AnnotationNode an = invisibleAnnotations.get(i);
- an.accept(mv.visitAnnotation(an.desc, false));
- }
- n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations.size();
- for (i = 0; i < n; ++i) {
- TypeAnnotationNode an = visibleTypeAnnotations.get(i);
- an.accept(mv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
- true));
- }
- n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
- .size();
- for (i = 0; i < n; ++i) {
- TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
- an.accept(mv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
- false));
- }
- n = visibleParameterAnnotations == null ? 0
- : visibleParameterAnnotations.length;
- for (i = 0; i < n; ++i) {
- List<?> l = visibleParameterAnnotations[i];
- if (l == null) {
- continue;
- }
- for (j = 0; j < l.size(); ++j) {
- AnnotationNode an = (AnnotationNode) l.get(j);
- an.accept(mv.visitParameterAnnotation(i, an.desc, true));
- }
- }
- n = invisibleParameterAnnotations == null ? 0
- : invisibleParameterAnnotations.length;
- for (i = 0; i < n; ++i) {
- List<?> l = invisibleParameterAnnotations[i];
- if (l == null) {
- continue;
- }
- for (j = 0; j < l.size(); ++j) {
- AnnotationNode an = (AnnotationNode) l.get(j);
- an.accept(mv.visitParameterAnnotation(i, an.desc, false));
- }
- }
- if (visited) {
- instructions.resetLabels();
- }
- n = attrs == null ? 0 : attrs.size();
- for (i = 0; i < n; ++i) {
- mv.visitAttribute(attrs.get(i));
- }
- // visits the method's code
- if (instructions.size() > 0) {
- mv.visitCode();
- // visits try catch blocks
- n = tryCatchBlocks == null ? 0 : tryCatchBlocks.size();
- for (i = 0; i < n; ++i) {
- tryCatchBlocks.get(i).updateIndex(i);
- tryCatchBlocks.get(i).accept(mv);
- }
- // visits instructions
- instructions.accept(mv);
- // visits local variables
- n = localVariables == null ? 0 : localVariables.size();
- for (i = 0; i < n; ++i) {
- localVariables.get(i).accept(mv);
- }
- // visits local variable annotations
- n = visibleLocalVariableAnnotations == null ? 0
- : visibleLocalVariableAnnotations.size();
- for (i = 0; i < n; ++i) {
- visibleLocalVariableAnnotations.get(i).accept(mv, true);
- }
- n = invisibleLocalVariableAnnotations == null ? 0
- : invisibleLocalVariableAnnotations.size();
- for (i = 0; i < n; ++i) {
- invisibleLocalVariableAnnotations.get(i).accept(mv, false);
- }
- // visits maxs
- mv.visitMaxs(maxStack, maxLocals);
- visited = true;
- }
- mv.visitEnd();
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/MultiANewArrayInsnNode.java b/src/asm/scala/tools/asm/tree/MultiANewArrayInsnNode.java
deleted file mode 100644
index a8339a20b5..0000000000
--- a/src/asm/scala/tools/asm/tree/MultiANewArrayInsnNode.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a MULTIANEWARRAY instruction.
- *
- * @author Eric Bruneton
- */
-public class MultiANewArrayInsnNode extends AbstractInsnNode {
-
- /**
- * An array type descriptor (see {@link scala.tools.asm.Type}).
- */
- public String desc;
-
- /**
- * Number of dimensions of the array to allocate.
- */
- public int dims;
-
- /**
- * Constructs a new {@link MultiANewArrayInsnNode}.
- *
- * @param desc
- * an array type descriptor (see {@link scala.tools.asm.Type}).
- * @param dims
- * number of dimensions of the array to allocate.
- */
- public MultiANewArrayInsnNode(final String desc, final int dims) {
- super(Opcodes.MULTIANEWARRAY);
- this.desc = desc;
- this.dims = dims;
- }
-
- @Override
- public int getType() {
- return MULTIANEWARRAY_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitMultiANewArrayInsn(desc, dims);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new MultiANewArrayInsnNode(desc, dims).cloneAnnotations(this);
- }
-
-}
diff --git a/src/asm/scala/tools/asm/tree/ParameterNode.java b/src/asm/scala/tools/asm/tree/ParameterNode.java
deleted file mode 100644
index a3e55d5629..0000000000
--- a/src/asm/scala/tools/asm/tree/ParameterNode.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a parameter access and name.
- *
- * @author Remi Forax
- */
-public class ParameterNode {
- /**
- * The parameter's name.
- */
- public String name;
-
- /**
- * The parameter's access flags (see {@link scala.tools.asm.Opcodes}).
- * Valid values are <tt>ACC_FINAL</tt>, <tt>ACC_SYNTHETIC</tt> and
- * <tt>ACC_MANDATED</tt>.
- */
- public int access;
-
- /**
- * Constructs a new {@link ParameterNode}.
- *
- * @param access
- * The parameter's access flags. Valid values are
- * <tt>ACC_FINAL</tt>, <tt>ACC_SYNTHETIC</tt> or/and
- * <tt>ACC_MANDATED</tt> (see {@link scala.tools.asm.Opcodes}).
- * @param name
- * the parameter's name.
- */
- public ParameterNode(final String name, final int access) {
- this.name = name;
- this.access = access;
- }
-
- /**
- * Makes the given visitor visit this parameter declaration.
- *
- * @param mv
- * a method visitor.
- */
- public void accept(final MethodVisitor mv) {
- mv.visitParameter(name, access);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/TableSwitchInsnNode.java b/src/asm/scala/tools/asm/tree/TableSwitchInsnNode.java
deleted file mode 100644
index fb17b9e2e9..0000000000
--- a/src/asm/scala/tools/asm/tree/TableSwitchInsnNode.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * A node that represents a TABLESWITCH instruction.
- *
- * @author Eric Bruneton
- */
-public class TableSwitchInsnNode extends AbstractInsnNode {
-
- /**
- * The minimum key value.
- */
- public int min;
-
- /**
- * The maximum key value.
- */
- public int max;
-
- /**
- * Beginning of the default handler block.
- */
- public LabelNode dflt;
-
- /**
- * Beginnings of the handler blocks. This list is a list of
- * {@link LabelNode} objects.
- */
- public List<LabelNode> labels;
-
- /**
- * Constructs a new {@link TableSwitchInsnNode}.
- *
- * @param min
- * the minimum key value.
- * @param max
- * the maximum key value.
- * @param dflt
- * beginning of the default handler block.
- * @param labels
- * beginnings of the handler blocks. <tt>labels[i]</tt> is the
- * beginning of the handler block for the <tt>min + i</tt> key.
- */
- public TableSwitchInsnNode(final int min, final int max,
- final LabelNode dflt, final LabelNode... labels) {
- super(Opcodes.TABLESWITCH);
- this.min = min;
- this.max = max;
- this.dflt = dflt;
- this.labels = new ArrayList<LabelNode>();
- if (labels != null) {
- this.labels.addAll(Arrays.asList(labels));
- }
- }
-
- @Override
- public int getType() {
- return TABLESWITCH_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- Label[] labels = new Label[this.labels.size()];
- for (int i = 0; i < labels.length; ++i) {
- labels[i] = this.labels.get(i).getLabel();
- }
- mv.visitTableSwitchInsn(min, max, dflt.getLabel(), labels);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new TableSwitchInsnNode(min, max, clone(dflt, labels), clone(
- this.labels, labels)).cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/TryCatchBlockNode.java b/src/asm/scala/tools/asm/tree/TryCatchBlockNode.java
deleted file mode 100644
index c639b9aa8b..0000000000
--- a/src/asm/scala/tools/asm/tree/TryCatchBlockNode.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.List;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a try catch block.
- *
- * @author Eric Bruneton
- */
-public class TryCatchBlockNode {
-
- /**
- * Beginning of the exception handler's scope (inclusive).
- */
- public LabelNode start;
-
- /**
- * End of the exception handler's scope (exclusive).
- */
- public LabelNode end;
-
- /**
- * Beginning of the exception handler's code.
- */
- public LabelNode handler;
-
- /**
- * Internal name of the type of exceptions handled by the handler. May be
- * <tt>null</tt> to catch any exceptions (for "finally" blocks).
- */
- public String type;
-
- /**
- * The runtime visible type annotations on the exception handler type. This
- * list is a list of {@link TypeAnnotationNode} objects. May be
- * <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label visible
- */
- public List<TypeAnnotationNode> visibleTypeAnnotations;
-
- /**
- * The runtime invisible type annotations on the exception handler type.
- * This list is a list of {@link TypeAnnotationNode} objects. May be
- * <tt>null</tt>.
- *
- * @associates scala.tools.asm.tree.TypeAnnotationNode
- * @label invisible
- */
- public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
- /**
- * Constructs a new {@link TryCatchBlockNode}.
- *
- * @param start
- * beginning of the exception handler's scope (inclusive).
- * @param end
- * end of the exception handler's scope (exclusive).
- * @param handler
- * beginning of the exception handler's code.
- * @param type
- * internal name of the type of exceptions handled by the
- * handler, or <tt>null</tt> to catch any exceptions (for
- * "finally" blocks).
- */
- public TryCatchBlockNode(final LabelNode start, final LabelNode end,
- final LabelNode handler, final String type) {
- this.start = start;
- this.end = end;
- this.handler = handler;
- this.type = type;
- }
-
- /**
- * Updates the index of this try catch block in the method's list of try
- * catch block nodes. This index maybe stored in the 'target' field of the
- * type annotations of this block.
- *
- * @param index
- * the new index of this try catch block in the method's list of
- * try catch block nodes.
- */
- public void updateIndex(final int index) {
- int newTypeRef = 0x42000000 | (index << 8);
- if (visibleTypeAnnotations != null) {
- for (TypeAnnotationNode tan : visibleTypeAnnotations) {
- tan.typeRef = newTypeRef;
- }
- }
- if (invisibleTypeAnnotations != null) {
- for (TypeAnnotationNode tan : invisibleTypeAnnotations) {
- tan.typeRef = newTypeRef;
- }
- }
- }
-
- /**
- * Makes the given visitor visit this try catch block.
- *
- * @param mv
- * a method visitor.
- */
- public void accept(final MethodVisitor mv) {
- mv.visitTryCatchBlock(start.getLabel(), end.getLabel(),
- handler == null ? null : handler.getLabel(), type);
- int n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations
- .size();
- for (int i = 0; i < n; ++i) {
- TypeAnnotationNode an = visibleTypeAnnotations.get(i);
- an.accept(mv.visitTryCatchAnnotation(an.typeRef, an.typePath,
- an.desc, true));
- }
- n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
- .size();
- for (int i = 0; i < n; ++i) {
- TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
- an.accept(mv.visitTryCatchAnnotation(an.typeRef, an.typePath,
- an.desc, false));
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/TypeAnnotationNode.java b/src/asm/scala/tools/asm/tree/TypeAnnotationNode.java
deleted file mode 100644
index 73b29624f7..0000000000
--- a/src/asm/scala/tools/asm/tree/TypeAnnotationNode.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-
-/**
- * A node that represents a type annotationn.
- *
- * @author Eric Bruneton
- */
-public class TypeAnnotationNode extends AnnotationNode {
-
- /**
- * A reference to the annotated type. See {@link TypeReference}.
- */
- public int typeRef;
-
- /**
- * The path to the annotated type argument, wildcard bound, array element
- * type, or static outer type within the referenced type. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- */
- public TypePath typePath;
-
- /**
- * Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this
- * constructor</i>. Instead, they must use the
- * {@link #TypeAnnotationNode(int, int, TypePath, String)} version.
- *
- * @param typeRef
- * a reference to the annotated type. See {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public TypeAnnotationNode(final int typeRef, final TypePath typePath,
- final String desc) {
- this(Opcodes.ASM5, typeRef, typePath, desc);
- if (getClass() != TypeAnnotationNode.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link AnnotationNode}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param typeRef
- * a reference to the annotated type. See {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- */
- public TypeAnnotationNode(final int api, final int typeRef,
- final TypePath typePath, final String desc) {
- super(api, desc);
- this.typeRef = typeRef;
- this.typePath = typePath;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/TypeInsnNode.java b/src/asm/scala/tools/asm/tree/TypeInsnNode.java
deleted file mode 100644
index 401400c3cb..0000000000
--- a/src/asm/scala/tools/asm/tree/TypeInsnNode.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a type instruction. A type instruction is an
- * instruction that takes a type descriptor as parameter.
- *
- * @author Eric Bruneton
- */
-public class TypeInsnNode extends AbstractInsnNode {
-
- /**
- * The operand of this instruction. This operand is an internal name (see
- * {@link scala.tools.asm.Type}).
- */
- public String desc;
-
- /**
- * Constructs a new {@link TypeInsnNode}.
- *
- * @param opcode
- * the opcode of the type instruction to be constructed. This
- * opcode must be NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
- * @param desc
- * the operand of the instruction to be constructed. This operand
- * is an internal name (see {@link scala.tools.asm.Type}).
- */
- public TypeInsnNode(final int opcode, final String desc) {
- super(opcode);
- this.desc = desc;
- }
-
- /**
- * Sets the opcode of this instruction.
- *
- * @param opcode
- * the new instruction opcode. This opcode must be NEW,
- * ANEWARRAY, CHECKCAST or INSTANCEOF.
- */
- public void setOpcode(final int opcode) {
- this.opcode = opcode;
- }
-
- @Override
- public int getType() {
- return TYPE_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitTypeInsn(opcode, desc);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new TypeInsnNode(opcode, desc).cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/VarInsnNode.java b/src/asm/scala/tools/asm/tree/VarInsnNode.java
deleted file mode 100644
index 685e4fce2c..0000000000
--- a/src/asm/scala/tools/asm/tree/VarInsnNode.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree;
-
-import java.util.Map;
-
-import scala.tools.asm.MethodVisitor;
-
-/**
- * A node that represents a local variable instruction. A local variable
- * instruction is an instruction that loads or stores the value of a local
- * variable.
- *
- * @author Eric Bruneton
- */
-public class VarInsnNode extends AbstractInsnNode {
-
- /**
- * The operand of this instruction. This operand is the index of a local
- * variable.
- */
- public int var;
-
- /**
- * Constructs a new {@link VarInsnNode}.
- *
- * @param opcode
- * the opcode of the local variable instruction to be
- * constructed. This opcode must be ILOAD, LLOAD, FLOAD, DLOAD,
- * ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
- * @param var
- * the operand of the instruction to be constructed. This operand
- * is the index of a local variable.
- */
- public VarInsnNode(final int opcode, final int var) {
- super(opcode);
- this.var = var;
- }
-
- /**
- * Sets the opcode of this instruction.
- *
- * @param opcode
- * the new instruction opcode. This opcode must be ILOAD, LLOAD,
- * FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or
- * RET.
- */
- public void setOpcode(final int opcode) {
- this.opcode = opcode;
- }
-
- @Override
- public int getType() {
- return VAR_INSN;
- }
-
- @Override
- public void accept(final MethodVisitor mv) {
- mv.visitVarInsn(opcode, var);
- acceptAnnotations(mv);
- }
-
- @Override
- public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
- return new VarInsnNode(opcode, var).cloneAnnotations(this);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Analyzer.java b/src/asm/scala/tools/asm/tree/analysis/Analyzer.java
deleted file mode 100644
index ff840aabde..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/Analyzer.java
+++ /dev/null
@@ -1,549 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.IincInsnNode;
-import scala.tools.asm.tree.InsnList;
-import scala.tools.asm.tree.JumpInsnNode;
-import scala.tools.asm.tree.LabelNode;
-import scala.tools.asm.tree.LookupSwitchInsnNode;
-import scala.tools.asm.tree.MethodNode;
-import scala.tools.asm.tree.TableSwitchInsnNode;
-import scala.tools.asm.tree.TryCatchBlockNode;
-import scala.tools.asm.tree.VarInsnNode;
-
-/**
- * A semantic bytecode analyzer. <i>This class does not fully check that JSR and
- * RET instructions are valid.</i>
- *
- * @param <V>
- * type of the Value used for the analysis.
- *
- * @author Eric Bruneton
- */
-public class Analyzer<V extends Value> implements Opcodes {
-
- private final Interpreter<V> interpreter;
-
- private int n;
-
- private InsnList insns;
-
- private List<TryCatchBlockNode>[] handlers;
-
- private Frame<V>[] frames;
-
- private Subroutine[] subroutines;
-
- private boolean[] queued;
-
- private int[] queue;
-
- private int top;
-
- /**
- * Constructs a new {@link Analyzer}.
- *
- * @param interpreter
- * the interpreter to be used to symbolically interpret the
- * bytecode instructions.
- */
- public Analyzer(final Interpreter<V> interpreter) {
- this.interpreter = interpreter;
- }
-
- /**
- * Analyzes the given method.
- *
- * @param owner
- * the internal name of the class to which the method belongs.
- * @param m
- * the method to be analyzed.
- * @return the symbolic state of the execution stack frame at each bytecode
- * instruction of the method. The size of the returned array is
- * equal to the number of instructions (and labels) of the method. A
- * given frame is <tt>null</tt> if and only if the corresponding
- * instruction cannot be reached (dead code).
- * @throws AnalyzerException
- * if a problem occurs during the analysis.
- */
- public Frame<V>[] analyze(final String owner, final MethodNode m)
- throws AnalyzerException {
- if ((m.access & (ACC_ABSTRACT | ACC_NATIVE)) != 0) {
- frames = (Frame<V>[]) new Frame<?>[0];
- return frames;
- }
- n = m.instructions.size();
- insns = m.instructions;
- handlers = (List<TryCatchBlockNode>[]) new List<?>[n];
- frames = (Frame<V>[]) new Frame<?>[n];
- subroutines = new Subroutine[n];
- queued = new boolean[n];
- queue = new int[n];
- top = 0;
-
- // computes exception handlers for each instruction
- for (int i = 0; i < m.tryCatchBlocks.size(); ++i) {
- TryCatchBlockNode tcb = m.tryCatchBlocks.get(i);
- int begin = insns.indexOf(tcb.start);
- int end = insns.indexOf(tcb.end);
- for (int j = begin; j < end; ++j) {
- List<TryCatchBlockNode> insnHandlers = handlers[j];
- if (insnHandlers == null) {
- insnHandlers = new ArrayList<TryCatchBlockNode>();
- handlers[j] = insnHandlers;
- }
- insnHandlers.add(tcb);
- }
- }
-
- // computes the subroutine for each instruction:
- Subroutine main = new Subroutine(null, m.maxLocals, null);
- List<AbstractInsnNode> subroutineCalls = new ArrayList<AbstractInsnNode>();
- Map<LabelNode, Subroutine> subroutineHeads = new HashMap<LabelNode, Subroutine>();
- findSubroutine(0, main, subroutineCalls);
- while (!subroutineCalls.isEmpty()) {
- JumpInsnNode jsr = (JumpInsnNode) subroutineCalls.remove(0);
- Subroutine sub = subroutineHeads.get(jsr.label);
- if (sub == null) {
- sub = new Subroutine(jsr.label, m.maxLocals, jsr);
- subroutineHeads.put(jsr.label, sub);
- findSubroutine(insns.indexOf(jsr.label), sub, subroutineCalls);
- } else {
- sub.callers.add(jsr);
- }
- }
- for (int i = 0; i < n; ++i) {
- if (subroutines[i] != null && subroutines[i].start == null) {
- subroutines[i] = null;
- }
- }
-
- // initializes the data structures for the control flow analysis
- Frame<V> current = newFrame(m.maxLocals, m.maxStack);
- Frame<V> handler = newFrame(m.maxLocals, m.maxStack);
- current.setReturn(interpreter.newValue(Type.getReturnType(m.desc)));
- Type[] args = Type.getArgumentTypes(m.desc);
- int local = 0;
- if ((m.access & ACC_STATIC) == 0) {
- Type ctype = Type.getObjectType(owner);
- current.setLocal(local++, interpreter.newValue(ctype));
- }
- for (int i = 0; i < args.length; ++i) {
- current.setLocal(local++, interpreter.newValue(args[i]));
- if (args[i].getSize() == 2) {
- current.setLocal(local++, interpreter.newValue(null));
- }
- }
- while (local < m.maxLocals) {
- current.setLocal(local++, interpreter.newValue(null));
- }
- merge(0, current, null);
-
- init(owner, m);
-
- // control flow analysis
- while (top > 0) {
- int insn = queue[--top];
- Frame<V> f = frames[insn];
- Subroutine subroutine = subroutines[insn];
- queued[insn] = false;
-
- AbstractInsnNode insnNode = null;
- try {
- insnNode = m.instructions.get(insn);
- int insnOpcode = insnNode.getOpcode();
- int insnType = insnNode.getType();
-
- if (insnType == AbstractInsnNode.LABEL
- || insnType == AbstractInsnNode.LINE
- || insnType == AbstractInsnNode.FRAME) {
- merge(insn + 1, f, subroutine);
- newControlFlowEdge(insn, insn + 1);
- } else {
- current.init(f).execute(insnNode, interpreter);
- subroutine = subroutine == null ? null : subroutine.copy();
-
- if (insnNode instanceof JumpInsnNode) {
- JumpInsnNode j = (JumpInsnNode) insnNode;
- if (insnOpcode != GOTO && insnOpcode != JSR) {
- merge(insn + 1, current, subroutine);
- newControlFlowEdge(insn, insn + 1);
- }
- int jump = insns.indexOf(j.label);
- if (insnOpcode == JSR) {
- merge(jump, current, new Subroutine(j.label,
- m.maxLocals, j));
- } else {
- merge(jump, current, subroutine);
- }
- newControlFlowEdge(insn, jump);
- } else if (insnNode instanceof LookupSwitchInsnNode) {
- LookupSwitchInsnNode lsi = (LookupSwitchInsnNode) insnNode;
- int jump = insns.indexOf(lsi.dflt);
- merge(jump, current, subroutine);
- newControlFlowEdge(insn, jump);
- for (int j = 0; j < lsi.labels.size(); ++j) {
- LabelNode label = lsi.labels.get(j);
- jump = insns.indexOf(label);
- merge(jump, current, subroutine);
- newControlFlowEdge(insn, jump);
- }
- } else if (insnNode instanceof TableSwitchInsnNode) {
- TableSwitchInsnNode tsi = (TableSwitchInsnNode) insnNode;
- int jump = insns.indexOf(tsi.dflt);
- merge(jump, current, subroutine);
- newControlFlowEdge(insn, jump);
- for (int j = 0; j < tsi.labels.size(); ++j) {
- LabelNode label = tsi.labels.get(j);
- jump = insns.indexOf(label);
- merge(jump, current, subroutine);
- newControlFlowEdge(insn, jump);
- }
- } else if (insnOpcode == RET) {
- if (subroutine == null) {
- throw new AnalyzerException(insnNode,
- "RET instruction outside of a sub routine");
- }
- for (int i = 0; i < subroutine.callers.size(); ++i) {
- JumpInsnNode caller = subroutine.callers.get(i);
- int call = insns.indexOf(caller);
- if (frames[call] != null) {
- merge(call + 1, frames[call], current,
- subroutines[call], subroutine.access);
- newControlFlowEdge(insn, call + 1);
- }
- }
- } else if (insnOpcode != ATHROW
- && (insnOpcode < IRETURN || insnOpcode > RETURN)) {
- if (subroutine != null) {
- if (insnNode instanceof VarInsnNode) {
- int var = ((VarInsnNode) insnNode).var;
- subroutine.access[var] = true;
- if (insnOpcode == LLOAD || insnOpcode == DLOAD
- || insnOpcode == LSTORE
- || insnOpcode == DSTORE) {
- subroutine.access[var + 1] = true;
- }
- } else if (insnNode instanceof IincInsnNode) {
- int var = ((IincInsnNode) insnNode).var;
- subroutine.access[var] = true;
- }
- }
- merge(insn + 1, current, subroutine);
- newControlFlowEdge(insn, insn + 1);
- }
- }
-
- List<TryCatchBlockNode> insnHandlers = handlers[insn];
- if (insnHandlers != null) {
- for (int i = 0; i < insnHandlers.size(); ++i) {
- TryCatchBlockNode tcb = insnHandlers.get(i);
- Type type;
- if (tcb.type == null) {
- type = Type.getObjectType("java/lang/Throwable");
- } else {
- type = Type.getObjectType(tcb.type);
- }
- int jump = insns.indexOf(tcb.handler);
- if (newControlFlowExceptionEdge(insn, tcb)) {
- handler.init(f);
- handler.clearStack();
- handler.push(interpreter.newValue(type));
- merge(jump, handler, subroutine);
- }
- }
- }
- } catch (AnalyzerException e) {
- throw new AnalyzerException(e.node, "Error at instruction "
- + insn + ": " + e.getMessage(), e);
- } catch (Exception e) {
- throw new AnalyzerException(insnNode, "Error at instruction "
- + insn + ": " + e.getMessage(), e);
- }
- }
-
- return frames;
- }
-
- private void findSubroutine(int insn, final Subroutine sub,
- final List<AbstractInsnNode> calls) throws AnalyzerException {
- while (true) {
- if (insn < 0 || insn >= n) {
- throw new AnalyzerException(null,
- "Execution can fall off end of the code");
- }
- if (subroutines[insn] != null) {
- return;
- }
- subroutines[insn] = sub.copy();
- AbstractInsnNode node = insns.get(insn);
-
- // calls findSubroutine recursively on normal successors
- if (node instanceof JumpInsnNode) {
- if (node.getOpcode() == JSR) {
- // do not follow a JSR, it leads to another subroutine!
- calls.add(node);
- } else {
- JumpInsnNode jnode = (JumpInsnNode) node;
- findSubroutine(insns.indexOf(jnode.label), sub, calls);
- }
- } else if (node instanceof TableSwitchInsnNode) {
- TableSwitchInsnNode tsnode = (TableSwitchInsnNode) node;
- findSubroutine(insns.indexOf(tsnode.dflt), sub, calls);
- for (int i = tsnode.labels.size() - 1; i >= 0; --i) {
- LabelNode l = tsnode.labels.get(i);
- findSubroutine(insns.indexOf(l), sub, calls);
- }
- } else if (node instanceof LookupSwitchInsnNode) {
- LookupSwitchInsnNode lsnode = (LookupSwitchInsnNode) node;
- findSubroutine(insns.indexOf(lsnode.dflt), sub, calls);
- for (int i = lsnode.labels.size() - 1; i >= 0; --i) {
- LabelNode l = lsnode.labels.get(i);
- findSubroutine(insns.indexOf(l), sub, calls);
- }
- }
-
- // calls findSubroutine recursively on exception handler successors
- List<TryCatchBlockNode> insnHandlers = handlers[insn];
- if (insnHandlers != null) {
- for (int i = 0; i < insnHandlers.size(); ++i) {
- TryCatchBlockNode tcb = insnHandlers.get(i);
- findSubroutine(insns.indexOf(tcb.handler), sub, calls);
- }
- }
-
- // if insn does not falls through to the next instruction, return.
- switch (node.getOpcode()) {
- case GOTO:
- case RET:
- case TABLESWITCH:
- case LOOKUPSWITCH:
- case IRETURN:
- case LRETURN:
- case FRETURN:
- case DRETURN:
- case ARETURN:
- case RETURN:
- case ATHROW:
- return;
- }
- insn++;
- }
- }
-
- /**
- * Returns the symbolic stack frame for each instruction of the last
- * recently analyzed method.
- *
- * @return the symbolic state of the execution stack frame at each bytecode
- * instruction of the method. The size of the returned array is
- * equal to the number of instructions (and labels) of the method. A
- * given frame is <tt>null</tt> if the corresponding instruction
- * cannot be reached, or if an error occurred during the analysis of
- * the method.
- */
- public Frame<V>[] getFrames() {
- return frames;
- }
-
- /**
- * Returns the exception handlers for the given instruction.
- *
- * @param insn
- * the index of an instruction of the last recently analyzed
- * method.
- * @return a list of {@link TryCatchBlockNode} objects.
- */
- public List<TryCatchBlockNode> getHandlers(final int insn) {
- return handlers[insn];
- }
-
- /**
- * Initializes this analyzer. This method is called just before the
- * execution of control flow analysis loop in #analyze. The default
- * implementation of this method does nothing.
- *
- * @param owner
- * the internal name of the class to which the method belongs.
- * @param m
- * the method to be analyzed.
- * @throws AnalyzerException
- * if a problem occurs.
- */
- protected void init(String owner, MethodNode m) throws AnalyzerException {
- }
-
- /**
- * Constructs a new frame with the given size.
- *
- * @param nLocals
- * the maximum number of local variables of the frame.
- * @param nStack
- * the maximum stack size of the frame.
- * @return the created frame.
- */
- protected Frame<V> newFrame(final int nLocals, final int nStack) {
- return new Frame<V>(nLocals, nStack);
- }
-
- /**
- * Constructs a new frame that is identical to the given frame.
- *
- * @param src
- * a frame.
- * @return the created frame.
- */
- protected Frame<V> newFrame(final Frame<? extends V> src) {
- return new Frame<V>(src);
- }
-
- /**
- * Creates a control flow graph edge. The default implementation of this
- * method does nothing. It can be overridden in order to construct the
- * control flow graph of a method (this method is called by the
- * {@link #analyze analyze} method during its visit of the method's code).
- *
- * @param insn
- * an instruction index.
- * @param successor
- * index of a successor instruction.
- */
- protected void newControlFlowEdge(final int insn, final int successor) {
- }
-
- /**
- * Creates a control flow graph edge corresponding to an exception handler.
- * The default implementation of this method does nothing. It can be
- * overridden in order to construct the control flow graph of a method (this
- * method is called by the {@link #analyze analyze} method during its visit
- * of the method's code).
- *
- * @param insn
- * an instruction index.
- * @param successor
- * index of a successor instruction.
- * @return true if this edge must be considered in the data flow analysis
- * performed by this analyzer, or false otherwise. The default
- * implementation of this method always returns true.
- */
- protected boolean newControlFlowExceptionEdge(final int insn,
- final int successor) {
- return true;
- }
-
- /**
- * Creates a control flow graph edge corresponding to an exception handler.
- * The default implementation of this method delegates to
- * {@link #newControlFlowExceptionEdge(int, int)
- * newControlFlowExceptionEdge(int, int)}. It can be overridden in order to
- * construct the control flow graph of a method (this method is called by
- * the {@link #analyze analyze} method during its visit of the method's
- * code).
- *
- * @param insn
- * an instruction index.
- * @param tcb
- * TryCatchBlockNode corresponding to this edge.
- * @return true if this edge must be considered in the data flow analysis
- * performed by this analyzer, or false otherwise. The default
- * implementation of this method delegates to
- * {@link #newControlFlowExceptionEdge(int, int)
- * newControlFlowExceptionEdge(int, int)}.
- */
- protected boolean newControlFlowExceptionEdge(final int insn,
- final TryCatchBlockNode tcb) {
- return newControlFlowExceptionEdge(insn, insns.indexOf(tcb.handler));
- }
-
- // -------------------------------------------------------------------------
-
- private void merge(final int insn, final Frame<V> frame,
- final Subroutine subroutine) throws AnalyzerException {
- Frame<V> oldFrame = frames[insn];
- Subroutine oldSubroutine = subroutines[insn];
- boolean changes;
-
- if (oldFrame == null) {
- frames[insn] = newFrame(frame);
- changes = true;
- } else {
- changes = oldFrame.merge(frame, interpreter);
- }
-
- if (oldSubroutine == null) {
- if (subroutine != null) {
- subroutines[insn] = subroutine.copy();
- changes = true;
- }
- } else {
- if (subroutine != null) {
- changes |= oldSubroutine.merge(subroutine);
- }
- }
- if (changes && !queued[insn]) {
- queued[insn] = true;
- queue[top++] = insn;
- }
- }
-
- private void merge(final int insn, final Frame<V> beforeJSR,
- final Frame<V> afterRET, final Subroutine subroutineBeforeJSR,
- final boolean[] access) throws AnalyzerException {
- Frame<V> oldFrame = frames[insn];
- Subroutine oldSubroutine = subroutines[insn];
- boolean changes;
-
- afterRET.merge(beforeJSR, access);
-
- if (oldFrame == null) {
- frames[insn] = newFrame(afterRET);
- changes = true;
- } else {
- changes = oldFrame.merge(afterRET, interpreter);
- }
-
- if (oldSubroutine != null && subroutineBeforeJSR != null) {
- changes |= oldSubroutine.merge(subroutineBeforeJSR);
- }
- if (changes && !queued[insn]) {
- queued[insn] = true;
- queue[top++] = insn;
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/AnalyzerException.java b/src/asm/scala/tools/asm/tree/analysis/AnalyzerException.java
deleted file mode 100644
index 52b2a11d6f..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/AnalyzerException.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import scala.tools.asm.tree.AbstractInsnNode;
-
-/**
- * Thrown if a problem occurs during the analysis of a method.
- *
- * @author Bing Ran
- * @author Eric Bruneton
- */
-@SuppressWarnings("serial")
-public class AnalyzerException extends Exception {
-
- public final AbstractInsnNode node;
-
- public AnalyzerException(final AbstractInsnNode node, final String msg) {
- super(msg);
- this.node = node;
- }
-
- public AnalyzerException(final AbstractInsnNode node, final String msg,
- final Throwable exception) {
- super(msg, exception);
- this.node = node;
- }
-
- public AnalyzerException(final AbstractInsnNode node, final String msg,
- final Object expected, final Value encountered) {
- super((msg == null ? "Expected " : msg + ": expected ") + expected
- + ", but found " + encountered);
- this.node = node;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/BasicInterpreter.java b/src/asm/scala/tools/asm/tree/analysis/BasicInterpreter.java
deleted file mode 100644
index 7d0b7b0694..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/BasicInterpreter.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.List;
-
-import scala.tools.asm.Handle;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.FieldInsnNode;
-import scala.tools.asm.tree.IntInsnNode;
-import scala.tools.asm.tree.InvokeDynamicInsnNode;
-import scala.tools.asm.tree.LdcInsnNode;
-import scala.tools.asm.tree.MethodInsnNode;
-import scala.tools.asm.tree.MultiANewArrayInsnNode;
-import scala.tools.asm.tree.TypeInsnNode;
-
-/**
- * An {@link Interpreter} for {@link BasicValue} values.
- *
- * @author Eric Bruneton
- * @author Bing Ran
- */
-public class BasicInterpreter extends Interpreter<BasicValue> implements
- Opcodes {
-
- public BasicInterpreter() {
- super(ASM5);
- }
-
- protected BasicInterpreter(final int api) {
- super(api);
- }
-
- @Override
- public BasicValue newValue(final Type type) {
- if (type == null) {
- return BasicValue.UNINITIALIZED_VALUE;
- }
- switch (type.getSort()) {
- case Type.VOID:
- return null;
- case Type.BOOLEAN:
- case Type.CHAR:
- case Type.BYTE:
- case Type.SHORT:
- case Type.INT:
- return BasicValue.INT_VALUE;
- case Type.FLOAT:
- return BasicValue.FLOAT_VALUE;
- case Type.LONG:
- return BasicValue.LONG_VALUE;
- case Type.DOUBLE:
- return BasicValue.DOUBLE_VALUE;
- case Type.ARRAY:
- case Type.OBJECT:
- return BasicValue.REFERENCE_VALUE;
- default:
- throw new Error("Internal error");
- }
- }
-
- @Override
- public BasicValue newOperation(final AbstractInsnNode insn)
- throws AnalyzerException {
- switch (insn.getOpcode()) {
- case ACONST_NULL:
- return newValue(Type.getObjectType("null"));
- case ICONST_M1:
- case ICONST_0:
- case ICONST_1:
- case ICONST_2:
- case ICONST_3:
- case ICONST_4:
- case ICONST_5:
- return BasicValue.INT_VALUE;
- case LCONST_0:
- case LCONST_1:
- return BasicValue.LONG_VALUE;
- case FCONST_0:
- case FCONST_1:
- case FCONST_2:
- return BasicValue.FLOAT_VALUE;
- case DCONST_0:
- case DCONST_1:
- return BasicValue.DOUBLE_VALUE;
- case BIPUSH:
- case SIPUSH:
- return BasicValue.INT_VALUE;
- case LDC:
- Object cst = ((LdcInsnNode) insn).cst;
- if (cst instanceof Integer) {
- return BasicValue.INT_VALUE;
- } else if (cst instanceof Float) {
- return BasicValue.FLOAT_VALUE;
- } else if (cst instanceof Long) {
- return BasicValue.LONG_VALUE;
- } else if (cst instanceof Double) {
- return BasicValue.DOUBLE_VALUE;
- } else if (cst instanceof String) {
- return newValue(Type.getObjectType("java/lang/String"));
- } else if (cst instanceof Type) {
- int sort = ((Type) cst).getSort();
- if (sort == Type.OBJECT || sort == Type.ARRAY) {
- return newValue(Type.getObjectType("java/lang/Class"));
- } else if (sort == Type.METHOD) {
- return newValue(Type
- .getObjectType("java/lang/invoke/MethodType"));
- } else {
- throw new IllegalArgumentException("Illegal LDC constant "
- + cst);
- }
- } else if (cst instanceof Handle) {
- return newValue(Type
- .getObjectType("java/lang/invoke/MethodHandle"));
- } else {
- throw new IllegalArgumentException("Illegal LDC constant "
- + cst);
- }
- case JSR:
- return BasicValue.RETURNADDRESS_VALUE;
- case GETSTATIC:
- return newValue(Type.getType(((FieldInsnNode) insn).desc));
- case NEW:
- return newValue(Type.getObjectType(((TypeInsnNode) insn).desc));
- default:
- throw new Error("Internal error.");
- }
- }
-
- @Override
- public BasicValue copyOperation(final AbstractInsnNode insn,
- final BasicValue value) throws AnalyzerException {
- return value;
- }
-
- @Override
- public BasicValue unaryOperation(final AbstractInsnNode insn,
- final BasicValue value) throws AnalyzerException {
- switch (insn.getOpcode()) {
- case INEG:
- case IINC:
- case L2I:
- case F2I:
- case D2I:
- case I2B:
- case I2C:
- case I2S:
- return BasicValue.INT_VALUE;
- case FNEG:
- case I2F:
- case L2F:
- case D2F:
- return BasicValue.FLOAT_VALUE;
- case LNEG:
- case I2L:
- case F2L:
- case D2L:
- return BasicValue.LONG_VALUE;
- case DNEG:
- case I2D:
- case L2D:
- case F2D:
- return BasicValue.DOUBLE_VALUE;
- case IFEQ:
- case IFNE:
- case IFLT:
- case IFGE:
- case IFGT:
- case IFLE:
- case TABLESWITCH:
- case LOOKUPSWITCH:
- case IRETURN:
- case LRETURN:
- case FRETURN:
- case DRETURN:
- case ARETURN:
- case PUTSTATIC:
- return null;
- case GETFIELD:
- return newValue(Type.getType(((FieldInsnNode) insn).desc));
- case NEWARRAY:
- switch (((IntInsnNode) insn).operand) {
- case T_BOOLEAN:
- return newValue(Type.getType("[Z"));
- case T_CHAR:
- return newValue(Type.getType("[C"));
- case T_BYTE:
- return newValue(Type.getType("[B"));
- case T_SHORT:
- return newValue(Type.getType("[S"));
- case T_INT:
- return newValue(Type.getType("[I"));
- case T_FLOAT:
- return newValue(Type.getType("[F"));
- case T_DOUBLE:
- return newValue(Type.getType("[D"));
- case T_LONG:
- return newValue(Type.getType("[J"));
- default:
- throw new AnalyzerException(insn, "Invalid array type");
- }
- case ANEWARRAY:
- String desc = ((TypeInsnNode) insn).desc;
- return newValue(Type.getType("[" + Type.getObjectType(desc)));
- case ARRAYLENGTH:
- return BasicValue.INT_VALUE;
- case ATHROW:
- return null;
- case CHECKCAST:
- desc = ((TypeInsnNode) insn).desc;
- return newValue(Type.getObjectType(desc));
- case INSTANCEOF:
- return BasicValue.INT_VALUE;
- case MONITORENTER:
- case MONITOREXIT:
- case IFNULL:
- case IFNONNULL:
- return null;
- default:
- throw new Error("Internal error.");
- }
- }
-
- @Override
- public BasicValue binaryOperation(final AbstractInsnNode insn,
- final BasicValue value1, final BasicValue value2)
- throws AnalyzerException {
- switch (insn.getOpcode()) {
- case IALOAD:
- case BALOAD:
- case CALOAD:
- case SALOAD:
- case IADD:
- case ISUB:
- case IMUL:
- case IDIV:
- case IREM:
- case ISHL:
- case ISHR:
- case IUSHR:
- case IAND:
- case IOR:
- case IXOR:
- return BasicValue.INT_VALUE;
- case FALOAD:
- case FADD:
- case FSUB:
- case FMUL:
- case FDIV:
- case FREM:
- return BasicValue.FLOAT_VALUE;
- case LALOAD:
- case LADD:
- case LSUB:
- case LMUL:
- case LDIV:
- case LREM:
- case LSHL:
- case LSHR:
- case LUSHR:
- case LAND:
- case LOR:
- case LXOR:
- return BasicValue.LONG_VALUE;
- case DALOAD:
- case DADD:
- case DSUB:
- case DMUL:
- case DDIV:
- case DREM:
- return BasicValue.DOUBLE_VALUE;
- case AALOAD:
- return BasicValue.REFERENCE_VALUE;
- case LCMP:
- case FCMPL:
- case FCMPG:
- case DCMPL:
- case DCMPG:
- return BasicValue.INT_VALUE;
- case IF_ICMPEQ:
- case IF_ICMPNE:
- case IF_ICMPLT:
- case IF_ICMPGE:
- case IF_ICMPGT:
- case IF_ICMPLE:
- case IF_ACMPEQ:
- case IF_ACMPNE:
- case PUTFIELD:
- return null;
- default:
- throw new Error("Internal error.");
- }
- }
-
- @Override
- public BasicValue ternaryOperation(final AbstractInsnNode insn,
- final BasicValue value1, final BasicValue value2,
- final BasicValue value3) throws AnalyzerException {
- return null;
- }
-
- @Override
- public BasicValue naryOperation(final AbstractInsnNode insn,
- final List<? extends BasicValue> values) throws AnalyzerException {
- int opcode = insn.getOpcode();
- if (opcode == MULTIANEWARRAY) {
- return newValue(Type.getType(((MultiANewArrayInsnNode) insn).desc));
- } else if (opcode == INVOKEDYNAMIC) {
- return newValue(Type
- .getReturnType(((InvokeDynamicInsnNode) insn).desc));
- } else {
- return newValue(Type.getReturnType(((MethodInsnNode) insn).desc));
- }
- }
-
- @Override
- public void returnOperation(final AbstractInsnNode insn,
- final BasicValue value, final BasicValue expected)
- throws AnalyzerException {
- }
-
- @Override
- public BasicValue merge(final BasicValue v, final BasicValue w) {
- if (!v.equals(w)) {
- return BasicValue.UNINITIALIZED_VALUE;
- }
- return v;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/BasicValue.java b/src/asm/scala/tools/asm/tree/analysis/BasicValue.java
deleted file mode 100644
index 439941fb9f..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/BasicValue.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import scala.tools.asm.Type;
-
-/**
- * A {@link Value} that is represented by its type in a seven types type system.
- * This type system distinguishes the UNINITIALZED, INT, FLOAT, LONG, DOUBLE,
- * REFERENCE and RETURNADDRESS types.
- *
- * @author Eric Bruneton
- */
-public class BasicValue implements Value {
-
- public static final BasicValue UNINITIALIZED_VALUE = new BasicValue(null);
-
- public static final BasicValue INT_VALUE = new BasicValue(Type.INT_TYPE);
-
- public static final BasicValue FLOAT_VALUE = new BasicValue(Type.FLOAT_TYPE);
-
- public static final BasicValue LONG_VALUE = new BasicValue(Type.LONG_TYPE);
-
- public static final BasicValue DOUBLE_VALUE = new BasicValue(
- Type.DOUBLE_TYPE);
-
- public static final BasicValue REFERENCE_VALUE = new BasicValue(
- Type.getObjectType("java/lang/Object"));
-
- public static final BasicValue RETURNADDRESS_VALUE = new BasicValue(
- Type.VOID_TYPE);
-
- private final Type type;
-
- public BasicValue(final Type type) {
- this.type = type;
- }
-
- public Type getType() {
- return type;
- }
-
- public int getSize() {
- return type == Type.LONG_TYPE || type == Type.DOUBLE_TYPE ? 2 : 1;
- }
-
- public boolean isReference() {
- return type != null
- && (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY);
- }
-
- @Override
- public boolean equals(final Object value) {
- if (value == this) {
- return true;
- } else if (value instanceof BasicValue) {
- if (type == null) {
- return ((BasicValue) value).type == null;
- } else {
- return type.equals(((BasicValue) value).type);
- }
- } else {
- return false;
- }
- }
-
- @Override
- public int hashCode() {
- return type == null ? 0 : type.hashCode();
- }
-
- @Override
- public String toString() {
- if (this == UNINITIALIZED_VALUE) {
- return ".";
- } else if (this == RETURNADDRESS_VALUE) {
- return "A";
- } else if (this == REFERENCE_VALUE) {
- return "R";
- } else {
- return type.getDescriptor();
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/BasicVerifier.java b/src/asm/scala/tools/asm/tree/analysis/BasicVerifier.java
deleted file mode 100644
index b852f20acf..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/BasicVerifier.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.List;
-
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.FieldInsnNode;
-import scala.tools.asm.tree.InvokeDynamicInsnNode;
-import scala.tools.asm.tree.MethodInsnNode;
-
-/**
- * An extended {@link BasicInterpreter} that checks that bytecode instructions
- * are correctly used.
- *
- * @author Eric Bruneton
- * @author Bing Ran
- */
-public class BasicVerifier extends BasicInterpreter {
-
- public BasicVerifier() {
- super(ASM5);
- }
-
- protected BasicVerifier(final int api) {
- super(api);
- }
-
- @Override
- public BasicValue copyOperation(final AbstractInsnNode insn,
- final BasicValue value) throws AnalyzerException {
- Value expected;
- switch (insn.getOpcode()) {
- case ILOAD:
- case ISTORE:
- expected = BasicValue.INT_VALUE;
- break;
- case FLOAD:
- case FSTORE:
- expected = BasicValue.FLOAT_VALUE;
- break;
- case LLOAD:
- case LSTORE:
- expected = BasicValue.LONG_VALUE;
- break;
- case DLOAD:
- case DSTORE:
- expected = BasicValue.DOUBLE_VALUE;
- break;
- case ALOAD:
- if (!value.isReference()) {
- throw new AnalyzerException(insn, null, "an object reference",
- value);
- }
- return value;
- case ASTORE:
- if (!value.isReference()
- && !BasicValue.RETURNADDRESS_VALUE.equals(value)) {
- throw new AnalyzerException(insn, null,
- "an object reference or a return address", value);
- }
- return value;
- default:
- return value;
- }
- if (!expected.equals(value)) {
- throw new AnalyzerException(insn, null, expected, value);
- }
- return value;
- }
-
- @Override
- public BasicValue unaryOperation(final AbstractInsnNode insn,
- final BasicValue value) throws AnalyzerException {
- BasicValue expected;
- switch (insn.getOpcode()) {
- case INEG:
- case IINC:
- case I2F:
- case I2L:
- case I2D:
- case I2B:
- case I2C:
- case I2S:
- case IFEQ:
- case IFNE:
- case IFLT:
- case IFGE:
- case IFGT:
- case IFLE:
- case TABLESWITCH:
- case LOOKUPSWITCH:
- case IRETURN:
- case NEWARRAY:
- case ANEWARRAY:
- expected = BasicValue.INT_VALUE;
- break;
- case FNEG:
- case F2I:
- case F2L:
- case F2D:
- case FRETURN:
- expected = BasicValue.FLOAT_VALUE;
- break;
- case LNEG:
- case L2I:
- case L2F:
- case L2D:
- case LRETURN:
- expected = BasicValue.LONG_VALUE;
- break;
- case DNEG:
- case D2I:
- case D2F:
- case D2L:
- case DRETURN:
- expected = BasicValue.DOUBLE_VALUE;
- break;
- case GETFIELD:
- expected = newValue(Type
- .getObjectType(((FieldInsnNode) insn).owner));
- break;
- case CHECKCAST:
- if (!value.isReference()) {
- throw new AnalyzerException(insn, null, "an object reference",
- value);
- }
- return super.unaryOperation(insn, value);
- case ARRAYLENGTH:
- if (!isArrayValue(value)) {
- throw new AnalyzerException(insn, null, "an array reference",
- value);
- }
- return super.unaryOperation(insn, value);
- case ARETURN:
- case ATHROW:
- case INSTANCEOF:
- case MONITORENTER:
- case MONITOREXIT:
- case IFNULL:
- case IFNONNULL:
- if (!value.isReference()) {
- throw new AnalyzerException(insn, null, "an object reference",
- value);
- }
- return super.unaryOperation(insn, value);
- case PUTSTATIC:
- expected = newValue(Type.getType(((FieldInsnNode) insn).desc));
- break;
- default:
- throw new Error("Internal error.");
- }
- if (!isSubTypeOf(value, expected)) {
- throw new AnalyzerException(insn, null, expected, value);
- }
- return super.unaryOperation(insn, value);
- }
-
- @Override
- public BasicValue binaryOperation(final AbstractInsnNode insn,
- final BasicValue value1, final BasicValue value2)
- throws AnalyzerException {
- BasicValue expected1;
- BasicValue expected2;
- switch (insn.getOpcode()) {
- case IALOAD:
- expected1 = newValue(Type.getType("[I"));
- expected2 = BasicValue.INT_VALUE;
- break;
- case BALOAD:
- if (isSubTypeOf(value1, newValue(Type.getType("[Z")))) {
- expected1 = newValue(Type.getType("[Z"));
- } else {
- expected1 = newValue(Type.getType("[B"));
- }
- expected2 = BasicValue.INT_VALUE;
- break;
- case CALOAD:
- expected1 = newValue(Type.getType("[C"));
- expected2 = BasicValue.INT_VALUE;
- break;
- case SALOAD:
- expected1 = newValue(Type.getType("[S"));
- expected2 = BasicValue.INT_VALUE;
- break;
- case LALOAD:
- expected1 = newValue(Type.getType("[J"));
- expected2 = BasicValue.INT_VALUE;
- break;
- case FALOAD:
- expected1 = newValue(Type.getType("[F"));
- expected2 = BasicValue.INT_VALUE;
- break;
- case DALOAD:
- expected1 = newValue(Type.getType("[D"));
- expected2 = BasicValue.INT_VALUE;
- break;
- case AALOAD:
- expected1 = newValue(Type.getType("[Ljava/lang/Object;"));
- expected2 = BasicValue.INT_VALUE;
- break;
- case IADD:
- case ISUB:
- case IMUL:
- case IDIV:
- case IREM:
- case ISHL:
- case ISHR:
- case IUSHR:
- case IAND:
- case IOR:
- case IXOR:
- case IF_ICMPEQ:
- case IF_ICMPNE:
- case IF_ICMPLT:
- case IF_ICMPGE:
- case IF_ICMPGT:
- case IF_ICMPLE:
- expected1 = BasicValue.INT_VALUE;
- expected2 = BasicValue.INT_VALUE;
- break;
- case FADD:
- case FSUB:
- case FMUL:
- case FDIV:
- case FREM:
- case FCMPL:
- case FCMPG:
- expected1 = BasicValue.FLOAT_VALUE;
- expected2 = BasicValue.FLOAT_VALUE;
- break;
- case LADD:
- case LSUB:
- case LMUL:
- case LDIV:
- case LREM:
- case LAND:
- case LOR:
- case LXOR:
- case LCMP:
- expected1 = BasicValue.LONG_VALUE;
- expected2 = BasicValue.LONG_VALUE;
- break;
- case LSHL:
- case LSHR:
- case LUSHR:
- expected1 = BasicValue.LONG_VALUE;
- expected2 = BasicValue.INT_VALUE;
- break;
- case DADD:
- case DSUB:
- case DMUL:
- case DDIV:
- case DREM:
- case DCMPL:
- case DCMPG:
- expected1 = BasicValue.DOUBLE_VALUE;
- expected2 = BasicValue.DOUBLE_VALUE;
- break;
- case IF_ACMPEQ:
- case IF_ACMPNE:
- expected1 = BasicValue.REFERENCE_VALUE;
- expected2 = BasicValue.REFERENCE_VALUE;
- break;
- case PUTFIELD:
- FieldInsnNode fin = (FieldInsnNode) insn;
- expected1 = newValue(Type.getObjectType(fin.owner));
- expected2 = newValue(Type.getType(fin.desc));
- break;
- default:
- throw new Error("Internal error.");
- }
- if (!isSubTypeOf(value1, expected1)) {
- throw new AnalyzerException(insn, "First argument", expected1,
- value1);
- } else if (!isSubTypeOf(value2, expected2)) {
- throw new AnalyzerException(insn, "Second argument", expected2,
- value2);
- }
- if (insn.getOpcode() == AALOAD) {
- return getElementValue(value1);
- } else {
- return super.binaryOperation(insn, value1, value2);
- }
- }
-
- @Override
- public BasicValue ternaryOperation(final AbstractInsnNode insn,
- final BasicValue value1, final BasicValue value2,
- final BasicValue value3) throws AnalyzerException {
- BasicValue expected1;
- BasicValue expected3;
- switch (insn.getOpcode()) {
- case IASTORE:
- expected1 = newValue(Type.getType("[I"));
- expected3 = BasicValue.INT_VALUE;
- break;
- case BASTORE:
- if (isSubTypeOf(value1, newValue(Type.getType("[Z")))) {
- expected1 = newValue(Type.getType("[Z"));
- } else {
- expected1 = newValue(Type.getType("[B"));
- }
- expected3 = BasicValue.INT_VALUE;
- break;
- case CASTORE:
- expected1 = newValue(Type.getType("[C"));
- expected3 = BasicValue.INT_VALUE;
- break;
- case SASTORE:
- expected1 = newValue(Type.getType("[S"));
- expected3 = BasicValue.INT_VALUE;
- break;
- case LASTORE:
- expected1 = newValue(Type.getType("[J"));
- expected3 = BasicValue.LONG_VALUE;
- break;
- case FASTORE:
- expected1 = newValue(Type.getType("[F"));
- expected3 = BasicValue.FLOAT_VALUE;
- break;
- case DASTORE:
- expected1 = newValue(Type.getType("[D"));
- expected3 = BasicValue.DOUBLE_VALUE;
- break;
- case AASTORE:
- expected1 = value1;
- expected3 = BasicValue.REFERENCE_VALUE;
- break;
- default:
- throw new Error("Internal error.");
- }
- if (!isSubTypeOf(value1, expected1)) {
- throw new AnalyzerException(insn, "First argument", "a "
- + expected1 + " array reference", value1);
- } else if (!BasicValue.INT_VALUE.equals(value2)) {
- throw new AnalyzerException(insn, "Second argument",
- BasicValue.INT_VALUE, value2);
- } else if (!isSubTypeOf(value3, expected3)) {
- throw new AnalyzerException(insn, "Third argument", expected3,
- value3);
- }
- return null;
- }
-
- @Override
- public BasicValue naryOperation(final AbstractInsnNode insn,
- final List<? extends BasicValue> values) throws AnalyzerException {
- int opcode = insn.getOpcode();
- if (opcode == MULTIANEWARRAY) {
- for (int i = 0; i < values.size(); ++i) {
- if (!BasicValue.INT_VALUE.equals(values.get(i))) {
- throw new AnalyzerException(insn, null,
- BasicValue.INT_VALUE, values.get(i));
- }
- }
- } else {
- int i = 0;
- int j = 0;
- if (opcode != INVOKESTATIC && opcode != INVOKEDYNAMIC) {
- Type owner = Type.getObjectType(((MethodInsnNode) insn).owner);
- if (!isSubTypeOf(values.get(i++), newValue(owner))) {
- throw new AnalyzerException(insn, "Method owner",
- newValue(owner), values.get(0));
- }
- }
- String desc = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc
- : ((MethodInsnNode) insn).desc;
- Type[] args = Type.getArgumentTypes(desc);
- while (i < values.size()) {
- BasicValue expected = newValue(args[j++]);
- BasicValue encountered = values.get(i++);
- if (!isSubTypeOf(encountered, expected)) {
- throw new AnalyzerException(insn, "Argument " + j,
- expected, encountered);
- }
- }
- }
- return super.naryOperation(insn, values);
- }
-
- @Override
- public void returnOperation(final AbstractInsnNode insn,
- final BasicValue value, final BasicValue expected)
- throws AnalyzerException {
- if (!isSubTypeOf(value, expected)) {
- throw new AnalyzerException(insn, "Incompatible return type",
- expected, value);
- }
- }
-
- protected boolean isArrayValue(final BasicValue value) {
- return value.isReference();
- }
-
- protected BasicValue getElementValue(final BasicValue objectArrayValue)
- throws AnalyzerException {
- return BasicValue.REFERENCE_VALUE;
- }
-
- protected boolean isSubTypeOf(final BasicValue value,
- final BasicValue expected) {
- return value.equals(expected);
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Frame.java b/src/asm/scala/tools/asm/tree/analysis/Frame.java
deleted file mode 100644
index 0b7f4ba53b..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/Frame.java
+++ /dev/null
@@ -1,738 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.IincInsnNode;
-import scala.tools.asm.tree.InvokeDynamicInsnNode;
-import scala.tools.asm.tree.MethodInsnNode;
-import scala.tools.asm.tree.MultiANewArrayInsnNode;
-import scala.tools.asm.tree.VarInsnNode;
-
-/**
- * A symbolic execution stack frame. A stack frame contains a set of local
- * variable slots, and an operand stack. Warning: long and double values are
- * represented by <i>two</i> slots in local variables, and by <i>one</i> slot in
- * the operand stack.
- *
- * @param <V>
- * type of the Value used for the analysis.
- *
- * @author Eric Bruneton
- */
-public class Frame<V extends Value> {
-
- /**
- * The expected return type of the analyzed method, or <tt>null</tt> if the
- * method returns void.
- */
- private V returnValue;
-
- /**
- * The local variables and operand stack of this frame.
- */
- private V[] values;
-
- /**
- * The number of local variables of this frame.
- */
- private int locals;
-
- /**
- * The number of elements in the operand stack.
- */
- private int top;
-
- /**
- * Constructs a new frame with the given size.
- *
- * @param nLocals
- * the maximum number of local variables of the frame.
- * @param nStack
- * the maximum stack size of the frame.
- */
- public Frame(final int nLocals, final int nStack) {
- this.values = (V[]) new Value[nLocals + nStack];
- this.locals = nLocals;
- }
-
- /**
- * Constructs a new frame that is identical to the given frame.
- *
- * @param src
- * a frame.
- */
- public Frame(final Frame<? extends V> src) {
- this(src.locals, src.values.length - src.locals);
- init(src);
- }
-
- /**
- * Copies the state of the given frame into this frame.
- *
- * @param src
- * a frame.
- * @return this frame.
- */
- public Frame<V> init(final Frame<? extends V> src) {
- returnValue = src.returnValue;
- System.arraycopy(src.values, 0, values, 0, values.length);
- top = src.top;
- return this;
- }
-
- /**
- * Sets the expected return type of the analyzed method.
- *
- * @param v
- * the expected return type of the analyzed method, or
- * <tt>null</tt> if the method returns void.
- */
- public void setReturn(final V v) {
- returnValue = v;
- }
-
- /**
- * Returns the maximum number of local variables of this frame.
- *
- * @return the maximum number of local variables of this frame.
- */
- public int getLocals() {
- return locals;
- }
-
- /**
- * Returns the maximum stack size of this frame.
- *
- * @return the maximum stack size of this frame.
- */
- public int getMaxStackSize() {
- return values.length - locals;
- }
-
- /**
- * Returns the value of the given local variable.
- *
- * @param i
- * a local variable index.
- * @return the value of the given local variable.
- * @throws IndexOutOfBoundsException
- * if the variable does not exist.
- */
- public V getLocal(final int i) throws IndexOutOfBoundsException {
- if (i >= locals) {
- throw new IndexOutOfBoundsException(
- "Trying to access an inexistant local variable");
- }
- return values[i];
- }
-
- /**
- * Sets the value of the given local variable.
- *
- * @param i
- * a local variable index.
- * @param value
- * the new value of this local variable.
- * @throws IndexOutOfBoundsException
- * if the variable does not exist.
- */
- public void setLocal(final int i, final V value)
- throws IndexOutOfBoundsException {
- if (i >= locals) {
- throw new IndexOutOfBoundsException(
- "Trying to access an inexistant local variable " + i);
- }
- values[i] = value;
- }
-
- /**
- * Returns the number of values in the operand stack of this frame. Long and
- * double values are treated as single values.
- *
- * @return the number of values in the operand stack of this frame.
- */
- public int getStackSize() {
- return top;
- }
-
- /**
- * Returns the value of the given operand stack slot.
- *
- * @param i
- * the index of an operand stack slot.
- * @return the value of the given operand stack slot.
- * @throws IndexOutOfBoundsException
- * if the operand stack slot does not exist.
- */
- public V getStack(final int i) throws IndexOutOfBoundsException {
- return values[i + locals];
- }
-
- /**
- * Clears the operand stack of this frame.
- */
- public void clearStack() {
- top = 0;
- }
-
- /**
- * Pops a value from the operand stack of this frame.
- *
- * @return the value that has been popped from the stack.
- * @throws IndexOutOfBoundsException
- * if the operand stack is empty.
- */
- public V pop() throws IndexOutOfBoundsException {
- if (top == 0) {
- throw new IndexOutOfBoundsException(
- "Cannot pop operand off an empty stack.");
- }
- return values[--top + locals];
- }
-
- /**
- * Pushes a value into the operand stack of this frame.
- *
- * @param value
- * the value that must be pushed into the stack.
- * @throws IndexOutOfBoundsException
- * if the operand stack is full.
- */
- public void push(final V value) throws IndexOutOfBoundsException {
- if (top + locals >= values.length) {
- throw new IndexOutOfBoundsException(
- "Insufficient maximum stack size.");
- }
- values[top++ + locals] = value;
- }
-
- public void execute(final AbstractInsnNode insn,
- final Interpreter<V> interpreter) throws AnalyzerException {
- V value1, value2, value3, value4;
- List<V> values;
- int var;
-
- switch (insn.getOpcode()) {
- case Opcodes.NOP:
- break;
- case Opcodes.ACONST_NULL:
- case Opcodes.ICONST_M1:
- case Opcodes.ICONST_0:
- case Opcodes.ICONST_1:
- case Opcodes.ICONST_2:
- case Opcodes.ICONST_3:
- case Opcodes.ICONST_4:
- case Opcodes.ICONST_5:
- case Opcodes.LCONST_0:
- case Opcodes.LCONST_1:
- case Opcodes.FCONST_0:
- case Opcodes.FCONST_1:
- case Opcodes.FCONST_2:
- case Opcodes.DCONST_0:
- case Opcodes.DCONST_1:
- case Opcodes.BIPUSH:
- case Opcodes.SIPUSH:
- case Opcodes.LDC:
- push(interpreter.newOperation(insn));
- break;
- case Opcodes.ILOAD:
- case Opcodes.LLOAD:
- case Opcodes.FLOAD:
- case Opcodes.DLOAD:
- case Opcodes.ALOAD:
- push(interpreter.copyOperation(insn,
- getLocal(((VarInsnNode) insn).var)));
- break;
- case Opcodes.IALOAD:
- case Opcodes.LALOAD:
- case Opcodes.FALOAD:
- case Opcodes.DALOAD:
- case Opcodes.AALOAD:
- case Opcodes.BALOAD:
- case Opcodes.CALOAD:
- case Opcodes.SALOAD:
- value2 = pop();
- value1 = pop();
- push(interpreter.binaryOperation(insn, value1, value2));
- break;
- case Opcodes.ISTORE:
- case Opcodes.LSTORE:
- case Opcodes.FSTORE:
- case Opcodes.DSTORE:
- case Opcodes.ASTORE:
- value1 = interpreter.copyOperation(insn, pop());
- var = ((VarInsnNode) insn).var;
- setLocal(var, value1);
- if (value1.getSize() == 2) {
- setLocal(var + 1, interpreter.newValue(null));
- }
- if (var > 0) {
- Value local = getLocal(var - 1);
- if (local != null && local.getSize() == 2) {
- setLocal(var - 1, interpreter.newValue(null));
- }
- }
- break;
- case Opcodes.IASTORE:
- case Opcodes.LASTORE:
- case Opcodes.FASTORE:
- case Opcodes.DASTORE:
- case Opcodes.AASTORE:
- case Opcodes.BASTORE:
- case Opcodes.CASTORE:
- case Opcodes.SASTORE:
- value3 = pop();
- value2 = pop();
- value1 = pop();
- interpreter.ternaryOperation(insn, value1, value2, value3);
- break;
- case Opcodes.POP:
- if (pop().getSize() == 2) {
- throw new AnalyzerException(insn, "Illegal use of POP");
- }
- break;
- case Opcodes.POP2:
- if (pop().getSize() == 1) {
- if (pop().getSize() != 1) {
- throw new AnalyzerException(insn, "Illegal use of POP2");
- }
- }
- break;
- case Opcodes.DUP:
- value1 = pop();
- if (value1.getSize() != 1) {
- throw new AnalyzerException(insn, "Illegal use of DUP");
- }
- push(value1);
- push(interpreter.copyOperation(insn, value1));
- break;
- case Opcodes.DUP_X1:
- value1 = pop();
- value2 = pop();
- if (value1.getSize() != 1 || value2.getSize() != 1) {
- throw new AnalyzerException(insn, "Illegal use of DUP_X1");
- }
- push(interpreter.copyOperation(insn, value1));
- push(value2);
- push(value1);
- break;
- case Opcodes.DUP_X2:
- value1 = pop();
- if (value1.getSize() == 1) {
- value2 = pop();
- if (value2.getSize() == 1) {
- value3 = pop();
- if (value3.getSize() == 1) {
- push(interpreter.copyOperation(insn, value1));
- push(value3);
- push(value2);
- push(value1);
- break;
- }
- } else {
- push(interpreter.copyOperation(insn, value1));
- push(value2);
- push(value1);
- break;
- }
- }
- throw new AnalyzerException(insn, "Illegal use of DUP_X2");
- case Opcodes.DUP2:
- value1 = pop();
- if (value1.getSize() == 1) {
- value2 = pop();
- if (value2.getSize() == 1) {
- push(value2);
- push(value1);
- push(interpreter.copyOperation(insn, value2));
- push(interpreter.copyOperation(insn, value1));
- break;
- }
- } else {
- push(value1);
- push(interpreter.copyOperation(insn, value1));
- break;
- }
- throw new AnalyzerException(insn, "Illegal use of DUP2");
- case Opcodes.DUP2_X1:
- value1 = pop();
- if (value1.getSize() == 1) {
- value2 = pop();
- if (value2.getSize() == 1) {
- value3 = pop();
- if (value3.getSize() == 1) {
- push(interpreter.copyOperation(insn, value2));
- push(interpreter.copyOperation(insn, value1));
- push(value3);
- push(value2);
- push(value1);
- break;
- }
- }
- } else {
- value2 = pop();
- if (value2.getSize() == 1) {
- push(interpreter.copyOperation(insn, value1));
- push(value2);
- push(value1);
- break;
- }
- }
- throw new AnalyzerException(insn, "Illegal use of DUP2_X1");
- case Opcodes.DUP2_X2:
- value1 = pop();
- if (value1.getSize() == 1) {
- value2 = pop();
- if (value2.getSize() == 1) {
- value3 = pop();
- if (value3.getSize() == 1) {
- value4 = pop();
- if (value4.getSize() == 1) {
- push(interpreter.copyOperation(insn, value2));
- push(interpreter.copyOperation(insn, value1));
- push(value4);
- push(value3);
- push(value2);
- push(value1);
- break;
- }
- } else {
- push(interpreter.copyOperation(insn, value2));
- push(interpreter.copyOperation(insn, value1));
- push(value3);
- push(value2);
- push(value1);
- break;
- }
- }
- } else {
- value2 = pop();
- if (value2.getSize() == 1) {
- value3 = pop();
- if (value3.getSize() == 1) {
- push(interpreter.copyOperation(insn, value1));
- push(value3);
- push(value2);
- push(value1);
- break;
- }
- } else {
- push(interpreter.copyOperation(insn, value1));
- push(value2);
- push(value1);
- break;
- }
- }
- throw new AnalyzerException(insn, "Illegal use of DUP2_X2");
- case Opcodes.SWAP:
- value2 = pop();
- value1 = pop();
- if (value1.getSize() != 1 || value2.getSize() != 1) {
- throw new AnalyzerException(insn, "Illegal use of SWAP");
- }
- push(interpreter.copyOperation(insn, value2));
- push(interpreter.copyOperation(insn, value1));
- break;
- case Opcodes.IADD:
- case Opcodes.LADD:
- case Opcodes.FADD:
- case Opcodes.DADD:
- case Opcodes.ISUB:
- case Opcodes.LSUB:
- case Opcodes.FSUB:
- case Opcodes.DSUB:
- case Opcodes.IMUL:
- case Opcodes.LMUL:
- case Opcodes.FMUL:
- case Opcodes.DMUL:
- case Opcodes.IDIV:
- case Opcodes.LDIV:
- case Opcodes.FDIV:
- case Opcodes.DDIV:
- case Opcodes.IREM:
- case Opcodes.LREM:
- case Opcodes.FREM:
- case Opcodes.DREM:
- value2 = pop();
- value1 = pop();
- push(interpreter.binaryOperation(insn, value1, value2));
- break;
- case Opcodes.INEG:
- case Opcodes.LNEG:
- case Opcodes.FNEG:
- case Opcodes.DNEG:
- push(interpreter.unaryOperation(insn, pop()));
- break;
- case Opcodes.ISHL:
- case Opcodes.LSHL:
- case Opcodes.ISHR:
- case Opcodes.LSHR:
- case Opcodes.IUSHR:
- case Opcodes.LUSHR:
- case Opcodes.IAND:
- case Opcodes.LAND:
- case Opcodes.IOR:
- case Opcodes.LOR:
- case Opcodes.IXOR:
- case Opcodes.LXOR:
- value2 = pop();
- value1 = pop();
- push(interpreter.binaryOperation(insn, value1, value2));
- break;
- case Opcodes.IINC:
- var = ((IincInsnNode) insn).var;
- setLocal(var, interpreter.unaryOperation(insn, getLocal(var)));
- break;
- case Opcodes.I2L:
- case Opcodes.I2F:
- case Opcodes.I2D:
- case Opcodes.L2I:
- case Opcodes.L2F:
- case Opcodes.L2D:
- case Opcodes.F2I:
- case Opcodes.F2L:
- case Opcodes.F2D:
- case Opcodes.D2I:
- case Opcodes.D2L:
- case Opcodes.D2F:
- case Opcodes.I2B:
- case Opcodes.I2C:
- case Opcodes.I2S:
- push(interpreter.unaryOperation(insn, pop()));
- break;
- case Opcodes.LCMP:
- case Opcodes.FCMPL:
- case Opcodes.FCMPG:
- case Opcodes.DCMPL:
- case Opcodes.DCMPG:
- value2 = pop();
- value1 = pop();
- push(interpreter.binaryOperation(insn, value1, value2));
- break;
- case Opcodes.IFEQ:
- case Opcodes.IFNE:
- case Opcodes.IFLT:
- case Opcodes.IFGE:
- case Opcodes.IFGT:
- case Opcodes.IFLE:
- interpreter.unaryOperation(insn, pop());
- break;
- case Opcodes.IF_ICMPEQ:
- case Opcodes.IF_ICMPNE:
- case Opcodes.IF_ICMPLT:
- case Opcodes.IF_ICMPGE:
- case Opcodes.IF_ICMPGT:
- case Opcodes.IF_ICMPLE:
- case Opcodes.IF_ACMPEQ:
- case Opcodes.IF_ACMPNE:
- value2 = pop();
- value1 = pop();
- interpreter.binaryOperation(insn, value1, value2);
- break;
- case Opcodes.GOTO:
- break;
- case Opcodes.JSR:
- push(interpreter.newOperation(insn));
- break;
- case Opcodes.RET:
- break;
- case Opcodes.TABLESWITCH:
- case Opcodes.LOOKUPSWITCH:
- interpreter.unaryOperation(insn, pop());
- break;
- case Opcodes.IRETURN:
- case Opcodes.LRETURN:
- case Opcodes.FRETURN:
- case Opcodes.DRETURN:
- case Opcodes.ARETURN:
- value1 = pop();
- interpreter.unaryOperation(insn, value1);
- interpreter.returnOperation(insn, value1, returnValue);
- break;
- case Opcodes.RETURN:
- if (returnValue != null) {
- throw new AnalyzerException(insn, "Incompatible return type");
- }
- break;
- case Opcodes.GETSTATIC:
- push(interpreter.newOperation(insn));
- break;
- case Opcodes.PUTSTATIC:
- interpreter.unaryOperation(insn, pop());
- break;
- case Opcodes.GETFIELD:
- push(interpreter.unaryOperation(insn, pop()));
- break;
- case Opcodes.PUTFIELD:
- value2 = pop();
- value1 = pop();
- interpreter.binaryOperation(insn, value1, value2);
- break;
- case Opcodes.INVOKEVIRTUAL:
- case Opcodes.INVOKESPECIAL:
- case Opcodes.INVOKESTATIC:
- case Opcodes.INVOKEINTERFACE: {
- values = new ArrayList<V>();
- String desc = ((MethodInsnNode) insn).desc;
- for (int i = Type.getArgumentTypes(desc).length; i > 0; --i) {
- values.add(0, pop());
- }
- if (insn.getOpcode() != Opcodes.INVOKESTATIC) {
- values.add(0, pop());
- }
- if (Type.getReturnType(desc) == Type.VOID_TYPE) {
- interpreter.naryOperation(insn, values);
- } else {
- push(interpreter.naryOperation(insn, values));
- }
- break;
- }
- case Opcodes.INVOKEDYNAMIC: {
- values = new ArrayList<V>();
- String desc = ((InvokeDynamicInsnNode) insn).desc;
- for (int i = Type.getArgumentTypes(desc).length; i > 0; --i) {
- values.add(0, pop());
- }
- if (Type.getReturnType(desc) == Type.VOID_TYPE) {
- interpreter.naryOperation(insn, values);
- } else {
- push(interpreter.naryOperation(insn, values));
- }
- break;
- }
- case Opcodes.NEW:
- push(interpreter.newOperation(insn));
- break;
- case Opcodes.NEWARRAY:
- case Opcodes.ANEWARRAY:
- case Opcodes.ARRAYLENGTH:
- push(interpreter.unaryOperation(insn, pop()));
- break;
- case Opcodes.ATHROW:
- interpreter.unaryOperation(insn, pop());
- break;
- case Opcodes.CHECKCAST:
- case Opcodes.INSTANCEOF:
- push(interpreter.unaryOperation(insn, pop()));
- break;
- case Opcodes.MONITORENTER:
- case Opcodes.MONITOREXIT:
- interpreter.unaryOperation(insn, pop());
- break;
- case Opcodes.MULTIANEWARRAY:
- values = new ArrayList<V>();
- for (int i = ((MultiANewArrayInsnNode) insn).dims; i > 0; --i) {
- values.add(0, pop());
- }
- push(interpreter.naryOperation(insn, values));
- break;
- case Opcodes.IFNULL:
- case Opcodes.IFNONNULL:
- interpreter.unaryOperation(insn, pop());
- break;
- default:
- throw new RuntimeException("Illegal opcode " + insn.getOpcode());
- }
- }
-
- /**
- * Merges this frame with the given frame.
- *
- * @param frame
- * a frame.
- * @param interpreter
- * the interpreter used to merge values.
- * @return <tt>true</tt> if this frame has been changed as a result of the
- * merge operation, or <tt>false</tt> otherwise.
- * @throws AnalyzerException
- * if the frames have incompatible sizes.
- */
- public boolean merge(final Frame<? extends V> frame,
- final Interpreter<V> interpreter) throws AnalyzerException {
- if (top != frame.top) {
- throw new AnalyzerException(null, "Incompatible stack heights");
- }
- boolean changes = false;
- for (int i = 0; i < locals + top; ++i) {
- V v = interpreter.merge(values[i], frame.values[i]);
- if (!v.equals(values[i])) {
- values[i] = v;
- changes = true;
- }
- }
- return changes;
- }
-
- /**
- * Merges this frame with the given frame (case of a RET instruction).
- *
- * @param frame
- * a frame
- * @param access
- * the local variables that have been accessed by the subroutine
- * to which the RET instruction corresponds.
- * @return <tt>true</tt> if this frame has been changed as a result of the
- * merge operation, or <tt>false</tt> otherwise.
- */
- public boolean merge(final Frame<? extends V> frame, final boolean[] access) {
- boolean changes = false;
- for (int i = 0; i < locals; ++i) {
- if (!access[i] && !values[i].equals(frame.values[i])) {
- values[i] = frame.values[i];
- changes = true;
- }
- }
- return changes;
- }
-
- /**
- * Returns a string representation of this frame.
- *
- * @return a string representation of this frame.
- */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < getLocals(); ++i) {
- sb.append(getLocal(i));
- }
- sb.append(' ');
- for (int i = 0; i < getStackSize(); ++i) {
- sb.append(getStack(i).toString());
- }
- return sb.toString();
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Interpreter.java b/src/asm/scala/tools/asm/tree/analysis/Interpreter.java
deleted file mode 100644
index 00fe6c8bff..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/Interpreter.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.List;
-
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-
-/**
- * A semantic bytecode interpreter. More precisely, this interpreter only
- * manages the computation of values from other values: it does not manage the
- * transfer of values to or from the stack, and to or from the local variables.
- * This separation allows a generic bytecode {@link Analyzer} to work with
- * various semantic interpreters, without needing to duplicate the code to
- * simulate the transfer of values.
- *
- * @param <V>
- * type of the Value used for the analysis.
- *
- * @author Eric Bruneton
- */
-public abstract class Interpreter<V extends Value> {
-
- protected final int api;
-
- protected Interpreter(final int api) {
- this.api = api;
- }
-
- /**
- * Creates a new value that represents the given type.
- *
- * Called for method parameters (including <code>this</code>), exception
- * handler variable and with <code>null</code> type for variables reserved
- * by long and double types.
- *
- * @param type
- * a primitive or reference type, or <tt>null</tt> to represent
- * an uninitialized value.
- * @return a value that represents the given type. The size of the returned
- * value must be equal to the size of the given type.
- */
- public abstract V newValue(Type type);
-
- /**
- * Interprets a bytecode instruction without arguments. This method is
- * called for the following opcodes:
- *
- * ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4,
- * ICONST_5, LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0,
- * DCONST_1, BIPUSH, SIPUSH, LDC, JSR, GETSTATIC, NEW
- *
- * @param insn
- * the bytecode instruction to be interpreted.
- * @return the result of the interpretation of the given instruction.
- * @throws AnalyzerException
- * if an error occurred during the interpretation.
- */
- public abstract V newOperation(AbstractInsnNode insn)
- throws AnalyzerException;
-
- /**
- * Interprets a bytecode instruction that moves a value on the stack or to
- * or from local variables. This method is called for the following opcodes:
- *
- * ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE,
- * ASTORE, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP
- *
- * @param insn
- * the bytecode instruction to be interpreted.
- * @param value
- * the value that must be moved by the instruction.
- * @return the result of the interpretation of the given instruction. The
- * returned value must be <tt>equal</tt> to the given value.
- * @throws AnalyzerException
- * if an error occurred during the interpretation.
- */
- public abstract V copyOperation(AbstractInsnNode insn, V value)
- throws AnalyzerException;
-
- /**
- * Interprets a bytecode instruction with a single argument. This method is
- * called for the following opcodes:
- *
- * INEG, LNEG, FNEG, DNEG, IINC, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L,
- * F2D, D2I, D2L, D2F, I2B, I2C, I2S, IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE,
- * TABLESWITCH, LOOKUPSWITCH, IRETURN, LRETURN, FRETURN, DRETURN, ARETURN,
- * PUTSTATIC, GETFIELD, NEWARRAY, ANEWARRAY, ARRAYLENGTH, ATHROW, CHECKCAST,
- * INSTANCEOF, MONITORENTER, MONITOREXIT, IFNULL, IFNONNULL
- *
- * @param insn
- * the bytecode instruction to be interpreted.
- * @param value
- * the argument of the instruction to be interpreted.
- * @return the result of the interpretation of the given instruction.
- * @throws AnalyzerException
- * if an error occurred during the interpretation.
- */
- public abstract V unaryOperation(AbstractInsnNode insn, V value)
- throws AnalyzerException;
-
- /**
- * Interprets a bytecode instruction with two arguments. This method is
- * called for the following opcodes:
- *
- * IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IADD,
- * LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV,
- * LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, ISHL, LSHL, ISHR, LSHR, IUSHR,
- * LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, LCMP, FCMPL, FCMPG, DCMPL,
- * DCMPG, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
- * IF_ACMPEQ, IF_ACMPNE, PUTFIELD
- *
- * @param insn
- * the bytecode instruction to be interpreted.
- * @param value1
- * the first argument of the instruction to be interpreted.
- * @param value2
- * the second argument of the instruction to be interpreted.
- * @return the result of the interpretation of the given instruction.
- * @throws AnalyzerException
- * if an error occurred during the interpretation.
- */
- public abstract V binaryOperation(AbstractInsnNode insn, V value1, V value2)
- throws AnalyzerException;
-
- /**
- * Interprets a bytecode instruction with three arguments. This method is
- * called for the following opcodes:
- *
- * IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE
- *
- * @param insn
- * the bytecode instruction to be interpreted.
- * @param value1
- * the first argument of the instruction to be interpreted.
- * @param value2
- * the second argument of the instruction to be interpreted.
- * @param value3
- * the third argument of the instruction to be interpreted.
- * @return the result of the interpretation of the given instruction.
- * @throws AnalyzerException
- * if an error occurred during the interpretation.
- */
- public abstract V ternaryOperation(AbstractInsnNode insn, V value1,
- V value2, V value3) throws AnalyzerException;
-
- /**
- * Interprets a bytecode instruction with a variable number of arguments.
- * This method is called for the following opcodes:
- *
- * INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE,
- * MULTIANEWARRAY and INVOKEDYNAMIC
- *
- * @param insn
- * the bytecode instruction to be interpreted.
- * @param values
- * the arguments of the instruction to be interpreted.
- * @return the result of the interpretation of the given instruction.
- * @throws AnalyzerException
- * if an error occurred during the interpretation.
- */
- public abstract V naryOperation(AbstractInsnNode insn,
- List<? extends V> values) throws AnalyzerException;
-
- /**
- * Interprets a bytecode return instruction. This method is called for the
- * following opcodes:
- *
- * IRETURN, LRETURN, FRETURN, DRETURN, ARETURN
- *
- * @param insn
- * the bytecode instruction to be interpreted.
- * @param value
- * the argument of the instruction to be interpreted.
- * @param expected
- * the expected return type of the analyzed method.
- * @throws AnalyzerException
- * if an error occurred during the interpretation.
- */
- public abstract void returnOperation(AbstractInsnNode insn, V value,
- V expected) throws AnalyzerException;
-
- /**
- * Merges two values. The merge operation must return a value that
- * represents both values (for instance, if the two values are two types,
- * the merged value must be a common super type of the two types. If the two
- * values are integer intervals, the merged value must be an interval that
- * contains the previous ones. Likewise for other types of values).
- *
- * @param v
- * a value.
- * @param w
- * another value.
- * @return the merged value. If the merged value is equal to <tt>v</tt>,
- * this method <i>must</i> return <tt>v</tt>.
- */
- public abstract V merge(V v, V w);
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/SimpleVerifier.java b/src/asm/scala/tools/asm/tree/analysis/SimpleVerifier.java
deleted file mode 100644
index a345981f36..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/SimpleVerifier.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.List;
-
-import scala.tools.asm.Type;
-
-/**
- * An extended {@link BasicVerifier} that performs more precise verifications.
- * This verifier computes exact class types, instead of using a single "object
- * reference" type (as done in the {@link BasicVerifier}).
- *
- * @author Eric Bruneton
- * @author Bing Ran
- */
-public class SimpleVerifier extends BasicVerifier {
-
- /**
- * The class that is verified.
- */
- private final Type currentClass;
-
- /**
- * The super class of the class that is verified.
- */
- private final Type currentSuperClass;
-
- /**
- * The interfaces implemented by the class that is verified.
- */
- private final List<Type> currentClassInterfaces;
-
- /**
- * If the class that is verified is an interface.
- */
- private final boolean isInterface;
-
- /**
- * The loader to use for referenced classes.
- */
- private ClassLoader loader = getClass().getClassLoader();
-
- /**
- * Constructs a new {@link SimpleVerifier}.
- */
- public SimpleVerifier() {
- this(null, null, false);
- }
-
- /**
- * Constructs a new {@link SimpleVerifier} to verify a specific class. This
- * class will not be loaded into the JVM since it may be incorrect.
- *
- * @param currentClass
- * the class that is verified.
- * @param currentSuperClass
- * the super class of the class that is verified.
- * @param isInterface
- * if the class that is verified is an interface.
- */
- public SimpleVerifier(final Type currentClass,
- final Type currentSuperClass, final boolean isInterface) {
- this(currentClass, currentSuperClass, null, isInterface);
- }
-
- /**
- * Constructs a new {@link SimpleVerifier} to verify a specific class. This
- * class will not be loaded into the JVM since it may be incorrect.
- *
- * @param currentClass
- * the class that is verified.
- * @param currentSuperClass
- * the super class of the class that is verified.
- * @param currentClassInterfaces
- * the interfaces implemented by the class that is verified.
- * @param isInterface
- * if the class that is verified is an interface.
- */
- public SimpleVerifier(final Type currentClass,
- final Type currentSuperClass,
- final List<Type> currentClassInterfaces, final boolean isInterface) {
- this(ASM5, currentClass, currentSuperClass, currentClassInterfaces,
- isInterface);
- }
-
- protected SimpleVerifier(final int api, final Type currentClass,
- final Type currentSuperClass,
- final List<Type> currentClassInterfaces, final boolean isInterface) {
- super(api);
- this.currentClass = currentClass;
- this.currentSuperClass = currentSuperClass;
- this.currentClassInterfaces = currentClassInterfaces;
- this.isInterface = isInterface;
- }
-
- /**
- * Set the <code>ClassLoader</code> which will be used to load referenced
- * classes. This is useful if you are verifying multiple interdependent
- * classes.
- *
- * @param loader
- * a <code>ClassLoader</code> to use
- */
- public void setClassLoader(final ClassLoader loader) {
- this.loader = loader;
- }
-
- @Override
- public BasicValue newValue(final Type type) {
- if (type == null) {
- return BasicValue.UNINITIALIZED_VALUE;
- }
-
- boolean isArray = type.getSort() == Type.ARRAY;
- if (isArray) {
- switch (type.getElementType().getSort()) {
- case Type.BOOLEAN:
- case Type.CHAR:
- case Type.BYTE:
- case Type.SHORT:
- return new BasicValue(type);
- }
- }
-
- BasicValue v = super.newValue(type);
- if (BasicValue.REFERENCE_VALUE.equals(v)) {
- if (isArray) {
- v = newValue(type.getElementType());
- String desc = v.getType().getDescriptor();
- for (int i = 0; i < type.getDimensions(); ++i) {
- desc = '[' + desc;
- }
- v = new BasicValue(Type.getType(desc));
- } else {
- v = new BasicValue(type);
- }
- }
- return v;
- }
-
- @Override
- protected boolean isArrayValue(final BasicValue value) {
- Type t = value.getType();
- return t != null
- && ("Lnull;".equals(t.getDescriptor()) || t.getSort() == Type.ARRAY);
- }
-
- @Override
- protected BasicValue getElementValue(final BasicValue objectArrayValue)
- throws AnalyzerException {
- Type arrayType = objectArrayValue.getType();
- if (arrayType != null) {
- if (arrayType.getSort() == Type.ARRAY) {
- return newValue(Type.getType(arrayType.getDescriptor()
- .substring(1)));
- } else if ("Lnull;".equals(arrayType.getDescriptor())) {
- return objectArrayValue;
- }
- }
- throw new Error("Internal error");
- }
-
- @Override
- protected boolean isSubTypeOf(final BasicValue value,
- final BasicValue expected) {
- Type expectedType = expected.getType();
- Type type = value.getType();
- switch (expectedType.getSort()) {
- case Type.INT:
- case Type.FLOAT:
- case Type.LONG:
- case Type.DOUBLE:
- return type.equals(expectedType);
- case Type.ARRAY:
- case Type.OBJECT:
- if ("Lnull;".equals(type.getDescriptor())) {
- return true;
- } else if (type.getSort() == Type.OBJECT
- || type.getSort() == Type.ARRAY) {
- return isAssignableFrom(expectedType, type);
- } else {
- return false;
- }
- default:
- throw new Error("Internal error");
- }
- }
-
- @Override
- public BasicValue merge(final BasicValue v, final BasicValue w) {
- if (!v.equals(w)) {
- Type t = v.getType();
- Type u = w.getType();
- if (t != null
- && (t.getSort() == Type.OBJECT || t.getSort() == Type.ARRAY)) {
- if (u != null
- && (u.getSort() == Type.OBJECT || u.getSort() == Type.ARRAY)) {
- if ("Lnull;".equals(t.getDescriptor())) {
- return w;
- }
- if ("Lnull;".equals(u.getDescriptor())) {
- return v;
- }
- if (isAssignableFrom(t, u)) {
- return v;
- }
- if (isAssignableFrom(u, t)) {
- return w;
- }
- // TODO case of array classes of the same dimension
- // TODO should we look also for a common super interface?
- // problem: there may be several possible common super
- // interfaces
- do {
- if (t == null || isInterface(t)) {
- return BasicValue.REFERENCE_VALUE;
- }
- t = getSuperClass(t);
- if (isAssignableFrom(t, u)) {
- return newValue(t);
- }
- } while (true);
- }
- }
- return BasicValue.UNINITIALIZED_VALUE;
- }
- return v;
- }
-
- protected boolean isInterface(final Type t) {
- if (currentClass != null && t.equals(currentClass)) {
- return isInterface;
- }
- return getClass(t).isInterface();
- }
-
- protected Type getSuperClass(final Type t) {
- if (currentClass != null && t.equals(currentClass)) {
- return currentSuperClass;
- }
- Class<?> c = getClass(t).getSuperclass();
- return c == null ? null : Type.getType(c);
- }
-
- protected boolean isAssignableFrom(final Type t, final Type u) {
- if (t.equals(u)) {
- return true;
- }
- if (currentClass != null && t.equals(currentClass)) {
- if (getSuperClass(u) == null) {
- return false;
- } else {
- if (isInterface) {
- return u.getSort() == Type.OBJECT
- || u.getSort() == Type.ARRAY;
- }
- return isAssignableFrom(t, getSuperClass(u));
- }
- }
- if (currentClass != null && u.equals(currentClass)) {
- if (isAssignableFrom(t, currentSuperClass)) {
- return true;
- }
- if (currentClassInterfaces != null) {
- for (int i = 0; i < currentClassInterfaces.size(); ++i) {
- Type v = currentClassInterfaces.get(i);
- if (isAssignableFrom(t, v)) {
- return true;
- }
- }
- }
- return false;
- }
- Class<?> tc = getClass(t);
- if (tc.isInterface()) {
- tc = Object.class;
- }
- return tc.isAssignableFrom(getClass(u));
- }
-
- protected Class<?> getClass(final Type t) {
- try {
- if (t.getSort() == Type.ARRAY) {
- return Class.forName(t.getDescriptor().replace('/', '.'),
- false, loader);
- }
- return Class.forName(t.getClassName(), false, loader);
- } catch (ClassNotFoundException e) {
- throw new RuntimeException(e.toString());
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/SmallSet.java b/src/asm/scala/tools/asm/tree/analysis/SmallSet.java
deleted file mode 100644
index 205878d18c..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/SmallSet.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.AbstractSet;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * A set of at most two elements.
- *
- * @author Eric Bruneton
- */
-class SmallSet<E> extends AbstractSet<E> implements Iterator<E> {
-
- // if e1 is null, e2 must be null; otherwise e2 must be different from e1
-
- E e1, e2;
-
- static final <T> Set<T> emptySet() {
- return new SmallSet<T>(null, null);
- }
-
- SmallSet(final E e1, final E e2) {
- this.e1 = e1;
- this.e2 = e2;
- }
-
- // -------------------------------------------------------------------------
- // Implementation of inherited abstract methods
- // -------------------------------------------------------------------------
-
- @Override
- public Iterator<E> iterator() {
- return new SmallSet<E>(e1, e2);
- }
-
- @Override
- public int size() {
- return e1 == null ? 0 : (e2 == null ? 1 : 2);
- }
-
- // -------------------------------------------------------------------------
- // Implementation of the Iterator interface
- // -------------------------------------------------------------------------
-
- public boolean hasNext() {
- return e1 != null;
- }
-
- public E next() {
- if (e1 == null) {
- throw new NoSuchElementException();
- }
- E e = e1;
- e1 = e2;
- e2 = null;
- return e;
- }
-
- public void remove() {
- }
-
- // -------------------------------------------------------------------------
- // Utility methods
- // -------------------------------------------------------------------------
-
- Set<E> union(final SmallSet<E> s) {
- if ((s.e1 == e1 && s.e2 == e2) || (s.e1 == e2 && s.e2 == e1)) {
- return this; // if the two sets are equal, return this
- }
- if (s.e1 == null) {
- return this; // if s is empty, return this
- }
- if (e1 == null) {
- return s; // if this is empty, return s
- }
- if (s.e2 == null) { // s contains exactly one element
- if (e2 == null) {
- return new SmallSet<E>(e1, s.e1); // necessarily e1 != s.e1
- } else if (s.e1 == e1 || s.e1 == e2) { // s is included in this
- return this;
- }
- }
- if (e2 == null) { // this contains exactly one element
- // if (s.e2 == null) { // cannot happen
- // return new SmallSet(e1, s.e1); // necessarily e1 != s.e1
- // } else
- if (e1 == s.e1 || e1 == s.e2) { // this in included in s
- return s;
- }
- }
- // here we know that there are at least 3 distinct elements
- HashSet<E> r = new HashSet<E>(4);
- r.add(e1);
- if (e2 != null) {
- r.add(e2);
- }
- r.add(s.e1);
- if (s.e2 != null) {
- r.add(s.e2);
- }
- return r;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/SourceInterpreter.java b/src/asm/scala/tools/asm/tree/analysis/SourceInterpreter.java
deleted file mode 100644
index 7d739d3df9..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/SourceInterpreter.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.tree.AbstractInsnNode;
-import scala.tools.asm.tree.FieldInsnNode;
-import scala.tools.asm.tree.InvokeDynamicInsnNode;
-import scala.tools.asm.tree.LdcInsnNode;
-import scala.tools.asm.tree.MethodInsnNode;
-
-/**
- * An {@link Interpreter} for {@link SourceValue} values.
- *
- * @author Eric Bruneton
- */
-public class SourceInterpreter extends Interpreter<SourceValue> implements
- Opcodes {
-
- public SourceInterpreter() {
- super(ASM5);
- }
-
- protected SourceInterpreter(final int api) {
- super(api);
- }
-
- @Override
- public SourceValue newValue(final Type type) {
- if (type == Type.VOID_TYPE) {
- return null;
- }
- return new SourceValue(type == null ? 1 : type.getSize());
- }
-
- @Override
- public SourceValue newOperation(final AbstractInsnNode insn) {
- int size;
- switch (insn.getOpcode()) {
- case LCONST_0:
- case LCONST_1:
- case DCONST_0:
- case DCONST_1:
- size = 2;
- break;
- case LDC:
- Object cst = ((LdcInsnNode) insn).cst;
- size = cst instanceof Long || cst instanceof Double ? 2 : 1;
- break;
- case GETSTATIC:
- size = Type.getType(((FieldInsnNode) insn).desc).getSize();
- break;
- default:
- size = 1;
- }
- return new SourceValue(size, insn);
- }
-
- @Override
- public SourceValue copyOperation(final AbstractInsnNode insn,
- final SourceValue value) {
- return new SourceValue(value.getSize(), insn);
- }
-
- @Override
- public SourceValue unaryOperation(final AbstractInsnNode insn,
- final SourceValue value) {
- int size;
- switch (insn.getOpcode()) {
- case LNEG:
- case DNEG:
- case I2L:
- case I2D:
- case L2D:
- case F2L:
- case F2D:
- case D2L:
- size = 2;
- break;
- case GETFIELD:
- size = Type.getType(((FieldInsnNode) insn).desc).getSize();
- break;
- default:
- size = 1;
- }
- return new SourceValue(size, insn);
- }
-
- @Override
- public SourceValue binaryOperation(final AbstractInsnNode insn,
- final SourceValue value1, final SourceValue value2) {
- int size;
- switch (insn.getOpcode()) {
- case LALOAD:
- case DALOAD:
- case LADD:
- case DADD:
- case LSUB:
- case DSUB:
- case LMUL:
- case DMUL:
- case LDIV:
- case DDIV:
- case LREM:
- case DREM:
- case LSHL:
- case LSHR:
- case LUSHR:
- case LAND:
- case LOR:
- case LXOR:
- size = 2;
- break;
- default:
- size = 1;
- }
- return new SourceValue(size, insn);
- }
-
- @Override
- public SourceValue ternaryOperation(final AbstractInsnNode insn,
- final SourceValue value1, final SourceValue value2,
- final SourceValue value3) {
- return new SourceValue(1, insn);
- }
-
- @Override
- public SourceValue naryOperation(final AbstractInsnNode insn,
- final List<? extends SourceValue> values) {
- int size;
- int opcode = insn.getOpcode();
- if (opcode == MULTIANEWARRAY) {
- size = 1;
- } else {
- String desc = (opcode == INVOKEDYNAMIC) ? ((InvokeDynamicInsnNode) insn).desc
- : ((MethodInsnNode) insn).desc;
- size = Type.getReturnType(desc).getSize();
- }
- return new SourceValue(size, insn);
- }
-
- @Override
- public void returnOperation(final AbstractInsnNode insn,
- final SourceValue value, final SourceValue expected) {
- }
-
- @Override
- public SourceValue merge(final SourceValue d, final SourceValue w) {
- if (d.insns instanceof SmallSet && w.insns instanceof SmallSet) {
- Set<AbstractInsnNode> s = ((SmallSet<AbstractInsnNode>) d.insns)
- .union((SmallSet<AbstractInsnNode>) w.insns);
- if (s == d.insns && d.size == w.size) {
- return d;
- } else {
- return new SourceValue(Math.min(d.size, w.size), s);
- }
- }
- if (d.size != w.size || !d.insns.containsAll(w.insns)) {
- HashSet<AbstractInsnNode> s = new HashSet<AbstractInsnNode>();
- s.addAll(d.insns);
- s.addAll(w.insns);
- return new SourceValue(Math.min(d.size, w.size), s);
- }
- return d;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/SourceValue.java b/src/asm/scala/tools/asm/tree/analysis/SourceValue.java
deleted file mode 100644
index 40d6b68180..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/SourceValue.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.Set;
-
-import scala.tools.asm.tree.AbstractInsnNode;
-
-/**
- * A {@link Value} that is represented by its type in a two types type system.
- * This type system distinguishes the ONEWORD and TWOWORDS types.
- *
- * @author Eric Bruneton
- */
-public class SourceValue implements Value {
-
- /**
- * The size of this value.
- */
- public final int size;
-
- /**
- * The instructions that can produce this value. For example, for the Java
- * code below, the instructions that can produce the value of <tt>i</tt> at
- * line 5 are the txo ISTORE instructions at line 1 and 3:
- *
- * <pre>
- * 1: i = 0;
- * 2: if (...) {
- * 3: i = 1;
- * 4: }
- * 5: return i;
- * </pre>
- *
- * This field is a set of {@link AbstractInsnNode} objects.
- */
- public final Set<AbstractInsnNode> insns;
-
- public SourceValue(final int size) {
- this(size, SmallSet.<AbstractInsnNode> emptySet());
- }
-
- public SourceValue(final int size, final AbstractInsnNode insn) {
- this.size = size;
- this.insns = new SmallSet<AbstractInsnNode>(insn, null);
- }
-
- public SourceValue(final int size, final Set<AbstractInsnNode> insns) {
- this.size = size;
- this.insns = insns;
- }
-
- public int getSize() {
- return size;
- }
-
- @Override
- public boolean equals(final Object value) {
- if (!(value instanceof SourceValue)) {
- return false;
- }
- SourceValue v = (SourceValue) value;
- return size == v.size && insns.equals(v.insns);
- }
-
- @Override
- public int hashCode() {
- return insns.hashCode();
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Subroutine.java b/src/asm/scala/tools/asm/tree/analysis/Subroutine.java
deleted file mode 100644
index d734bbd499..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/Subroutine.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.tree.JumpInsnNode;
-import scala.tools.asm.tree.LabelNode;
-
-/**
- * A method subroutine (corresponds to a JSR instruction).
- *
- * @author Eric Bruneton
- */
-class Subroutine {
-
- LabelNode start;
-
- boolean[] access;
-
- List<JumpInsnNode> callers;
-
- private Subroutine() {
- }
-
- Subroutine(final LabelNode start, final int maxLocals,
- final JumpInsnNode caller) {
- this.start = start;
- this.access = new boolean[maxLocals];
- this.callers = new ArrayList<JumpInsnNode>();
- callers.add(caller);
- }
-
- public Subroutine copy() {
- Subroutine result = new Subroutine();
- result.start = start;
- result.access = new boolean[access.length];
- System.arraycopy(access, 0, result.access, 0, access.length);
- result.callers = new ArrayList<JumpInsnNode>(callers);
- return result;
- }
-
- public boolean merge(final Subroutine subroutine) throws AnalyzerException {
- boolean changes = false;
- for (int i = 0; i < access.length; ++i) {
- if (subroutine.access[i] && !access[i]) {
- access[i] = true;
- changes = true;
- }
- }
- if (subroutine.start == start) {
- for (int i = 0; i < subroutine.callers.size(); ++i) {
- JumpInsnNode caller = subroutine.callers.get(i);
- if (!callers.contains(caller)) {
- callers.add(caller);
- changes = true;
- }
- }
- }
- return changes;
- }
-}
diff --git a/src/asm/scala/tools/asm/tree/analysis/Value.java b/src/asm/scala/tools/asm/tree/analysis/Value.java
deleted file mode 100644
index 1edf475ce7..0000000000
--- a/src/asm/scala/tools/asm/tree/analysis/Value.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.tree.analysis;
-
-/**
- * An immutable symbolic value for semantic interpretation of bytecode.
- *
- * @author Eric Bruneton
- */
-public interface Value {
-
- /**
- * Returns the size of this value in words.
- *
- * @return either 1 or 2.
- */
- int getSize();
-}
diff --git a/src/asm/scala/tools/asm/util/ASMifiable.java b/src/asm/scala/tools/asm/util/ASMifiable.java
deleted file mode 100644
index 95cc6e3a74..0000000000
--- a/src/asm/scala/tools/asm/util/ASMifiable.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.util.Map;
-
-import scala.tools.asm.Label;
-
-/**
- * An {@link scala.tools.asm.Attribute Attribute} that can print the ASM code
- * to create an equivalent attribute.
- *
- * @author Eugene Kuleshov
- */
-public interface ASMifiable {
-
- /**
- * Prints the ASM code to create an attribute equal to this attribute.
- *
- * @param buf
- * a buffer used for printing Java code.
- * @param varName
- * name of the variable in a printed code used to store attribute
- * instance.
- * @param labelNames
- * map of label instances to their names.
- */
- void asmify(StringBuffer buf, String varName, Map<Label, String> labelNames);
-}
diff --git a/src/asm/scala/tools/asm/util/ASMifier.java b/src/asm/scala/tools/asm/util/ASMifier.java
deleted file mode 100644
index 521e07541b..0000000000
--- a/src/asm/scala/tools/asm/util/ASMifier.java
+++ /dev/null
@@ -1,1284 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.FileInputStream;
-import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassReader;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-
-/**
- * A {@link Printer} that prints the ASM code to generate the classes if visits.
- *
- * @author Eric Bruneton
- */
-public class ASMifier extends Printer {
-
- /**
- * The name of the visitor variable in the produced code.
- */
- protected final String name;
-
- /**
- * Identifier of the annotation visitor variable in the produced code.
- */
- protected final int id;
-
- /**
- * The label names. This map associates String values to Label keys. It is
- * used only in ASMifierMethodVisitor.
- */
- protected Map<Label, String> labelNames;
-
- /**
- * Pseudo access flag used to distinguish class access flags.
- */
- private static final int ACCESS_CLASS = 262144;
-
- /**
- * Pseudo access flag used to distinguish field access flags.
- */
- private static final int ACCESS_FIELD = 524288;
-
- /**
- * Pseudo access flag used to distinguish inner class flags.
- */
- private static final int ACCESS_INNER = 1048576;
-
- /**
- * Constructs a new {@link ASMifier}. <i>Subclasses must not use this
- * constructor</i>. Instead, they must use the
- * {@link #ASMifier(int, String, int)} version.
- *
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public ASMifier() {
- this(Opcodes.ASM5, "cw", 0);
- if (getClass() != ASMifier.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link ASMifier}.
- *
- * @param api
- * the ASM API version implemented by this class. Must be one of
- * {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param name
- * the name of the visitor variable in the produced code.
- * @param id
- * identifier of the annotation visitor variable in the produced
- * code.
- */
- protected ASMifier(final int api, final String name, final int id) {
- super(api);
- this.name = name;
- this.id = id;
- }
-
- /**
- * Prints the ASM source code to generate the given class to the standard
- * output.
- * <p>
- * Usage: ASMifier [-debug] &lt;binary class name or class file name&gt;
- *
- * @param args
- * the command line arguments.
- *
- * @throws Exception
- * if the class cannot be found, or if an IO exception occurs.
- */
- public static void main(final String[] args) throws Exception {
- int i = 0;
- int flags = ClassReader.SKIP_DEBUG;
-
- boolean ok = true;
- if (args.length < 1 || args.length > 2) {
- ok = false;
- }
- if (ok && "-debug".equals(args[0])) {
- i = 1;
- flags = 0;
- if (args.length != 2) {
- ok = false;
- }
- }
- if (!ok) {
- System.err
- .println("Prints the ASM code to generate the given class.");
- System.err.println("Usage: ASMifier [-debug] "
- + "<fully qualified class name or class file name>");
- return;
- }
- ClassReader cr;
- if (args[i].endsWith(".class") || args[i].indexOf('\\') > -1
- || args[i].indexOf('/') > -1) {
- cr = new ClassReader(new FileInputStream(args[i]));
- } else {
- cr = new ClassReader(args[i]);
- }
- cr.accept(new TraceClassVisitor(null, new ASMifier(), new PrintWriter(
- System.out)), flags);
- }
-
- // ------------------------------------------------------------------------
- // Classes
- // ------------------------------------------------------------------------
-
- @Override
- public void visit(final int version, final int access, final String name,
- final String signature, final String superName,
- final String[] interfaces) {
- String simpleName;
- int n = name.lastIndexOf('/');
- if (n == -1) {
- simpleName = name;
- } else {
- text.add("package asm." + name.substring(0, n).replace('/', '.')
- + ";\n");
- simpleName = name.substring(n + 1);
- }
- text.add("import java.util.*;\n");
- text.add("import scala.tools.asm.*;\n");
- text.add("public class " + simpleName + "Dump implements Opcodes {\n\n");
- text.add("public static byte[] dump () throws Exception {\n\n");
- text.add("ClassWriter cw = new ClassWriter(0);\n");
- text.add("FieldVisitor fv;\n");
- text.add("MethodVisitor mv;\n");
- text.add("AnnotationVisitor av0;\n\n");
-
- buf.setLength(0);
- buf.append("cw.visit(");
- switch (version) {
- case Opcodes.V1_1:
- buf.append("V1_1");
- break;
- case Opcodes.V1_2:
- buf.append("V1_2");
- break;
- case Opcodes.V1_3:
- buf.append("V1_3");
- break;
- case Opcodes.V1_4:
- buf.append("V1_4");
- break;
- case Opcodes.V1_5:
- buf.append("V1_5");
- break;
- case Opcodes.V1_6:
- buf.append("V1_6");
- break;
- case Opcodes.V1_7:
- buf.append("V1_7");
- break;
- default:
- buf.append(version);
- break;
- }
- buf.append(", ");
- appendAccess(access | ACCESS_CLASS);
- buf.append(", ");
- appendConstant(name);
- buf.append(", ");
- appendConstant(signature);
- buf.append(", ");
- appendConstant(superName);
- buf.append(", ");
- if (interfaces != null && interfaces.length > 0) {
- buf.append("new String[] {");
- for (int i = 0; i < interfaces.length; ++i) {
- buf.append(i == 0 ? " " : ", ");
- appendConstant(interfaces[i]);
- }
- buf.append(" }");
- } else {
- buf.append("null");
- }
- buf.append(");\n\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitSource(final String file, final String debug) {
- buf.setLength(0);
- buf.append("cw.visitSource(");
- appendConstant(file);
- buf.append(", ");
- appendConstant(debug);
- buf.append(");\n\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitOuterClass(final String owner, final String name,
- final String desc) {
- buf.setLength(0);
- buf.append("cw.visitOuterClass(");
- appendConstant(owner);
- buf.append(", ");
- appendConstant(name);
- buf.append(", ");
- appendConstant(desc);
- buf.append(");\n\n");
- text.add(buf.toString());
- }
-
- @Override
- public ASMifier visitClassAnnotation(final String desc,
- final boolean visible) {
- return visitAnnotation(desc, visible);
- }
-
- @Override
- public ASMifier visitClassTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- return visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
-
- @Override
- public void visitClassAttribute(final Attribute attr) {
- visitAttribute(attr);
- }
-
- @Override
- public void visitInnerClass(final String name, final String outerName,
- final String innerName, final int access) {
- buf.setLength(0);
- buf.append("cw.visitInnerClass(");
- appendConstant(name);
- buf.append(", ");
- appendConstant(outerName);
- buf.append(", ");
- appendConstant(innerName);
- buf.append(", ");
- appendAccess(access | ACCESS_INNER);
- buf.append(");\n\n");
- text.add(buf.toString());
- }
-
- @Override
- public ASMifier visitField(final int access, final String name,
- final String desc, final String signature, final Object value) {
- buf.setLength(0);
- buf.append("{\n");
- buf.append("fv = cw.visitField(");
- appendAccess(access | ACCESS_FIELD);
- buf.append(", ");
- appendConstant(name);
- buf.append(", ");
- appendConstant(desc);
- buf.append(", ");
- appendConstant(signature);
- buf.append(", ");
- appendConstant(value);
- buf.append(");\n");
- text.add(buf.toString());
- ASMifier a = createASMifier("fv", 0);
- text.add(a.getText());
- text.add("}\n");
- return a;
- }
-
- @Override
- public ASMifier visitMethod(final int access, final String name,
- final String desc, final String signature, final String[] exceptions) {
- buf.setLength(0);
- buf.append("{\n");
- buf.append("mv = cw.visitMethod(");
- appendAccess(access);
- buf.append(", ");
- appendConstant(name);
- buf.append(", ");
- appendConstant(desc);
- buf.append(", ");
- appendConstant(signature);
- buf.append(", ");
- if (exceptions != null && exceptions.length > 0) {
- buf.append("new String[] {");
- for (int i = 0; i < exceptions.length; ++i) {
- buf.append(i == 0 ? " " : ", ");
- appendConstant(exceptions[i]);
- }
- buf.append(" }");
- } else {
- buf.append("null");
- }
- buf.append(");\n");
- text.add(buf.toString());
- ASMifier a = createASMifier("mv", 0);
- text.add(a.getText());
- text.add("}\n");
- return a;
- }
-
- @Override
- public void visitClassEnd() {
- text.add("cw.visitEnd();\n\n");
- text.add("return cw.toByteArray();\n");
- text.add("}\n");
- text.add("}\n");
- }
-
- // ------------------------------------------------------------------------
- // Annotations
- // ------------------------------------------------------------------------
-
- @Override
- public void visit(final String name, final Object value) {
- buf.setLength(0);
- buf.append("av").append(id).append(".visit(");
- appendConstant(buf, name);
- buf.append(", ");
- appendConstant(buf, value);
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitEnum(final String name, final String desc,
- final String value) {
- buf.setLength(0);
- buf.append("av").append(id).append(".visitEnum(");
- appendConstant(buf, name);
- buf.append(", ");
- appendConstant(buf, desc);
- buf.append(", ");
- appendConstant(buf, value);
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public ASMifier visitAnnotation(final String name, final String desc) {
- buf.setLength(0);
- buf.append("{\n");
- buf.append("AnnotationVisitor av").append(id + 1).append(" = av");
- buf.append(id).append(".visitAnnotation(");
- appendConstant(buf, name);
- buf.append(", ");
- appendConstant(buf, desc);
- buf.append(");\n");
- text.add(buf.toString());
- ASMifier a = createASMifier("av", id + 1);
- text.add(a.getText());
- text.add("}\n");
- return a;
- }
-
- @Override
- public ASMifier visitArray(final String name) {
- buf.setLength(0);
- buf.append("{\n");
- buf.append("AnnotationVisitor av").append(id + 1).append(" = av");
- buf.append(id).append(".visitArray(");
- appendConstant(buf, name);
- buf.append(");\n");
- text.add(buf.toString());
- ASMifier a = createASMifier("av", id + 1);
- text.add(a.getText());
- text.add("}\n");
- return a;
- }
-
- @Override
- public void visitAnnotationEnd() {
- buf.setLength(0);
- buf.append("av").append(id).append(".visitEnd();\n");
- text.add(buf.toString());
- }
-
- // ------------------------------------------------------------------------
- // Fields
- // ------------------------------------------------------------------------
-
- @Override
- public ASMifier visitFieldAnnotation(final String desc,
- final boolean visible) {
- return visitAnnotation(desc, visible);
- }
-
- @Override
- public ASMifier visitFieldTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- return visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
-
- @Override
- public void visitFieldAttribute(final Attribute attr) {
- visitAttribute(attr);
- }
-
- @Override
- public void visitFieldEnd() {
- buf.setLength(0);
- buf.append(name).append(".visitEnd();\n");
- text.add(buf.toString());
- }
-
- // ------------------------------------------------------------------------
- // Methods
- // ------------------------------------------------------------------------
-
- @Override
- public void visitParameter(String parameterName, int access) {
- buf.setLength(0);
- buf.append(name).append(".visitParameter(");
- appendString(buf, parameterName);
- buf.append(", ");
- appendAccess(access);
- text.add(buf.append(");\n").toString());
- }
-
- @Override
- public ASMifier visitAnnotationDefault() {
- buf.setLength(0);
- buf.append("{\n").append("av0 = ").append(name)
- .append(".visitAnnotationDefault();\n");
- text.add(buf.toString());
- ASMifier a = createASMifier("av", 0);
- text.add(a.getText());
- text.add("}\n");
- return a;
- }
-
- @Override
- public ASMifier visitMethodAnnotation(final String desc,
- final boolean visible) {
- return visitAnnotation(desc, visible);
- }
-
- @Override
- public ASMifier visitMethodTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- return visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
-
- @Override
- public ASMifier visitParameterAnnotation(final int parameter,
- final String desc, final boolean visible) {
- buf.setLength(0);
- buf.append("{\n").append("av0 = ").append(name)
- .append(".visitParameterAnnotation(").append(parameter)
- .append(", ");
- appendConstant(desc);
- buf.append(", ").append(visible).append(");\n");
- text.add(buf.toString());
- ASMifier a = createASMifier("av", 0);
- text.add(a.getText());
- text.add("}\n");
- return a;
- }
-
- @Override
- public void visitMethodAttribute(final Attribute attr) {
- visitAttribute(attr);
- }
-
- @Override
- public void visitCode() {
- text.add(name + ".visitCode();\n");
- }
-
- @Override
- public void visitFrame(final int type, final int nLocal,
- final Object[] local, final int nStack, final Object[] stack) {
- buf.setLength(0);
- switch (type) {
- case Opcodes.F_NEW:
- case Opcodes.F_FULL:
- declareFrameTypes(nLocal, local);
- declareFrameTypes(nStack, stack);
- if (type == Opcodes.F_NEW) {
- buf.append(name).append(".visitFrame(Opcodes.F_NEW, ");
- } else {
- buf.append(name).append(".visitFrame(Opcodes.F_FULL, ");
- }
- buf.append(nLocal).append(", new Object[] {");
- appendFrameTypes(nLocal, local);
- buf.append("}, ").append(nStack).append(", new Object[] {");
- appendFrameTypes(nStack, stack);
- buf.append('}');
- break;
- case Opcodes.F_APPEND:
- declareFrameTypes(nLocal, local);
- buf.append(name).append(".visitFrame(Opcodes.F_APPEND,")
- .append(nLocal).append(", new Object[] {");
- appendFrameTypes(nLocal, local);
- buf.append("}, 0, null");
- break;
- case Opcodes.F_CHOP:
- buf.append(name).append(".visitFrame(Opcodes.F_CHOP,")
- .append(nLocal).append(", null, 0, null");
- break;
- case Opcodes.F_SAME:
- buf.append(name).append(
- ".visitFrame(Opcodes.F_SAME, 0, null, 0, null");
- break;
- case Opcodes.F_SAME1:
- declareFrameTypes(1, stack);
- buf.append(name).append(
- ".visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {");
- appendFrameTypes(1, stack);
- buf.append('}');
- break;
- }
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitInsn(final int opcode) {
- buf.setLength(0);
- buf.append(name).append(".visitInsn(").append(OPCODES[opcode])
- .append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitIntInsn(final int opcode, final int operand) {
- buf.setLength(0);
- buf.append(name)
- .append(".visitIntInsn(")
- .append(OPCODES[opcode])
- .append(", ")
- .append(opcode == Opcodes.NEWARRAY ? TYPES[operand] : Integer
- .toString(operand)).append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitVarInsn(final int opcode, final int var) {
- buf.setLength(0);
- buf.append(name).append(".visitVarInsn(").append(OPCODES[opcode])
- .append(", ").append(var).append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitTypeInsn(final int opcode, final String type) {
- buf.setLength(0);
- buf.append(name).append(".visitTypeInsn(").append(OPCODES[opcode])
- .append(", ");
- appendConstant(type);
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitFieldInsn(final int opcode, final String owner,
- final String name, final String desc) {
- buf.setLength(0);
- buf.append(this.name).append(".visitFieldInsn(")
- .append(OPCODES[opcode]).append(", ");
- appendConstant(owner);
- buf.append(", ");
- appendConstant(name);
- buf.append(", ");
- appendConstant(desc);
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Deprecated
- @Override
- public void visitMethodInsn(final int opcode, final String owner,
- final String name, final String desc) {
- if (api >= Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc);
- return;
- }
- doVisitMethodInsn(opcode, owner, name, desc,
- opcode == Opcodes.INVOKEINTERFACE);
- }
-
- @Override
- public void visitMethodInsn(final int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- if (api < Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc, itf);
- return;
- }
- doVisitMethodInsn(opcode, owner, name, desc, itf);
- }
-
- private void doVisitMethodInsn(final int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- buf.setLength(0);
- buf.append(this.name).append(".visitMethodInsn(")
- .append(OPCODES[opcode]).append(", ");
- appendConstant(owner);
- buf.append(", ");
- appendConstant(name);
- buf.append(", ");
- appendConstant(desc);
- buf.append(", ");
- buf.append(itf ? "true" : "false");
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
- Object... bsmArgs) {
- buf.setLength(0);
- buf.append(this.name).append(".visitInvokeDynamicInsn(");
- appendConstant(name);
- buf.append(", ");
- appendConstant(desc);
- buf.append(", ");
- appendConstant(bsm);
- buf.append(", new Object[]{");
- for (int i = 0; i < bsmArgs.length; ++i) {
- appendConstant(bsmArgs[i]);
- if (i != bsmArgs.length - 1) {
- buf.append(", ");
- }
- }
- buf.append("});\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitJumpInsn(final int opcode, final Label label) {
- buf.setLength(0);
- declareLabel(label);
- buf.append(name).append(".visitJumpInsn(").append(OPCODES[opcode])
- .append(", ");
- appendLabel(label);
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitLabel(final Label label) {
- buf.setLength(0);
- declareLabel(label);
- buf.append(name).append(".visitLabel(");
- appendLabel(label);
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitLdcInsn(final Object cst) {
- buf.setLength(0);
- buf.append(name).append(".visitLdcInsn(");
- appendConstant(cst);
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitIincInsn(final int var, final int increment) {
- buf.setLength(0);
- buf.append(name).append(".visitIincInsn(").append(var).append(", ")
- .append(increment).append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitTableSwitchInsn(final int min, final int max,
- final Label dflt, final Label... labels) {
- buf.setLength(0);
- for (int i = 0; i < labels.length; ++i) {
- declareLabel(labels[i]);
- }
- declareLabel(dflt);
-
- buf.append(name).append(".visitTableSwitchInsn(").append(min)
- .append(", ").append(max).append(", ");
- appendLabel(dflt);
- buf.append(", new Label[] {");
- for (int i = 0; i < labels.length; ++i) {
- buf.append(i == 0 ? " " : ", ");
- appendLabel(labels[i]);
- }
- buf.append(" });\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
- final Label[] labels) {
- buf.setLength(0);
- for (int i = 0; i < labels.length; ++i) {
- declareLabel(labels[i]);
- }
- declareLabel(dflt);
-
- buf.append(name).append(".visitLookupSwitchInsn(");
- appendLabel(dflt);
- buf.append(", new int[] {");
- for (int i = 0; i < keys.length; ++i) {
- buf.append(i == 0 ? " " : ", ").append(keys[i]);
- }
- buf.append(" }, new Label[] {");
- for (int i = 0; i < labels.length; ++i) {
- buf.append(i == 0 ? " " : ", ");
- appendLabel(labels[i]);
- }
- buf.append(" });\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitMultiANewArrayInsn(final String desc, final int dims) {
- buf.setLength(0);
- buf.append(name).append(".visitMultiANewArrayInsn(");
- appendConstant(desc);
- buf.append(", ").append(dims).append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public ASMifier visitInsnAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- return visitTypeAnnotation("visitInsnAnnotation", typeRef, typePath,
- desc, visible);
- }
-
- @Override
- public void visitTryCatchBlock(final Label start, final Label end,
- final Label handler, final String type) {
- buf.setLength(0);
- declareLabel(start);
- declareLabel(end);
- declareLabel(handler);
- buf.append(name).append(".visitTryCatchBlock(");
- appendLabel(start);
- buf.append(", ");
- appendLabel(end);
- buf.append(", ");
- appendLabel(handler);
- buf.append(", ");
- appendConstant(type);
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public ASMifier visitTryCatchAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- return visitTypeAnnotation("visitTryCatchAnnotation", typeRef,
- typePath, desc, visible);
- }
-
- @Override
- public void visitLocalVariable(final String name, final String desc,
- final String signature, final Label start, final Label end,
- final int index) {
- buf.setLength(0);
- buf.append(this.name).append(".visitLocalVariable(");
- appendConstant(name);
- buf.append(", ");
- appendConstant(desc);
- buf.append(", ");
- appendConstant(signature);
- buf.append(", ");
- appendLabel(start);
- buf.append(", ");
- appendLabel(end);
- buf.append(", ").append(index).append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public Printer visitLocalVariableAnnotation(int typeRef, TypePath typePath,
- Label[] start, Label[] end, int[] index, String desc,
- boolean visible) {
- buf.setLength(0);
- buf.append("{\n").append("av0 = ").append(name)
- .append(".visitLocalVariableAnnotation(");
- buf.append(typeRef);
- buf.append(", TypePath.fromString(\"").append(typePath).append("\"), ");
- buf.append("new Label[] {");
- for (int i = 0; i < start.length; ++i) {
- buf.append(i == 0 ? " " : ", ");
- appendLabel(start[i]);
- }
- buf.append(" }, new Label[] {");
- for (int i = 0; i < end.length; ++i) {
- buf.append(i == 0 ? " " : ", ");
- appendLabel(end[i]);
- }
- buf.append(" }, new int[] {");
- for (int i = 0; i < index.length; ++i) {
- buf.append(i == 0 ? " " : ", ").append(index[i]);
- }
- buf.append(" }, ");
- appendConstant(desc);
- buf.append(", ").append(visible).append(");\n");
- text.add(buf.toString());
- ASMifier a = createASMifier("av", 0);
- text.add(a.getText());
- text.add("}\n");
- return a;
- }
-
- @Override
- public void visitLineNumber(final int line, final Label start) {
- buf.setLength(0);
- buf.append(name).append(".visitLineNumber(").append(line).append(", ");
- appendLabel(start);
- buf.append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitMaxs(final int maxStack, final int maxLocals) {
- buf.setLength(0);
- buf.append(name).append(".visitMaxs(").append(maxStack).append(", ")
- .append(maxLocals).append(");\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitMethodEnd() {
- buf.setLength(0);
- buf.append(name).append(".visitEnd();\n");
- text.add(buf.toString());
- }
-
- // ------------------------------------------------------------------------
- // Common methods
- // ------------------------------------------------------------------------
-
- public ASMifier visitAnnotation(final String desc, final boolean visible) {
- buf.setLength(0);
- buf.append("{\n").append("av0 = ").append(name)
- .append(".visitAnnotation(");
- appendConstant(desc);
- buf.append(", ").append(visible).append(");\n");
- text.add(buf.toString());
- ASMifier a = createASMifier("av", 0);
- text.add(a.getText());
- text.add("}\n");
- return a;
- }
-
- public ASMifier visitTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- return visitTypeAnnotation("visitTypeAnnotation", typeRef, typePath,
- desc, visible);
- }
-
- public ASMifier visitTypeAnnotation(final String method, final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- buf.setLength(0);
- buf.append("{\n").append("av0 = ").append(name).append(".")
- .append(method).append("(");
- buf.append(typeRef);
- buf.append(", TypePath.fromString(\"").append(typePath).append("\"), ");
- appendConstant(desc);
- buf.append(", ").append(visible).append(");\n");
- text.add(buf.toString());
- ASMifier a = createASMifier("av", 0);
- text.add(a.getText());
- text.add("}\n");
- return a;
- }
-
- public void visitAttribute(final Attribute attr) {
- buf.setLength(0);
- buf.append("// ATTRIBUTE ").append(attr.type).append('\n');
- if (attr instanceof ASMifiable) {
- if (labelNames == null) {
- labelNames = new HashMap<Label, String>();
- }
- buf.append("{\n");
- ((ASMifiable) attr).asmify(buf, "attr", labelNames);
- buf.append(name).append(".visitAttribute(attr);\n");
- buf.append("}\n");
- }
- text.add(buf.toString());
- }
-
- // ------------------------------------------------------------------------
- // Utility methods
- // ------------------------------------------------------------------------
-
- protected ASMifier createASMifier(final String name, final int id) {
- return new ASMifier(Opcodes.ASM5, name, id);
- }
-
- /**
- * Appends a string representation of the given access modifiers to
- * {@link #buf buf}.
- *
- * @param access
- * some access modifiers.
- */
- void appendAccess(final int access) {
- boolean first = true;
- if ((access & Opcodes.ACC_PUBLIC) != 0) {
- buf.append("ACC_PUBLIC");
- first = false;
- }
- if ((access & Opcodes.ACC_PRIVATE) != 0) {
- buf.append("ACC_PRIVATE");
- first = false;
- }
- if ((access & Opcodes.ACC_PROTECTED) != 0) {
- buf.append("ACC_PROTECTED");
- first = false;
- }
- if ((access & Opcodes.ACC_FINAL) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_FINAL");
- first = false;
- }
- if ((access & Opcodes.ACC_STATIC) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_STATIC");
- first = false;
- }
- if ((access & Opcodes.ACC_SYNCHRONIZED) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- if ((access & ACCESS_CLASS) == 0) {
- buf.append("ACC_SYNCHRONIZED");
- } else {
- buf.append("ACC_SUPER");
- }
- first = false;
- }
- if ((access & Opcodes.ACC_VOLATILE) != 0
- && (access & ACCESS_FIELD) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_VOLATILE");
- first = false;
- }
- if ((access & Opcodes.ACC_BRIDGE) != 0 && (access & ACCESS_CLASS) == 0
- && (access & ACCESS_FIELD) == 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_BRIDGE");
- first = false;
- }
- if ((access & Opcodes.ACC_VARARGS) != 0 && (access & ACCESS_CLASS) == 0
- && (access & ACCESS_FIELD) == 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_VARARGS");
- first = false;
- }
- if ((access & Opcodes.ACC_TRANSIENT) != 0
- && (access & ACCESS_FIELD) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_TRANSIENT");
- first = false;
- }
- if ((access & Opcodes.ACC_NATIVE) != 0 && (access & ACCESS_CLASS) == 0
- && (access & ACCESS_FIELD) == 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_NATIVE");
- first = false;
- }
- if ((access & Opcodes.ACC_ENUM) != 0
- && ((access & ACCESS_CLASS) != 0
- || (access & ACCESS_FIELD) != 0 || (access & ACCESS_INNER) != 0)) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_ENUM");
- first = false;
- }
- if ((access & Opcodes.ACC_ANNOTATION) != 0
- && ((access & ACCESS_CLASS) != 0 || (access & ACCESS_INNER) != 0)) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_ANNOTATION");
- first = false;
- }
- if ((access & Opcodes.ACC_ABSTRACT) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_ABSTRACT");
- first = false;
- }
- if ((access & Opcodes.ACC_INTERFACE) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_INTERFACE");
- first = false;
- }
- if ((access & Opcodes.ACC_STRICT) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_STRICT");
- first = false;
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_SYNTHETIC");
- first = false;
- }
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_DEPRECATED");
- first = false;
- }
- if ((access & Opcodes.ACC_MANDATED) != 0) {
- if (!first) {
- buf.append(" + ");
- }
- buf.append("ACC_MANDATED");
- first = false;
- }
- if (first) {
- buf.append('0');
- }
- }
-
- /**
- * Appends a string representation of the given constant to the given
- * buffer.
- *
- * @param cst
- * an {@link Integer}, {@link Float}, {@link Long},
- * {@link Double} or {@link String} object. May be <tt>null</tt>.
- */
- protected void appendConstant(final Object cst) {
- appendConstant(buf, cst);
- }
-
- /**
- * Appends a string representation of the given constant to the given
- * buffer.
- *
- * @param buf
- * a string buffer.
- * @param cst
- * an {@link Integer}, {@link Float}, {@link Long},
- * {@link Double} or {@link String} object. May be <tt>null</tt>.
- */
- static void appendConstant(final StringBuffer buf, final Object cst) {
- if (cst == null) {
- buf.append("null");
- } else if (cst instanceof String) {
- appendString(buf, (String) cst);
- } else if (cst instanceof Type) {
- buf.append("Type.getType(\"");
- buf.append(((Type) cst).getDescriptor());
- buf.append("\")");
- } else if (cst instanceof Handle) {
- buf.append("new Handle(");
- Handle h = (Handle) cst;
- buf.append("Opcodes.").append(HANDLE_TAG[h.getTag()])
- .append(", \"");
- buf.append(h.getOwner()).append("\", \"");
- buf.append(h.getName()).append("\", \"");
- buf.append(h.getDesc()).append("\")");
- } else if (cst instanceof Byte) {
- buf.append("new Byte((byte)").append(cst).append(')');
- } else if (cst instanceof Boolean) {
- buf.append(((Boolean) cst).booleanValue() ? "Boolean.TRUE"
- : "Boolean.FALSE");
- } else if (cst instanceof Short) {
- buf.append("new Short((short)").append(cst).append(')');
- } else if (cst instanceof Character) {
- int c = ((Character) cst).charValue();
- buf.append("new Character((char)").append(c).append(')');
- } else if (cst instanceof Integer) {
- buf.append("new Integer(").append(cst).append(')');
- } else if (cst instanceof Float) {
- buf.append("new Float(\"").append(cst).append("\")");
- } else if (cst instanceof Long) {
- buf.append("new Long(").append(cst).append("L)");
- } else if (cst instanceof Double) {
- buf.append("new Double(\"").append(cst).append("\")");
- } else if (cst instanceof byte[]) {
- byte[] v = (byte[]) cst;
- buf.append("new byte[] {");
- for (int i = 0; i < v.length; i++) {
- buf.append(i == 0 ? "" : ",").append(v[i]);
- }
- buf.append('}');
- } else if (cst instanceof boolean[]) {
- boolean[] v = (boolean[]) cst;
- buf.append("new boolean[] {");
- for (int i = 0; i < v.length; i++) {
- buf.append(i == 0 ? "" : ",").append(v[i]);
- }
- buf.append('}');
- } else if (cst instanceof short[]) {
- short[] v = (short[]) cst;
- buf.append("new short[] {");
- for (int i = 0; i < v.length; i++) {
- buf.append(i == 0 ? "" : ",").append("(short)").append(v[i]);
- }
- buf.append('}');
- } else if (cst instanceof char[]) {
- char[] v = (char[]) cst;
- buf.append("new char[] {");
- for (int i = 0; i < v.length; i++) {
- buf.append(i == 0 ? "" : ",").append("(char)")
- .append((int) v[i]);
- }
- buf.append('}');
- } else if (cst instanceof int[]) {
- int[] v = (int[]) cst;
- buf.append("new int[] {");
- for (int i = 0; i < v.length; i++) {
- buf.append(i == 0 ? "" : ",").append(v[i]);
- }
- buf.append('}');
- } else if (cst instanceof long[]) {
- long[] v = (long[]) cst;
- buf.append("new long[] {");
- for (int i = 0; i < v.length; i++) {
- buf.append(i == 0 ? "" : ",").append(v[i]).append('L');
- }
- buf.append('}');
- } else if (cst instanceof float[]) {
- float[] v = (float[]) cst;
- buf.append("new float[] {");
- for (int i = 0; i < v.length; i++) {
- buf.append(i == 0 ? "" : ",").append(v[i]).append('f');
- }
- buf.append('}');
- } else if (cst instanceof double[]) {
- double[] v = (double[]) cst;
- buf.append("new double[] {");
- for (int i = 0; i < v.length; i++) {
- buf.append(i == 0 ? "" : ",").append(v[i]).append('d');
- }
- buf.append('}');
- }
- }
-
- private void declareFrameTypes(final int n, final Object[] o) {
- for (int i = 0; i < n; ++i) {
- if (o[i] instanceof Label) {
- declareLabel((Label) o[i]);
- }
- }
- }
-
- private void appendFrameTypes(final int n, final Object[] o) {
- for (int i = 0; i < n; ++i) {
- if (i > 0) {
- buf.append(", ");
- }
- if (o[i] instanceof String) {
- appendConstant(o[i]);
- } else if (o[i] instanceof Integer) {
- switch (((Integer) o[i]).intValue()) {
- case 0:
- buf.append("Opcodes.TOP");
- break;
- case 1:
- buf.append("Opcodes.INTEGER");
- break;
- case 2:
- buf.append("Opcodes.FLOAT");
- break;
- case 3:
- buf.append("Opcodes.DOUBLE");
- break;
- case 4:
- buf.append("Opcodes.LONG");
- break;
- case 5:
- buf.append("Opcodes.NULL");
- break;
- case 6:
- buf.append("Opcodes.UNINITIALIZED_THIS");
- break;
- }
- } else {
- appendLabel((Label) o[i]);
- }
- }
- }
-
- /**
- * Appends a declaration of the given label to {@link #buf buf}. This
- * declaration is of the form "Label lXXX = new Label();". Does nothing if
- * the given label has already been declared.
- *
- * @param l
- * a label.
- */
- protected void declareLabel(final Label l) {
- if (labelNames == null) {
- labelNames = new HashMap<Label, String>();
- }
- String name = labelNames.get(l);
- if (name == null) {
- name = "l" + labelNames.size();
- labelNames.put(l, name);
- buf.append("Label ").append(name).append(" = new Label();\n");
- }
- }
-
- /**
- * Appends the name of the given label to {@link #buf buf}. The given label
- * <i>must</i> already have a name. One way to ensure this is to always call
- * {@link #declareLabel declared} before calling this method.
- *
- * @param l
- * a label.
- */
- protected void appendLabel(final Label l) {
- buf.append(labelNames.get(l));
- }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckAnnotationAdapter.java b/src/asm/scala/tools/asm/util/CheckAnnotationAdapter.java
deleted file mode 100644
index 70441d1df4..0000000000
--- a/src/asm/scala/tools/asm/util/CheckAnnotationAdapter.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-
-/**
- * An {@link AnnotationVisitor} that checks that its methods are properly used.
- *
- * @author Eric Bruneton
- */
-public class CheckAnnotationAdapter extends AnnotationVisitor {
-
- private final boolean named;
-
- private boolean end;
-
- public CheckAnnotationAdapter(final AnnotationVisitor av) {
- this(av, true);
- }
-
- CheckAnnotationAdapter(final AnnotationVisitor av, final boolean named) {
- super(Opcodes.ASM5, av);
- this.named = named;
- }
-
- @Override
- public void visit(final String name, final Object value) {
- checkEnd();
- checkName(name);
- if (!(value instanceof Byte || value instanceof Boolean
- || value instanceof Character || value instanceof Short
- || value instanceof Integer || value instanceof Long
- || value instanceof Float || value instanceof Double
- || value instanceof String || value instanceof Type
- || value instanceof byte[] || value instanceof boolean[]
- || value instanceof char[] || value instanceof short[]
- || value instanceof int[] || value instanceof long[]
- || value instanceof float[] || value instanceof double[])) {
- throw new IllegalArgumentException("Invalid annotation value");
- }
- if (value instanceof Type) {
- int sort = ((Type) value).getSort();
- if (sort == Type.METHOD) {
- throw new IllegalArgumentException("Invalid annotation value");
- }
- }
- if (av != null) {
- av.visit(name, value);
- }
- }
-
- @Override
- public void visitEnum(final String name, final String desc,
- final String value) {
- checkEnd();
- checkName(name);
- CheckMethodAdapter.checkDesc(desc, false);
- if (value == null) {
- throw new IllegalArgumentException("Invalid enum value");
- }
- if (av != null) {
- av.visitEnum(name, desc, value);
- }
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String name,
- final String desc) {
- checkEnd();
- checkName(name);
- CheckMethodAdapter.checkDesc(desc, false);
- return new CheckAnnotationAdapter(av == null ? null
- : av.visitAnnotation(name, desc));
- }
-
- @Override
- public AnnotationVisitor visitArray(final String name) {
- checkEnd();
- checkName(name);
- return new CheckAnnotationAdapter(av == null ? null
- : av.visitArray(name), false);
- }
-
- @Override
- public void visitEnd() {
- checkEnd();
- end = true;
- if (av != null) {
- av.visitEnd();
- }
- }
-
- private void checkEnd() {
- if (end) {
- throw new IllegalStateException(
- "Cannot call a visit method after visitEnd has been called");
- }
- }
-
- private void checkName(final String name) {
- if (named && name == null) {
- throw new IllegalArgumentException(
- "Annotation value name must not be null");
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckClassAdapter.java b/src/asm/scala/tools/asm/util/CheckClassAdapter.java
deleted file mode 100644
index 88afdb0441..0000000000
--- a/src/asm/scala/tools/asm/util/CheckClassAdapter.java
+++ /dev/null
@@ -1,1009 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.FileInputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassReader;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-import scala.tools.asm.tree.ClassNode;
-import scala.tools.asm.tree.MethodNode;
-import scala.tools.asm.tree.analysis.Analyzer;
-import scala.tools.asm.tree.analysis.BasicValue;
-import scala.tools.asm.tree.analysis.Frame;
-import scala.tools.asm.tree.analysis.SimpleVerifier;
-
-/**
- * A {@link ClassVisitor} that checks that its methods are properly used. More
- * precisely this class adapter checks each method call individually, based
- * <i>only</i> on its arguments, but does <i>not</i> check the <i>sequence</i>
- * of method calls. For example, the invalid sequence
- * <tt>visitField(ACC_PUBLIC, "i", "I", null)</tt> <tt>visitField(ACC_PUBLIC,
- * "i", "D", null)</tt> will <i>not</i> be detected by this class adapter.
- *
- * <p>
- * <code>CheckClassAdapter</code> can be also used to verify bytecode
- * transformations in order to make sure transformed bytecode is sane. For
- * example:
- *
- * <pre>
- * InputStream is = ...; // get bytes for the source class
- * ClassReader cr = new ClassReader(is);
- * ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
- * ClassVisitor cv = new <b>MyClassAdapter</b>(new CheckClassAdapter(cw));
- * cr.accept(cv, 0);
- *
- * StringWriter sw = new StringWriter();
- * PrintWriter pw = new PrintWriter(sw);
- * CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), false, pw);
- * assertTrue(sw.toString(), sw.toString().length()==0);
- * </pre>
- *
- * Above code runs transformed bytecode trough the
- * <code>CheckClassAdapter</code>. It won't be exactly the same verification as
- * JVM does, but it run data flow analysis for the code of each method and
- * checks that expectations are met for each method instruction.
- *
- * <p>
- * If method bytecode has errors, assertion text will show the erroneous
- * instruction number and dump of the failed method with information about
- * locals and stack slot for each instruction. For example (format is -
- * insnNumber locals : stack):
- *
- * <pre>
- * org.objectweb.asm.tree.analysis.AnalyzerException: Error at instruction 71: Expected I, but found .
- * at org.objectweb.asm.tree.analysis.Analyzer.analyze(Analyzer.java:289)
- * at org.objectweb.asm.util.CheckClassAdapter.verify(CheckClassAdapter.java:135)
- * ...
- * remove()V
- * 00000 LinkedBlockingQueue$Itr . . . . . . . . :
- * ICONST_0
- * 00001 LinkedBlockingQueue$Itr . . . . . . . . : I
- * ISTORE 2
- * 00001 LinkedBlockingQueue$Itr <b>.</b> I . . . . . . :
- * ...
- *
- * 00071 LinkedBlockingQueue$Itr <b>.</b> I . . . . . . :
- * ILOAD 1
- * 00072 <b>?</b>
- * INVOKESPECIAL java/lang/Integer.&lt;init&gt; (I)V
- * ...
- * </pre>
- *
- * In the above output you can see that variable 1 loaded by
- * <code>ILOAD 1</code> instruction at position <code>00071</code> is not
- * initialized. You can also see that at the beginning of the method (code
- * inserted by the transformation) variable 2 is initialized.
- *
- * <p>
- * Note that when used like that, <code>CheckClassAdapter.verify()</code> can
- * trigger additional class loading, because it is using
- * <code>SimpleVerifier</code>.
- *
- * @author Eric Bruneton
- */
-public class CheckClassAdapter extends ClassVisitor {
-
- /**
- * The class version number.
- */
- private int version;
-
- /**
- * <tt>true</tt> if the visit method has been called.
- */
- private boolean start;
-
- /**
- * <tt>true</tt> if the visitSource method has been called.
- */
- private boolean source;
-
- /**
- * <tt>true</tt> if the visitOuterClass method has been called.
- */
- private boolean outer;
-
- /**
- * <tt>true</tt> if the visitEnd method has been called.
- */
- private boolean end;
-
- /**
- * The already visited labels. This map associate Integer values to Label
- * keys.
- */
- private Map<Label, Integer> labels;
-
- /**
- * <tt>true</tt> if the method code must be checked with a BasicVerifier.
- */
- private boolean checkDataFlow;
-
- /**
- * Checks a given class.
- * <p>
- * Usage: CheckClassAdapter &lt;binary class name or class file name&gt;
- *
- * @param args
- * the command line arguments.
- *
- * @throws Exception
- * if the class cannot be found, or if an IO exception occurs.
- */
- public static void main(final String[] args) throws Exception {
- if (args.length != 1) {
- System.err.println("Verifies the given class.");
- System.err.println("Usage: CheckClassAdapter "
- + "<fully qualified class name or class file name>");
- return;
- }
- ClassReader cr;
- if (args[0].endsWith(".class")) {
- cr = new ClassReader(new FileInputStream(args[0]));
- } else {
- cr = new ClassReader(args[0]);
- }
-
- verify(cr, false, new PrintWriter(System.err));
- }
-
- /**
- * Checks a given class.
- *
- * @param cr
- * a <code>ClassReader</code> that contains bytecode for the
- * analysis.
- * @param loader
- * a <code>ClassLoader</code> which will be used to load
- * referenced classes. This is useful if you are verifiying
- * multiple interdependent classes.
- * @param dump
- * true if bytecode should be printed out not only when errors
- * are found.
- * @param pw
- * write where results going to be printed
- */
- public static void verify(final ClassReader cr, final ClassLoader loader,
- final boolean dump, final PrintWriter pw) {
- ClassNode cn = new ClassNode();
- cr.accept(new CheckClassAdapter(cn, false), ClassReader.SKIP_DEBUG);
-
- Type syperType = cn.superName == null ? null : Type
- .getObjectType(cn.superName);
- List<MethodNode> methods = cn.methods;
-
- List<Type> interfaces = new ArrayList<Type>();
- for (Iterator<String> i = cn.interfaces.iterator(); i.hasNext();) {
- interfaces.add(Type.getObjectType(i.next()));
- }
-
- for (int i = 0; i < methods.size(); ++i) {
- MethodNode method = methods.get(i);
- SimpleVerifier verifier = new SimpleVerifier(
- Type.getObjectType(cn.name), syperType, interfaces,
- (cn.access & Opcodes.ACC_INTERFACE) != 0);
- Analyzer<BasicValue> a = new Analyzer<BasicValue>(verifier);
- if (loader != null) {
- verifier.setClassLoader(loader);
- }
- try {
- a.analyze(cn.name, method);
- if (!dump) {
- continue;
- }
- } catch (Exception e) {
- e.printStackTrace(pw);
- }
- printAnalyzerResult(method, a, pw);
- }
- pw.flush();
- }
-
- /**
- * Checks a given class
- *
- * @param cr
- * a <code>ClassReader</code> that contains bytecode for the
- * analysis.
- * @param dump
- * true if bytecode should be printed out not only when errors
- * are found.
- * @param pw
- * write where results going to be printed
- */
- public static void verify(final ClassReader cr, final boolean dump,
- final PrintWriter pw) {
- verify(cr, null, dump, pw);
- }
-
- static void printAnalyzerResult(MethodNode method, Analyzer<BasicValue> a,
- final PrintWriter pw) {
- Frame<BasicValue>[] frames = a.getFrames();
- Textifier t = new Textifier();
- TraceMethodVisitor mv = new TraceMethodVisitor(t);
-
- pw.println(method.name + method.desc);
- for (int j = 0; j < method.instructions.size(); ++j) {
- method.instructions.get(j).accept(mv);
-
- StringBuilder sb = new StringBuilder();
- Frame<BasicValue> f = frames[j];
- if (f == null) {
- sb.append('?');
- } else {
- for (int k = 0; k < f.getLocals(); ++k) {
- sb.append(getShortName(f.getLocal(k).toString()))
- .append(' ');
- }
- sb.append(" : ");
- for (int k = 0; k < f.getStackSize(); ++k) {
- sb.append(getShortName(f.getStack(k).toString()))
- .append(' ');
- }
- }
- while (sb.length() < method.maxStack + method.maxLocals + 1) {
- sb.append(' ');
- }
- pw.print(Integer.toString(j + 100000).substring(1));
- pw.print(" " + sb + " : " + t.text.get(t.text.size() - 1));
- }
- for (int j = 0; j < method.tryCatchBlocks.size(); ++j) {
- method.tryCatchBlocks.get(j).accept(mv);
- pw.print(" " + t.text.get(t.text.size() - 1));
- }
- pw.println();
- }
-
- private static String getShortName(final String name) {
- int n = name.lastIndexOf('/');
- int k = name.length();
- if (name.charAt(k - 1) == ';') {
- k--;
- }
- return n == -1 ? name : name.substring(n + 1, k);
- }
-
- /**
- * Constructs a new {@link CheckClassAdapter}. <i>Subclasses must not use
- * this constructor</i>. Instead, they must use the
- * {@link #CheckClassAdapter(int, ClassVisitor, boolean)} version.
- *
- * @param cv
- * the class visitor to which this adapter must delegate calls.
- */
- public CheckClassAdapter(final ClassVisitor cv) {
- this(cv, true);
- }
-
- /**
- * Constructs a new {@link CheckClassAdapter}. <i>Subclasses must not use
- * this constructor</i>. Instead, they must use the
- * {@link #CheckClassAdapter(int, ClassVisitor, boolean)} version.
- *
- * @param cv
- * the class visitor to which this adapter must delegate calls.
- * @param checkDataFlow
- * <tt>true</tt> to perform basic data flow checks, or
- * <tt>false</tt> to not perform any data flow check (see
- * {@link CheckMethodAdapter}). This option requires valid
- * maxLocals and maxStack values.
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public CheckClassAdapter(final ClassVisitor cv, final boolean checkDataFlow) {
- this(Opcodes.ASM5, cv, checkDataFlow);
- if (getClass() != CheckClassAdapter.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link CheckClassAdapter}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param cv
- * the class visitor to which this adapter must delegate calls.
- * @param checkDataFlow
- * <tt>true</tt> to perform basic data flow checks, or
- * <tt>false</tt> to not perform any data flow check (see
- * {@link CheckMethodAdapter}). This option requires valid
- * maxLocals and maxStack values.
- */
- protected CheckClassAdapter(final int api, final ClassVisitor cv,
- final boolean checkDataFlow) {
- super(api, cv);
- this.labels = new HashMap<Label, Integer>();
- this.checkDataFlow = checkDataFlow;
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the ClassVisitor interface
- // ------------------------------------------------------------------------
-
- @Override
- public void visit(final int version, final int access, final String name,
- final String signature, final String superName,
- final String[] interfaces) {
- if (start) {
- throw new IllegalStateException("visit must be called only once");
- }
- start = true;
- checkState();
- checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL
- + Opcodes.ACC_SUPER + Opcodes.ACC_INTERFACE
- + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC
- + Opcodes.ACC_ANNOTATION + Opcodes.ACC_ENUM
- + Opcodes.ACC_DEPRECATED + 0x40000); // ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
- if (name == null || !name.endsWith("package-info")) {
- CheckMethodAdapter.checkInternalName(name, "class name");
- }
- if ("java/lang/Object".equals(name)) {
- if (superName != null) {
- throw new IllegalArgumentException(
- "The super class name of the Object class must be 'null'");
- }
- } else {
- CheckMethodAdapter.checkInternalName(superName, "super class name");
- }
- if (signature != null) {
- checkClassSignature(signature);
- }
- if ((access & Opcodes.ACC_INTERFACE) != 0) {
- if (!"java/lang/Object".equals(superName)) {
- throw new IllegalArgumentException(
- "The super class name of interfaces must be 'java/lang/Object'");
- }
- }
- if (interfaces != null) {
- for (int i = 0; i < interfaces.length; ++i) {
- CheckMethodAdapter.checkInternalName(interfaces[i],
- "interface name at index " + i);
- }
- }
- this.version = version;
- super.visit(version, access, name, signature, superName, interfaces);
- }
-
- @Override
- public void visitSource(final String file, final String debug) {
- checkState();
- if (source) {
- throw new IllegalStateException(
- "visitSource can be called only once.");
- }
- source = true;
- super.visitSource(file, debug);
- }
-
- @Override
- public void visitOuterClass(final String owner, final String name,
- final String desc) {
- checkState();
- if (outer) {
- throw new IllegalStateException(
- "visitOuterClass can be called only once.");
- }
- outer = true;
- if (owner == null) {
- throw new IllegalArgumentException("Illegal outer class owner");
- }
- if (desc != null) {
- CheckMethodAdapter.checkMethodDesc(desc);
- }
- super.visitOuterClass(owner, name, desc);
- }
-
- @Override
- public void visitInnerClass(final String name, final String outerName,
- final String innerName, final int access) {
- checkState();
- CheckMethodAdapter.checkInternalName(name, "class name");
- if (outerName != null) {
- CheckMethodAdapter.checkInternalName(outerName, "outer class name");
- }
- if (innerName != null) {
- int start = 0;
- while (start < innerName.length()
- && Character.isDigit(innerName.charAt(start))) {
- start++;
- }
- if (start == 0 || start < innerName.length()) {
- CheckMethodAdapter.checkIdentifier(innerName, start, -1,
- "inner class name");
- }
- }
- checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_PRIVATE
- + Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC
- + Opcodes.ACC_FINAL + Opcodes.ACC_INTERFACE
- + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC
- + Opcodes.ACC_ANNOTATION + Opcodes.ACC_ENUM);
- super.visitInnerClass(name, outerName, innerName, access);
- }
-
- @Override
- public FieldVisitor visitField(final int access, final String name,
- final String desc, final String signature, final Object value) {
- checkState();
- checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_PRIVATE
- + Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC
- + Opcodes.ACC_FINAL + Opcodes.ACC_VOLATILE
- + Opcodes.ACC_TRANSIENT + Opcodes.ACC_SYNTHETIC
- + Opcodes.ACC_ENUM + Opcodes.ACC_DEPRECATED + 0x40000); // ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
- CheckMethodAdapter.checkUnqualifiedName(version, name, "field name");
- CheckMethodAdapter.checkDesc(desc, false);
- if (signature != null) {
- checkFieldSignature(signature);
- }
- if (value != null) {
- CheckMethodAdapter.checkConstant(value);
- }
- FieldVisitor av = super
- .visitField(access, name, desc, signature, value);
- return new CheckFieldAdapter(av);
- }
-
- @Override
- public MethodVisitor visitMethod(final int access, final String name,
- final String desc, final String signature, final String[] exceptions) {
- checkState();
- checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_PRIVATE
- + Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC
- + Opcodes.ACC_FINAL + Opcodes.ACC_SYNCHRONIZED
- + Opcodes.ACC_BRIDGE + Opcodes.ACC_VARARGS + Opcodes.ACC_NATIVE
- + Opcodes.ACC_ABSTRACT + Opcodes.ACC_STRICT
- + Opcodes.ACC_SYNTHETIC + Opcodes.ACC_DEPRECATED + 0x40000); // ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
- if (!"<init>".equals(name) && !"<clinit>".equals(name)) {
- CheckMethodAdapter.checkMethodIdentifier(version, name,
- "method name");
- }
- CheckMethodAdapter.checkMethodDesc(desc);
- if (signature != null) {
- checkMethodSignature(signature);
- }
- if (exceptions != null) {
- for (int i = 0; i < exceptions.length; ++i) {
- CheckMethodAdapter.checkInternalName(exceptions[i],
- "exception name at index " + i);
- }
- }
- CheckMethodAdapter cma;
- if (checkDataFlow) {
- cma = new CheckMethodAdapter(access, name, desc, super.visitMethod(
- access, name, desc, signature, exceptions), labels);
- } else {
- cma = new CheckMethodAdapter(super.visitMethod(access, name, desc,
- signature, exceptions), labels);
- }
- cma.version = version;
- return cma;
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- checkState();
- CheckMethodAdapter.checkDesc(desc, false);
- return new CheckAnnotationAdapter(super.visitAnnotation(desc, visible));
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- checkState();
- int sort = typeRef >>> 24;
- if (sort != TypeReference.CLASS_TYPE_PARAMETER
- && sort != TypeReference.CLASS_TYPE_PARAMETER_BOUND
- && sort != TypeReference.CLASS_EXTENDS) {
- throw new IllegalArgumentException("Invalid type reference sort 0x"
- + Integer.toHexString(sort));
- }
- checkTypeRefAndPath(typeRef, typePath);
- CheckMethodAdapter.checkDesc(desc, false);
- return new CheckAnnotationAdapter(super.visitTypeAnnotation(typeRef,
- typePath, desc, visible));
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- checkState();
- if (attr == null) {
- throw new IllegalArgumentException(
- "Invalid attribute (must not be null)");
- }
- super.visitAttribute(attr);
- }
-
- @Override
- public void visitEnd() {
- checkState();
- end = true;
- super.visitEnd();
- }
-
- // ------------------------------------------------------------------------
- // Utility methods
- // ------------------------------------------------------------------------
-
- /**
- * Checks that the visit method has been called and that visitEnd has not
- * been called.
- */
- private void checkState() {
- if (!start) {
- throw new IllegalStateException(
- "Cannot visit member before visit has been called.");
- }
- if (end) {
- throw new IllegalStateException(
- "Cannot visit member after visitEnd has been called.");
- }
- }
-
- /**
- * Checks that the given access flags do not contain invalid flags. This
- * method also checks that mutually incompatible flags are not set
- * simultaneously.
- *
- * @param access
- * the access flags to be checked
- * @param possibleAccess
- * the valid access flags.
- */
- static void checkAccess(final int access, final int possibleAccess) {
- if ((access & ~possibleAccess) != 0) {
- throw new IllegalArgumentException("Invalid access flags: "
- + access);
- }
- int pub = (access & Opcodes.ACC_PUBLIC) == 0 ? 0 : 1;
- int pri = (access & Opcodes.ACC_PRIVATE) == 0 ? 0 : 1;
- int pro = (access & Opcodes.ACC_PROTECTED) == 0 ? 0 : 1;
- if (pub + pri + pro > 1) {
- throw new IllegalArgumentException(
- "public private and protected are mutually exclusive: "
- + access);
- }
- int fin = (access & Opcodes.ACC_FINAL) == 0 ? 0 : 1;
- int abs = (access & Opcodes.ACC_ABSTRACT) == 0 ? 0 : 1;
- if (fin + abs > 1) {
- throw new IllegalArgumentException(
- "final and abstract are mutually exclusive: " + access);
- }
- }
-
- /**
- * Checks a class signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- */
- public static void checkClassSignature(final String signature) {
- // ClassSignature:
- // FormalTypeParameters? ClassTypeSignature ClassTypeSignature*
-
- int pos = 0;
- if (getChar(signature, 0) == '<') {
- pos = checkFormalTypeParameters(signature, pos);
- }
- pos = checkClassTypeSignature(signature, pos);
- while (getChar(signature, pos) == 'L') {
- pos = checkClassTypeSignature(signature, pos);
- }
- if (pos != signature.length()) {
- throw new IllegalArgumentException(signature + ": error at index "
- + pos);
- }
- }
-
- /**
- * Checks a method signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- */
- public static void checkMethodSignature(final String signature) {
- // MethodTypeSignature:
- // FormalTypeParameters? ( TypeSignature* ) ( TypeSignature | V ) (
- // ^ClassTypeSignature | ^TypeVariableSignature )*
-
- int pos = 0;
- if (getChar(signature, 0) == '<') {
- pos = checkFormalTypeParameters(signature, pos);
- }
- pos = checkChar('(', signature, pos);
- while ("ZCBSIFJDL[T".indexOf(getChar(signature, pos)) != -1) {
- pos = checkTypeSignature(signature, pos);
- }
- pos = checkChar(')', signature, pos);
- if (getChar(signature, pos) == 'V') {
- ++pos;
- } else {
- pos = checkTypeSignature(signature, pos);
- }
- while (getChar(signature, pos) == '^') {
- ++pos;
- if (getChar(signature, pos) == 'L') {
- pos = checkClassTypeSignature(signature, pos);
- } else {
- pos = checkTypeVariableSignature(signature, pos);
- }
- }
- if (pos != signature.length()) {
- throw new IllegalArgumentException(signature + ": error at index "
- + pos);
- }
- }
-
- /**
- * Checks a field signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- */
- public static void checkFieldSignature(final String signature) {
- int pos = checkFieldTypeSignature(signature, 0);
- if (pos != signature.length()) {
- throw new IllegalArgumentException(signature + ": error at index "
- + pos);
- }
- }
-
- /**
- * Checks the reference to a type in a type annotation.
- *
- * @param typeRef
- * a reference to an annotated type.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- */
- static void checkTypeRefAndPath(int typeRef, TypePath typePath) {
- int mask = 0;
- switch (typeRef >>> 24) {
- case TypeReference.CLASS_TYPE_PARAMETER:
- case TypeReference.METHOD_TYPE_PARAMETER:
- case TypeReference.METHOD_FORMAL_PARAMETER:
- mask = 0xFFFF0000;
- break;
- case TypeReference.FIELD:
- case TypeReference.METHOD_RETURN:
- case TypeReference.METHOD_RECEIVER:
- case TypeReference.LOCAL_VARIABLE:
- case TypeReference.RESOURCE_VARIABLE:
- case TypeReference.INSTANCEOF:
- case TypeReference.NEW:
- case TypeReference.CONSTRUCTOR_REFERENCE:
- case TypeReference.METHOD_REFERENCE:
- mask = 0xFF000000;
- break;
- case TypeReference.CLASS_EXTENDS:
- case TypeReference.CLASS_TYPE_PARAMETER_BOUND:
- case TypeReference.METHOD_TYPE_PARAMETER_BOUND:
- case TypeReference.THROWS:
- case TypeReference.EXCEPTION_PARAMETER:
- mask = 0xFFFFFF00;
- break;
- case TypeReference.CAST:
- case TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT:
- case TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT:
- case TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT:
- case TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT:
- mask = 0xFF0000FF;
- break;
- default:
- throw new IllegalArgumentException("Invalid type reference sort 0x"
- + Integer.toHexString(typeRef >>> 24));
- }
- if ((typeRef & ~mask) != 0) {
- throw new IllegalArgumentException("Invalid type reference 0x"
- + Integer.toHexString(typeRef));
- }
- if (typePath != null) {
- for (int i = 0; i < typePath.getLength(); ++i) {
- int step = typePath.getStep(i);
- if (step != TypePath.ARRAY_ELEMENT
- && step != TypePath.INNER_TYPE
- && step != TypePath.TYPE_ARGUMENT
- && step != TypePath.WILDCARD_BOUND) {
- throw new IllegalArgumentException(
- "Invalid type path step " + i + " in " + typePath);
- }
- if (step != TypePath.TYPE_ARGUMENT
- && typePath.getStepArgument(i) != 0) {
- throw new IllegalArgumentException(
- "Invalid type path step argument for step " + i
- + " in " + typePath);
- }
- }
- }
- }
-
- /**
- * Checks the formal type parameters of a class or method signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkFormalTypeParameters(final String signature, int pos) {
- // FormalTypeParameters:
- // < FormalTypeParameter+ >
-
- pos = checkChar('<', signature, pos);
- pos = checkFormalTypeParameter(signature, pos);
- while (getChar(signature, pos) != '>') {
- pos = checkFormalTypeParameter(signature, pos);
- }
- return pos + 1;
- }
-
- /**
- * Checks a formal type parameter of a class or method signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkFormalTypeParameter(final String signature, int pos) {
- // FormalTypeParameter:
- // Identifier : FieldTypeSignature? (: FieldTypeSignature)*
-
- pos = checkIdentifier(signature, pos);
- pos = checkChar(':', signature, pos);
- if ("L[T".indexOf(getChar(signature, pos)) != -1) {
- pos = checkFieldTypeSignature(signature, pos);
- }
- while (getChar(signature, pos) == ':') {
- pos = checkFieldTypeSignature(signature, pos + 1);
- }
- return pos;
- }
-
- /**
- * Checks a field type signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkFieldTypeSignature(final String signature, int pos) {
- // FieldTypeSignature:
- // ClassTypeSignature | ArrayTypeSignature | TypeVariableSignature
- //
- // ArrayTypeSignature:
- // [ TypeSignature
-
- switch (getChar(signature, pos)) {
- case 'L':
- return checkClassTypeSignature(signature, pos);
- case '[':
- return checkTypeSignature(signature, pos + 1);
- default:
- return checkTypeVariableSignature(signature, pos);
- }
- }
-
- /**
- * Checks a class type signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkClassTypeSignature(final String signature, int pos) {
- // ClassTypeSignature:
- // L Identifier ( / Identifier )* TypeArguments? ( . Identifier
- // TypeArguments? )* ;
-
- pos = checkChar('L', signature, pos);
- pos = checkIdentifier(signature, pos);
- while (getChar(signature, pos) == '/') {
- pos = checkIdentifier(signature, pos + 1);
- }
- if (getChar(signature, pos) == '<') {
- pos = checkTypeArguments(signature, pos);
- }
- while (getChar(signature, pos) == '.') {
- pos = checkIdentifier(signature, pos + 1);
- if (getChar(signature, pos) == '<') {
- pos = checkTypeArguments(signature, pos);
- }
- }
- return checkChar(';', signature, pos);
- }
-
- /**
- * Checks the type arguments in a class type signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkTypeArguments(final String signature, int pos) {
- // TypeArguments:
- // < TypeArgument+ >
-
- pos = checkChar('<', signature, pos);
- pos = checkTypeArgument(signature, pos);
- while (getChar(signature, pos) != '>') {
- pos = checkTypeArgument(signature, pos);
- }
- return pos + 1;
- }
-
- /**
- * Checks a type argument in a class type signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkTypeArgument(final String signature, int pos) {
- // TypeArgument:
- // * | ( ( + | - )? FieldTypeSignature )
-
- char c = getChar(signature, pos);
- if (c == '*') {
- return pos + 1;
- } else if (c == '+' || c == '-') {
- pos++;
- }
- return checkFieldTypeSignature(signature, pos);
- }
-
- /**
- * Checks a type variable signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkTypeVariableSignature(final String signature,
- int pos) {
- // TypeVariableSignature:
- // T Identifier ;
-
- pos = checkChar('T', signature, pos);
- pos = checkIdentifier(signature, pos);
- return checkChar(';', signature, pos);
- }
-
- /**
- * Checks a type signature.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkTypeSignature(final String signature, int pos) {
- // TypeSignature:
- // Z | C | B | S | I | F | J | D | FieldTypeSignature
-
- switch (getChar(signature, pos)) {
- case 'Z':
- case 'C':
- case 'B':
- case 'S':
- case 'I':
- case 'F':
- case 'J':
- case 'D':
- return pos + 1;
- default:
- return checkFieldTypeSignature(signature, pos);
- }
- }
-
- /**
- * Checks an identifier.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkIdentifier(final String signature, int pos) {
- if (!Character.isJavaIdentifierStart(getChar(signature, pos))) {
- throw new IllegalArgumentException(signature
- + ": identifier expected at index " + pos);
- }
- ++pos;
- while (Character.isJavaIdentifierPart(getChar(signature, pos))) {
- ++pos;
- }
- return pos;
- }
-
- /**
- * Checks a single character.
- *
- * @param signature
- * a string containing the signature that must be checked.
- * @param pos
- * index of first character to be checked.
- * @return the index of the first character after the checked part.
- */
- private static int checkChar(final char c, final String signature, int pos) {
- if (getChar(signature, pos) == c) {
- return pos + 1;
- }
- throw new IllegalArgumentException(signature + ": '" + c
- + "' expected at index " + pos);
- }
-
- /**
- * Returns the signature car at the given index.
- *
- * @param signature
- * a signature.
- * @param pos
- * an index in signature.
- * @return the character at the given index, or 0 if there is no such
- * character.
- */
- private static char getChar(final String signature, int pos) {
- return pos < signature.length() ? signature.charAt(pos) : (char) 0;
- }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckFieldAdapter.java b/src/asm/scala/tools/asm/util/CheckFieldAdapter.java
deleted file mode 100644
index e682df47af..0000000000
--- a/src/asm/scala/tools/asm/util/CheckFieldAdapter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-
-/**
- * A {@link FieldVisitor} that checks that its methods are properly used.
- */
-public class CheckFieldAdapter extends FieldVisitor {
-
- private boolean end;
-
- /**
- * Constructs a new {@link CheckFieldAdapter}. <i>Subclasses must not use
- * this constructor</i>. Instead, they must use the
- * {@link #CheckFieldAdapter(int, FieldVisitor)} version.
- *
- * @param fv
- * the field visitor to which this adapter must delegate calls.
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public CheckFieldAdapter(final FieldVisitor fv) {
- this(Opcodes.ASM5, fv);
- if (getClass() != CheckFieldAdapter.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link CheckFieldAdapter}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param fv
- * the field visitor to which this adapter must delegate calls.
- */
- protected CheckFieldAdapter(final int api, final FieldVisitor fv) {
- super(api, fv);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- checkEnd();
- CheckMethodAdapter.checkDesc(desc, false);
- return new CheckAnnotationAdapter(super.visitAnnotation(desc, visible));
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- checkEnd();
- int sort = typeRef >>> 24;
- if (sort != TypeReference.FIELD) {
- throw new IllegalArgumentException("Invalid type reference sort 0x"
- + Integer.toHexString(sort));
- }
- CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
- CheckMethodAdapter.checkDesc(desc, false);
- return new CheckAnnotationAdapter(super.visitTypeAnnotation(typeRef,
- typePath, desc, visible));
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- checkEnd();
- if (attr == null) {
- throw new IllegalArgumentException(
- "Invalid attribute (must not be null)");
- }
- super.visitAttribute(attr);
- }
-
- @Override
- public void visitEnd() {
- checkEnd();
- end = true;
- super.visitEnd();
- }
-
- private void checkEnd() {
- if (end) {
- throw new IllegalStateException(
- "Cannot call a visit method after visitEnd has been called");
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckMethodAdapter.java b/src/asm/scala/tools/asm/util/CheckMethodAdapter.java
deleted file mode 100644
index 131dfa5e5b..0000000000
--- a/src/asm/scala/tools/asm/util/CheckMethodAdapter.java
+++ /dev/null
@@ -1,1542 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-import scala.tools.asm.tree.MethodNode;
-import scala.tools.asm.tree.analysis.Analyzer;
-import scala.tools.asm.tree.analysis.BasicValue;
-import scala.tools.asm.tree.analysis.BasicVerifier;
-
-/**
- * A {@link MethodVisitor} that checks that its methods are properly used. More
- * precisely this method adapter checks each instruction individually, i.e.,
- * each visit method checks some preconditions based <i>only</i> on its
- * arguments - such as the fact that the given opcode is correct for a given
- * visit method. This adapter can also perform some basic data flow checks (more
- * precisely those that can be performed without the full class hierarchy - see
- * {@link scala.tools.asm.tree.analysis.BasicVerifier}). For instance in a
- * method whose signature is <tt>void m ()</tt>, the invalid instruction
- * IRETURN, or the invalid sequence IADD L2I will be detected if the data flow
- * checks are enabled. These checks are enabled by using the
- * {@link #CheckMethodAdapter(int,String,String,MethodVisitor,Map)} constructor.
- * They are not performed if any other constructor is used.
- *
- * @author Eric Bruneton
- */
-public class CheckMethodAdapter extends MethodVisitor {
-
- /**
- * The class version number.
- */
- public int version;
-
- /**
- * The access flags of the method.
- */
- private int access;
-
- /**
- * <tt>true</tt> if the visitCode method has been called.
- */
- private boolean startCode;
-
- /**
- * <tt>true</tt> if the visitMaxs method has been called.
- */
- private boolean endCode;
-
- /**
- * <tt>true</tt> if the visitEnd method has been called.
- */
- private boolean endMethod;
-
- /**
- * Number of visited instructions.
- */
- private int insnCount;
-
- /**
- * The already visited labels. This map associate Integer values to pseudo
- * code offsets.
- */
- private final Map<Label, Integer> labels;
-
- /**
- * The labels used in this method. Every used label must be visited with
- * visitLabel before the end of the method (i.e. should be in #labels).
- */
- private Set<Label> usedLabels;
-
- /**
- * Number of visited frames in expanded form.
- */
- private int expandedFrames;
-
- /**
- * Number of visited frames in compressed form.
- */
- private int compressedFrames;
-
- /**
- * Number of instructions before the last visited frame.
- */
- private int lastFrame = -1;
-
- /**
- * The exception handler ranges. Each pair of list element contains the
- * start and end labels of an exception handler block.
- */
- private List<Label> handlers;
-
- /**
- * Code of the visit method to be used for each opcode.
- */
- private static final int[] TYPE;
-
- /**
- * The Label.status field.
- */
- private static Field labelStatusField;
-
- static {
- String s = "BBBBBBBBBBBBBBBBCCIAADDDDDAAAAAAAAAAAAAAAAAAAABBBBBBBBDD"
- + "DDDAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- + "BBBBBBBBBBBBBBBBBBBJBBBBBBBBBBBBBBBBBBBBHHHHHHHHHHHHHHHHD"
- + "KLBBBBBBFFFFGGGGAECEBBEEBBAMHHAA";
- TYPE = new int[s.length()];
- for (int i = 0; i < TYPE.length; ++i) {
- TYPE[i] = s.charAt(i) - 'A' - 1;
- }
- }
-
- // code to generate the above string
- // public static void main (String[] args) {
- // int[] TYPE = new int[] {
- // 0, //NOP
- // 0, //ACONST_NULL
- // 0, //ICONST_M1
- // 0, //ICONST_0
- // 0, //ICONST_1
- // 0, //ICONST_2
- // 0, //ICONST_3
- // 0, //ICONST_4
- // 0, //ICONST_5
- // 0, //LCONST_0
- // 0, //LCONST_1
- // 0, //FCONST_0
- // 0, //FCONST_1
- // 0, //FCONST_2
- // 0, //DCONST_0
- // 0, //DCONST_1
- // 1, //BIPUSH
- // 1, //SIPUSH
- // 7, //LDC
- // -1, //LDC_W
- // -1, //LDC2_W
- // 2, //ILOAD
- // 2, //LLOAD
- // 2, //FLOAD
- // 2, //DLOAD
- // 2, //ALOAD
- // -1, //ILOAD_0
- // -1, //ILOAD_1
- // -1, //ILOAD_2
- // -1, //ILOAD_3
- // -1, //LLOAD_0
- // -1, //LLOAD_1
- // -1, //LLOAD_2
- // -1, //LLOAD_3
- // -1, //FLOAD_0
- // -1, //FLOAD_1
- // -1, //FLOAD_2
- // -1, //FLOAD_3
- // -1, //DLOAD_0
- // -1, //DLOAD_1
- // -1, //DLOAD_2
- // -1, //DLOAD_3
- // -1, //ALOAD_0
- // -1, //ALOAD_1
- // -1, //ALOAD_2
- // -1, //ALOAD_3
- // 0, //IALOAD
- // 0, //LALOAD
- // 0, //FALOAD
- // 0, //DALOAD
- // 0, //AALOAD
- // 0, //BALOAD
- // 0, //CALOAD
- // 0, //SALOAD
- // 2, //ISTORE
- // 2, //LSTORE
- // 2, //FSTORE
- // 2, //DSTORE
- // 2, //ASTORE
- // -1, //ISTORE_0
- // -1, //ISTORE_1
- // -1, //ISTORE_2
- // -1, //ISTORE_3
- // -1, //LSTORE_0
- // -1, //LSTORE_1
- // -1, //LSTORE_2
- // -1, //LSTORE_3
- // -1, //FSTORE_0
- // -1, //FSTORE_1
- // -1, //FSTORE_2
- // -1, //FSTORE_3
- // -1, //DSTORE_0
- // -1, //DSTORE_1
- // -1, //DSTORE_2
- // -1, //DSTORE_3
- // -1, //ASTORE_0
- // -1, //ASTORE_1
- // -1, //ASTORE_2
- // -1, //ASTORE_3
- // 0, //IASTORE
- // 0, //LASTORE
- // 0, //FASTORE
- // 0, //DASTORE
- // 0, //AASTORE
- // 0, //BASTORE
- // 0, //CASTORE
- // 0, //SASTORE
- // 0, //POP
- // 0, //POP2
- // 0, //DUP
- // 0, //DUP_X1
- // 0, //DUP_X2
- // 0, //DUP2
- // 0, //DUP2_X1
- // 0, //DUP2_X2
- // 0, //SWAP
- // 0, //IADD
- // 0, //LADD
- // 0, //FADD
- // 0, //DADD
- // 0, //ISUB
- // 0, //LSUB
- // 0, //FSUB
- // 0, //DSUB
- // 0, //IMUL
- // 0, //LMUL
- // 0, //FMUL
- // 0, //DMUL
- // 0, //IDIV
- // 0, //LDIV
- // 0, //FDIV
- // 0, //DDIV
- // 0, //IREM
- // 0, //LREM
- // 0, //FREM
- // 0, //DREM
- // 0, //INEG
- // 0, //LNEG
- // 0, //FNEG
- // 0, //DNEG
- // 0, //ISHL
- // 0, //LSHL
- // 0, //ISHR
- // 0, //LSHR
- // 0, //IUSHR
- // 0, //LUSHR
- // 0, //IAND
- // 0, //LAND
- // 0, //IOR
- // 0, //LOR
- // 0, //IXOR
- // 0, //LXOR
- // 8, //IINC
- // 0, //I2L
- // 0, //I2F
- // 0, //I2D
- // 0, //L2I
- // 0, //L2F
- // 0, //L2D
- // 0, //F2I
- // 0, //F2L
- // 0, //F2D
- // 0, //D2I
- // 0, //D2L
- // 0, //D2F
- // 0, //I2B
- // 0, //I2C
- // 0, //I2S
- // 0, //LCMP
- // 0, //FCMPL
- // 0, //FCMPG
- // 0, //DCMPL
- // 0, //DCMPG
- // 6, //IFEQ
- // 6, //IFNE
- // 6, //IFLT
- // 6, //IFGE
- // 6, //IFGT
- // 6, //IFLE
- // 6, //IF_ICMPEQ
- // 6, //IF_ICMPNE
- // 6, //IF_ICMPLT
- // 6, //IF_ICMPGE
- // 6, //IF_ICMPGT
- // 6, //IF_ICMPLE
- // 6, //IF_ACMPEQ
- // 6, //IF_ACMPNE
- // 6, //GOTO
- // 6, //JSR
- // 2, //RET
- // 9, //TABLESWITCH
- // 10, //LOOKUPSWITCH
- // 0, //IRETURN
- // 0, //LRETURN
- // 0, //FRETURN
- // 0, //DRETURN
- // 0, //ARETURN
- // 0, //RETURN
- // 4, //GETSTATIC
- // 4, //PUTSTATIC
- // 4, //GETFIELD
- // 4, //PUTFIELD
- // 5, //INVOKEVIRTUAL
- // 5, //INVOKESPECIAL
- // 5, //INVOKESTATIC
- // 5, //INVOKEINTERFACE
- // -1, //INVOKEDYNAMIC
- // 3, //NEW
- // 1, //NEWARRAY
- // 3, //ANEWARRAY
- // 0, //ARRAYLENGTH
- // 0, //ATHROW
- // 3, //CHECKCAST
- // 3, //INSTANCEOF
- // 0, //MONITORENTER
- // 0, //MONITOREXIT
- // -1, //WIDE
- // 11, //MULTIANEWARRAY
- // 6, //IFNULL
- // 6, //IFNONNULL
- // -1, //GOTO_W
- // -1 //JSR_W
- // };
- // for (int i = 0; i < TYPE.length; ++i) {
- // System.out.print((char)(TYPE[i] + 1 + 'A'));
- // }
- // System.out.println();
- // }
-
- /**
- * Constructs a new {@link CheckMethodAdapter} object. This method adapter
- * will not perform any data flow check (see
- * {@link #CheckMethodAdapter(int,String,String,MethodVisitor,Map)}).
- * <i>Subclasses must not use this constructor</i>. Instead, they must use
- * the {@link #CheckMethodAdapter(int, MethodVisitor, Map)} version.
- *
- * @param mv
- * the method visitor to which this adapter must delegate calls.
- */
- public CheckMethodAdapter(final MethodVisitor mv) {
- this(mv, new HashMap<Label, Integer>());
- }
-
- /**
- * Constructs a new {@link CheckMethodAdapter} object. This method adapter
- * will not perform any data flow check (see
- * {@link #CheckMethodAdapter(int,String,String,MethodVisitor,Map)}).
- * <i>Subclasses must not use this constructor</i>. Instead, they must use
- * the {@link #CheckMethodAdapter(int, MethodVisitor, Map)} version.
- *
- * @param mv
- * the method visitor to which this adapter must delegate calls.
- * @param labels
- * a map of already visited labels (in other methods).
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public CheckMethodAdapter(final MethodVisitor mv,
- final Map<Label, Integer> labels) {
- this(Opcodes.ASM5, mv, labels);
- if (getClass() != CheckMethodAdapter.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link CheckMethodAdapter} object. This method adapter
- * will not perform any data flow check (see
- * {@link #CheckMethodAdapter(int,String,String,MethodVisitor,Map)}).
- *
- * @param mv
- * the method visitor to which this adapter must delegate calls.
- * @param labels
- * a map of already visited labels (in other methods).
- */
- protected CheckMethodAdapter(final int api, final MethodVisitor mv,
- final Map<Label, Integer> labels) {
- super(api, mv);
- this.labels = labels;
- this.usedLabels = new HashSet<Label>();
- this.handlers = new ArrayList<Label>();
- }
-
- /**
- * Constructs a new {@link CheckMethodAdapter} object. This method adapter
- * will perform basic data flow checks. For instance in a method whose
- * signature is <tt>void m ()</tt>, the invalid instruction IRETURN, or the
- * invalid sequence IADD L2I will be detected.
- *
- * @param access
- * the method's access flags.
- * @param name
- * the method's name.
- * @param desc
- * the method's descriptor (see {@link Type Type}).
- * @param cmv
- * the method visitor to which this adapter must delegate calls.
- * @param labels
- * a map of already visited labels (in other methods).
- */
- public CheckMethodAdapter(final int access, final String name,
- final String desc, final MethodVisitor cmv,
- final Map<Label, Integer> labels) {
- this(new MethodNode(Opcodes.ASM5, access, name, desc, null, null) {
- @Override
- public void visitEnd() {
- Analyzer<BasicValue> a = new Analyzer<BasicValue>(
- new BasicVerifier());
- try {
- a.analyze("dummy", this);
- } catch (Exception e) {
- if (e instanceof IndexOutOfBoundsException
- && maxLocals == 0 && maxStack == 0) {
- throw new RuntimeException(
- "Data flow checking option requires valid, non zero maxLocals and maxStack values.");
- }
- e.printStackTrace();
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw, true);
- CheckClassAdapter.printAnalyzerResult(this, a, pw);
- pw.close();
- throw new RuntimeException(e.getMessage() + ' '
- + sw.toString());
- }
- accept(cmv);
- }
- }, labels);
- this.access = access;
- }
-
- @Override
- public void visitParameter(String name, int access) {
- if (name != null) {
- checkUnqualifiedName(version, name, "name");
- }
- CheckClassAdapter.checkAccess(access, Opcodes.ACC_FINAL
- + Opcodes.ACC_MANDATED + Opcodes.ACC_SYNTHETIC);
- super.visitParameter(name, access);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- checkEndMethod();
- checkDesc(desc, false);
- return new CheckAnnotationAdapter(super.visitAnnotation(desc, visible));
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- checkEndMethod();
- int sort = typeRef >>> 24;
- if (sort != TypeReference.METHOD_TYPE_PARAMETER
- && sort != TypeReference.METHOD_TYPE_PARAMETER_BOUND
- && sort != TypeReference.METHOD_RETURN
- && sort != TypeReference.METHOD_RECEIVER
- && sort != TypeReference.METHOD_FORMAL_PARAMETER
- && sort != TypeReference.THROWS) {
- throw new IllegalArgumentException("Invalid type reference sort 0x"
- + Integer.toHexString(sort));
- }
- CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
- CheckMethodAdapter.checkDesc(desc, false);
- return new CheckAnnotationAdapter(super.visitTypeAnnotation(typeRef,
- typePath, desc, visible));
- }
-
- @Override
- public AnnotationVisitor visitAnnotationDefault() {
- checkEndMethod();
- return new CheckAnnotationAdapter(super.visitAnnotationDefault(), false);
- }
-
- @Override
- public AnnotationVisitor visitParameterAnnotation(final int parameter,
- final String desc, final boolean visible) {
- checkEndMethod();
- checkDesc(desc, false);
- return new CheckAnnotationAdapter(super.visitParameterAnnotation(
- parameter, desc, visible));
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- checkEndMethod();
- if (attr == null) {
- throw new IllegalArgumentException(
- "Invalid attribute (must not be null)");
- }
- super.visitAttribute(attr);
- }
-
- @Override
- public void visitCode() {
- if ((access & Opcodes.ACC_ABSTRACT) != 0) {
- throw new RuntimeException("Abstract methods cannot have code");
- }
- startCode = true;
- super.visitCode();
- }
-
- @Override
- public void visitFrame(final int type, final int nLocal,
- final Object[] local, final int nStack, final Object[] stack) {
- if (insnCount == lastFrame) {
- throw new IllegalStateException(
- "At most one frame can be visited at a given code location.");
- }
- lastFrame = insnCount;
- int mLocal;
- int mStack;
- switch (type) {
- case Opcodes.F_NEW:
- case Opcodes.F_FULL:
- mLocal = Integer.MAX_VALUE;
- mStack = Integer.MAX_VALUE;
- break;
-
- case Opcodes.F_SAME:
- mLocal = 0;
- mStack = 0;
- break;
-
- case Opcodes.F_SAME1:
- mLocal = 0;
- mStack = 1;
- break;
-
- case Opcodes.F_APPEND:
- case Opcodes.F_CHOP:
- mLocal = 3;
- mStack = 0;
- break;
-
- default:
- throw new IllegalArgumentException("Invalid frame type " + type);
- }
-
- if (nLocal > mLocal) {
- throw new IllegalArgumentException("Invalid nLocal=" + nLocal
- + " for frame type " + type);
- }
- if (nStack > mStack) {
- throw new IllegalArgumentException("Invalid nStack=" + nStack
- + " for frame type " + type);
- }
-
- if (type != Opcodes.F_CHOP) {
- if (nLocal > 0 && (local == null || local.length < nLocal)) {
- throw new IllegalArgumentException(
- "Array local[] is shorter than nLocal");
- }
- for (int i = 0; i < nLocal; ++i) {
- checkFrameValue(local[i]);
- }
- }
- if (nStack > 0 && (stack == null || stack.length < nStack)) {
- throw new IllegalArgumentException(
- "Array stack[] is shorter than nStack");
- }
- for (int i = 0; i < nStack; ++i) {
- checkFrameValue(stack[i]);
- }
- if (type == Opcodes.F_NEW) {
- ++expandedFrames;
- } else {
- ++compressedFrames;
- }
- if (expandedFrames > 0 && compressedFrames > 0) {
- throw new RuntimeException(
- "Expanded and compressed frames must not be mixed.");
- }
- super.visitFrame(type, nLocal, local, nStack, stack);
- }
-
- @Override
- public void visitInsn(final int opcode) {
- checkStartCode();
- checkEndCode();
- checkOpcode(opcode, 0);
- super.visitInsn(opcode);
- ++insnCount;
- }
-
- @Override
- public void visitIntInsn(final int opcode, final int operand) {
- checkStartCode();
- checkEndCode();
- checkOpcode(opcode, 1);
- switch (opcode) {
- case Opcodes.BIPUSH:
- checkSignedByte(operand, "Invalid operand");
- break;
- case Opcodes.SIPUSH:
- checkSignedShort(operand, "Invalid operand");
- break;
- // case Constants.NEWARRAY:
- default:
- if (operand < Opcodes.T_BOOLEAN || operand > Opcodes.T_LONG) {
- throw new IllegalArgumentException(
- "Invalid operand (must be an array type code T_...): "
- + operand);
- }
- }
- super.visitIntInsn(opcode, operand);
- ++insnCount;
- }
-
- @Override
- public void visitVarInsn(final int opcode, final int var) {
- checkStartCode();
- checkEndCode();
- checkOpcode(opcode, 2);
- checkUnsignedShort(var, "Invalid variable index");
- super.visitVarInsn(opcode, var);
- ++insnCount;
- }
-
- @Override
- public void visitTypeInsn(final int opcode, final String type) {
- checkStartCode();
- checkEndCode();
- checkOpcode(opcode, 3);
- checkInternalName(type, "type");
- if (opcode == Opcodes.NEW && type.charAt(0) == '[') {
- throw new IllegalArgumentException(
- "NEW cannot be used to create arrays: " + type);
- }
- super.visitTypeInsn(opcode, type);
- ++insnCount;
- }
-
- @Override
- public void visitFieldInsn(final int opcode, final String owner,
- final String name, final String desc) {
- checkStartCode();
- checkEndCode();
- checkOpcode(opcode, 4);
- checkInternalName(owner, "owner");
- checkUnqualifiedName(version, name, "name");
- checkDesc(desc, false);
- super.visitFieldInsn(opcode, owner, name, desc);
- ++insnCount;
- }
-
- @Deprecated
- @Override
- public void visitMethodInsn(int opcode, String owner, String name,
- String desc) {
- if (api >= Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc);
- return;
- }
- doVisitMethodInsn(opcode, owner, name, desc,
- opcode == Opcodes.INVOKEINTERFACE);
- }
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name,
- String desc, boolean itf) {
- if (api < Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc, itf);
- return;
- }
- doVisitMethodInsn(opcode, owner, name, desc, itf);
- }
-
- private void doVisitMethodInsn(int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- checkStartCode();
- checkEndCode();
- checkOpcode(opcode, 5);
- if (opcode != Opcodes.INVOKESPECIAL || !"<init>".equals(name)) {
- checkMethodIdentifier(version, name, "name");
- }
- checkInternalName(owner, "owner");
- checkMethodDesc(desc);
- if (opcode == Opcodes.INVOKEVIRTUAL && itf) {
- throw new IllegalArgumentException(
- "INVOKEVIRTUAL can't be used with interfaces");
- }
- if (opcode == Opcodes.INVOKEINTERFACE && !itf) {
- throw new IllegalArgumentException(
- "INVOKEINTERFACE can't be used with classes");
- }
- // Calling super.visitMethodInsn requires to call the correct version
- // depending on this.api (otherwise infinite loops can occur). To
- // simplify and to make it easier to automatically remove the backward
- // compatibility code, we inline the code of the overridden method here.
- if (mv != null) {
- mv.visitMethodInsn(opcode, owner, name, desc, itf);
- }
- ++insnCount;
- }
-
- @Override
- public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
- Object... bsmArgs) {
- checkStartCode();
- checkEndCode();
- checkMethodIdentifier(version, name, "name");
- checkMethodDesc(desc);
- if (bsm.getTag() != Opcodes.H_INVOKESTATIC
- && bsm.getTag() != Opcodes.H_NEWINVOKESPECIAL) {
- throw new IllegalArgumentException("invalid handle tag "
- + bsm.getTag());
- }
- for (int i = 0; i < bsmArgs.length; i++) {
- checkLDCConstant(bsmArgs[i]);
- }
- super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
- ++insnCount;
- }
-
- @Override
- public void visitJumpInsn(final int opcode, final Label label) {
- checkStartCode();
- checkEndCode();
- checkOpcode(opcode, 6);
- checkLabel(label, false, "label");
- checkNonDebugLabel(label);
- super.visitJumpInsn(opcode, label);
- usedLabels.add(label);
- ++insnCount;
- }
-
- @Override
- public void visitLabel(final Label label) {
- checkStartCode();
- checkEndCode();
- checkLabel(label, false, "label");
- if (labels.get(label) != null) {
- throw new IllegalArgumentException("Already visited label");
- }
- labels.put(label, new Integer(insnCount));
- super.visitLabel(label);
- }
-
- @Override
- public void visitLdcInsn(final Object cst) {
- checkStartCode();
- checkEndCode();
- checkLDCConstant(cst);
- super.visitLdcInsn(cst);
- ++insnCount;
- }
-
- @Override
- public void visitIincInsn(final int var, final int increment) {
- checkStartCode();
- checkEndCode();
- checkUnsignedShort(var, "Invalid variable index");
- checkSignedShort(increment, "Invalid increment");
- super.visitIincInsn(var, increment);
- ++insnCount;
- }
-
- @Override
- public void visitTableSwitchInsn(final int min, final int max,
- final Label dflt, final Label... labels) {
- checkStartCode();
- checkEndCode();
- if (max < min) {
- throw new IllegalArgumentException("Max = " + max
- + " must be greater than or equal to min = " + min);
- }
- checkLabel(dflt, false, "default label");
- checkNonDebugLabel(dflt);
- if (labels == null || labels.length != max - min + 1) {
- throw new IllegalArgumentException(
- "There must be max - min + 1 labels");
- }
- for (int i = 0; i < labels.length; ++i) {
- checkLabel(labels[i], false, "label at index " + i);
- checkNonDebugLabel(labels[i]);
- }
- super.visitTableSwitchInsn(min, max, dflt, labels);
- for (int i = 0; i < labels.length; ++i) {
- usedLabels.add(labels[i]);
- }
- ++insnCount;
- }
-
- @Override
- public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
- final Label[] labels) {
- checkEndCode();
- checkStartCode();
- checkLabel(dflt, false, "default label");
- checkNonDebugLabel(dflt);
- if (keys == null || labels == null || keys.length != labels.length) {
- throw new IllegalArgumentException(
- "There must be the same number of keys and labels");
- }
- for (int i = 0; i < labels.length; ++i) {
- checkLabel(labels[i], false, "label at index " + i);
- checkNonDebugLabel(labels[i]);
- }
- super.visitLookupSwitchInsn(dflt, keys, labels);
- usedLabels.add(dflt);
- for (int i = 0; i < labels.length; ++i) {
- usedLabels.add(labels[i]);
- }
- ++insnCount;
- }
-
- @Override
- public void visitMultiANewArrayInsn(final String desc, final int dims) {
- checkStartCode();
- checkEndCode();
- checkDesc(desc, false);
- if (desc.charAt(0) != '[') {
- throw new IllegalArgumentException(
- "Invalid descriptor (must be an array type descriptor): "
- + desc);
- }
- if (dims < 1) {
- throw new IllegalArgumentException(
- "Invalid dimensions (must be greater than 0): " + dims);
- }
- if (dims > desc.lastIndexOf('[') + 1) {
- throw new IllegalArgumentException(
- "Invalid dimensions (must not be greater than dims(desc)): "
- + dims);
- }
- super.visitMultiANewArrayInsn(desc, dims);
- ++insnCount;
- }
-
- @Override
- public AnnotationVisitor visitInsnAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- checkStartCode();
- checkEndCode();
- int sort = typeRef >>> 24;
- if (sort != TypeReference.INSTANCEOF && sort != TypeReference.NEW
- && sort != TypeReference.CONSTRUCTOR_REFERENCE
- && sort != TypeReference.METHOD_REFERENCE
- && sort != TypeReference.CAST
- && sort != TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
- && sort != TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT
- && sort != TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
- && sort != TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT) {
- throw new IllegalArgumentException("Invalid type reference sort 0x"
- + Integer.toHexString(sort));
- }
- CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
- CheckMethodAdapter.checkDesc(desc, false);
- return new CheckAnnotationAdapter(super.visitInsnAnnotation(typeRef,
- typePath, desc, visible));
- }
-
- @Override
- public void visitTryCatchBlock(final Label start, final Label end,
- final Label handler, final String type) {
- checkStartCode();
- checkEndCode();
- checkLabel(start, false, "start label");
- checkLabel(end, false, "end label");
- checkLabel(handler, false, "handler label");
- checkNonDebugLabel(start);
- checkNonDebugLabel(end);
- checkNonDebugLabel(handler);
- if (labels.get(start) != null || labels.get(end) != null
- || labels.get(handler) != null) {
- throw new IllegalStateException(
- "Try catch blocks must be visited before their labels");
- }
- if (type != null) {
- checkInternalName(type, "type");
- }
- super.visitTryCatchBlock(start, end, handler, type);
- handlers.add(start);
- handlers.add(end);
- }
-
- @Override
- public AnnotationVisitor visitTryCatchAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- checkStartCode();
- checkEndCode();
- int sort = typeRef >>> 24;
- if (sort != TypeReference.EXCEPTION_PARAMETER) {
- throw new IllegalArgumentException("Invalid type reference sort 0x"
- + Integer.toHexString(sort));
- }
- CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
- CheckMethodAdapter.checkDesc(desc, false);
- return new CheckAnnotationAdapter(super.visitTryCatchAnnotation(
- typeRef, typePath, desc, visible));
- }
-
- @Override
- public void visitLocalVariable(final String name, final String desc,
- final String signature, final Label start, final Label end,
- final int index) {
- checkStartCode();
- checkEndCode();
- checkUnqualifiedName(version, name, "name");
- checkDesc(desc, false);
- checkLabel(start, true, "start label");
- checkLabel(end, true, "end label");
- checkUnsignedShort(index, "Invalid variable index");
- int s = labels.get(start).intValue();
- int e = labels.get(end).intValue();
- if (e < s) {
- throw new IllegalArgumentException(
- "Invalid start and end labels (end must be greater than start)");
- }
- super.visitLocalVariable(name, desc, signature, start, end, index);
- }
-
- @Override
- public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
- TypePath typePath, Label[] start, Label[] end, int[] index,
- String desc, boolean visible) {
- checkStartCode();
- checkEndCode();
- int sort = typeRef >>> 24;
- if (sort != TypeReference.LOCAL_VARIABLE
- && sort != TypeReference.RESOURCE_VARIABLE) {
- throw new IllegalArgumentException("Invalid type reference sort 0x"
- + Integer.toHexString(sort));
- }
- CheckClassAdapter.checkTypeRefAndPath(typeRef, typePath);
- checkDesc(desc, false);
- if (start == null || end == null || index == null
- || end.length != start.length || index.length != start.length) {
- throw new IllegalArgumentException(
- "Invalid start, end and index arrays (must be non null and of identical length");
- }
- for (int i = 0; i < start.length; ++i) {
- checkLabel(start[i], true, "start label");
- checkLabel(end[i], true, "end label");
- checkUnsignedShort(index[i], "Invalid variable index");
- int s = labels.get(start[i]).intValue();
- int e = labels.get(end[i]).intValue();
- if (e < s) {
- throw new IllegalArgumentException(
- "Invalid start and end labels (end must be greater than start)");
- }
- }
- return super.visitLocalVariableAnnotation(typeRef, typePath, start,
- end, index, desc, visible);
- }
-
- @Override
- public void visitLineNumber(final int line, final Label start) {
- checkStartCode();
- checkEndCode();
- checkUnsignedShort(line, "Invalid line number");
- checkLabel(start, true, "start label");
- super.visitLineNumber(line, start);
- }
-
- @Override
- public void visitMaxs(final int maxStack, final int maxLocals) {
- checkStartCode();
- checkEndCode();
- endCode = true;
- for (Label l : usedLabels) {
- if (labels.get(l) == null) {
- throw new IllegalStateException("Undefined label used");
- }
- }
- for (int i = 0; i < handlers.size();) {
- Integer start = labels.get(handlers.get(i++));
- Integer end = labels.get(handlers.get(i++));
- if (start == null || end == null) {
- throw new IllegalStateException(
- "Undefined try catch block labels");
- }
- if (end.intValue() <= start.intValue()) {
- throw new IllegalStateException(
- "Emty try catch block handler range");
- }
- }
- checkUnsignedShort(maxStack, "Invalid max stack");
- checkUnsignedShort(maxLocals, "Invalid max locals");
- super.visitMaxs(maxStack, maxLocals);
- }
-
- @Override
- public void visitEnd() {
- checkEndMethod();
- endMethod = true;
- super.visitEnd();
- }
-
- // -------------------------------------------------------------------------
-
- /**
- * Checks that the visitCode method has been called.
- */
- void checkStartCode() {
- if (!startCode) {
- throw new IllegalStateException(
- "Cannot visit instructions before visitCode has been called.");
- }
- }
-
- /**
- * Checks that the visitMaxs method has not been called.
- */
- void checkEndCode() {
- if (endCode) {
- throw new IllegalStateException(
- "Cannot visit instructions after visitMaxs has been called.");
- }
- }
-
- /**
- * Checks that the visitEnd method has not been called.
- */
- void checkEndMethod() {
- if (endMethod) {
- throw new IllegalStateException(
- "Cannot visit elements after visitEnd has been called.");
- }
- }
-
- /**
- * Checks a stack frame value.
- *
- * @param value
- * the value to be checked.
- */
- void checkFrameValue(final Object value) {
- if (value == Opcodes.TOP || value == Opcodes.INTEGER
- || value == Opcodes.FLOAT || value == Opcodes.LONG
- || value == Opcodes.DOUBLE || value == Opcodes.NULL
- || value == Opcodes.UNINITIALIZED_THIS) {
- return;
- }
- if (value instanceof String) {
- checkInternalName((String) value, "Invalid stack frame value");
- return;
- }
- if (!(value instanceof Label)) {
- throw new IllegalArgumentException("Invalid stack frame value: "
- + value);
- } else {
- usedLabels.add((Label) value);
- }
- }
-
- /**
- * Checks that the type of the given opcode is equal to the given type.
- *
- * @param opcode
- * the opcode to be checked.
- * @param type
- * the expected opcode type.
- */
- static void checkOpcode(final int opcode, final int type) {
- if (opcode < 0 || opcode > 199 || TYPE[opcode] != type) {
- throw new IllegalArgumentException("Invalid opcode: " + opcode);
- }
- }
-
- /**
- * Checks that the given value is a signed byte.
- *
- * @param value
- * the value to be checked.
- * @param msg
- * an message to be used in case of error.
- */
- static void checkSignedByte(final int value, final String msg) {
- if (value < Byte.MIN_VALUE || value > Byte.MAX_VALUE) {
- throw new IllegalArgumentException(msg
- + " (must be a signed byte): " + value);
- }
- }
-
- /**
- * Checks that the given value is a signed short.
- *
- * @param value
- * the value to be checked.
- * @param msg
- * an message to be used in case of error.
- */
- static void checkSignedShort(final int value, final String msg) {
- if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) {
- throw new IllegalArgumentException(msg
- + " (must be a signed short): " + value);
- }
- }
-
- /**
- * Checks that the given value is an unsigned short.
- *
- * @param value
- * the value to be checked.
- * @param msg
- * an message to be used in case of error.
- */
- static void checkUnsignedShort(final int value, final String msg) {
- if (value < 0 || value > 65535) {
- throw new IllegalArgumentException(msg
- + " (must be an unsigned short): " + value);
- }
- }
-
- /**
- * Checks that the given value is an {@link Integer}, a{@link Float}, a
- * {@link Long}, a {@link Double} or a {@link String}.
- *
- * @param cst
- * the value to be checked.
- */
- static void checkConstant(final Object cst) {
- if (!(cst instanceof Integer) && !(cst instanceof Float)
- && !(cst instanceof Long) && !(cst instanceof Double)
- && !(cst instanceof String)) {
- throw new IllegalArgumentException("Invalid constant: " + cst);
- }
- }
-
- void checkLDCConstant(final Object cst) {
- if (cst instanceof Type) {
- int s = ((Type) cst).getSort();
- if (s != Type.OBJECT && s != Type.ARRAY && s != Type.METHOD) {
- throw new IllegalArgumentException("Illegal LDC constant value");
- }
- if (s != Type.METHOD && (version & 0xFFFF) < Opcodes.V1_5) {
- throw new IllegalArgumentException(
- "ldc of a constant class requires at least version 1.5");
- }
- if (s == Type.METHOD && (version & 0xFFFF) < Opcodes.V1_7) {
- throw new IllegalArgumentException(
- "ldc of a method type requires at least version 1.7");
- }
- } else if (cst instanceof Handle) {
- if ((version & 0xFFFF) < Opcodes.V1_7) {
- throw new IllegalArgumentException(
- "ldc of a handle requires at least version 1.7");
- }
- int tag = ((Handle) cst).getTag();
- if (tag < Opcodes.H_GETFIELD || tag > Opcodes.H_INVOKEINTERFACE) {
- throw new IllegalArgumentException("invalid handle tag " + tag);
- }
- } else {
- checkConstant(cst);
- }
- }
-
- /**
- * Checks that the given string is a valid unqualified name.
- *
- * @param version
- * the class version.
- * @param name
- * the string to be checked.
- * @param msg
- * a message to be used in case of error.
- */
- static void checkUnqualifiedName(int version, final String name,
- final String msg) {
- if ((version & 0xFFFF) < Opcodes.V1_5) {
- checkIdentifier(name, msg);
- } else {
- for (int i = 0; i < name.length(); ++i) {
- if (".;[/".indexOf(name.charAt(i)) != -1) {
- throw new IllegalArgumentException("Invalid " + msg
- + " (must be a valid unqualified name): " + name);
- }
- }
- }
- }
-
- /**
- * Checks that the given string is a valid Java identifier.
- *
- * @param name
- * the string to be checked.
- * @param msg
- * a message to be used in case of error.
- */
- static void checkIdentifier(final String name, final String msg) {
- checkIdentifier(name, 0, -1, msg);
- }
-
- /**
- * Checks that the given substring is a valid Java identifier.
- *
- * @param name
- * the string to be checked.
- * @param start
- * index of the first character of the identifier (inclusive).
- * @param end
- * index of the last character of the identifier (exclusive). -1
- * is equivalent to <tt>name.length()</tt> if name is not
- * <tt>null</tt>.
- * @param msg
- * a message to be used in case of error.
- */
- static void checkIdentifier(final String name, final int start,
- final int end, final String msg) {
- if (name == null || (end == -1 ? name.length() <= start : end <= start)) {
- throw new IllegalArgumentException("Invalid " + msg
- + " (must not be null or empty)");
- }
- if (!Character.isJavaIdentifierStart(name.charAt(start))) {
- throw new IllegalArgumentException("Invalid " + msg
- + " (must be a valid Java identifier): " + name);
- }
- int max = end == -1 ? name.length() : end;
- for (int i = start + 1; i < max; ++i) {
- if (!Character.isJavaIdentifierPart(name.charAt(i))) {
- throw new IllegalArgumentException("Invalid " + msg
- + " (must be a valid Java identifier): " + name);
- }
- }
- }
-
- /**
- * Checks that the given string is a valid Java identifier.
- *
- * @param version
- * the class version.
- * @param name
- * the string to be checked.
- * @param msg
- * a message to be used in case of error.
- */
- static void checkMethodIdentifier(int version, final String name,
- final String msg) {
- if (name == null || name.length() == 0) {
- throw new IllegalArgumentException("Invalid " + msg
- + " (must not be null or empty)");
- }
- if ((version & 0xFFFF) >= Opcodes.V1_5) {
- for (int i = 0; i < name.length(); ++i) {
- if (".;[/<>".indexOf(name.charAt(i)) != -1) {
- throw new IllegalArgumentException("Invalid " + msg
- + " (must be a valid unqualified name): " + name);
- }
- }
- return;
- }
- if (!Character.isJavaIdentifierStart(name.charAt(0))) {
- throw new IllegalArgumentException(
- "Invalid "
- + msg
- + " (must be a '<init>', '<clinit>' or a valid Java identifier): "
- + name);
- }
- for (int i = 1; i < name.length(); ++i) {
- if (!Character.isJavaIdentifierPart(name.charAt(i))) {
- throw new IllegalArgumentException(
- "Invalid "
- + msg
- + " (must be '<init>' or '<clinit>' or a valid Java identifier): "
- + name);
- }
- }
- }
-
- /**
- * Checks that the given string is a valid internal class name.
- *
- * @param name
- * the string to be checked.
- * @param msg
- * a message to be used in case of error.
- */
- static void checkInternalName(final String name, final String msg) {
- if (name == null || name.length() == 0) {
- throw new IllegalArgumentException("Invalid " + msg
- + " (must not be null or empty)");
- }
- if (name.charAt(0) == '[') {
- checkDesc(name, false);
- } else {
- checkInternalName(name, 0, -1, msg);
- }
- }
-
- /**
- * Checks that the given substring is a valid internal class name.
- *
- * @param name
- * the string to be checked.
- * @param start
- * index of the first character of the identifier (inclusive).
- * @param end
- * index of the last character of the identifier (exclusive). -1
- * is equivalent to <tt>name.length()</tt> if name is not
- * <tt>null</tt>.
- * @param msg
- * a message to be used in case of error.
- */
- static void checkInternalName(final String name, final int start,
- final int end, final String msg) {
- int max = end == -1 ? name.length() : end;
- try {
- int begin = start;
- int slash;
- do {
- slash = name.indexOf('/', begin + 1);
- if (slash == -1 || slash > max) {
- slash = max;
- }
- checkIdentifier(name, begin, slash, null);
- begin = slash + 1;
- } while (slash != max);
- } catch (IllegalArgumentException unused) {
- throw new IllegalArgumentException(
- "Invalid "
- + msg
- + " (must be a fully qualified class name in internal form): "
- + name);
- }
- }
-
- /**
- * Checks that the given string is a valid type descriptor.
- *
- * @param desc
- * the string to be checked.
- * @param canBeVoid
- * <tt>true</tt> if <tt>V</tt> can be considered valid.
- */
- static void checkDesc(final String desc, final boolean canBeVoid) {
- int end = checkDesc(desc, 0, canBeVoid);
- if (end != desc.length()) {
- throw new IllegalArgumentException("Invalid descriptor: " + desc);
- }
- }
-
- /**
- * Checks that a the given substring is a valid type descriptor.
- *
- * @param desc
- * the string to be checked.
- * @param start
- * index of the first character of the identifier (inclusive).
- * @param canBeVoid
- * <tt>true</tt> if <tt>V</tt> can be considered valid.
- * @return the index of the last character of the type decriptor, plus one.
- */
- static int checkDesc(final String desc, final int start,
- final boolean canBeVoid) {
- if (desc == null || start >= desc.length()) {
- throw new IllegalArgumentException(
- "Invalid type descriptor (must not be null or empty)");
- }
- int index;
- switch (desc.charAt(start)) {
- case 'V':
- if (canBeVoid) {
- return start + 1;
- } else {
- throw new IllegalArgumentException("Invalid descriptor: "
- + desc);
- }
- case 'Z':
- case 'C':
- case 'B':
- case 'S':
- case 'I':
- case 'F':
- case 'J':
- case 'D':
- return start + 1;
- case '[':
- index = start + 1;
- while (index < desc.length() && desc.charAt(index) == '[') {
- ++index;
- }
- if (index < desc.length()) {
- return checkDesc(desc, index, false);
- } else {
- throw new IllegalArgumentException("Invalid descriptor: "
- + desc);
- }
- case 'L':
- index = desc.indexOf(';', start);
- if (index == -1 || index - start < 2) {
- throw new IllegalArgumentException("Invalid descriptor: "
- + desc);
- }
- try {
- checkInternalName(desc, start + 1, index, null);
- } catch (IllegalArgumentException unused) {
- throw new IllegalArgumentException("Invalid descriptor: "
- + desc);
- }
- return index + 1;
- default:
- throw new IllegalArgumentException("Invalid descriptor: " + desc);
- }
- }
-
- /**
- * Checks that the given string is a valid method descriptor.
- *
- * @param desc
- * the string to be checked.
- */
- static void checkMethodDesc(final String desc) {
- if (desc == null || desc.length() == 0) {
- throw new IllegalArgumentException(
- "Invalid method descriptor (must not be null or empty)");
- }
- if (desc.charAt(0) != '(' || desc.length() < 3) {
- throw new IllegalArgumentException("Invalid descriptor: " + desc);
- }
- int start = 1;
- if (desc.charAt(start) != ')') {
- do {
- if (desc.charAt(start) == 'V') {
- throw new IllegalArgumentException("Invalid descriptor: "
- + desc);
- }
- start = checkDesc(desc, start, false);
- } while (start < desc.length() && desc.charAt(start) != ')');
- }
- start = checkDesc(desc, start + 1, true);
- if (start != desc.length()) {
- throw new IllegalArgumentException("Invalid descriptor: " + desc);
- }
- }
-
- /**
- * Checks that the given label is not null. This method can also check that
- * the label has been visited.
- *
- * @param label
- * the label to be checked.
- * @param checkVisited
- * <tt>true</tt> to check that the label has been visited.
- * @param msg
- * a message to be used in case of error.
- */
- void checkLabel(final Label label, final boolean checkVisited,
- final String msg) {
- if (label == null) {
- throw new IllegalArgumentException("Invalid " + msg
- + " (must not be null)");
- }
- if (checkVisited && labels.get(label) == null) {
- throw new IllegalArgumentException("Invalid " + msg
- + " (must be visited first)");
- }
- }
-
- /**
- * Checks that the given label is not a label used only for debug purposes.
- *
- * @param label
- * the label to be checked.
- */
- private static void checkNonDebugLabel(final Label label) {
- Field f = getLabelStatusField();
- int status = 0;
- try {
- status = f == null ? 0 : ((Integer) f.get(label)).intValue();
- } catch (IllegalAccessException e) {
- throw new Error("Internal error");
- }
- if ((status & 0x01) != 0) {
- throw new IllegalArgumentException(
- "Labels used for debug info cannot be reused for control flow");
- }
- }
-
- /**
- * Returns the Field object corresponding to the Label.status field.
- *
- * @return the Field object corresponding to the Label.status field.
- */
- private static Field getLabelStatusField() {
- if (labelStatusField == null) {
- labelStatusField = getLabelField("a");
- if (labelStatusField == null) {
- labelStatusField = getLabelField("status");
- }
- }
- return labelStatusField;
- }
-
- /**
- * Returns the field of the Label class whose name is given.
- *
- * @param name
- * a field name.
- * @return the field of the Label class whose name is given, or null.
- */
- private static Field getLabelField(final String name) {
- try {
- Field f = Label.class.getDeclaredField(name);
- f.setAccessible(true);
- return f;
- } catch (NoSuchFieldException e) {
- return null;
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/util/CheckSignatureAdapter.java b/src/asm/scala/tools/asm/util/CheckSignatureAdapter.java
deleted file mode 100644
index 54c9033c90..0000000000
--- a/src/asm/scala/tools/asm/util/CheckSignatureAdapter.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.signature.SignatureVisitor;
-
-/**
- * A {@link SignatureVisitor} that checks that its methods are properly used.
- *
- * @author Eric Bruneton
- */
-public class CheckSignatureAdapter extends SignatureVisitor {
-
- /**
- * Type to be used to check class signatures. See
- * {@link #CheckSignatureAdapter(int, SignatureVisitor)
- * CheckSignatureAdapter}.
- */
- public static final int CLASS_SIGNATURE = 0;
-
- /**
- * Type to be used to check method signatures. See
- * {@link #CheckSignatureAdapter(int, SignatureVisitor)
- * CheckSignatureAdapter}.
- */
- public static final int METHOD_SIGNATURE = 1;
-
- /**
- * Type to be used to check type signatures.See
- * {@link #CheckSignatureAdapter(int, SignatureVisitor)
- * CheckSignatureAdapter}.
- */
- public static final int TYPE_SIGNATURE = 2;
-
- private static final int EMPTY = 1;
-
- private static final int FORMAL = 2;
-
- private static final int BOUND = 4;
-
- private static final int SUPER = 8;
-
- private static final int PARAM = 16;
-
- private static final int RETURN = 32;
-
- private static final int SIMPLE_TYPE = 64;
-
- private static final int CLASS_TYPE = 128;
-
- private static final int END = 256;
-
- /**
- * Type of the signature to be checked.
- */
- private final int type;
-
- /**
- * State of the automaton used to check the order of method calls.
- */
- private int state;
-
- /**
- * <tt>true</tt> if the checked type signature can be 'V'.
- */
- private boolean canBeVoid;
-
- /**
- * The visitor to which this adapter must delegate calls. May be
- * <tt>null</tt>.
- */
- private final SignatureVisitor sv;
-
- /**
- * Creates a new {@link CheckSignatureAdapter} object. <i>Subclasses must
- * not use this constructor</i>. Instead, they must use the
- * {@link #CheckSignatureAdapter(int, int, SignatureVisitor)} version.
- *
- * @param type
- * the type of signature to be checked. See
- * {@link #CLASS_SIGNATURE}, {@link #METHOD_SIGNATURE} and
- * {@link #TYPE_SIGNATURE}.
- * @param sv
- * the visitor to which this adapter must delegate calls. May be
- * <tt>null</tt>.
- */
- public CheckSignatureAdapter(final int type, final SignatureVisitor sv) {
- this(Opcodes.ASM5, type, sv);
- }
-
- /**
- * Creates a new {@link CheckSignatureAdapter} object.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- * @param type
- * the type of signature to be checked. See
- * {@link #CLASS_SIGNATURE}, {@link #METHOD_SIGNATURE} and
- * {@link #TYPE_SIGNATURE}.
- * @param sv
- * the visitor to which this adapter must delegate calls. May be
- * <tt>null</tt>.
- */
- protected CheckSignatureAdapter(final int api, final int type,
- final SignatureVisitor sv) {
- super(api);
- this.type = type;
- this.state = EMPTY;
- this.sv = sv;
- }
-
- // class and method signatures
-
- @Override
- public void visitFormalTypeParameter(final String name) {
- if (type == TYPE_SIGNATURE
- || (state != EMPTY && state != FORMAL && state != BOUND)) {
- throw new IllegalStateException();
- }
- CheckMethodAdapter.checkIdentifier(name, "formal type parameter");
- state = FORMAL;
- if (sv != null) {
- sv.visitFormalTypeParameter(name);
- }
- }
-
- @Override
- public SignatureVisitor visitClassBound() {
- if (state != FORMAL) {
- throw new IllegalStateException();
- }
- state = BOUND;
- SignatureVisitor v = sv == null ? null : sv.visitClassBound();
- return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
- }
-
- @Override
- public SignatureVisitor visitInterfaceBound() {
- if (state != FORMAL && state != BOUND) {
- throw new IllegalArgumentException();
- }
- SignatureVisitor v = sv == null ? null : sv.visitInterfaceBound();
- return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
- }
-
- // class signatures
-
- @Override
- public SignatureVisitor visitSuperclass() {
- if (type != CLASS_SIGNATURE || (state & (EMPTY | FORMAL | BOUND)) == 0) {
- throw new IllegalArgumentException();
- }
- state = SUPER;
- SignatureVisitor v = sv == null ? null : sv.visitSuperclass();
- return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
- }
-
- @Override
- public SignatureVisitor visitInterface() {
- if (state != SUPER) {
- throw new IllegalStateException();
- }
- SignatureVisitor v = sv == null ? null : sv.visitInterface();
- return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
- }
-
- // method signatures
-
- @Override
- public SignatureVisitor visitParameterType() {
- if (type != METHOD_SIGNATURE
- || (state & (EMPTY | FORMAL | BOUND | PARAM)) == 0) {
- throw new IllegalArgumentException();
- }
- state = PARAM;
- SignatureVisitor v = sv == null ? null : sv.visitParameterType();
- return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
- }
-
- @Override
- public SignatureVisitor visitReturnType() {
- if (type != METHOD_SIGNATURE
- || (state & (EMPTY | FORMAL | BOUND | PARAM)) == 0) {
- throw new IllegalArgumentException();
- }
- state = RETURN;
- SignatureVisitor v = sv == null ? null : sv.visitReturnType();
- CheckSignatureAdapter cv = new CheckSignatureAdapter(TYPE_SIGNATURE, v);
- cv.canBeVoid = true;
- return cv;
- }
-
- @Override
- public SignatureVisitor visitExceptionType() {
- if (state != RETURN) {
- throw new IllegalStateException();
- }
- SignatureVisitor v = sv == null ? null : sv.visitExceptionType();
- return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
- }
-
- // type signatures
-
- @Override
- public void visitBaseType(final char descriptor) {
- if (type != TYPE_SIGNATURE || state != EMPTY) {
- throw new IllegalStateException();
- }
- if (descriptor == 'V') {
- if (!canBeVoid) {
- throw new IllegalArgumentException();
- }
- } else {
- if ("ZCBSIFJD".indexOf(descriptor) == -1) {
- throw new IllegalArgumentException();
- }
- }
- state = SIMPLE_TYPE;
- if (sv != null) {
- sv.visitBaseType(descriptor);
- }
- }
-
- @Override
- public void visitTypeVariable(final String name) {
- if (type != TYPE_SIGNATURE || state != EMPTY) {
- throw new IllegalStateException();
- }
- CheckMethodAdapter.checkIdentifier(name, "type variable");
- state = SIMPLE_TYPE;
- if (sv != null) {
- sv.visitTypeVariable(name);
- }
- }
-
- @Override
- public SignatureVisitor visitArrayType() {
- if (type != TYPE_SIGNATURE || state != EMPTY) {
- throw new IllegalStateException();
- }
- state = SIMPLE_TYPE;
- SignatureVisitor v = sv == null ? null : sv.visitArrayType();
- return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
- }
-
- @Override
- public void visitClassType(final String name) {
- if (type != TYPE_SIGNATURE || state != EMPTY) {
- throw new IllegalStateException();
- }
- CheckMethodAdapter.checkInternalName(name, "class name");
- state = CLASS_TYPE;
- if (sv != null) {
- sv.visitClassType(name);
- }
- }
-
- @Override
- public void visitInnerClassType(final String name) {
- if (state != CLASS_TYPE) {
- throw new IllegalStateException();
- }
- CheckMethodAdapter.checkIdentifier(name, "inner class name");
- if (sv != null) {
- sv.visitInnerClassType(name);
- }
- }
-
- @Override
- public void visitTypeArgument() {
- if (state != CLASS_TYPE) {
- throw new IllegalStateException();
- }
- if (sv != null) {
- sv.visitTypeArgument();
- }
- }
-
- @Override
- public SignatureVisitor visitTypeArgument(final char wildcard) {
- if (state != CLASS_TYPE) {
- throw new IllegalStateException();
- }
- if ("+-=".indexOf(wildcard) == -1) {
- throw new IllegalArgumentException();
- }
- SignatureVisitor v = sv == null ? null : sv.visitTypeArgument(wildcard);
- return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
- }
-
- @Override
- public void visitEnd() {
- if (state != CLASS_TYPE) {
- throw new IllegalStateException();
- }
- state = END;
- if (sv != null) {
- sv.visitEnd();
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/util/Printer.java b/src/asm/scala/tools/asm/util/Printer.java
deleted file mode 100644
index 773f129ad9..0000000000
--- a/src/asm/scala/tools/asm/util/Printer.java
+++ /dev/null
@@ -1,589 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.asm.Attribute;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * An abstract converter from visit events to text.
- *
- * @author Eric Bruneton
- */
-public abstract class Printer {
-
- /**
- * The names of the Java Virtual Machine opcodes.
- */
- public static final String[] OPCODES;
-
- /**
- * The names of the for <code>operand</code> parameter values of the
- * {@link scala.tools.asm.MethodVisitor#visitIntInsn} method when
- * <code>opcode</code> is <code>NEWARRAY</code>.
- */
- public static final String[] TYPES;
-
- /**
- * The names of the <code>tag</code> field values for
- * {@link scala.tools.asm.Handle}.
- */
- public static final String[] HANDLE_TAG;
-
- static {
- String s = "NOP,ACONST_NULL,ICONST_M1,ICONST_0,ICONST_1,ICONST_2,"
- + "ICONST_3,ICONST_4,ICONST_5,LCONST_0,LCONST_1,FCONST_0,"
- + "FCONST_1,FCONST_2,DCONST_0,DCONST_1,BIPUSH,SIPUSH,LDC,,,"
- + "ILOAD,LLOAD,FLOAD,DLOAD,ALOAD,,,,,,,,,,,,,,,,,,,,,IALOAD,"
- + "LALOAD,FALOAD,DALOAD,AALOAD,BALOAD,CALOAD,SALOAD,ISTORE,"
- + "LSTORE,FSTORE,DSTORE,ASTORE,,,,,,,,,,,,,,,,,,,,,IASTORE,"
- + "LASTORE,FASTORE,DASTORE,AASTORE,BASTORE,CASTORE,SASTORE,POP,"
- + "POP2,DUP,DUP_X1,DUP_X2,DUP2,DUP2_X1,DUP2_X2,SWAP,IADD,LADD,"
- + "FADD,DADD,ISUB,LSUB,FSUB,DSUB,IMUL,LMUL,FMUL,DMUL,IDIV,LDIV,"
- + "FDIV,DDIV,IREM,LREM,FREM,DREM,INEG,LNEG,FNEG,DNEG,ISHL,LSHL,"
- + "ISHR,LSHR,IUSHR,LUSHR,IAND,LAND,IOR,LOR,IXOR,LXOR,IINC,I2L,"
- + "I2F,I2D,L2I,L2F,L2D,F2I,F2L,F2D,D2I,D2L,D2F,I2B,I2C,I2S,LCMP,"
- + "FCMPL,FCMPG,DCMPL,DCMPG,IFEQ,IFNE,IFLT,IFGE,IFGT,IFLE,"
- + "IF_ICMPEQ,IF_ICMPNE,IF_ICMPLT,IF_ICMPGE,IF_ICMPGT,IF_ICMPLE,"
- + "IF_ACMPEQ,IF_ACMPNE,GOTO,JSR,RET,TABLESWITCH,LOOKUPSWITCH,"
- + "IRETURN,LRETURN,FRETURN,DRETURN,ARETURN,RETURN,GETSTATIC,"
- + "PUTSTATIC,GETFIELD,PUTFIELD,INVOKEVIRTUAL,INVOKESPECIAL,"
- + "INVOKESTATIC,INVOKEINTERFACE,INVOKEDYNAMIC,NEW,NEWARRAY,"
- + "ANEWARRAY,ARRAYLENGTH,ATHROW,CHECKCAST,INSTANCEOF,"
- + "MONITORENTER,MONITOREXIT,,MULTIANEWARRAY,IFNULL,IFNONNULL,";
- OPCODES = new String[200];
- int i = 0;
- int j = 0;
- int l;
- while ((l = s.indexOf(',', j)) > 0) {
- OPCODES[i++] = j + 1 == l ? null : s.substring(j, l);
- j = l + 1;
- }
-
- s = "T_BOOLEAN,T_CHAR,T_FLOAT,T_DOUBLE,T_BYTE,T_SHORT,T_INT,T_LONG,";
- TYPES = new String[12];
- j = 0;
- i = 4;
- while ((l = s.indexOf(',', j)) > 0) {
- TYPES[i++] = s.substring(j, l);
- j = l + 1;
- }
-
- s = "H_GETFIELD,H_GETSTATIC,H_PUTFIELD,H_PUTSTATIC,"
- + "H_INVOKEVIRTUAL,H_INVOKESTATIC,H_INVOKESPECIAL,"
- + "H_NEWINVOKESPECIAL,H_INVOKEINTERFACE,";
- HANDLE_TAG = new String[10];
- j = 0;
- i = 1;
- while ((l = s.indexOf(',', j)) > 0) {
- HANDLE_TAG[i++] = s.substring(j, l);
- j = l + 1;
- }
- }
-
- /**
- * The ASM API version implemented by this class. The value of this field
- * must be one of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- protected final int api;
-
- /**
- * A buffer that can be used to create strings.
- */
- protected final StringBuffer buf;
-
- /**
- * The text to be printed. Since the code of methods is not necessarily
- * visited in sequential order, one method after the other, but can be
- * interlaced (some instructions from method one, then some instructions
- * from method two, then some instructions from method one again...), it is
- * not possible to print the visited instructions directly to a sequential
- * stream. A class is therefore printed in a two steps process: a string
- * tree is constructed during the visit, and printed to a sequential stream
- * at the end of the visit. This string tree is stored in this field, as a
- * string list that can contain other string lists, which can themselves
- * contain other string lists, and so on.
- */
- public final List<Object> text;
-
- /**
- * Constructs a new {@link Printer}.
- */
- protected Printer(final int api) {
- this.api = api;
- this.buf = new StringBuffer();
- this.text = new ArrayList<Object>();
- }
-
- /**
- * Class header. See {@link scala.tools.asm.ClassVisitor#visit}.
- */
- public abstract void visit(final int version, final int access,
- final String name, final String signature, final String superName,
- final String[] interfaces);
-
- /**
- * Class source. See {@link scala.tools.asm.ClassVisitor#visitSource}.
- */
- public abstract void visitSource(final String file, final String debug);
-
- /**
- * Class outer class. See
- * {@link scala.tools.asm.ClassVisitor#visitOuterClass}.
- */
- public abstract void visitOuterClass(final String owner, final String name,
- final String desc);
-
- /**
- * Class annotation. See
- * {@link scala.tools.asm.ClassVisitor#visitAnnotation}.
- */
- public abstract Printer visitClassAnnotation(final String desc,
- final boolean visible);
-
- /**
- * Class type annotation. See
- * {@link scala.tools.asm.ClassVisitor#visitTypeAnnotation}.
- */
- public Printer visitClassTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- throw new RuntimeException("Must be overridden");
- }
-
- /**
- * Class attribute. See
- * {@link scala.tools.asm.ClassVisitor#visitAttribute}.
- */
- public abstract void visitClassAttribute(final Attribute attr);
-
- /**
- * Class inner name. See
- * {@link scala.tools.asm.ClassVisitor#visitInnerClass}.
- */
- public abstract void visitInnerClass(final String name,
- final String outerName, final String innerName, final int access);
-
- /**
- * Class field. See {@link scala.tools.asm.ClassVisitor#visitField}.
- */
- public abstract Printer visitField(final int access, final String name,
- final String desc, final String signature, final Object value);
-
- /**
- * Class method. See {@link scala.tools.asm.ClassVisitor#visitMethod}.
- */
- public abstract Printer visitMethod(final int access, final String name,
- final String desc, final String signature, final String[] exceptions);
-
- /**
- * Class end. See {@link scala.tools.asm.ClassVisitor#visitEnd}.
- */
- public abstract void visitClassEnd();
-
- // ------------------------------------------------------------------------
- // Annotations
- // ------------------------------------------------------------------------
-
- /**
- * Annotation value. See {@link scala.tools.asm.AnnotationVisitor#visit}.
- */
- public abstract void visit(final String name, final Object value);
-
- /**
- * Annotation enum value. See
- * {@link scala.tools.asm.AnnotationVisitor#visitEnum}.
- */
- public abstract void visitEnum(final String name, final String desc,
- final String value);
-
- /**
- * Nested annotation value. See
- * {@link scala.tools.asm.AnnotationVisitor#visitAnnotation}.
- */
- public abstract Printer visitAnnotation(final String name, final String desc);
-
- /**
- * Annotation array value. See
- * {@link scala.tools.asm.AnnotationVisitor#visitArray}.
- */
- public abstract Printer visitArray(final String name);
-
- /**
- * Annotation end. See {@link scala.tools.asm.AnnotationVisitor#visitEnd}.
- */
- public abstract void visitAnnotationEnd();
-
- // ------------------------------------------------------------------------
- // Fields
- // ------------------------------------------------------------------------
-
- /**
- * Field annotation. See
- * {@link scala.tools.asm.FieldVisitor#visitAnnotation}.
- */
- public abstract Printer visitFieldAnnotation(final String desc,
- final boolean visible);
-
- /**
- * Field type annotation. See
- * {@link scala.tools.asm.FieldVisitor#visitTypeAnnotation}.
- */
- public Printer visitFieldTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- throw new RuntimeException("Must be overridden");
- }
-
- /**
- * Field attribute. See
- * {@link scala.tools.asm.FieldVisitor#visitAttribute}.
- */
- public abstract void visitFieldAttribute(final Attribute attr);
-
- /**
- * Field end. See {@link scala.tools.asm.FieldVisitor#visitEnd}.
- */
- public abstract void visitFieldEnd();
-
- // ------------------------------------------------------------------------
- // Methods
- // ------------------------------------------------------------------------
-
- /**
- * Method parameter. See
- * {@link scala.tools.asm.MethodVisitor#visitParameter(String, int)}.
- */
- public void visitParameter(String name, int access) {
- throw new RuntimeException("Must be overridden");
- }
-
- /**
- * Method default annotation. See
- * {@link scala.tools.asm.MethodVisitor#visitAnnotationDefault}.
- */
- public abstract Printer visitAnnotationDefault();
-
- /**
- * Method annotation. See
- * {@link scala.tools.asm.MethodVisitor#visitAnnotation}.
- */
- public abstract Printer visitMethodAnnotation(final String desc,
- final boolean visible);
-
- /**
- * Method type annotation. See
- * {@link scala.tools.asm.MethodVisitor#visitTypeAnnotation}.
- */
- public Printer visitMethodTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- throw new RuntimeException("Must be overridden");
- }
-
- /**
- * Method parameter annotation. See
- * {@link scala.tools.asm.MethodVisitor#visitParameterAnnotation}.
- */
- public abstract Printer visitParameterAnnotation(final int parameter,
- final String desc, final boolean visible);
-
- /**
- * Method attribute. See
- * {@link scala.tools.asm.MethodVisitor#visitAttribute}.
- */
- public abstract void visitMethodAttribute(final Attribute attr);
-
- /**
- * Method start. See {@link scala.tools.asm.MethodVisitor#visitCode}.
- */
- public abstract void visitCode();
-
- /**
- * Method stack frame. See
- * {@link scala.tools.asm.MethodVisitor#visitFrame}.
- */
- public abstract void visitFrame(final int type, final int nLocal,
- final Object[] local, final int nStack, final Object[] stack);
-
- /**
- * Method instruction. See {@link scala.tools.asm.MethodVisitor#visitInsn}
- * .
- */
- public abstract void visitInsn(final int opcode);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitIntInsn}.
- */
- public abstract void visitIntInsn(final int opcode, final int operand);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitVarInsn}.
- */
- public abstract void visitVarInsn(final int opcode, final int var);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitTypeInsn}.
- */
- public abstract void visitTypeInsn(final int opcode, final String type);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitFieldInsn}.
- */
- public abstract void visitFieldInsn(final int opcode, final String owner,
- final String name, final String desc);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitMethodInsn}.
- */
- @Deprecated
- public void visitMethodInsn(final int opcode, final String owner,
- final String name, final String desc) {
- if (api >= Opcodes.ASM5) {
- boolean itf = opcode == Opcodes.INVOKEINTERFACE;
- visitMethodInsn(opcode, owner, name, desc, itf);
- return;
- }
- throw new RuntimeException("Must be overridden");
- }
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitMethodInsn}.
- */
- public void visitMethodInsn(final int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- if (api < Opcodes.ASM5) {
- if (itf != (opcode == Opcodes.INVOKEINTERFACE)) {
- throw new IllegalArgumentException(
- "INVOKESPECIAL/STATIC on interfaces require ASM 5");
- }
- visitMethodInsn(opcode, owner, name, desc);
- return;
- }
- throw new RuntimeException("Must be overridden");
- }
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitInvokeDynamicInsn}.
- */
- public abstract void visitInvokeDynamicInsn(String name, String desc,
- Handle bsm, Object... bsmArgs);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitJumpInsn}.
- */
- public abstract void visitJumpInsn(final int opcode, final Label label);
-
- /**
- * Method label. See {@link scala.tools.asm.MethodVisitor#visitLabel}.
- */
- public abstract void visitLabel(final Label label);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitLdcInsn}.
- */
- public abstract void visitLdcInsn(final Object cst);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitIincInsn}.
- */
- public abstract void visitIincInsn(final int var, final int increment);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitTableSwitchInsn}.
- */
- public abstract void visitTableSwitchInsn(final int min, final int max,
- final Label dflt, final Label... labels);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitLookupSwitchInsn}.
- */
- public abstract void visitLookupSwitchInsn(final Label dflt,
- final int[] keys, final Label[] labels);
-
- /**
- * Method instruction. See
- * {@link scala.tools.asm.MethodVisitor#visitMultiANewArrayInsn}.
- */
- public abstract void visitMultiANewArrayInsn(final String desc,
- final int dims);
-
- /**
- * Instruction type annotation. See
- * {@link scala.tools.asm.MethodVisitor#visitInsnAnnotation}.
- */
- public Printer visitInsnAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- throw new RuntimeException("Must be overridden");
- }
-
- /**
- * Method exception handler. See
- * {@link scala.tools.asm.MethodVisitor#visitTryCatchBlock}.
- */
- public abstract void visitTryCatchBlock(final Label start, final Label end,
- final Label handler, final String type);
-
- /**
- * Try catch block type annotation. See
- * {@link scala.tools.asm.MethodVisitor#visitTryCatchAnnotation}.
- */
- public Printer visitTryCatchAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- throw new RuntimeException("Must be overridden");
- }
-
- /**
- * Method debug info. See
- * {@link scala.tools.asm.MethodVisitor#visitLocalVariable}.
- */
- public abstract void visitLocalVariable(final String name,
- final String desc, final String signature, final Label start,
- final Label end, final int index);
-
- /**
- * Local variable type annotation. See
- * {@link scala.tools.asm.MethodVisitor#visitTryCatchAnnotation}.
- */
- public Printer visitLocalVariableAnnotation(final int typeRef,
- final TypePath typePath, final Label[] start, final Label[] end,
- final int[] index, final String desc, final boolean visible) {
- throw new RuntimeException("Must be overridden");
- }
-
- /**
- * Method debug info. See
- * {@link scala.tools.asm.MethodVisitor#visitLineNumber}.
- */
- public abstract void visitLineNumber(final int line, final Label start);
-
- /**
- * Method max stack and max locals. See
- * {@link scala.tools.asm.MethodVisitor#visitMaxs}.
- */
- public abstract void visitMaxs(final int maxStack, final int maxLocals);
-
- /**
- * Method end. See {@link scala.tools.asm.MethodVisitor#visitEnd}.
- */
- public abstract void visitMethodEnd();
-
- /**
- * Returns the text constructed by this visitor.
- *
- * @return the text constructed by this visitor.
- */
- public List<Object> getText() {
- return text;
- }
-
- /**
- * Prints the text constructed by this visitor.
- *
- * @param pw
- * the print writer to be used.
- */
- public void print(final PrintWriter pw) {
- printList(pw, text);
- }
-
- /**
- * Appends a quoted string to a given buffer.
- *
- * @param buf
- * the buffer where the string must be added.
- * @param s
- * the string to be added.
- */
- public static void appendString(final StringBuffer buf, final String s) {
- buf.append('\"');
- for (int i = 0; i < s.length(); ++i) {
- char c = s.charAt(i);
- if (c == '\n') {
- buf.append("\\n");
- } else if (c == '\r') {
- buf.append("\\r");
- } else if (c == '\\') {
- buf.append("\\\\");
- } else if (c == '"') {
- buf.append("\\\"");
- } else if (c < 0x20 || c > 0x7f) {
- buf.append("\\u");
- if (c < 0x10) {
- buf.append("000");
- } else if (c < 0x100) {
- buf.append("00");
- } else if (c < 0x1000) {
- buf.append('0');
- }
- buf.append(Integer.toString(c, 16));
- } else {
- buf.append(c);
- }
- }
- buf.append('\"');
- }
-
- /**
- * Prints the given string tree.
- *
- * @param pw
- * the writer to be used to print the tree.
- * @param l
- * a string tree, i.e., a string list that can contain other
- * string lists, and so on recursively.
- */
- static void printList(final PrintWriter pw, final List<?> l) {
- for (int i = 0; i < l.size(); ++i) {
- Object o = l.get(i);
- if (o instanceof List) {
- printList(pw, (List<?>) o);
- } else {
- pw.print(o.toString());
- }
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/util/Textifiable.java b/src/asm/scala/tools/asm/util/Textifiable.java
deleted file mode 100644
index 85e051e2f8..0000000000
--- a/src/asm/scala/tools/asm/util/Textifiable.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.util.Map;
-
-import scala.tools.asm.Label;
-
-/**
- * An {@link scala.tools.asm.Attribute Attribute} that can print a readable
- * representation of itself.
- *
- * Implementations should construct readable output from an attribute data
- * structure. Such representation could be used in unit test assertions.
- *
- * @author Eugene Kuleshov
- */
-public interface Textifiable {
-
- /**
- * Build a human readable representation of this attribute.
- *
- * @param buf
- * a buffer used for printing Java code.
- * @param labelNames
- * map of label instances to their names.
- */
- void textify(StringBuffer buf, Map<Label, String> labelNames);
-}
diff --git a/src/asm/scala/tools/asm/util/Textifier.java b/src/asm/scala/tools/asm/util/Textifier.java
deleted file mode 100644
index 373e46f5ed..0000000000
--- a/src/asm/scala/tools/asm/util/Textifier.java
+++ /dev/null
@@ -1,1459 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.FileInputStream;
-import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassReader;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.Type;
-import scala.tools.asm.TypePath;
-import scala.tools.asm.TypeReference;
-import scala.tools.asm.signature.SignatureReader;
-
-/**
- * A {@link Printer} that prints a disassembled view of the classes it visits.
- *
- * @author Eric Bruneton
- */
-public class Textifier extends Printer {
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for internal
- * type names in bytecode notation.
- */
- public static final int INTERNAL_NAME = 0;
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for field
- * descriptors, formatted in bytecode notation
- */
- public static final int FIELD_DESCRIPTOR = 1;
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for field
- * signatures, formatted in bytecode notation
- */
- public static final int FIELD_SIGNATURE = 2;
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for method
- * descriptors, formatted in bytecode notation
- */
- public static final int METHOD_DESCRIPTOR = 3;
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for method
- * signatures, formatted in bytecode notation
- */
- public static final int METHOD_SIGNATURE = 4;
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for class
- * signatures, formatted in bytecode notation
- */
- public static final int CLASS_SIGNATURE = 5;
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for field or
- * method return value signatures, formatted in default Java notation
- * (non-bytecode)
- */
- public static final int TYPE_DECLARATION = 6;
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for class
- * signatures, formatted in default Java notation (non-bytecode)
- */
- public static final int CLASS_DECLARATION = 7;
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for method
- * parameter signatures, formatted in default Java notation (non-bytecode)
- */
- public static final int PARAMETERS_DECLARATION = 8;
-
- /**
- * Constant used in {@link #appendDescriptor appendDescriptor} for handle
- * descriptors, formatted in bytecode notation
- */
- public static final int HANDLE_DESCRIPTOR = 9;
-
- /**
- * Tab for class members.
- */
- protected String tab = " ";
-
- /**
- * Tab for bytecode instructions.
- */
- protected String tab2 = " ";
-
- /**
- * Tab for table and lookup switch instructions.
- */
- protected String tab3 = " ";
-
- /**
- * Tab for labels.
- */
- protected String ltab = " ";
-
- /**
- * The label names. This map associate String values to Label keys.
- */
- protected Map<Label, String> labelNames;
-
- /**
- * Class access flags
- */
- private int access;
-
- private int valueNumber = 0;
-
- /**
- * Constructs a new {@link Textifier}. <i>Subclasses must not use this
- * constructor</i>. Instead, they must use the {@link #Textifier(int)}
- * version.
- *
- * @throws IllegalStateException
- * If a subclass calls this constructor.
- */
- public Textifier() {
- this(Opcodes.ASM5);
- if (getClass() != Textifier.class) {
- throw new IllegalStateException();
- }
- }
-
- /**
- * Constructs a new {@link Textifier}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
- */
- protected Textifier(final int api) {
- super(api);
- }
-
- /**
- * Prints a disassembled view of the given class to the standard output.
- * <p>
- * Usage: Textifier [-debug] &lt;binary class name or class file name &gt;
- *
- * @param args
- * the command line arguments.
- *
- * @throws Exception
- * if the class cannot be found, or if an IO exception occurs.
- */
- public static void main(final String[] args) throws Exception {
- int i = 0;
- int flags = ClassReader.SKIP_DEBUG;
-
- boolean ok = true;
- if (args.length < 1 || args.length > 2) {
- ok = false;
- }
- if (ok && "-debug".equals(args[0])) {
- i = 1;
- flags = 0;
- if (args.length != 2) {
- ok = false;
- }
- }
- if (!ok) {
- System.err
- .println("Prints a disassembled view of the given class.");
- System.err.println("Usage: Textifier [-debug] "
- + "<fully qualified class name or class file name>");
- return;
- }
- ClassReader cr;
- if (args[i].endsWith(".class") || args[i].indexOf('\\') > -1
- || args[i].indexOf('/') > -1) {
- cr = new ClassReader(new FileInputStream(args[i]));
- } else {
- cr = new ClassReader(args[i]);
- }
- cr.accept(new TraceClassVisitor(new PrintWriter(System.out)), flags);
- }
-
- // ------------------------------------------------------------------------
- // Classes
- // ------------------------------------------------------------------------
-
- @Override
- public void visit(final int version, final int access, final String name,
- final String signature, final String superName,
- final String[] interfaces) {
- this.access = access;
- int major = version & 0xFFFF;
- int minor = version >>> 16;
- buf.setLength(0);
- buf.append("// class version ").append(major).append('.').append(minor)
- .append(" (").append(version).append(")\n");
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- buf.append("// DEPRECATED\n");
- }
- buf.append("// access flags 0x")
- .append(Integer.toHexString(access).toUpperCase()).append('\n');
-
- appendDescriptor(CLASS_SIGNATURE, signature);
- if (signature != null) {
- TraceSignatureVisitor sv = new TraceSignatureVisitor(access);
- SignatureReader r = new SignatureReader(signature);
- r.accept(sv);
- buf.append("// declaration: ").append(name)
- .append(sv.getDeclaration()).append('\n');
- }
-
- appendAccess(access & ~Opcodes.ACC_SUPER);
- if ((access & Opcodes.ACC_ANNOTATION) != 0) {
- buf.append("@interface ");
- } else if ((access & Opcodes.ACC_INTERFACE) != 0) {
- buf.append("interface ");
- } else if ((access & Opcodes.ACC_ENUM) == 0) {
- buf.append("class ");
- }
- appendDescriptor(INTERNAL_NAME, name);
-
- if (superName != null && !"java/lang/Object".equals(superName)) {
- buf.append(" extends ");
- appendDescriptor(INTERNAL_NAME, superName);
- buf.append(' ');
- }
- if (interfaces != null && interfaces.length > 0) {
- buf.append(" implements ");
- for (int i = 0; i < interfaces.length; ++i) {
- appendDescriptor(INTERNAL_NAME, interfaces[i]);
- buf.append(' ');
- }
- }
- buf.append(" {\n\n");
-
- text.add(buf.toString());
- }
-
- @Override
- public void visitSource(final String file, final String debug) {
- buf.setLength(0);
- if (file != null) {
- buf.append(tab).append("// compiled from: ").append(file)
- .append('\n');
- }
- if (debug != null) {
- buf.append(tab).append("// debug info: ").append(debug)
- .append('\n');
- }
- if (buf.length() > 0) {
- text.add(buf.toString());
- }
- }
-
- @Override
- public void visitOuterClass(final String owner, final String name,
- final String desc) {
- buf.setLength(0);
- buf.append(tab).append("OUTERCLASS ");
- appendDescriptor(INTERNAL_NAME, owner);
- buf.append(' ');
- if (name != null) {
- buf.append(name).append(' ');
- }
- appendDescriptor(METHOD_DESCRIPTOR, desc);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public Textifier visitClassAnnotation(final String desc,
- final boolean visible) {
- text.add("\n");
- return visitAnnotation(desc, visible);
- }
-
- @Override
- public Printer visitClassTypeAnnotation(int typeRef, TypePath typePath,
- String desc, boolean visible) {
- text.add("\n");
- return visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
-
- @Override
- public void visitClassAttribute(final Attribute attr) {
- text.add("\n");
- visitAttribute(attr);
- }
-
- @Override
- public void visitInnerClass(final String name, final String outerName,
- final String innerName, final int access) {
- buf.setLength(0);
- buf.append(tab).append("// access flags 0x");
- buf.append(
- Integer.toHexString(access & ~Opcodes.ACC_SUPER).toUpperCase())
- .append('\n');
- buf.append(tab);
- appendAccess(access);
- buf.append("INNERCLASS ");
- appendDescriptor(INTERNAL_NAME, name);
- buf.append(' ');
- appendDescriptor(INTERNAL_NAME, outerName);
- buf.append(' ');
- appendDescriptor(INTERNAL_NAME, innerName);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public Textifier visitField(final int access, final String name,
- final String desc, final String signature, final Object value) {
- buf.setLength(0);
- buf.append('\n');
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- buf.append(tab).append("// DEPRECATED\n");
- }
- buf.append(tab).append("// access flags 0x")
- .append(Integer.toHexString(access).toUpperCase()).append('\n');
- if (signature != null) {
- buf.append(tab);
- appendDescriptor(FIELD_SIGNATURE, signature);
-
- TraceSignatureVisitor sv = new TraceSignatureVisitor(0);
- SignatureReader r = new SignatureReader(signature);
- r.acceptType(sv);
- buf.append(tab).append("// declaration: ")
- .append(sv.getDeclaration()).append('\n');
- }
-
- buf.append(tab);
- appendAccess(access);
-
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append(' ').append(name);
- if (value != null) {
- buf.append(" = ");
- if (value instanceof String) {
- buf.append('\"').append(value).append('\"');
- } else {
- buf.append(value);
- }
- }
-
- buf.append('\n');
- text.add(buf.toString());
-
- Textifier t = createTextifier();
- text.add(t.getText());
- return t;
- }
-
- @Override
- public Textifier visitMethod(final int access, final String name,
- final String desc, final String signature, final String[] exceptions) {
- buf.setLength(0);
- buf.append('\n');
- if ((access & Opcodes.ACC_DEPRECATED) != 0) {
- buf.append(tab).append("// DEPRECATED\n");
- }
- buf.append(tab).append("// access flags 0x")
- .append(Integer.toHexString(access).toUpperCase()).append('\n');
-
- if (signature != null) {
- buf.append(tab);
- appendDescriptor(METHOD_SIGNATURE, signature);
-
- TraceSignatureVisitor v = new TraceSignatureVisitor(0);
- SignatureReader r = new SignatureReader(signature);
- r.accept(v);
- String genericDecl = v.getDeclaration();
- String genericReturn = v.getReturnType();
- String genericExceptions = v.getExceptions();
-
- buf.append(tab).append("// declaration: ").append(genericReturn)
- .append(' ').append(name).append(genericDecl);
- if (genericExceptions != null) {
- buf.append(" throws ").append(genericExceptions);
- }
- buf.append('\n');
- }
-
- buf.append(tab);
- appendAccess(access & ~Opcodes.ACC_VOLATILE);
- if ((access & Opcodes.ACC_NATIVE) != 0) {
- buf.append("native ");
- }
- if ((access & Opcodes.ACC_VARARGS) != 0) {
- buf.append("varargs ");
- }
- if ((access & Opcodes.ACC_BRIDGE) != 0) {
- buf.append("bridge ");
- }
- if ((this.access & Opcodes.ACC_INTERFACE) != 0
- && (access & Opcodes.ACC_ABSTRACT) == 0
- && (access & Opcodes.ACC_STATIC) == 0) {
- buf.append("default ");
- }
-
- buf.append(name);
- appendDescriptor(METHOD_DESCRIPTOR, desc);
- if (exceptions != null && exceptions.length > 0) {
- buf.append(" throws ");
- for (int i = 0; i < exceptions.length; ++i) {
- appendDescriptor(INTERNAL_NAME, exceptions[i]);
- buf.append(' ');
- }
- }
-
- buf.append('\n');
- text.add(buf.toString());
-
- Textifier t = createTextifier();
- text.add(t.getText());
- return t;
- }
-
- @Override
- public void visitClassEnd() {
- text.add("}\n");
- }
-
- // ------------------------------------------------------------------------
- // Annotations
- // ------------------------------------------------------------------------
-
- @Override
- public void visit(final String name, final Object value) {
- buf.setLength(0);
- appendComa(valueNumber++);
-
- if (name != null) {
- buf.append(name).append('=');
- }
-
- if (value instanceof String) {
- visitString((String) value);
- } else if (value instanceof Type) {
- visitType((Type) value);
- } else if (value instanceof Byte) {
- visitByte(((Byte) value).byteValue());
- } else if (value instanceof Boolean) {
- visitBoolean(((Boolean) value).booleanValue());
- } else if (value instanceof Short) {
- visitShort(((Short) value).shortValue());
- } else if (value instanceof Character) {
- visitChar(((Character) value).charValue());
- } else if (value instanceof Integer) {
- visitInt(((Integer) value).intValue());
- } else if (value instanceof Float) {
- visitFloat(((Float) value).floatValue());
- } else if (value instanceof Long) {
- visitLong(((Long) value).longValue());
- } else if (value instanceof Double) {
- visitDouble(((Double) value).doubleValue());
- } else if (value.getClass().isArray()) {
- buf.append('{');
- if (value instanceof byte[]) {
- byte[] v = (byte[]) value;
- for (int i = 0; i < v.length; i++) {
- appendComa(i);
- visitByte(v[i]);
- }
- } else if (value instanceof boolean[]) {
- boolean[] v = (boolean[]) value;
- for (int i = 0; i < v.length; i++) {
- appendComa(i);
- visitBoolean(v[i]);
- }
- } else if (value instanceof short[]) {
- short[] v = (short[]) value;
- for (int i = 0; i < v.length; i++) {
- appendComa(i);
- visitShort(v[i]);
- }
- } else if (value instanceof char[]) {
- char[] v = (char[]) value;
- for (int i = 0; i < v.length; i++) {
- appendComa(i);
- visitChar(v[i]);
- }
- } else if (value instanceof int[]) {
- int[] v = (int[]) value;
- for (int i = 0; i < v.length; i++) {
- appendComa(i);
- visitInt(v[i]);
- }
- } else if (value instanceof long[]) {
- long[] v = (long[]) value;
- for (int i = 0; i < v.length; i++) {
- appendComa(i);
- visitLong(v[i]);
- }
- } else if (value instanceof float[]) {
- float[] v = (float[]) value;
- for (int i = 0; i < v.length; i++) {
- appendComa(i);
- visitFloat(v[i]);
- }
- } else if (value instanceof double[]) {
- double[] v = (double[]) value;
- for (int i = 0; i < v.length; i++) {
- appendComa(i);
- visitDouble(v[i]);
- }
- }
- buf.append('}');
- }
-
- text.add(buf.toString());
- }
-
- private void visitInt(final int value) {
- buf.append(value);
- }
-
- private void visitLong(final long value) {
- buf.append(value).append('L');
- }
-
- private void visitFloat(final float value) {
- buf.append(value).append('F');
- }
-
- private void visitDouble(final double value) {
- buf.append(value).append('D');
- }
-
- private void visitChar(final char value) {
- buf.append("(char)").append((int) value);
- }
-
- private void visitShort(final short value) {
- buf.append("(short)").append(value);
- }
-
- private void visitByte(final byte value) {
- buf.append("(byte)").append(value);
- }
-
- private void visitBoolean(final boolean value) {
- buf.append(value);
- }
-
- private void visitString(final String value) {
- appendString(buf, value);
- }
-
- private void visitType(final Type value) {
- buf.append(value.getClassName()).append(".class");
- }
-
- @Override
- public void visitEnum(final String name, final String desc,
- final String value) {
- buf.setLength(0);
- appendComa(valueNumber++);
- if (name != null) {
- buf.append(name).append('=');
- }
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append('.').append(value);
- text.add(buf.toString());
- }
-
- @Override
- public Textifier visitAnnotation(final String name, final String desc) {
- buf.setLength(0);
- appendComa(valueNumber++);
- if (name != null) {
- buf.append(name).append('=');
- }
- buf.append('@');
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append('(');
- text.add(buf.toString());
- Textifier t = createTextifier();
- text.add(t.getText());
- text.add(")");
- return t;
- }
-
- @Override
- public Textifier visitArray(final String name) {
- buf.setLength(0);
- appendComa(valueNumber++);
- if (name != null) {
- buf.append(name).append('=');
- }
- buf.append('{');
- text.add(buf.toString());
- Textifier t = createTextifier();
- text.add(t.getText());
- text.add("}");
- return t;
- }
-
- @Override
- public void visitAnnotationEnd() {
- }
-
- // ------------------------------------------------------------------------
- // Fields
- // ------------------------------------------------------------------------
-
- @Override
- public Textifier visitFieldAnnotation(final String desc,
- final boolean visible) {
- return visitAnnotation(desc, visible);
- }
-
- @Override
- public Printer visitFieldTypeAnnotation(int typeRef, TypePath typePath,
- String desc, boolean visible) {
- return visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
-
- @Override
- public void visitFieldAttribute(final Attribute attr) {
- visitAttribute(attr);
- }
-
- @Override
- public void visitFieldEnd() {
- }
-
- // ------------------------------------------------------------------------
- // Methods
- // ------------------------------------------------------------------------
-
- @Override
- public void visitParameter(final String name, final int access) {
- buf.setLength(0);
- buf.append(tab2).append("// parameter ");
- appendAccess(access);
- buf.append(' ').append((name == null) ? "<no name>" : name)
- .append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public Textifier visitAnnotationDefault() {
- text.add(tab2 + "default=");
- Textifier t = createTextifier();
- text.add(t.getText());
- text.add("\n");
- return t;
- }
-
- @Override
- public Textifier visitMethodAnnotation(final String desc,
- final boolean visible) {
- return visitAnnotation(desc, visible);
- }
-
- @Override
- public Printer visitMethodTypeAnnotation(int typeRef, TypePath typePath,
- String desc, boolean visible) {
- return visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
-
- @Override
- public Textifier visitParameterAnnotation(final int parameter,
- final String desc, final boolean visible) {
- buf.setLength(0);
- buf.append(tab2).append('@');
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append('(');
- text.add(buf.toString());
- Textifier t = createTextifier();
- text.add(t.getText());
- text.add(visible ? ") // parameter " : ") // invisible, parameter ");
- text.add(new Integer(parameter));
- text.add("\n");
- return t;
- }
-
- @Override
- public void visitMethodAttribute(final Attribute attr) {
- buf.setLength(0);
- buf.append(tab).append("ATTRIBUTE ");
- appendDescriptor(-1, attr.type);
-
- if (attr instanceof Textifiable) {
- ((Textifiable) attr).textify(buf, labelNames);
- } else {
- buf.append(" : unknown\n");
- }
-
- text.add(buf.toString());
- }
-
- @Override
- public void visitCode() {
- }
-
- @Override
- public void visitFrame(final int type, final int nLocal,
- final Object[] local, final int nStack, final Object[] stack) {
- buf.setLength(0);
- buf.append(ltab);
- buf.append("FRAME ");
- switch (type) {
- case Opcodes.F_NEW:
- case Opcodes.F_FULL:
- buf.append("FULL [");
- appendFrameTypes(nLocal, local);
- buf.append("] [");
- appendFrameTypes(nStack, stack);
- buf.append(']');
- break;
- case Opcodes.F_APPEND:
- buf.append("APPEND [");
- appendFrameTypes(nLocal, local);
- buf.append(']');
- break;
- case Opcodes.F_CHOP:
- buf.append("CHOP ").append(nLocal);
- break;
- case Opcodes.F_SAME:
- buf.append("SAME");
- break;
- case Opcodes.F_SAME1:
- buf.append("SAME1 ");
- appendFrameTypes(1, stack);
- break;
- }
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitInsn(final int opcode) {
- buf.setLength(0);
- buf.append(tab2).append(OPCODES[opcode]).append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitIntInsn(final int opcode, final int operand) {
- buf.setLength(0);
- buf.append(tab2)
- .append(OPCODES[opcode])
- .append(' ')
- .append(opcode == Opcodes.NEWARRAY ? TYPES[operand] : Integer
- .toString(operand)).append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitVarInsn(final int opcode, final int var) {
- buf.setLength(0);
- buf.append(tab2).append(OPCODES[opcode]).append(' ').append(var)
- .append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitTypeInsn(final int opcode, final String type) {
- buf.setLength(0);
- buf.append(tab2).append(OPCODES[opcode]).append(' ');
- appendDescriptor(INTERNAL_NAME, type);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitFieldInsn(final int opcode, final String owner,
- final String name, final String desc) {
- buf.setLength(0);
- buf.append(tab2).append(OPCODES[opcode]).append(' ');
- appendDescriptor(INTERNAL_NAME, owner);
- buf.append('.').append(name).append(" : ");
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Deprecated
- @Override
- public void visitMethodInsn(final int opcode, final String owner,
- final String name, final String desc) {
- if (api >= Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc);
- return;
- }
- doVisitMethodInsn(opcode, owner, name, desc,
- opcode == Opcodes.INVOKEINTERFACE);
- }
-
- @Override
- public void visitMethodInsn(final int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- if (api < Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc, itf);
- return;
- }
- doVisitMethodInsn(opcode, owner, name, desc, itf);
- }
-
- private void doVisitMethodInsn(final int opcode, final String owner,
- final String name, final String desc, final boolean itf) {
- buf.setLength(0);
- buf.append(tab2).append(OPCODES[opcode]).append(' ');
- appendDescriptor(INTERNAL_NAME, owner);
- buf.append('.').append(name).append(' ');
- appendDescriptor(METHOD_DESCRIPTOR, desc);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
- Object... bsmArgs) {
- buf.setLength(0);
- buf.append(tab2).append("INVOKEDYNAMIC").append(' ');
- buf.append(name);
- appendDescriptor(METHOD_DESCRIPTOR, desc);
- buf.append(" [");
- buf.append('\n');
- buf.append(tab3);
- appendHandle(bsm);
- buf.append('\n');
- buf.append(tab3).append("// arguments:");
- if (bsmArgs.length == 0) {
- buf.append(" none");
- } else {
- buf.append('\n');
- for (int i = 0; i < bsmArgs.length; i++) {
- buf.append(tab3);
- Object cst = bsmArgs[i];
- if (cst instanceof String) {
- Printer.appendString(buf, (String) cst);
- } else if (cst instanceof Type) {
- Type type = (Type) cst;
- if(type.getSort() == Type.METHOD){
- appendDescriptor(METHOD_DESCRIPTOR, type.getDescriptor());
- } else {
- buf.append(type.getDescriptor()).append(".class");
- }
- } else if (cst instanceof Handle) {
- appendHandle((Handle) cst);
- } else {
- buf.append(cst);
- }
- buf.append(", \n");
- }
- buf.setLength(buf.length() - 3);
- }
- buf.append('\n');
- buf.append(tab2).append("]\n");
- text.add(buf.toString());
- }
-
- @Override
- public void visitJumpInsn(final int opcode, final Label label) {
- buf.setLength(0);
- buf.append(tab2).append(OPCODES[opcode]).append(' ');
- appendLabel(label);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitLabel(final Label label) {
- buf.setLength(0);
- buf.append(ltab);
- appendLabel(label);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitLdcInsn(final Object cst) {
- buf.setLength(0);
- buf.append(tab2).append("LDC ");
- if (cst instanceof String) {
- Printer.appendString(buf, (String) cst);
- } else if (cst instanceof Type) {
- buf.append(((Type) cst).getDescriptor()).append(".class");
- } else {
- buf.append(cst);
- }
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitIincInsn(final int var, final int increment) {
- buf.setLength(0);
- buf.append(tab2).append("IINC ").append(var).append(' ')
- .append(increment).append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitTableSwitchInsn(final int min, final int max,
- final Label dflt, final Label... labels) {
- buf.setLength(0);
- buf.append(tab2).append("TABLESWITCH\n");
- for (int i = 0; i < labels.length; ++i) {
- buf.append(tab3).append(min + i).append(": ");
- appendLabel(labels[i]);
- buf.append('\n');
- }
- buf.append(tab3).append("default: ");
- appendLabel(dflt);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
- final Label[] labels) {
- buf.setLength(0);
- buf.append(tab2).append("LOOKUPSWITCH\n");
- for (int i = 0; i < labels.length; ++i) {
- buf.append(tab3).append(keys[i]).append(": ");
- appendLabel(labels[i]);
- buf.append('\n');
- }
- buf.append(tab3).append("default: ");
- appendLabel(dflt);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitMultiANewArrayInsn(final String desc, final int dims) {
- buf.setLength(0);
- buf.append(tab2).append("MULTIANEWARRAY ");
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append(' ').append(dims).append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public Printer visitInsnAnnotation(int typeRef, TypePath typePath,
- String desc, boolean visible) {
- return visitTypeAnnotation(typeRef, typePath, desc, visible);
- }
-
- @Override
- public void visitTryCatchBlock(final Label start, final Label end,
- final Label handler, final String type) {
- buf.setLength(0);
- buf.append(tab2).append("TRYCATCHBLOCK ");
- appendLabel(start);
- buf.append(' ');
- appendLabel(end);
- buf.append(' ');
- appendLabel(handler);
- buf.append(' ');
- appendDescriptor(INTERNAL_NAME, type);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public Printer visitTryCatchAnnotation(int typeRef, TypePath typePath,
- String desc, boolean visible) {
- buf.setLength(0);
- buf.append(tab2).append("TRYCATCHBLOCK @");
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append('(');
- text.add(buf.toString());
- Textifier t = createTextifier();
- text.add(t.getText());
- buf.setLength(0);
- buf.append(") : ");
- appendTypeReference(typeRef);
- buf.append(", ").append(typePath);
- buf.append(visible ? "\n" : " // invisible\n");
- text.add(buf.toString());
- return t;
- }
-
- @Override
- public void visitLocalVariable(final String name, final String desc,
- final String signature, final Label start, final Label end,
- final int index) {
- buf.setLength(0);
- buf.append(tab2).append("LOCALVARIABLE ").append(name).append(' ');
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append(' ');
- appendLabel(start);
- buf.append(' ');
- appendLabel(end);
- buf.append(' ').append(index).append('\n');
-
- if (signature != null) {
- buf.append(tab2);
- appendDescriptor(FIELD_SIGNATURE, signature);
-
- TraceSignatureVisitor sv = new TraceSignatureVisitor(0);
- SignatureReader r = new SignatureReader(signature);
- r.acceptType(sv);
- buf.append(tab2).append("// declaration: ")
- .append(sv.getDeclaration()).append('\n');
- }
- text.add(buf.toString());
- }
-
- @Override
- public Printer visitLocalVariableAnnotation(int typeRef, TypePath typePath,
- Label[] start, Label[] end, int[] index, String desc,
- boolean visible) {
- buf.setLength(0);
- buf.append(tab2).append("LOCALVARIABLE @");
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append('(');
- text.add(buf.toString());
- Textifier t = createTextifier();
- text.add(t.getText());
- buf.setLength(0);
- buf.append(") : ");
- appendTypeReference(typeRef);
- buf.append(", ").append(typePath);
- for (int i = 0; i < start.length; ++i) {
- buf.append(" [ ");
- appendLabel(start[i]);
- buf.append(" - ");
- appendLabel(end[i]);
- buf.append(" - ").append(index[i]).append(" ]");
- }
- buf.append(visible ? "\n" : " // invisible\n");
- text.add(buf.toString());
- return t;
- }
-
- @Override
- public void visitLineNumber(final int line, final Label start) {
- buf.setLength(0);
- buf.append(tab2).append("LINENUMBER ").append(line).append(' ');
- appendLabel(start);
- buf.append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitMaxs(final int maxStack, final int maxLocals) {
- buf.setLength(0);
- buf.append(tab2).append("MAXSTACK = ").append(maxStack).append('\n');
- text.add(buf.toString());
-
- buf.setLength(0);
- buf.append(tab2).append("MAXLOCALS = ").append(maxLocals).append('\n');
- text.add(buf.toString());
- }
-
- @Override
- public void visitMethodEnd() {
- }
-
- // ------------------------------------------------------------------------
- // Common methods
- // ------------------------------------------------------------------------
-
- /**
- * Prints a disassembled view of the given annotation.
- *
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values.
- */
- public Textifier visitAnnotation(final String desc, final boolean visible) {
- buf.setLength(0);
- buf.append(tab).append('@');
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append('(');
- text.add(buf.toString());
- Textifier t = createTextifier();
- text.add(t.getText());
- text.add(visible ? ")\n" : ") // invisible\n");
- return t;
- }
-
- /**
- * Prints a disassembled view of the given type annotation.
- *
- * @param typeRef
- * a reference to the annotated type. See {@link TypeReference}.
- * @param typePath
- * the path to the annotated type argument, wildcard bound, array
- * element type, or static inner type within 'typeRef'. May be
- * <tt>null</tt> if the annotation targets 'typeRef' as a whole.
- * @param desc
- * the class descriptor of the annotation class.
- * @param visible
- * <tt>true</tt> if the annotation is visible at runtime.
- * @return a visitor to visit the annotation values.
- */
- public Textifier visitTypeAnnotation(final int typeRef,
- final TypePath typePath, final String desc, final boolean visible) {
- buf.setLength(0);
- buf.append(tab).append('@');
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- buf.append('(');
- text.add(buf.toString());
- Textifier t = createTextifier();
- text.add(t.getText());
- buf.setLength(0);
- buf.append(") : ");
- appendTypeReference(typeRef);
- buf.append(", ").append(typePath);
- buf.append(visible ? "\n" : " // invisible\n");
- text.add(buf.toString());
- return t;
- }
-
- /**
- * Prints a disassembled view of the given attribute.
- *
- * @param attr
- * an attribute.
- */
- public void visitAttribute(final Attribute attr) {
- buf.setLength(0);
- buf.append(tab).append("ATTRIBUTE ");
- appendDescriptor(-1, attr.type);
-
- if (attr instanceof Textifiable) {
- ((Textifiable) attr).textify(buf, null);
- } else {
- buf.append(" : unknown\n");
- }
-
- text.add(buf.toString());
- }
-
- // ------------------------------------------------------------------------
- // Utility methods
- // ------------------------------------------------------------------------
-
- /**
- * Creates a new TraceVisitor instance.
- *
- * @return a new TraceVisitor.
- */
- protected Textifier createTextifier() {
- return new Textifier();
- }
-
- /**
- * Appends an internal name, a type descriptor or a type signature to
- * {@link #buf buf}.
- *
- * @param type
- * indicates if desc is an internal name, a field descriptor, a
- * method descriptor, a class signature, ...
- * @param desc
- * an internal name, type descriptor, or type signature. May be
- * <tt>null</tt>.
- */
- protected void appendDescriptor(final int type, final String desc) {
- if (type == CLASS_SIGNATURE || type == FIELD_SIGNATURE
- || type == METHOD_SIGNATURE) {
- if (desc != null) {
- buf.append("// signature ").append(desc).append('\n');
- }
- } else {
- buf.append(desc);
- }
- }
-
- /**
- * Appends the name of the given label to {@link #buf buf}. Creates a new
- * label name if the given label does not yet have one.
- *
- * @param l
- * a label.
- */
- protected void appendLabel(final Label l) {
- if (labelNames == null) {
- labelNames = new HashMap<Label, String>();
- }
- String name = labelNames.get(l);
- if (name == null) {
- name = "L" + labelNames.size();
- labelNames.put(l, name);
- }
- buf.append(name);
- }
-
- /**
- * Appends the information about the given handle to {@link #buf buf}.
- *
- * @param h
- * a handle, non null.
- */
- protected void appendHandle(final Handle h) {
- int tag = h.getTag();
- buf.append("// handle kind 0x").append(Integer.toHexString(tag))
- .append(" : ");
- boolean isMethodHandle = false;
- switch (tag) {
- case Opcodes.H_GETFIELD:
- buf.append("GETFIELD");
- break;
- case Opcodes.H_GETSTATIC:
- buf.append("GETSTATIC");
- break;
- case Opcodes.H_PUTFIELD:
- buf.append("PUTFIELD");
- break;
- case Opcodes.H_PUTSTATIC:
- buf.append("PUTSTATIC");
- break;
- case Opcodes.H_INVOKEINTERFACE:
- buf.append("INVOKEINTERFACE");
- isMethodHandle = true;
- break;
- case Opcodes.H_INVOKESPECIAL:
- buf.append("INVOKESPECIAL");
- isMethodHandle = true;
- break;
- case Opcodes.H_INVOKESTATIC:
- buf.append("INVOKESTATIC");
- isMethodHandle = true;
- break;
- case Opcodes.H_INVOKEVIRTUAL:
- buf.append("INVOKEVIRTUAL");
- isMethodHandle = true;
- break;
- case Opcodes.H_NEWINVOKESPECIAL:
- buf.append("NEWINVOKESPECIAL");
- isMethodHandle = true;
- break;
- }
- buf.append('\n');
- buf.append(tab3);
- appendDescriptor(INTERNAL_NAME, h.getOwner());
- buf.append('.');
- buf.append(h.getName());
- if(!isMethodHandle){
- buf.append('(');
- }
- appendDescriptor(HANDLE_DESCRIPTOR, h.getDesc());
- if(!isMethodHandle){
- buf.append(')');
- }
- }
-
- /**
- * Appends a string representation of the given access modifiers to
- * {@link #buf buf}.
- *
- * @param access
- * some access modifiers.
- */
- private void appendAccess(final int access) {
- if ((access & Opcodes.ACC_PUBLIC) != 0) {
- buf.append("public ");
- }
- if ((access & Opcodes.ACC_PRIVATE) != 0) {
- buf.append("private ");
- }
- if ((access & Opcodes.ACC_PROTECTED) != 0) {
- buf.append("protected ");
- }
- if ((access & Opcodes.ACC_FINAL) != 0) {
- buf.append("final ");
- }
- if ((access & Opcodes.ACC_STATIC) != 0) {
- buf.append("static ");
- }
- if ((access & Opcodes.ACC_SYNCHRONIZED) != 0) {
- buf.append("synchronized ");
- }
- if ((access & Opcodes.ACC_VOLATILE) != 0) {
- buf.append("volatile ");
- }
- if ((access & Opcodes.ACC_TRANSIENT) != 0) {
- buf.append("transient ");
- }
- if ((access & Opcodes.ACC_ABSTRACT) != 0) {
- buf.append("abstract ");
- }
- if ((access & Opcodes.ACC_STRICT) != 0) {
- buf.append("strictfp ");
- }
- if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
- buf.append("synthetic ");
- }
- if ((access & Opcodes.ACC_MANDATED) != 0) {
- buf.append("mandated ");
- }
- if ((access & Opcodes.ACC_ENUM) != 0) {
- buf.append("enum ");
- }
- }
-
- private void appendComa(final int i) {
- if (i != 0) {
- buf.append(", ");
- }
- }
-
- private void appendTypeReference(final int typeRef) {
- TypeReference ref = new TypeReference(typeRef);
- switch (ref.getSort()) {
- case TypeReference.CLASS_TYPE_PARAMETER:
- buf.append("CLASS_TYPE_PARAMETER ").append(
- ref.getTypeParameterIndex());
- break;
- case TypeReference.METHOD_TYPE_PARAMETER:
- buf.append("METHOD_TYPE_PARAMETER ").append(
- ref.getTypeParameterIndex());
- break;
- case TypeReference.CLASS_EXTENDS:
- buf.append("CLASS_EXTENDS ").append(ref.getSuperTypeIndex());
- break;
- case TypeReference.CLASS_TYPE_PARAMETER_BOUND:
- buf.append("CLASS_TYPE_PARAMETER_BOUND ")
- .append(ref.getTypeParameterIndex()).append(", ")
- .append(ref.getTypeParameterBoundIndex());
- break;
- case TypeReference.METHOD_TYPE_PARAMETER_BOUND:
- buf.append("METHOD_TYPE_PARAMETER_BOUND ")
- .append(ref.getTypeParameterIndex()).append(", ")
- .append(ref.getTypeParameterBoundIndex());
- break;
- case TypeReference.FIELD:
- buf.append("FIELD");
- break;
- case TypeReference.METHOD_RETURN:
- buf.append("METHOD_RETURN");
- break;
- case TypeReference.METHOD_RECEIVER:
- buf.append("METHOD_RECEIVER");
- break;
- case TypeReference.METHOD_FORMAL_PARAMETER:
- buf.append("METHOD_FORMAL_PARAMETER ").append(
- ref.getFormalParameterIndex());
- break;
- case TypeReference.THROWS:
- buf.append("THROWS ").append(ref.getExceptionIndex());
- break;
- case TypeReference.LOCAL_VARIABLE:
- buf.append("LOCAL_VARIABLE");
- break;
- case TypeReference.RESOURCE_VARIABLE:
- buf.append("RESOURCE_VARIABLE");
- break;
- case TypeReference.EXCEPTION_PARAMETER:
- buf.append("EXCEPTION_PARAMETER ").append(
- ref.getTryCatchBlockIndex());
- break;
- case TypeReference.INSTANCEOF:
- buf.append("INSTANCEOF");
- break;
- case TypeReference.NEW:
- buf.append("NEW");
- break;
- case TypeReference.CONSTRUCTOR_REFERENCE:
- buf.append("CONSTRUCTOR_REFERENCE");
- break;
- case TypeReference.METHOD_REFERENCE:
- buf.append("METHOD_REFERENCE");
- break;
- case TypeReference.CAST:
- buf.append("CAST ").append(ref.getTypeArgumentIndex());
- break;
- case TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT:
- buf.append("CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT ").append(
- ref.getTypeArgumentIndex());
- break;
- case TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT:
- buf.append("METHOD_INVOCATION_TYPE_ARGUMENT ").append(
- ref.getTypeArgumentIndex());
- break;
- case TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT:
- buf.append("CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT ").append(
- ref.getTypeArgumentIndex());
- break;
- case TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT:
- buf.append("METHOD_REFERENCE_TYPE_ARGUMENT ").append(
- ref.getTypeArgumentIndex());
- break;
- }
- }
-
- private void appendFrameTypes(final int n, final Object[] o) {
- for (int i = 0; i < n; ++i) {
- if (i > 0) {
- buf.append(' ');
- }
- if (o[i] instanceof String) {
- String desc = (String) o[i];
- if (desc.startsWith("[")) {
- appendDescriptor(FIELD_DESCRIPTOR, desc);
- } else {
- appendDescriptor(INTERNAL_NAME, desc);
- }
- } else if (o[i] instanceof Integer) {
- switch (((Integer) o[i]).intValue()) {
- case 0:
- appendDescriptor(FIELD_DESCRIPTOR, "T");
- break;
- case 1:
- appendDescriptor(FIELD_DESCRIPTOR, "I");
- break;
- case 2:
- appendDescriptor(FIELD_DESCRIPTOR, "F");
- break;
- case 3:
- appendDescriptor(FIELD_DESCRIPTOR, "D");
- break;
- case 4:
- appendDescriptor(FIELD_DESCRIPTOR, "J");
- break;
- case 5:
- appendDescriptor(FIELD_DESCRIPTOR, "N");
- break;
- case 6:
- appendDescriptor(FIELD_DESCRIPTOR, "U");
- break;
- }
- } else {
- appendLabel((Label) o[i]);
- }
- }
- }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceAnnotationVisitor.java b/src/asm/scala/tools/asm/util/TraceAnnotationVisitor.java
deleted file mode 100644
index 7a9dbfef06..0000000000
--- a/src/asm/scala/tools/asm/util/TraceAnnotationVisitor.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Opcodes;
-
-/**
- * An {@link AnnotationVisitor} that prints the annotations it visits with a
- * {@link Printer}.
- *
- * @author Eric Bruneton
- */
-public final class TraceAnnotationVisitor extends AnnotationVisitor {
-
- private final Printer p;
-
- public TraceAnnotationVisitor(final Printer p) {
- this(null, p);
- }
-
- public TraceAnnotationVisitor(final AnnotationVisitor av, final Printer p) {
- super(Opcodes.ASM5, av);
- this.p = p;
- }
-
- @Override
- public void visit(final String name, final Object value) {
- p.visit(name, value);
- super.visit(name, value);
- }
-
- @Override
- public void visitEnum(final String name, final String desc,
- final String value) {
- p.visitEnum(name, desc, value);
- super.visitEnum(name, desc, value);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String name,
- final String desc) {
- Printer p = this.p.visitAnnotation(name, desc);
- AnnotationVisitor av = this.av == null ? null : this.av
- .visitAnnotation(name, desc);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public AnnotationVisitor visitArray(final String name) {
- Printer p = this.p.visitArray(name);
- AnnotationVisitor av = this.av == null ? null : this.av
- .visitArray(name);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public void visitEnd() {
- p.visitAnnotationEnd();
- super.visitEnd();
- }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceClassVisitor.java b/src/asm/scala/tools/asm/util/TraceClassVisitor.java
deleted file mode 100644
index 842d286672..0000000000
--- a/src/asm/scala/tools/asm/util/TraceClassVisitor.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import java.io.PrintWriter;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.ClassVisitor;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A {@link ClassVisitor} that prints the classes it visits with a
- * {@link Printer}. This class visitor can be used in the middle of a class
- * visitor chain to trace the class that is visited at a given point in this
- * chain. This may be useful for debugging purposes.
- * <p>
- * The trace printed when visiting the <tt>Hello</tt> class is the following:
- * <p>
- * <blockquote>
- *
- * <pre>
- * // class version 49.0 (49) // access flags 0x21 public class Hello {
- *
- * // compiled from: Hello.java
- *
- * // access flags 0x1 public &lt;init&gt; ()V ALOAD 0 INVOKESPECIAL
- * java/lang/Object &lt;init&gt; ()V RETURN MAXSTACK = 1 MAXLOCALS = 1
- *
- * // access flags 0x9 public static main ([Ljava/lang/String;)V GETSTATIC
- * java/lang/System out Ljava/io/PrintStream; LDC &quot;hello&quot;
- * INVOKEVIRTUAL java/io/PrintStream println (Ljava/lang/String;)V RETURN
- * MAXSTACK = 2 MAXLOCALS = 1 }
- * </pre>
- *
- * </blockquote> where <tt>Hello</tt> is defined by:
- * <p>
- * <blockquote>
- *
- * <pre>
- * public class Hello {
- *
- * public static void main(String[] args) {
- * System.out.println(&quot;hello&quot;);
- * }
- * }
- * </pre>
- *
- * </blockquote>
- *
- * @author Eric Bruneton
- * @author Eugene Kuleshov
- */
-public final class TraceClassVisitor extends ClassVisitor {
-
- /**
- * The print writer to be used to print the class. May be null.
- */
- private final PrintWriter pw;
-
- /**
- * The object that actually converts visit events into text.
- */
- public final Printer p;
-
- /**
- * Constructs a new {@link TraceClassVisitor}.
- *
- * @param pw
- * the print writer to be used to print the class.
- */
- public TraceClassVisitor(final PrintWriter pw) {
- this(null, pw);
- }
-
- /**
- * Constructs a new {@link TraceClassVisitor}.
- *
- * @param cv
- * the {@link ClassVisitor} to which this visitor delegates
- * calls. May be <tt>null</tt>.
- * @param pw
- * the print writer to be used to print the class.
- */
- public TraceClassVisitor(final ClassVisitor cv, final PrintWriter pw) {
- this(cv, new Textifier(), pw);
- }
-
- /**
- * Constructs a new {@link TraceClassVisitor}.
- *
- * @param cv
- * the {@link ClassVisitor} to which this visitor delegates
- * calls. May be <tt>null</tt>.
- * @param p
- * the object that actually converts visit events into text.
- * @param pw
- * the print writer to be used to print the class. May be null if
- * you simply want to use the result via
- * {@link Printer#getText()}, instead of printing it.
- */
- public TraceClassVisitor(final ClassVisitor cv, final Printer p,
- final PrintWriter pw) {
- super(Opcodes.ASM5, cv);
- this.pw = pw;
- this.p = p;
- }
-
- @Override
- public void visit(final int version, final int access, final String name,
- final String signature, final String superName,
- final String[] interfaces) {
- p.visit(version, access, name, signature, superName, interfaces);
- super.visit(version, access, name, signature, superName, interfaces);
- }
-
- @Override
- public void visitSource(final String file, final String debug) {
- p.visitSource(file, debug);
- super.visitSource(file, debug);
- }
-
- @Override
- public void visitOuterClass(final String owner, final String name,
- final String desc) {
- p.visitOuterClass(owner, name, desc);
- super.visitOuterClass(owner, name, desc);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- Printer p = this.p.visitClassAnnotation(desc, visible);
- AnnotationVisitor av = cv == null ? null : cv.visitAnnotation(desc,
- visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- Printer p = this.p.visitClassTypeAnnotation(typeRef, typePath, desc,
- visible);
- AnnotationVisitor av = cv == null ? null : cv.visitTypeAnnotation(
- typeRef, typePath, desc, visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- p.visitClassAttribute(attr);
- super.visitAttribute(attr);
- }
-
- @Override
- public void visitInnerClass(final String name, final String outerName,
- final String innerName, final int access) {
- p.visitInnerClass(name, outerName, innerName, access);
- super.visitInnerClass(name, outerName, innerName, access);
- }
-
- @Override
- public FieldVisitor visitField(final int access, final String name,
- final String desc, final String signature, final Object value) {
- Printer p = this.p.visitField(access, name, desc, signature, value);
- FieldVisitor fv = cv == null ? null : cv.visitField(access, name, desc,
- signature, value);
- return new TraceFieldVisitor(fv, p);
- }
-
- @Override
- public MethodVisitor visitMethod(final int access, final String name,
- final String desc, final String signature, final String[] exceptions) {
- Printer p = this.p.visitMethod(access, name, desc, signature,
- exceptions);
- MethodVisitor mv = cv == null ? null : cv.visitMethod(access, name,
- desc, signature, exceptions);
- return new TraceMethodVisitor(mv, p);
- }
-
- @Override
- public void visitEnd() {
- p.visitClassEnd();
- if (pw != null) {
- p.print(pw);
- pw.flush();
- }
- super.visitEnd();
- }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceFieldVisitor.java b/src/asm/scala/tools/asm/util/TraceFieldVisitor.java
deleted file mode 100644
index 1d0743a424..0000000000
--- a/src/asm/scala/tools/asm/util/TraceFieldVisitor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.FieldVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A {@link FieldVisitor} that prints the fields it visits with a
- * {@link Printer}.
- *
- * @author Eric Bruneton
- */
-public final class TraceFieldVisitor extends FieldVisitor {
-
- public final Printer p;
-
- public TraceFieldVisitor(final Printer p) {
- this(null, p);
- }
-
- public TraceFieldVisitor(final FieldVisitor fv, final Printer p) {
- super(Opcodes.ASM5, fv);
- this.p = p;
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- Printer p = this.p.visitFieldAnnotation(desc, visible);
- AnnotationVisitor av = fv == null ? null : fv.visitAnnotation(desc,
- visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- Printer p = this.p.visitFieldTypeAnnotation(typeRef, typePath, desc,
- visible);
- AnnotationVisitor av = fv == null ? null : fv.visitTypeAnnotation(
- typeRef, typePath, desc, visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- p.visitFieldAttribute(attr);
- super.visitAttribute(attr);
- }
-
- @Override
- public void visitEnd() {
- p.visitFieldEnd();
- super.visitEnd();
- }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceMethodVisitor.java b/src/asm/scala/tools/asm/util/TraceMethodVisitor.java
deleted file mode 100644
index db5f051003..0000000000
--- a/src/asm/scala/tools/asm/util/TraceMethodVisitor.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.AnnotationVisitor;
-import scala.tools.asm.Attribute;
-import scala.tools.asm.Handle;
-import scala.tools.asm.Label;
-import scala.tools.asm.MethodVisitor;
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.TypePath;
-
-/**
- * A {@link MethodVisitor} that prints the methods it visits with a
- * {@link Printer}.
- *
- * @author Eric Bruneton
- */
-public final class TraceMethodVisitor extends MethodVisitor {
-
- public final Printer p;
-
- public TraceMethodVisitor(final Printer p) {
- this(null, p);
- }
-
- public TraceMethodVisitor(final MethodVisitor mv, final Printer p) {
- super(Opcodes.ASM5, mv);
- this.p = p;
- }
-
- @Override
- public void visitParameter(String name, int access) {
- p.visitParameter(name, access);
- super.visitParameter(name, access);
- }
-
- @Override
- public AnnotationVisitor visitAnnotation(final String desc,
- final boolean visible) {
- Printer p = this.p.visitMethodAnnotation(desc, visible);
- AnnotationVisitor av = mv == null ? null : mv.visitAnnotation(desc,
- visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public AnnotationVisitor visitTypeAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- Printer p = this.p.visitMethodTypeAnnotation(typeRef, typePath, desc,
- visible);
- AnnotationVisitor av = mv == null ? null : mv.visitTypeAnnotation(
- typeRef, typePath, desc, visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public void visitAttribute(final Attribute attr) {
- p.visitMethodAttribute(attr);
- super.visitAttribute(attr);
- }
-
- @Override
- public AnnotationVisitor visitAnnotationDefault() {
- Printer p = this.p.visitAnnotationDefault();
- AnnotationVisitor av = mv == null ? null : mv.visitAnnotationDefault();
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public AnnotationVisitor visitParameterAnnotation(final int parameter,
- final String desc, final boolean visible) {
- Printer p = this.p.visitParameterAnnotation(parameter, desc, visible);
- AnnotationVisitor av = mv == null ? null : mv.visitParameterAnnotation(
- parameter, desc, visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public void visitCode() {
- p.visitCode();
- super.visitCode();
- }
-
- @Override
- public void visitFrame(final int type, final int nLocal,
- final Object[] local, final int nStack, final Object[] stack) {
- p.visitFrame(type, nLocal, local, nStack, stack);
- super.visitFrame(type, nLocal, local, nStack, stack);
- }
-
- @Override
- public void visitInsn(final int opcode) {
- p.visitInsn(opcode);
- super.visitInsn(opcode);
- }
-
- @Override
- public void visitIntInsn(final int opcode, final int operand) {
- p.visitIntInsn(opcode, operand);
- super.visitIntInsn(opcode, operand);
- }
-
- @Override
- public void visitVarInsn(final int opcode, final int var) {
- p.visitVarInsn(opcode, var);
- super.visitVarInsn(opcode, var);
- }
-
- @Override
- public void visitTypeInsn(final int opcode, final String type) {
- p.visitTypeInsn(opcode, type);
- super.visitTypeInsn(opcode, type);
- }
-
- @Override
- public void visitFieldInsn(final int opcode, final String owner,
- final String name, final String desc) {
- p.visitFieldInsn(opcode, owner, name, desc);
- super.visitFieldInsn(opcode, owner, name, desc);
- }
-
- @Deprecated
- @Override
- public void visitMethodInsn(int opcode, String owner, String name,
- String desc) {
- if (api >= Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc);
- return;
- }
- p.visitMethodInsn(opcode, owner, name, desc);
- if (mv != null) {
- mv.visitMethodInsn(opcode, owner, name, desc);
- }
- }
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name,
- String desc, boolean itf) {
- if (api < Opcodes.ASM5) {
- super.visitMethodInsn(opcode, owner, name, desc, itf);
- return;
- }
- p.visitMethodInsn(opcode, owner, name, desc, itf);
- if (mv != null) {
- mv.visitMethodInsn(opcode, owner, name, desc, itf);
- }
- }
-
- @Override
- public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
- Object... bsmArgs) {
- p.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
- super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
- }
-
- @Override
- public void visitJumpInsn(final int opcode, final Label label) {
- p.visitJumpInsn(opcode, label);
- super.visitJumpInsn(opcode, label);
- }
-
- @Override
- public void visitLabel(final Label label) {
- p.visitLabel(label);
- super.visitLabel(label);
- }
-
- @Override
- public void visitLdcInsn(final Object cst) {
- p.visitLdcInsn(cst);
- super.visitLdcInsn(cst);
- }
-
- @Override
- public void visitIincInsn(final int var, final int increment) {
- p.visitIincInsn(var, increment);
- super.visitIincInsn(var, increment);
- }
-
- @Override
- public void visitTableSwitchInsn(final int min, final int max,
- final Label dflt, final Label... labels) {
- p.visitTableSwitchInsn(min, max, dflt, labels);
- super.visitTableSwitchInsn(min, max, dflt, labels);
- }
-
- @Override
- public void visitLookupSwitchInsn(final Label dflt, final int[] keys,
- final Label[] labels) {
- p.visitLookupSwitchInsn(dflt, keys, labels);
- super.visitLookupSwitchInsn(dflt, keys, labels);
- }
-
- @Override
- public void visitMultiANewArrayInsn(final String desc, final int dims) {
- p.visitMultiANewArrayInsn(desc, dims);
- super.visitMultiANewArrayInsn(desc, dims);
- }
-
- @Override
- public AnnotationVisitor visitInsnAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- Printer p = this.p
- .visitInsnAnnotation(typeRef, typePath, desc, visible);
- AnnotationVisitor av = mv == null ? null : mv.visitInsnAnnotation(
- typeRef, typePath, desc, visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public void visitTryCatchBlock(final Label start, final Label end,
- final Label handler, final String type) {
- p.visitTryCatchBlock(start, end, handler, type);
- super.visitTryCatchBlock(start, end, handler, type);
- }
-
- @Override
- public AnnotationVisitor visitTryCatchAnnotation(int typeRef,
- TypePath typePath, String desc, boolean visible) {
- Printer p = this.p.visitTryCatchAnnotation(typeRef, typePath, desc,
- visible);
- AnnotationVisitor av = mv == null ? null : mv.visitTryCatchAnnotation(
- typeRef, typePath, desc, visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public void visitLocalVariable(final String name, final String desc,
- final String signature, final Label start, final Label end,
- final int index) {
- p.visitLocalVariable(name, desc, signature, start, end, index);
- super.visitLocalVariable(name, desc, signature, start, end, index);
- }
-
- @Override
- public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
- TypePath typePath, Label[] start, Label[] end, int[] index,
- String desc, boolean visible) {
- Printer p = this.p.visitLocalVariableAnnotation(typeRef, typePath,
- start, end, index, desc, visible);
- AnnotationVisitor av = mv == null ? null : mv
- .visitLocalVariableAnnotation(typeRef, typePath, start, end,
- index, desc, visible);
- return new TraceAnnotationVisitor(av, p);
- }
-
- @Override
- public void visitLineNumber(final int line, final Label start) {
- p.visitLineNumber(line, start);
- super.visitLineNumber(line, start);
- }
-
- @Override
- public void visitMaxs(final int maxStack, final int maxLocals) {
- p.visitMaxs(maxStack, maxLocals);
- super.visitMaxs(maxStack, maxLocals);
- }
-
- @Override
- public void visitEnd() {
- p.visitMethodEnd();
- super.visitEnd();
- }
-}
diff --git a/src/asm/scala/tools/asm/util/TraceSignatureVisitor.java b/src/asm/scala/tools/asm/util/TraceSignatureVisitor.java
deleted file mode 100644
index f99ec2b0c2..0000000000
--- a/src/asm/scala/tools/asm/util/TraceSignatureVisitor.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-package scala.tools.asm.util;
-
-import scala.tools.asm.Opcodes;
-import scala.tools.asm.signature.SignatureVisitor;
-
-/**
- * A {@link SignatureVisitor} that prints a disassembled view of the signature
- * it visits.
- *
- * @author Eugene Kuleshov
- * @author Eric Bruneton
- */
-public final class TraceSignatureVisitor extends SignatureVisitor {
-
- private final StringBuffer declaration;
-
- private boolean isInterface;
-
- private boolean seenFormalParameter;
-
- private boolean seenInterfaceBound;
-
- private boolean seenParameter;
-
- private boolean seenInterface;
-
- private StringBuffer returnType;
-
- private StringBuffer exceptions;
-
- /**
- * Stack used to keep track of class types that have arguments. Each element
- * of this stack is a boolean encoded in one bit. The top of the stack is
- * the lowest order bit. Pushing false = *2, pushing true = *2+1, popping =
- * /2.
- */
- private int argumentStack;
-
- /**
- * Stack used to keep track of array class types. Each element of this stack
- * is a boolean encoded in one bit. The top of the stack is the lowest order
- * bit. Pushing false = *2, pushing true = *2+1, popping = /2.
- */
- private int arrayStack;
-
- private String separator = "";
-
- public TraceSignatureVisitor(final int access) {
- super(Opcodes.ASM5);
- isInterface = (access & Opcodes.ACC_INTERFACE) != 0;
- this.declaration = new StringBuffer();
- }
-
- private TraceSignatureVisitor(final StringBuffer buf) {
- super(Opcodes.ASM5);
- this.declaration = buf;
- }
-
- @Override
- public void visitFormalTypeParameter(final String name) {
- declaration.append(seenFormalParameter ? ", " : "<").append(name);
- seenFormalParameter = true;
- seenInterfaceBound = false;
- }
-
- @Override
- public SignatureVisitor visitClassBound() {
- separator = " extends ";
- startType();
- return this;
- }
-
- @Override
- public SignatureVisitor visitInterfaceBound() {
- separator = seenInterfaceBound ? ", " : " extends ";
- seenInterfaceBound = true;
- startType();
- return this;
- }
-
- @Override
- public SignatureVisitor visitSuperclass() {
- endFormals();
- separator = " extends ";
- startType();
- return this;
- }
-
- @Override
- public SignatureVisitor visitInterface() {
- separator = seenInterface ? ", " : isInterface ? " extends "
- : " implements ";
- seenInterface = true;
- startType();
- return this;
- }
-
- @Override
- public SignatureVisitor visitParameterType() {
- endFormals();
- if (seenParameter) {
- declaration.append(", ");
- } else {
- seenParameter = true;
- declaration.append('(');
- }
- startType();
- return this;
- }
-
- @Override
- public SignatureVisitor visitReturnType() {
- endFormals();
- if (seenParameter) {
- seenParameter = false;
- } else {
- declaration.append('(');
- }
- declaration.append(')');
- returnType = new StringBuffer();
- return new TraceSignatureVisitor(returnType);
- }
-
- @Override
- public SignatureVisitor visitExceptionType() {
- if (exceptions == null) {
- exceptions = new StringBuffer();
- } else {
- exceptions.append(", ");
- }
- // startType();
- return new TraceSignatureVisitor(exceptions);
- }
-
- @Override
- public void visitBaseType(final char descriptor) {
- switch (descriptor) {
- case 'V':
- declaration.append("void");
- break;
- case 'B':
- declaration.append("byte");
- break;
- case 'J':
- declaration.append("long");
- break;
- case 'Z':
- declaration.append("boolean");
- break;
- case 'I':
- declaration.append("int");
- break;
- case 'S':
- declaration.append("short");
- break;
- case 'C':
- declaration.append("char");
- break;
- case 'F':
- declaration.append("float");
- break;
- // case 'D':
- default:
- declaration.append("double");
- break;
- }
- endType();
- }
-
- @Override
- public void visitTypeVariable(final String name) {
- declaration.append(name);
- endType();
- }
-
- @Override
- public SignatureVisitor visitArrayType() {
- startType();
- arrayStack |= 1;
- return this;
- }
-
- @Override
- public void visitClassType(final String name) {
- if ("java/lang/Object".equals(name)) {
- // Map<java.lang.Object,java.util.List>
- // or
- // abstract public V get(Object key); (seen in Dictionary.class)
- // should have Object
- // but java.lang.String extends java.lang.Object is unnecessary
- boolean needObjectClass = argumentStack % 2 != 0 || seenParameter;
- if (needObjectClass) {
- declaration.append(separator).append(name.replace('/', '.'));
- }
- } else {
- declaration.append(separator).append(name.replace('/', '.'));
- }
- separator = "";
- argumentStack *= 2;
- }
-
- @Override
- public void visitInnerClassType(final String name) {
- if (argumentStack % 2 != 0) {
- declaration.append('>');
- }
- argumentStack /= 2;
- declaration.append('.');
- declaration.append(separator).append(name.replace('/', '.'));
- separator = "";
- argumentStack *= 2;
- }
-
- @Override
- public void visitTypeArgument() {
- if (argumentStack % 2 == 0) {
- ++argumentStack;
- declaration.append('<');
- } else {
- declaration.append(", ");
- }
- declaration.append('?');
- }
-
- @Override
- public SignatureVisitor visitTypeArgument(final char tag) {
- if (argumentStack % 2 == 0) {
- ++argumentStack;
- declaration.append('<');
- } else {
- declaration.append(", ");
- }
-
- if (tag == EXTENDS) {
- declaration.append("? extends ");
- } else if (tag == SUPER) {
- declaration.append("? super ");
- }
-
- startType();
- return this;
- }
-
- @Override
- public void visitEnd() {
- if (argumentStack % 2 != 0) {
- declaration.append('>');
- }
- argumentStack /= 2;
- endType();
- }
-
- public String getDeclaration() {
- return declaration.toString();
- }
-
- public String getReturnType() {
- return returnType == null ? null : returnType.toString();
- }
-
- public String getExceptions() {
- return exceptions == null ? null : exceptions.toString();
- }
-
- // -----------------------------------------------
-
- private void endFormals() {
- if (seenFormalParameter) {
- declaration.append('>');
- seenFormalParameter = false;
- }
- }
-
- private void startType() {
- arrayStack *= 2;
- }
-
- private void endType() {
- if (arrayStack % 2 == 0) {
- arrayStack /= 2;
- } else {
- while (arrayStack % 2 != 0) {
- arrayStack /= 2;
- declaration.append("[]");
- }
- }
- }
-}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
index 5b53ac7bc6..7d24347b4e 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala
@@ -10,6 +10,7 @@ package backend
package jvm
import scala.annotation.switch
+import scala.reflect.internal.Flags
import scala.tools.asm
import GenBCode._
@@ -632,6 +633,10 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
case _ =>
abort(s"Cannot instantiate $tpt of kind: $generatedType")
}
+ case Apply(_, args) if app.hasAttachment[delambdafy.LambdaMetaFactoryCapable] =>
+ val attachment = app.attachments.get[delambdafy.LambdaMetaFactoryCapable].get
+ genLoadArguments(args, paramTKs(app))
+ genInvokeDynamicLambda(attachment.target, attachment.arity, attachment.functionalInterface)
case Apply(fun @ _, List(expr)) if currentRun.runDefinitions.isBox(fun.symbol) =>
val nativeKind = tpeTK(expr)
@@ -1280,6 +1285,40 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
def genSynchronized(tree: Apply, expectedType: BType): BType
def genLoadTry(tree: Try): BType
+ def genInvokeDynamicLambda(lambdaTarget: Symbol, arity: Int, functionalInterface: Symbol) {
+ val isStaticMethod = lambdaTarget.hasFlag(Flags.STATIC)
+
+ val targetHandle =
+ new asm.Handle(if (lambdaTarget.hasFlag(Flags.STATIC)) asm.Opcodes.H_INVOKESTATIC else asm.Opcodes.H_INVOKEVIRTUAL,
+ classBTypeFromSymbol(lambdaTarget.owner).internalName,
+ lambdaTarget.name.toString,
+ asmMethodType(lambdaTarget).descriptor)
+ val receiver = if (isStaticMethod) None else Some(lambdaTarget.owner)
+ val (capturedParams, lambdaParams) = lambdaTarget.paramss.head.splitAt(lambdaTarget.paramss.head.length - arity)
+ // Requires https://github.com/scala/scala-java8-compat on the runtime classpath
+ val returnUnit = lambdaTarget.info.resultType.typeSymbol == UnitClass
+ val functionalInterfaceDesc: String = classBTypeFromSymbol(functionalInterface).descriptor
+ val desc = (receiver.toList ::: capturedParams).map(sym => toTypeKind(sym.info)).mkString(("("), "", ")") + functionalInterfaceDesc
+
+ // TODO specialization
+ val constrainedType = new MethodBType(lambdaParams.map(p => toTypeKind(p.tpe)), toTypeKind(lambdaTarget.tpe.resultType)).toASMType
+ val abstractMethod = functionalInterface.info.decls.find(_.isDeferred).getOrElse(functionalInterface.info.member(nme.apply))
+ val methodName = abstractMethod.name.toString
+ val applyN = {
+ val mt = asmMethodType(abstractMethod)
+ mt.toASMType
+ }
+
+ bc.jmethod.visitInvokeDynamicInsn(methodName, desc, lambdaMetaFactoryBootstrapHandle,
+ // boostrap args
+ applyN, targetHandle, constrainedType
+ )
+ }
}
+ val lambdaMetaFactoryBootstrapHandle =
+ new asm.Handle(asm.Opcodes.H_INVOKESTATIC,
+ "java/lang/invoke/LambdaMetafactory", "metafactory",
+ "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;")
+
}
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala
index 9993357eee..8f2a17a2bf 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala
@@ -412,6 +412,9 @@ abstract class BCodeIdiomatic extends SubComponent {
jmethod.instructions.add(node)
if (settings.YoptInlinerEnabled) callsitePositions(node) = pos
}
+ final def invokedynamic(owner: String, name: String, desc: String) {
+ jmethod.visitMethodInsn(Opcodes.INVOKEDYNAMIC, owner, name, desc)
+ }
// can-multi-thread
final def goTo(label: asm.Label) { jmethod.visitJumpInsn(Opcodes.GOTO, label) }
diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
index 630276e412..35ee889c58 100644
--- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
@@ -101,7 +101,8 @@ trait ScalaSettings extends AbsScalaSettings
val Xhelp = BooleanSetting ("-X", "Print a synopsis of advanced options.")
val checkInit = BooleanSetting ("-Xcheckinit", "Wrap field accessors to throw an exception on uninitialized access.")
val developer = BooleanSetting ("-Xdev", "Indicates user is a developer - issue warnings about anything which seems amiss")
- val noassertions = BooleanSetting ("-Xdisable-assertions", "Generate no assertions or assumptions.")
+ val noassertions = BooleanSetting ("-Xdisable-assertions", "Generate no assertions or assumptions.") andThen (flag =>
+ if (flag) elidebelow.value = elidable.ASSERTION + 1)
val elidebelow = IntSetting ("-Xelide-below", "Calls to @elidable methods are omitted if method priority is lower than argument",
elidable.MINIMUM, None, elidable.byName get _)
val noForwarders = BooleanSetting ("-Xno-forwarders", "Do not generate static forwarders in mirror classes.")
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index a59b9d3f48..518a402230 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -53,6 +53,7 @@ abstract class ClassfileParser {
protected type ThisConstantPool <: ConstantPool
protected def newConstantPool: ThisConstantPool
+ protected var file: AbstractFile = _ // the class file
protected var in: AbstractFileReader = _ // the class file reader
protected var clazz: Symbol = _ // the class symbol containing dynamic members
protected var staticModule: Symbol = _ // the module symbol containing static members
@@ -97,14 +98,14 @@ abstract class ClassfileParser {
private def handleMissing(e: MissingRequirementError) = {
if (settings.debug) e.printStackTrace
- throw new IOException(s"Missing dependency '${e.req}', required by ${in.file}")
+ throw new IOException(s"Missing dependency '${e.req}', required by $file")
}
private def handleError(e: Exception) = {
if (settings.debug) e.printStackTrace()
- throw new IOException(s"class file '${in.file}' is broken\n(${e.getClass}/${e.getMessage})")
+ throw new IOException(s"class file '$file' is broken\n(${e.getClass}/${e.getMessage})")
}
private def mismatchError(c: Symbol) = {
- throw new IOException(s"class file '${in.file}' has location not matching its contents: contains $c")
+ throw new IOException(s"class file '$file' has location not matching its contents: contains $c")
}
private def parseErrorHandler[T]: PartialFunction[Throwable, T] = {
@@ -131,6 +132,7 @@ abstract class ClassfileParser {
def parse(file: AbstractFile, root: Symbol): Unit = {
debuglog("[class] >> " + root.fullName)
+ this.file = file
pushBusy(root) {
this.in = new AbstractFileReader(file)
this.clazz = if (root.isModule) root.companionClass else root
@@ -923,6 +925,7 @@ abstract class ClassfileParser {
Some(ScalaSigBytes(pool.getBytes(entries.toList)))
}
+ // TODO SI-9296 duplicated code, refactor
/* Parse and return a single annotation. If it is malformed,
* return None.
*/
diff --git a/src/compiler/scala/tools/nsc/transform/Delambdafy.scala b/src/compiler/scala/tools/nsc/transform/Delambdafy.scala
index 45a89ac594..92db57c533 100644
--- a/src/compiler/scala/tools/nsc/transform/Delambdafy.scala
+++ b/src/compiler/scala/tools/nsc/transform/Delambdafy.scala
@@ -9,12 +9,17 @@ import scala.reflect.internal.Symbols
import scala.collection.mutable.LinkedHashMap
/**
- * This transformer is responsible for turning lambdas into anonymous classes.
+ * This transformer is responsible for preparing lambdas for runtime, by either translating to anonymous classes
+ * or to a tree that will be convereted to invokedynamic by the JVM 1.8+ backend.
+ *
* The main assumption it makes is that a lambda {args => body} has been turned into
* {args => liftedBody()} where lifted body is a top level method that implements the body of the lambda.
* Currently Uncurry is responsible for that transformation.
*
- * From a lambda, Delambdafy will create
+ * From a lambda, Delambdafy will create:
+ *
+ * Under -target:jvm-1.7 and below:
+ *
* 1) a new top level class that
a) has fields and a constructor taking the captured environment (including possibly the "this"
* reference)
@@ -22,9 +27,11 @@ import scala.collection.mutable.LinkedHashMap
* c) if needed a bridge method for the apply method
* 2) an instantiation of the newly created class which replaces the lambda
*
- * TODO the main work left to be done is to plug into specialization. Primarily that means choosing a
- * specialized FunctionN trait instead of the generic FunctionN trait as a parent and creating the
- * appropriately named applysp method
+ * Under -target:jvm-1.8 with GenBCode:
+ *
+ * 1) An application of the captured arguments to a fictional symbol representing the lambda factory.
+ * This will be translated by the backed into an invokedynamic using a bootstrap method in JDK8's `LambdaMetaFactory`.
+ * The captured arguments include `this` if `liftedBody` is unable to be made STATIC.
*/
abstract class Delambdafy extends Transform with TypingTransformers with ast.TreeDSL with TypeAdaptingTransformer {
import global._
@@ -79,6 +86,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
sealed abstract class TransformedFunction
// A class definition for the lambda, an expression instantiating the lambda class
case class DelambdafyAnonClass(lambdaClassDef: ClassDef, newExpr: Tree) extends TransformedFunction
+ case class InvokeDynamicLambda(tree: Apply) extends TransformedFunction
// here's the main entry point of the transform
override def transform(tree: Tree): Tree = tree match {
@@ -93,6 +101,9 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
lambdaClassDefs(pkg) = lambdaClassDef :: lambdaClassDefs(pkg)
super.transform(newExpr)
+ case InvokeDynamicLambda(apply) =>
+ // ... or an invokedynamic call
+ super.transform(apply)
}
case _ => super.transform(tree)
}
@@ -124,6 +135,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
if (!thisReferringMethods.contains(target))
target setFlag STATIC
+ val isStatic = target.hasFlag(STATIC)
/**
* Creates the apply method for the anonymous subclass of FunctionN
@@ -199,7 +211,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
val abstractFunctionErasedType = AbstractFunctionClass(formals.length).tpe
// anonymous subclass of FunctionN with an apply method
- def makeAnonymousClass = {
+ def makeAnonymousClass: ClassDef = {
val parents = addSerializable(abstractFunctionErasedType)
val funOwner = originalFunction.symbol.owner
@@ -232,7 +244,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
// the Optional proxy that will hold a reference to the 'this'
// object used by the lambda, if any. NoSymbol if there is no this proxy
val thisProxy = {
- if (target.hasFlag(STATIC))
+ if (isStatic)
NoSymbol
else {
val sym = lambdaClass.newVariable(nme.FAKE_LOCAL_THIS, originalFunction.pos, SYNTHETIC)
@@ -271,22 +283,39 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
val body = members ++ List(constr, applyMethodDef) ++ bridgeMethod
// TODO if member fields are private this complains that they're not accessible
- (localTyper.typedPos(decapturedFunction.pos)(ClassDef(lambdaClass, body)).asInstanceOf[ClassDef], thisProxy)
+ localTyper.typedPos(decapturedFunction.pos)(ClassDef(lambdaClass, body)).asInstanceOf[ClassDef]
}
- val (anonymousClassDef, thisProxy) = makeAnonymousClass
-
- pkg.info.decls enter anonymousClassDef.symbol
-
- val thisArg = optionSymbol(thisProxy) map (_ => gen.mkAttributedThis(oldClass) setPos originalFunction.pos)
- val captureArgs = captures map (capture => Ident(capture) setPos originalFunction.pos)
-
- val newStat =
- Typed(New(anonymousClassDef.symbol, (thisArg.toList ++ captureArgs): _*), TypeTree(abstractFunctionErasedType))
-
- val typedNewStat = localTyper.typedPos(originalFunction.pos)(newStat)
+ val allCaptureArgs: List[Tree] = {
+ val thisArg = if (isStatic) Nil else (gen.mkAttributedThis(oldClass) setPos originalFunction.pos) :: Nil
+ val captureArgs = captures.iterator.map(capture => gen.mkAttributedRef(capture) setPos originalFunction.pos).toList
+ thisArg ::: captureArgs
+ }
- DelambdafyAnonClass(anonymousClassDef, typedNewStat)
+ val functionalInterface = java8CompatFunctionalInterface(target, originalFunction.tpe)
+ if (functionalInterface.exists) {
+ // Create a symbol representing a fictional lambda factory method that accepts the captured
+ // arguments and returns a Function.
+ val msym = currentOwner.newMethod(nme.ANON_FUN_NAME, originalFunction.pos, ARTIFACT)
+ val argTypes: List[Type] = allCaptureArgs.map(_.tpe)
+ val params = msym.newSyntheticValueParams(argTypes)
+ msym.setInfo(MethodType(params, originalFunction.tpe))
+ val arity = originalFunction.vparams.length
+
+ // We then apply this symbol to the captures.
+ val apply = localTyper.typedPos(originalFunction.pos)(Apply(Ident(msym), allCaptureArgs)).asInstanceOf[Apply]
+
+ // The backend needs to know the target of the lambda and the functional interface in order
+ // to emit the invokedynamic instruction. We pass this information as tree attachment.
+ apply.updateAttachment(LambdaMetaFactoryCapable(target, arity, functionalInterface))
+ InvokeDynamicLambda(apply)
+ } else {
+ val anonymousClassDef = makeAnonymousClass
+ pkg.info.decls enter anonymousClassDef.symbol
+ val newStat = Typed(New(anonymousClassDef.symbol, allCaptureArgs: _*), TypeTree(abstractFunctionErasedType))
+ val typedNewStat = localTyper.typedPos(originalFunction.pos)(newStat)
+ DelambdafyAnonClass(anonymousClassDef, typedNewStat)
+ }
}
/**
@@ -436,4 +465,38 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
super.traverse(tree)
}
}
+
+ final case class LambdaMetaFactoryCapable(target: Symbol, arity: Int, functionalInterface: Symbol)
+
+ // The functional interface that can be used to adapt the lambda target method `target` to the
+ // given function type. Returns `NoSymbol` if the compiler settings are unsuitable, or `LambdaMetaFactory`
+ // would be unable to generate the correct implementation (e.g. functions referring to derived value classes)
+ private def java8CompatFunctionalInterface(target: Symbol, functionType: Type): Symbol = {
+ val canUseLambdaMetafactory: Boolean = {
+ val hasValueClass = exitingErasure {
+ val methodType: Type = target.info
+ methodType.exists(_.isInstanceOf[ErasedValueType])
+ }
+ val isTarget18 = settings.target.value.contains("jvm-1.8")
+ settings.isBCodeActive && isTarget18 && !hasValueClass
+ }
+
+ def functionalInterface: Symbol = {
+ val sym = functionType.typeSymbol
+ val pack = currentRun.runDefinitions.Scala_Java8_CompatPackage
+ val name1 = specializeTypes.specializedFunctionName(sym, functionType.typeArgs)
+ val paramTps :+ restpe = functionType.typeArgs
+ val arity = paramTps.length
+ if (name1.toTypeName == sym.name) {
+ val returnUnit = restpe.typeSymbol == UnitClass
+ val functionInterfaceArray =
+ if (returnUnit) currentRun.runDefinitions.Scala_Java8_CompatPackage_JProcedure
+ else currentRun.runDefinitions.Scala_Java8_CompatPackage_JFunction
+ functionInterfaceArray.apply(arity)
+ } else {
+ pack.info.decl(name1.toTypeName.prepend("J"))
+ }
+ }
+ if (canUseLambdaMetafactory) functionalInterface else NoSymbol
+ }
}
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
index 1a24c668ba..53a1347a48 100644
--- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
+++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
@@ -303,6 +303,17 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
}
}
+ def specializedFunctionName(sym: Symbol, args: List[Type]) = exitingSpecialize {
+ require(isFunctionSymbol(sym), sym)
+ val env: TypeEnv = TypeEnv.fromSpecialization(sym, args)
+ specializedClass.get((sym, env)) match {
+ case Some(x) =>
+ x.name
+ case None =>
+ sym.name
+ }
+ }
+
/** Return the specialized name of 'sym' in the given environment. It
* guarantees the same result regardless of the map order by sorting
* type variables alphabetically.
@@ -315,10 +326,14 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
if (sym.isClass) env.keySet
else specializedTypeVars(sym).intersect(env.keySet)
)
+ specializedName(sym.name, tvars, env)
+ }
+
+ private def specializedName(name: Name, tvars: immutable.Set[Symbol], env: TypeEnv): TermName = {
val (methparams, others) = tvars.toList sortBy ("" + _.name) partition (_.owner.isMethod)
// debuglog("specName(" + sym + ") env: " + env + " tvars: " + tvars)
- specializedName(sym.name, methparams map env, others map env)
+ specializedName(name, methparams map env, others map env)
}
/** Specialize name for the two list of types. The first one denotes
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
index 6484d96a52..1020b98bb9 100644
--- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala
+++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
@@ -237,7 +237,7 @@ abstract class UnCurry extends InfoTransform
def canUseDelamdafyMethod = (
(inConstructorFlag == 0) // Avoiding synthesizing code prone to SI-6666, SI-8363 by using old-style lambda translation
- && !isSpecialized // DelambdafyTransformer currently only emits generic FunctionN-s, use the old style in the meantime
+ && (!isSpecialized || (settings.target.value == "jvm-1.8")) // DelambdafyTransformer currently only emits generic FunctionN-s, use the old style in the meantime
)
if (inlineFunctionExpansion || !canUseDelamdafyMethod) {
val parents = addSerializable(abstractFunctionForFunctionType(fun.tpe))
@@ -437,9 +437,7 @@ abstract class UnCurry extends InfoTransform
def isLiftedLambdaBody(target: Tree) = target.symbol.isLocalToBlock && target.symbol.isArtifact && target.symbol.name.containsName(nme.ANON_FUN_NAME)
val result = (
- // TODO - settings.noassertions.value temporarily retained to avoid
- // breakage until a reasonable interface is settled upon.
- if ((sym ne null) && (sym.elisionLevel.exists (_ < settings.elidebelow.value || settings.noassertions)))
+ if ((sym ne null) && sym.elisionLevel.exists(_ < settings.elidebelow.value))
replaceElidableTree(tree)
else translateSynchronized(tree) match {
case dd @ DefDef(mods, name, tparams, _, tpt, rhs) =>
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/Logic.scala b/src/compiler/scala/tools/nsc/transform/patmat/Logic.scala
index cef22d7d6b..227c45b3a7 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/Logic.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/Logic.scala
@@ -384,9 +384,8 @@ trait Logic extends Debugging {
// ... and what must not?
excluded foreach {
excludedSym =>
- val related = Set(sym, excludedSym)
val exclusive = v.groupedDomains.exists {
- domain => related subsetOf domain.toSet
+ domain => domain.contains(sym) && domain.contains(excludedSym)
}
// TODO: populate `v.exclusiveDomains` with `Set`s from the start, and optimize to:
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index a3a4c70d1e..4b30b4e436 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -1122,7 +1122,7 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
}
/** Sensibility check examines flavors of equals. */
def checkSensible(pos: Position, fn: Tree, args: List[Tree]) = fn match {
- case Select(qual, name @ (nme.EQ | nme.NE | nme.eq | nme.ne)) if args.length == 1 && isObjectOrAnyComparisonMethod(fn.symbol) =>
+ case Select(qual, name @ (nme.EQ | nme.NE | nme.eq | nme.ne)) if args.length == 1 && isObjectOrAnyComparisonMethod(fn.symbol) && !currentOwner.isSynthetic =>
checkSensibleEquals(pos, qual, name, fn.symbol, args.head)
case _ =>
}
diff --git a/src/intellij-14/README b/src/intellij-14/README
deleted file mode 100644
index 310a766a20..0000000000
--- a/src/intellij-14/README
+++ /dev/null
@@ -1,12 +0,0 @@
-Use the latest IntelliJ IDEA release and install the Scala plugin from within the IDE.
-
-Compilation withing IDEA is performed in "-Dlocker.skip=1" mode: the sources are built
-directly using the STARR compiler.
-
-The following steps are required to use IntelliJ IDEA on Scala trunk
- - Run "ant init". This will download some JARs from to ./build/deps, which are
- included in IntelliJ's classpath.
- - Run src/intellij-14/setup.sh
- - Open ./src/intellij-14/scala.ipr in IntelliJ
- - File, Project Settings, Project, SDK. Create an SDK entry named "1.6" containing the
- Java 1.6 SDK
diff --git a/src/intellij-14/asm.iml.SAMPLE b/src/intellij-14/asm.iml.SAMPLE
deleted file mode 100644
index 9b2fd58ce7..0000000000
--- a/src/intellij-14/asm.iml.SAMPLE
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../asm">
- <sourceFolder url="file://$MODULE_DIR$/../asm/src" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/../asm" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/compiler.iml.SAMPLE b/src/intellij-14/compiler.iml.SAMPLE
deleted file mode 100644
index 858ca2f2c2..0000000000
--- a/src/intellij-14/compiler.iml.SAMPLE
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../compiler">
- <sourceFolder url="file://$MODULE_DIR$/../compiler" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="asm" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="reflect" />
- <orderEntry type="library" name="ant" level="project" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/diff.sh b/src/intellij-14/diff.sh
deleted file mode 100755
index 54f9248608..0000000000
--- a/src/intellij-14/diff.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-#
-# Diffs the SAMPLE files against the working project config.
-#
-export SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
-for f in "$SCRIPT_DIR"/*.{iml,ipr}; do
- echo $f; diff -u $f.SAMPLE $f;
-done
diff --git a/src/intellij-14/forkjoin.iml.SAMPLE b/src/intellij-14/forkjoin.iml.SAMPLE
deleted file mode 100644
index 42507b2911..0000000000
--- a/src/intellij-14/forkjoin.iml.SAMPLE
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../forkjoin">
- <sourceFolder url="file://$MODULE_DIR$/../forkjoin" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/interactive.iml.SAMPLE b/src/intellij-14/interactive.iml.SAMPLE
deleted file mode 100644
index db12a7dc9b..0000000000
--- a/src/intellij-14/interactive.iml.SAMPLE
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../interactive">
- <sourceFolder url="file://$MODULE_DIR$/../interactive" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="scaladoc" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/library.iml.SAMPLE b/src/intellij-14/library.iml.SAMPLE
deleted file mode 100644
index 08cccba4b9..0000000000
--- a/src/intellij-14/library.iml.SAMPLE
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../library">
- <sourceFolder url="file://$MODULE_DIR$/../library" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="forkjoin" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/manual.iml.SAMPLE b/src/intellij-14/manual.iml.SAMPLE
deleted file mode 100644
index 2e67076e28..0000000000
--- a/src/intellij-14/manual.iml.SAMPLE
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../manual">
- <sourceFolder url="file://$MODULE_DIR$/../manual" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="library" name="ant" level="project" />
- <orderEntry type="library" name="scaladoc-deps" level="project" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/partest-extras.iml.SAMPLE b/src/intellij-14/partest-extras.iml.SAMPLE
deleted file mode 100644
index b3537a949a..0000000000
--- a/src/intellij-14/partest-extras.iml.SAMPLE
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../partest-extras">
- <sourceFolder url="file://$MODULE_DIR$/../partest-extras" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="asm" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="repl" />
- <orderEntry type="library" name="partest" level="project" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/partest-javaagent.iml.SAMPLE b/src/intellij-14/partest-javaagent.iml.SAMPLE
deleted file mode 100644
index 3a387aab0f..0000000000
--- a/src/intellij-14/partest-javaagent.iml.SAMPLE
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../partest-javaagent">
- <sourceFolder url="file://$MODULE_DIR$/../partest-javaagent" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="asm" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/reflect.iml.SAMPLE b/src/intellij-14/reflect.iml.SAMPLE
deleted file mode 100644
index 87da13777b..0000000000
--- a/src/intellij-14/reflect.iml.SAMPLE
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../reflect">
- <sourceFolder url="file://$MODULE_DIR$/../reflect" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/repl.iml.SAMPLE b/src/intellij-14/repl.iml.SAMPLE
deleted file mode 100644
index 5a7476b1ef..0000000000
--- a/src/intellij-14/repl.iml.SAMPLE
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../repl">
- <sourceFolder url="file://$MODULE_DIR$/../repl" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="asm" />
- <orderEntry type="module" module-name="reflect" />
- <orderEntry type="library" name="repl-deps" level="project" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/scala.iml.SAMPLE b/src/intellij-14/scala.iml.SAMPLE
deleted file mode 100644
index 9e8718dd45..0000000000
--- a/src/intellij-14/scala.iml.SAMPLE
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../..">
- <excludeFolder url="file://$MODULE_DIR$/../../build" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/scala.ipr.SAMPLE b/src/intellij-14/scala.ipr.SAMPLE
deleted file mode 100644
index af0502034e..0000000000
--- a/src/intellij-14/scala.ipr.SAMPLE
+++ /dev/null
@@ -1,260 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="CompilerConfiguration">
- <option name="DEFAULT_COMPILER" value="Javac" />
- <resourceExtensions />
- <wildcardResourcePatterns>
- <entry name="!?*.java" />
- <entry name="!?*.form" />
- <entry name="!?*.class" />
- <entry name="!?*.groovy" />
- <entry name="!?*.scala" />
- <entry name="!?*.flex" />
- <entry name="!?*.kt" />
- <entry name="!?*.clj" />
- </wildcardResourcePatterns>
- <annotationProcessing>
- <profile default="true" name="Default" enabled="false">
- <processorPath useClasspath="true" />
- </profile>
- </annotationProcessing>
- </component>
- <component name="CopyrightManager" default="" />
- <component name="DaemonCodeAnalyzer">
- <disable_hints />
- </component>
- <component name="DependencyValidationManager">
- <option name="SKIP_IMPORT_STATEMENTS" value="false" />
- </component>
- <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
- <component name="EntryPointsManager">
- <entry_points version="2.0" />
- </component>
- <component name="ProjectLevelVcsManager" settingsEditedManually="false">
- <OptionsSetting value="true" id="Add" />
- <OptionsSetting value="true" id="Remove" />
- <OptionsSetting value="true" id="Checkout" />
- <OptionsSetting value="true" id="Update" />
- <OptionsSetting value="true" id="Status" />
- <OptionsSetting value="true" id="Edit" />
- <ConfirmationsSetting value="0" id="Add" />
- <ConfirmationsSetting value="0" id="Remove" />
- </component>
- <component name="ProjectModuleManager">
- <modules>
- <module fileurl="file://$PROJECT_DIR$/asm.iml" filepath="$PROJECT_DIR$/asm.iml" />
- <module fileurl="file://$PROJECT_DIR$/compiler.iml" filepath="$PROJECT_DIR$/compiler.iml" />
- <module fileurl="file://$PROJECT_DIR$/forkjoin.iml" filepath="$PROJECT_DIR$/forkjoin.iml" />
- <module fileurl="file://$PROJECT_DIR$/interactive.iml" filepath="$PROJECT_DIR$/interactive.iml" />
- <module fileurl="file://$PROJECT_DIR$/library.iml" filepath="$PROJECT_DIR$/library.iml" />
- <module fileurl="file://$PROJECT_DIR$/manual.iml" filepath="$PROJECT_DIR$/manual.iml" />
- <module fileurl="file://$PROJECT_DIR$/partest-extras.iml" filepath="$PROJECT_DIR$/partest-extras.iml" />
- <module fileurl="file://$PROJECT_DIR$/partest-javaagent.iml" filepath="$PROJECT_DIR$/partest-javaagent.iml" />
- <module fileurl="file://$PROJECT_DIR$/reflect.iml" filepath="$PROJECT_DIR$/reflect.iml" />
- <module fileurl="file://$PROJECT_DIR$/repl.iml" filepath="$PROJECT_DIR$/repl.iml" />
- <module fileurl="file://$PROJECT_DIR$/scala.iml" filepath="$PROJECT_DIR$/scala.iml" />
- <module fileurl="file://$PROJECT_DIR$/scaladoc.iml" filepath="$PROJECT_DIR$/scaladoc.iml" />
- <module fileurl="file://$PROJECT_DIR$/scalap.iml" filepath="$PROJECT_DIR$/scalap.iml" />
- <module fileurl="file://$PROJECT_DIR$/test.iml" filepath="$PROJECT_DIR$/test.iml" />
- <module fileurl="file://$PROJECT_DIR$/test-junit.iml" filepath="$PROJECT_DIR$/test-junit.iml" />
- </modules>
- </component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
- <output url="file://$PROJECT_DIR$/../../out" />
- </component>
- <component name="PropertiesComponent">
- <property name="GoToClass.includeLibraries" value="false" />
- <property name="GoToClass.toSaveIncludeLibraries" value="false" />
- <property name="GoToFile.includeJavaFiles" value="false" />
- <property name="MemberChooser.sorted" value="false" />
- <property name="MemberChooser.showClasses" value="true" />
- <property name="MemberChooser.copyJavadoc" value="false" />
- <property name="options.lastSelected" value="configurable.group.appearance" />
- <property name="options.splitter.main.proportions" value="0.3" />
- <property name="options.splitter.details.proportions" value="0.2" />
- <property name="options.searchVisible" value="true" />
- </component>
- <component name="RunManager">
- <configuration default="true" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin">
- <module name="" />
- <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
- <option name="PROGRAM_PARAMETERS" />
- <method />
- </configuration>
- <configuration default="true" type="Remote" factoryName="Remote">
- <option name="USE_SOCKET_TRANSPORT" value="true" />
- <option name="SERVER_MODE" value="false" />
- <option name="SHMEM_ADDRESS" value="javadebug" />
- <option name="HOST" value="localhost" />
- <option name="PORT" value="5005" />
- <method />
- </configuration>
- <configuration default="true" type="Applet" factoryName="Applet">
- <module name="" />
- <option name="MAIN_CLASS_NAME" />
- <option name="HTML_FILE_NAME" />
- <option name="HTML_USED" value="false" />
- <option name="WIDTH" value="400" />
- <option name="HEIGHT" value="300" />
- <option name="POLICY_FILE" value="$CARDEA_HOME$/bin/appletviewer.policy" />
- <option name="VM_PARAMETERS" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" />
- <method />
- </configuration>
- <configuration default="true" type="TestNG" factoryName="TestNG">
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
- <module name="" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" />
- <option name="SUITE_NAME" />
- <option name="PACKAGE_NAME" />
- <option name="MAIN_CLASS_NAME" />
- <option name="METHOD_NAME" />
- <option name="GROUP_NAME" />
- <option name="TEST_OBJECT" value="CLASS" />
- <option name="VM_PARAMETERS" value="-ea" />
- <option name="PARAMETERS" />
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
- <option name="OUTPUT_DIRECTORY" />
- <option name="ANNOTATION_TYPE" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <option name="TEST_SEARCH_SCOPE">
- <value defaultName="moduleWithDependencies" />
- </option>
- <option name="USE_DEFAULT_REPORTERS" value="false" />
- <option name="PROPERTIES_FILE" />
- <envs />
- <properties />
- <listeners />
- <method />
- </configuration>
- <configuration default="true" type="Application" factoryName="Application">
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
- <option name="MAIN_CLASS_NAME" />
- <option name="VM_PARAMETERS" />
- <option name="PROGRAM_PARAMETERS" />
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" />
- <option name="ENABLE_SWING_INSPECTOR" value="false" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <module name="" />
- <envs />
- <method />
- </configuration>
- <configuration default="true" type="JUnit" factoryName="JUnit">
- <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
- <module name="" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" />
- <option name="PACKAGE_NAME" />
- <option name="MAIN_CLASS_NAME" />
- <option name="METHOD_NAME" />
- <option name="TEST_OBJECT" value="class" />
- <option name="VM_PARAMETERS" value="-ea" />
- <option name="PARAMETERS" />
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <option name="TEST_SEARCH_SCOPE">
- <value defaultName="moduleWithDependencies" />
- </option>
- <envs />
- <patterns />
- <method />
- </configuration>
- <list size="0" />
- <configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false">
- <Host>localhost</Host>
- <Port>5050</Port>
- </configuration>
- </component>
- <component name="ScalaCompilerConfiguration">
- <parameters>
- <parameter value="-sourcepath" />
- <parameter value="$PROJECT_DIR$/../library" />
- </parameters>
- </component>
- <component name="VcsContentAnnotationSettings">
- <option name="myLimit" value="2678400000" />
- </component>
- <component name="VcsDirectoryMappings">
- <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
- </component>
- <component name="VcsManagerConfiguration">
- <option name="myTodoPanelSettings">
- <TodoPanelSettings />
- </option>
- </component>
- <component name="libraryTable">
- <library name="ant">
- <CLASSES>
- <root url="jar://$PROJECT_DIR$/../../lib/ant/ant.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- <library name="junit">
- <CLASSES>
- <root url="file://$PROJECT_DIR$/../../build/deps/junit" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/junit" recursive="false" />
- </library>
- <library name="partest">
- <CLASSES>
- <root url="file://$PROJECT_DIR$/../../build/deps/partest" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/partest" recursive="false" />
- </library>
- <library name="repl-deps">
- <CLASSES>
- <root url="file://$PROJECT_DIR$/../../build/deps/repl" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/repl" recursive="false" />
- </library>
- <library name="scaladoc-deps">
- <CLASSES>
- <root url="file://$PROJECT_DIR$/../../build/deps/scaladoc" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/scaladoc" recursive="false" />
- </library>
- <library name="starr" type="Scala">
- <properties>
- <compiler-classpath>
- <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-compiler-#scala-version#.jar" />
- <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-library-#scala-version#.jar" />
- <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-reflect-#scala-version#.jar" />
- </compiler-classpath>
- </properties>
- <CLASSES>
- <root url="jar://$PROJECT_DIR$/../../build/deps/starr/scala-library-#scala-version#.jar!/" />
- <root url="jar://$PROJECT_DIR$/../../build/deps/starr/scala-reflect-#scala-version#.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- <library name="starr-no-deps" type="Scala">
- <properties>
- <compiler-classpath>
- <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-compiler-#scala-version#.jar" />
- <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-library-#scala-version#.jar" />
- <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-reflect-#scala-version#.jar" />
- </compiler-classpath>
- </properties>
- <CLASSES />
- <JAVADOC />
- <SOURCES />
- </library>
- </component>
-</project> \ No newline at end of file
diff --git a/src/intellij-14/scaladoc.iml.SAMPLE b/src/intellij-14/scaladoc.iml.SAMPLE
deleted file mode 100644
index 5c7015aa61..0000000000
--- a/src/intellij-14/scaladoc.iml.SAMPLE
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../scaladoc">
- <sourceFolder url="file://$MODULE_DIR$/../scaladoc" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="reflect" />
- <orderEntry type="library" name="scaladoc-deps" level="project" />
- <orderEntry type="library" name="partest" level="project" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- <orderEntry type="library" name="ant" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/scalap.iml.SAMPLE b/src/intellij-14/scalap.iml.SAMPLE
deleted file mode 100644
index e09b8d11b6..0000000000
--- a/src/intellij-14/scalap.iml.SAMPLE
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../scalap">
- <sourceFolder url="file://$MODULE_DIR$/../scalap" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="reflect" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/setup.sh b/src/intellij-14/setup.sh
deleted file mode 100755
index cf08898f24..0000000000
--- a/src/intellij-14/setup.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-#
-# Generates IntelliJ IDEA project files based on the checked-in samples.
-#
-
-set -e
-export SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
-echo "About to delete .ipr and .iml files and replace with the .SAMPLE files. Press enter to continue or CTRL-C to cancel."
-read
-
-for f in "$SCRIPT_DIR"/*.SAMPLE; do
- g=${f%.SAMPLE}
- cp $f $g
-done
-
-SCALA_VERSION="`cat $SCRIPT_DIR/../../versions.properties | grep 'starr.version' | awk '{split($0,a,"="); print a[2]}'`"
-sed "s/#scala-version#/$SCALA_VERSION/g" $SCRIPT_DIR/scala.ipr.SAMPLE > $SCRIPT_DIR/scala.ipr \ No newline at end of file
diff --git a/src/intellij-14/test-junit.iml.SAMPLE b/src/intellij-14/test-junit.iml.SAMPLE
deleted file mode 100644
index 0dd9044066..0000000000
--- a/src/intellij-14/test-junit.iml.SAMPLE
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../../test/junit">
- <sourceFolder url="file://$MODULE_DIR$/../../test/junit" isTestSource="true" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="library" name="junit" level="project" />
- <orderEntry type="library" name="scaladoc-deps" level="project" />
- <orderEntry type="module" module-name="asm" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="forkjoin" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="partest-extras" />
- <orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="repl" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/test.iml.SAMPLE b/src/intellij-14/test.iml.SAMPLE
deleted file mode 100644
index 4492f66db6..0000000000
--- a/src/intellij-14/test.iml.SAMPLE
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../../test">
- <excludeFolder url="file://$MODULE_DIR$/../../test/junit" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="asm" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="forkjoin" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="partest-extras" />
- <orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="repl" />
- <orderEntry type="library" name="partest" level="project" />
- <orderEntry type="library" name="scaladoc-deps" level="project" />
- <orderEntry type="library" name="starr-no-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij-14/update.sh b/src/intellij-14/update.sh
deleted file mode 100755
index eb6fea782f..0000000000
--- a/src/intellij-14/update.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-#
-# Updates the .SAMPLE files with the current project files.
-#
-
-set -e
-export SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
-
-echo "About to create overwrite the .ipr.SAMPLE and .iml.SAMPLE files with the current project files. Press enter to continue or CTRL-C to cancel."
-read
-
-for f in "$SCRIPT_DIR"/*.{iml,ipr}; do
- cp $f $f.SAMPLE
-done
-
-for f in "$SCRIPT_DIR"/*.SAMPLE; do
- g=${f%.SAMPLE}
- if [[ ! -f $g ]]; then
- echo "Stale sample file, deleting $f"
- rm $f
- fi
-done
diff --git a/src/intellij/README b/src/intellij/README
index a39691f4f0..4ecab5561f 100644
--- a/src/intellij/README
+++ b/src/intellij/README
@@ -7,6 +7,6 @@ The following steps are required to use IntelliJ IDEA on Scala trunk
- Run "ant init". This will download some JARs from to ./build/deps, which are
included in IntelliJ's classpath.
- Run src/intellij/setup.sh
- - Open ./src/intellij/scala-lang.ipr in IntelliJ
+ - Open ./src/intellij/scala.ipr in IntelliJ
- File, Project Settings, Project, SDK. Create an SDK entry named "1.6" containing the
- java 1.6 SDK
+ Java 1.6 SDK
diff --git a/src/intellij/asm.iml.SAMPLE b/src/intellij/asm.iml.SAMPLE
index ba9e7e899f..9886154bdf 100644
--- a/src/intellij/asm.iml.SAMPLE
+++ b/src/intellij/asm.iml.SAMPLE
@@ -8,5 +8,4 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/compiler.iml.SAMPLE b/src/intellij/compiler.iml.SAMPLE
index 50253000ab..0e121925e6 100644
--- a/src/intellij/compiler.iml.SAMPLE
+++ b/src/intellij/compiler.iml.SAMPLE
@@ -1,27 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="languageLevel" value="Scala 2.11" />
- <option name="maximumHeapSize" value="1536" />
- <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../compiler">
+ <sourceFolder url="file://$MODULE_DIR$/../compiler/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../compiler" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="library" />
<orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="asm" />
+ <orderEntry type="library" name="starr" level="project" />
<orderEntry type="library" name="ant" level="project" />
+ <orderEntry type="library" name="asm" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/forkjoin.iml.SAMPLE b/src/intellij/forkjoin.iml.SAMPLE
index be807cc019..42507b2911 100644
--- a/src/intellij/forkjoin.iml.SAMPLE
+++ b/src/intellij/forkjoin.iml.SAMPLE
@@ -8,5 +8,4 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/interactive.iml.SAMPLE b/src/intellij/interactive.iml.SAMPLE
index 83178021d3..047b5c9069 100644
--- a/src/intellij/interactive.iml.SAMPLE
+++ b/src/intellij/interactive.iml.SAMPLE
@@ -1,16 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="languageLevel" value="Scala 2.11" />
- <option name="maximumHeapSize" value="1536" />
- <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../interactive">
@@ -18,10 +7,9 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="compiler" />
<orderEntry type="module" module-name="library" />
<orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="scaladoc" />
+ <orderEntry type="library" name="starr" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/library.iml.SAMPLE b/src/intellij/library.iml.SAMPLE
index 137ce6eb9c..b03fef9414 100644
--- a/src/intellij/library.iml.SAMPLE
+++ b/src/intellij/library.iml.SAMPLE
@@ -1,25 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="compilerOptions" value="-sourcepath $MODULE_DIR$/../library" />
- <option name="languageLevel" value="Scala 2.11" />
- <option name="maximumHeapSize" value="1536" />
- <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../library">
+ <sourceFolder url="file://$MODULE_DIR$/../library/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../library" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="forkjoin" />
+ <orderEntry type="library" name="starr" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/manual.iml.SAMPLE b/src/intellij/manual.iml.SAMPLE
index 8babde73ea..97bfb5940a 100644
--- a/src/intellij/manual.iml.SAMPLE
+++ b/src/intellij/manual.iml.SAMPLE
@@ -1,16 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="languageLevel" value="Scala 2.11" />
- <option name="maximumHeapSize" value="1536" />
- <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../manual">
@@ -19,8 +8,8 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="library" />
- <orderEntry type="library" name="ant" level="project" />
<orderEntry type="library" name="scaladoc-deps" level="project" />
+ <orderEntry type="library" name="ant" level="project" />
+ <orderEntry type="library" name="starr" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/partest-extras.iml.SAMPLE b/src/intellij/partest-extras.iml.SAMPLE
index c2ada43493..1cd712184b 100644
--- a/src/intellij/partest-extras.iml.SAMPLE
+++ b/src/intellij/partest-extras.iml.SAMPLE
@@ -1,14 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="languageLevel" value="Scala 2.11" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../partest-extras">
@@ -16,12 +7,12 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="asm" />
+ <orderEntry type="module" module-name="compiler" />
<orderEntry type="module" module-name="library" />
<orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="compiler" />
<orderEntry type="module" module-name="repl" />
<orderEntry type="library" name="partest" level="project" />
+ <orderEntry type="library" name="starr" level="project" />
+ <orderEntry type="library" name="asm" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/partest-javaagent.iml.SAMPLE b/src/intellij/partest-javaagent.iml.SAMPLE
index e47e0f6349..ffc540cdb9 100644
--- a/src/intellij/partest-javaagent.iml.SAMPLE
+++ b/src/intellij/partest-javaagent.iml.SAMPLE
@@ -7,7 +7,6 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="asm" />
+ <orderEntry type="library" name="asm" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/reflect.iml.SAMPLE b/src/intellij/reflect.iml.SAMPLE
index d206304896..c9b7130aef 100644
--- a/src/intellij/reflect.iml.SAMPLE
+++ b/src/intellij/reflect.iml.SAMPLE
@@ -1,17 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="compilerOptions" value="-sourcepath $MODULE_DIR$/../reflect" />
- <option name="languageLevel" value="Scala 2.11" />
- <option name="maximumHeapSize" value="1536" />
- <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../reflect">
@@ -20,6 +8,6 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="library" />
+ <orderEntry type="library" name="starr" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/repl.iml.SAMPLE b/src/intellij/repl.iml.SAMPLE
index 83791f4f6e..7476f30131 100644
--- a/src/intellij/repl.iml.SAMPLE
+++ b/src/intellij/repl.iml.SAMPLE
@@ -1,16 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="languageLevel" value="Scala 2.11" />
- <option name="maximumHeapSize" value="1536" />
- <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../repl">
@@ -18,10 +7,11 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="compiler" />
<orderEntry type="module" module-name="library" />
<orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="compiler" />
+ <orderEntry type="library" name="starr" level="project" />
<orderEntry type="library" name="repl-deps" level="project" />
+ <orderEntry type="library" name="asm" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/scala-lang.ipr.SAMPLE b/src/intellij/scala-lang.ipr.SAMPLE
deleted file mode 100644
index a22bbd11dd..0000000000
--- a/src/intellij/scala-lang.ipr.SAMPLE
+++ /dev/null
@@ -1,286 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="CompilerConfiguration">
- <option name="DEFAULT_COMPILER" value="Javac" />
- <resourceExtensions>
- <entry name=".+\.(properties|xml|html|dtd|tld)" />
- <entry name=".+\.(gif|png|jpeg|jpg)" />
- </resourceExtensions>
- <wildcardResourcePatterns>
- <entry name="?*.properties" />
- <entry name="?*.xml" />
- <entry name="?*.gif" />
- <entry name="?*.png" />
- <entry name="?*.jpeg" />
- <entry name="?*.jpg" />
- <entry name="?*.html" />
- <entry name="?*.dtd" />
- <entry name="?*.tld" />
- <entry name="?*.ftl" />
- </wildcardResourcePatterns>
- <annotationProcessing>
- <profile default="true" name="Default" enabled="false">
- <processorPath useClasspath="true" />
- </profile>
- </annotationProcessing>
- </component>
- <component name="CopyrightManager" default="" />
- <component name="DependencyValidationManager">
- <option name="SKIP_IMPORT_STATEMENTS" value="false" />
- </component>
- <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
- <component name="EntryPointsManager">
- <entry_points version="2.0" />
- </component>
- <component name="HighlightingAdvisor">
- <option name="SUGGEST_TYPE_AWARE_HIGHLIGHTING" value="false" />
- </component>
- <component name="InspectionProjectProfileManager">
- <profiles>
- <profile version="1.0" is_locked="false">
- <option name="myName" value="Project Default" />
- <option name="myLocal" value="false" />
- <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
- <option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
- <option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
- </inspection_tool>
- <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
- <option name="processCode" value="true" />
- <option name="processLiterals" value="true" />
- <option name="processComments" value="true" />
- </inspection_tool>
- <inspection_tool class="UnitMethodIsParameterless" enabled="false" level="WARNING" enabled_by_default="false" />
- </profile>
- </profiles>
- <option name="PROJECT_PROFILE" value="Project Default" />
- <option name="USE_PROJECT_PROFILE" value="true" />
- <version value="1.0" />
- </component>
- <component name="JavacSettings">
- <option name="ADDITIONAL_OPTIONS_STRING" value="-source 1.6 -target 1.6" />
- </component>
- <component name="JavadocGenerationManager">
- <option name="OUTPUT_DIRECTORY" />
- <option name="OPTION_SCOPE" value="protected" />
- <option name="OPTION_HIERARCHY" value="true" />
- <option name="OPTION_NAVIGATOR" value="true" />
- <option name="OPTION_INDEX" value="true" />
- <option name="OPTION_SEPARATE_INDEX" value="true" />
- <option name="OPTION_DOCUMENT_TAG_USE" value="false" />
- <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false" />
- <option name="OPTION_DOCUMENT_TAG_VERSION" value="false" />
- <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true" />
- <option name="OPTION_DEPRECATED_LIST" value="true" />
- <option name="OTHER_OPTIONS" value="" />
- <option name="HEAP_SIZE" />
- <option name="LOCALE" />
- <option name="OPEN_IN_BROWSER" value="true" />
- </component>
- <component name="Palette2">
- <group name="Swing">
- <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
- </item>
- <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
- </item>
- <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
- <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
- <initial-values>
- <property name="text" value="Button" />
- </initial-values>
- </item>
- <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="RadioButton" />
- </initial-values>
- </item>
- <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="CheckBox" />
- </initial-values>
- </item>
- <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="Label" />
- </initial-values>
- </item>
- <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
- <preferred-size width="200" height="200" />
- </default-constraints>
- </item>
- <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
- <preferred-size width="200" height="200" />
- </default-constraints>
- </item>
- <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
- </item>
- <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
- <preferred-size width="-1" height="20" />
- </default-constraints>
- </item>
- <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
- </item>
- <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
- </item>
- </group>
- </component>
- <component name="ProjectDictionaryState">
- <dictionary name="luc" />
- </component>
- <component name="ProjectModuleManager">
- <modules>
- <module fileurl="file://$PROJECT_DIR$/asm.iml" filepath="$PROJECT_DIR$/asm.iml" />
- <module fileurl="file://$PROJECT_DIR$/compiler.iml" filepath="$PROJECT_DIR$/compiler.iml" />
- <module fileurl="file://$PROJECT_DIR$/forkjoin.iml" filepath="$PROJECT_DIR$/forkjoin.iml" />
- <module fileurl="file://$PROJECT_DIR$/interactive.iml" filepath="$PROJECT_DIR$/interactive.iml" />
- <module fileurl="file://$PROJECT_DIR$/library.iml" filepath="$PROJECT_DIR$/library.iml" />
- <module fileurl="file://$PROJECT_DIR$/manual.iml" filepath="$PROJECT_DIR$/manual.iml" />
- <module fileurl="file://$PROJECT_DIR$/partest-extras.iml" filepath="$PROJECT_DIR$/partest-extras.iml" />
- <module fileurl="file://$PROJECT_DIR$/partest-javaagent.iml" filepath="$PROJECT_DIR$/partest-javaagent.iml" />
- <module fileurl="file://$PROJECT_DIR$/reflect.iml" filepath="$PROJECT_DIR$/reflect.iml" />
- <module fileurl="file://$PROJECT_DIR$/repl.iml" filepath="$PROJECT_DIR$/repl.iml" />
- <module fileurl="file://$PROJECT_DIR$/scala.iml" filepath="$PROJECT_DIR$/scala.iml" />
- <module fileurl="file://$PROJECT_DIR$/scaladoc.iml" filepath="$PROJECT_DIR$/scaladoc.iml" />
- <module fileurl="file://$PROJECT_DIR$/scalap.iml" filepath="$PROJECT_DIR$/scalap.iml" />
- <module fileurl="file://$PROJECT_DIR$/test.iml" filepath="$PROJECT_DIR$/test.iml" />
- <module fileurl="file://$PROJECT_DIR$/test-junit.iml" filepath="$PROJECT_DIR$/test-junit.iml" />
- <module fileurl="file://$PROJECT_DIR$/test-osgi.iml" filepath="$PROJECT_DIR$/test-osgi.iml" />
- </modules>
- </component>
- <component name="ProjectResources">
- <default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
- </component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
- <output url="file://$PROJECT_DIR$/../../out" />
- </component>
- <component name="ScalacSettings">
- <option name="COMPILER_LIBRARY_NAME" value="compiler-locker" />
- <option name="COMPILER_LIBRARY_LEVEL" value="Project" />
- </component>
- <component name="VcsDirectoryMappings">
- <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
- </component>
- <component name="libraryTable">
- <library name="ant">
- <CLASSES>
- <root url="jar://$PROJECT_DIR$/../../lib/ant/ant.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- <library name="junit">
- <CLASSES>
- <root url="file://$PROJECT_DIR$/../../build/deps/junit" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/junit" recursive="false" />
- </library>
- <library name="partest">
- <CLASSES>
- <root url="file://$PROJECT_DIR$/../../build/deps/partest" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/partest" recursive="false" />
- </library>
- <library name="repl-deps">
- <CLASSES>
- <root url="file://$PROJECT_DIR$/../../build/deps/repl" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/repl" recursive="false" />
- </library>
- <library name="scaladoc-deps">
- <CLASSES>
- <root url="file://$PROJECT_DIR$/../../build/deps/scaladoc" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/scaladoc" recursive="false" />
- </library>
- <library name="starr">
- <CLASSES>
- <root url="file://$PROJECT_DIR$/../../build/deps/starr" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/starr" recursive="false" />
- </library>
- </component>
-</project>
-
diff --git a/src/intellij/scala.iml.SAMPLE b/src/intellij/scala.iml.SAMPLE
index a4d863800b..9e8718dd45 100644
--- a/src/intellij/scala.iml.SAMPLE
+++ b/src/intellij/scala.iml.SAMPLE
@@ -8,5 +8,4 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/scala.ipr.SAMPLE b/src/intellij/scala.ipr.SAMPLE
new file mode 100644
index 0000000000..290d53aa5d
--- /dev/null
+++ b/src/intellij/scala.ipr.SAMPLE
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="CompilerConfiguration">
+ <option name="DEFAULT_COMPILER" value="Javac" />
+ <resourceExtensions />
+ <wildcardResourcePatterns>
+ <entry name="!?*.java" />
+ <entry name="!?*.form" />
+ <entry name="!?*.class" />
+ <entry name="!?*.groovy" />
+ <entry name="!?*.scala" />
+ <entry name="!?*.flex" />
+ <entry name="!?*.kt" />
+ <entry name="!?*.clj" />
+ </wildcardResourcePatterns>
+ <annotationProcessing>
+ <profile default="true" name="Default" enabled="false">
+ <processorPath useClasspath="true" />
+ </profile>
+ </annotationProcessing>
+ </component>
+ <component name="CopyrightManager" default="" />
+ <component name="EntryPointsManager">
+ <entry_points version="2.0" />
+ </component>
+ <component name="ProjectLevelVcsManager" settingsEditedManually="false">
+ <OptionsSetting value="true" id="Add" />
+ <OptionsSetting value="true" id="Remove" />
+ <OptionsSetting value="true" id="Checkout" />
+ <OptionsSetting value="true" id="Update" />
+ <OptionsSetting value="true" id="Status" />
+ <OptionsSetting value="true" id="Edit" />
+ <ConfirmationsSetting value="0" id="Add" />
+ <ConfirmationsSetting value="0" id="Remove" />
+ </component>
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/compiler.iml" filepath="$PROJECT_DIR$/compiler.iml" />
+ <module fileurl="file://$PROJECT_DIR$/forkjoin.iml" filepath="$PROJECT_DIR$/forkjoin.iml" />
+ <module fileurl="file://$PROJECT_DIR$/interactive.iml" filepath="$PROJECT_DIR$/interactive.iml" />
+ <module fileurl="file://$PROJECT_DIR$/library.iml" filepath="$PROJECT_DIR$/library.iml" />
+ <module fileurl="file://$PROJECT_DIR$/manual.iml" filepath="$PROJECT_DIR$/manual.iml" />
+ <module fileurl="file://$PROJECT_DIR$/partest-extras.iml" filepath="$PROJECT_DIR$/partest-extras.iml" />
+ <module fileurl="file://$PROJECT_DIR$/partest-javaagent.iml" filepath="$PROJECT_DIR$/partest-javaagent.iml" />
+ <module fileurl="file://$PROJECT_DIR$/reflect.iml" filepath="$PROJECT_DIR$/reflect.iml" />
+ <module fileurl="file://$PROJECT_DIR$/repl.iml" filepath="$PROJECT_DIR$/repl.iml" />
+ <module fileurl="file://$PROJECT_DIR$/scala.iml" filepath="$PROJECT_DIR$/scala.iml" />
+ <module fileurl="file://$PROJECT_DIR$/scaladoc.iml" filepath="$PROJECT_DIR$/scaladoc.iml" />
+ <module fileurl="file://$PROJECT_DIR$/scalap.iml" filepath="$PROJECT_DIR$/scalap.iml" />
+ <module fileurl="file://$PROJECT_DIR$/test.iml" filepath="$PROJECT_DIR$/test.iml" />
+ <module fileurl="file://$PROJECT_DIR$/test-junit.iml" filepath="$PROJECT_DIR$/test-junit.iml" />
+ </modules>
+ </component>
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
+ <output url="file://$PROJECT_DIR$/../../out" />
+ </component>
+ <component name="ScalaCompilerConfiguration">
+ <parameters>
+ <parameter value="-sourcepath" />
+ <parameter value="$PROJECT_DIR$/../library" />
+ </parameters>
+ </component>
+ <component name="VcsDirectoryMappings">
+ <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
+ </component>
+ <component name="libraryTable">
+ <library name="ant">
+ <CLASSES>
+ <root url="jar://$PROJECT_DIR$/../../lib/ant/ant.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ <library name="asm">
+ <CLASSES>
+ <root url="file://$PROJECT_DIR$/../../build/deps/asm" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/asm" recursive="false" />
+ </library>
+ <library name="junit">
+ <CLASSES>
+ <root url="file://$PROJECT_DIR$/../../build/deps/junit" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/junit" recursive="false" />
+ </library>
+ <library name="partest">
+ <CLASSES>
+ <root url="file://$PROJECT_DIR$/../../build/deps/partest" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/partest" recursive="false" />
+ </library>
+ <library name="repl-deps">
+ <CLASSES>
+ <root url="file://$PROJECT_DIR$/../../build/deps/repl" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/repl" recursive="false" />
+ </library>
+ <library name="scaladoc-deps">
+ <CLASSES>
+ <root url="file://$PROJECT_DIR$/../../build/deps/scaladoc" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ <jarDirectory url="file://$PROJECT_DIR$/../../build/deps/scaladoc" recursive="false" />
+ </library>
+ <library name="starr" type="Scala">
+ <properties>
+ <compiler-classpath>
+ <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-compiler-#starr-version#.jar" />
+ <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-library-#starr-version#.jar" />
+ <root url="file://$PROJECT_DIR$/../../build/deps/starr/scala-reflect-#starr-version#.jar" />
+ </compiler-classpath>
+ </properties>
+ <CLASSES />
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </component>
+</project> \ No newline at end of file
diff --git a/src/intellij/scaladoc.iml.SAMPLE b/src/intellij/scaladoc.iml.SAMPLE
index 8f9a0d8344..4ba0a848c6 100644
--- a/src/intellij/scaladoc.iml.SAMPLE
+++ b/src/intellij/scaladoc.iml.SAMPLE
@@ -1,16 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="languageLevel" value="Scala 2.11" />
- <option name="maximumHeapSize" value="1536" />
- <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../scaladoc">
@@ -18,11 +7,12 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="compiler" />
<orderEntry type="module" module-name="library" />
<orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="library" name="partest" level="project" />
+ <orderEntry type="library" name="starr" level="project" />
<orderEntry type="library" name="scaladoc-deps" level="project" />
+ <orderEntry type="library" name="ant" level="project" />
+ <orderEntry type="library" name="partest" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/scalap.iml.SAMPLE b/src/intellij/scalap.iml.SAMPLE
index 27ae451369..665aac07f8 100644
--- a/src/intellij/scalap.iml.SAMPLE
+++ b/src/intellij/scalap.iml.SAMPLE
@@ -1,16 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="languageLevel" value="Scala 2.11" />
- <option name="maximumHeapSize" value="1536" />
- <option name="vmOptions" value="-Xms1536m -Xss1m -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops -XX:+UseParallelGC" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../scalap">
@@ -19,8 +8,8 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="reflect" />
<orderEntry type="module" module-name="compiler" />
+ <orderEntry type="module" module-name="reflect" />
+ <orderEntry type="library" name="starr" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/setup.sh b/src/intellij/setup.sh
index ec303778ed..251f717829 100755
--- a/src/intellij/setup.sh
+++ b/src/intellij/setup.sh
@@ -12,3 +12,6 @@ for f in "$SCRIPT_DIR"/*.SAMPLE; do
g=${f%.SAMPLE}
cp $f $g
done
+
+STARR_VERSION="`cat $SCRIPT_DIR/../../versions.properties | grep 'starr.version' | awk '{split($0,a,"="); print a[2]}'`"
+sed "s/#starr-version#/$STARR_VERSION/g" $SCRIPT_DIR/scala.ipr.SAMPLE > $SCRIPT_DIR/scala.ipr
diff --git a/src/intellij/test-junit.iml.SAMPLE b/src/intellij/test-junit.iml.SAMPLE
index b633166f7a..8252ef6d98 100644
--- a/src/intellij/test-junit.iml.SAMPLE
+++ b/src/intellij/test-junit.iml.SAMPLE
@@ -1,13 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../../test/junit">
@@ -15,15 +7,16 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="asm" />
<orderEntry type="module" module-name="compiler" />
+ <orderEntry type="module" module-name="forkjoin" />
<orderEntry type="module" module-name="library" />
+ <orderEntry type="module" module-name="partest-extras" />
<orderEntry type="module" module-name="reflect" />
<orderEntry type="module" module-name="repl" />
- <orderEntry type="module" module-name="partest-extras" />
- <orderEntry type="module" module-name="forkjoin" />
- <orderEntry type="library" name="junit" level="project" />
+ <orderEntry type="module" module-name="scaladoc" />
<orderEntry type="library" name="scaladoc-deps" level="project" />
+ <orderEntry type="library" name="junit" level="project" />
+ <orderEntry type="library" name="starr" level="project" />
+ <orderEntry type="library" name="asm" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/intellij/test-osgi.iml.SAMPLE b/src/intellij/test-osgi.iml.SAMPLE
deleted file mode 100644
index d2ed5be974..0000000000
--- a/src/intellij/test-osgi.iml.SAMPLE
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../../test/osgi">
- <sourceFolder url="file://$MODULE_DIR$/../../test/osgi/src" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="asm" />
- <orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="reflect" />
- <orderEntry type="module" module-name="repl" />
- <orderEntry type="module" module-name="partest-extras" />
- <orderEntry type="module" module-name="forkjoin" />
- <orderEntry type="library" name="junit" level="project" />
- <orderEntry type="library" name="scaladoc-deps" level="project" />
- <orderEntry type="library" name="scala-sdk" level="project" />
- <orderEntry type="library" scope="PROVIDED" name="pax.exam-deps" level="project" />
- </component>
-</module> \ No newline at end of file
diff --git a/src/intellij/test.iml.SAMPLE b/src/intellij/test.iml.SAMPLE
index 7e19a83d34..e7eb7576c3 100644
--- a/src/intellij/test.iml.SAMPLE
+++ b/src/intellij/test.iml.SAMPLE
@@ -1,14 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="scala" name="Scala">
- <configuration>
- <option name="compilerLibraryLevel" value="Project" />
- <option name="compilerLibraryName" value="starr" />
- <option name="languageLevel" value="Scala 2.11" />
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../../test">
@@ -16,15 +7,15 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="library" />
- <orderEntry type="module" module-name="reflect" />
<orderEntry type="module" module-name="compiler" />
- <orderEntry type="module" module-name="repl" />
- <orderEntry type="module" module-name="asm" />
<orderEntry type="module" module-name="forkjoin" />
+ <orderEntry type="module" module-name="interactive" />
+ <orderEntry type="module" module-name="library" />
<orderEntry type="module" module-name="partest-extras" />
- <orderEntry type="library" name="scaladoc-deps" level="project" />
+ <orderEntry type="module" module-name="reflect" />
+ <orderEntry type="module" module-name="repl" />
<orderEntry type="library" name="partest" level="project" />
+ <orderEntry type="library" name="scaladoc-deps" level="project" />
+ <orderEntry type="library" name="asm" level="project" />
</component>
-</module>
-
+</module> \ No newline at end of file
diff --git a/src/library/scala/Array.scala b/src/library/scala/Array.scala
index 6ab82d998e..d89e9d291d 100644
--- a/src/library/scala/Array.scala
+++ b/src/library/scala/Array.scala
@@ -483,7 +483,7 @@ object Array extends FallbackArrayBuilding {
*
* @author Martin Odersky
* @version 1.0
- * @see [[http://www.scala-lang.org/docu/files/ScalaReference.pdf Scala Language Specification]], for in-depth information on the transformations the Scala compiler makes on Arrays (Sections 6.6 and 6.15 respectively.)
+ * @see [[http://www.scala-lang.org/files/archive/spec/2.11/ Scala Language Specification]], for in-depth information on the transformations the Scala compiler makes on Arrays (Sections 6.6 and 6.15 respectively.)
* @see [[http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html "Scala 2.8 Arrays"]] the Scala Improvement Document detailing arrays since Scala 2.8.
* @see [[http://docs.scala-lang.org/overviews/collections/arrays.html "The Scala 2.8 Collections' API"]] section on `Array` by Martin Odersky for more information.
* @define coll array
diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala
index 3cc83654b7..0914bcefa3 100644
--- a/src/library/scala/Predef.scala
+++ b/src/library/scala/Predef.scala
@@ -35,9 +35,9 @@ import scala.io.StdIn
* === Assertions ===
*
* A set of `assert` functions are provided for use as a way to document
- * and dynamically check invariants in code. `assert` statements can be elided
- * at runtime by providing the command line argument `-Xdisable-assertions` to
- * the `scala` command.
+ * and dynamically check invariants in code. Invocations of `assert` can be elided
+ * at compile time by providing the command line option `-Xdisable-assertions`,
+ * which raises `-Xelide-below` above `elidable.ASSERTION`, to the `scalac` command.
*
* Variants of `assert` intended for use with static analysis tools are also
* provided: `assume`, `require` and `ensuring`. `require` and `ensuring` are
diff --git a/src/library/scala/collection/GenSeqLike.scala b/src/library/scala/collection/GenSeqLike.scala
index cf1de0c8e6..f786293822 100644
--- a/src/library/scala/collection/GenSeqLike.scala
+++ b/src/library/scala/collection/GenSeqLike.scala
@@ -275,6 +275,7 @@ trait GenSeqLike[+A, +Repr] extends Any with GenIterableLike[A, Repr] with Equal
* @tparam That $thatinfo
* @param bf $bfinfo
* @return a new $coll` which is a copy of this $coll with the element at position `index` replaced by `elem`.
+ * @throws IndexOutOfBoundsException if `index` does not satisfy `0 <= index < length`.
*
* @usecase def updated(index: Int, elem: A): $Coll[A]
* @inheritdoc
diff --git a/src/library/scala/util/Try.scala b/src/library/scala/util/Try.scala
index c807677119..1a13ac2305 100644
--- a/src/library/scala/util/Try.scala
+++ b/src/library/scala/util/Try.scala
@@ -165,8 +165,8 @@ sealed abstract class Try[+T] extends Product with Serializable {
def flatten[U](implicit ev: T <:< Try[U]): Try[U]
/**
- * Completes this `Try` with an exception wrapped in a `Success`. The exception is either the exception that the
- * `Try` failed with (if a `Failure`) or an `UnsupportedOperationException`.
+ * Inverts this `Try`. If this is a `Failure`, returns its exception wrapped in a `Success`.
+ * If this is a `Success`, returns a `Failure` containing an `UnsupportedOperationException`.
*/
def failed: Try[Throwable]
diff --git a/src/reflect/scala/reflect/api/Constants.scala b/src/reflect/scala/reflect/api/Constants.scala
index fbcf7f3e4f..4cc2cb86b2 100644
--- a/src/reflect/scala/reflect/api/Constants.scala
+++ b/src/reflect/scala/reflect/api/Constants.scala
@@ -95,7 +95,7 @@ trait Constants {
* broken down or evaluated, such as "true", "0", "classOf[List]". Such values become parts of the Scala abstract
* syntax tree representing the program. The constants
* correspond to section 6.24 "Constant Expressions" of the
- * [[http://www.scala-lang.org/docu/files/ScalaReference.pdf Scala language specification]].
+ * [[http://www.scala-lang.org/files/archive/spec/2.11/ Scala Language Specification]].
*
* Such constants are used to represent literals in abstract syntax trees (the [[scala.reflect.api.Trees#Literal]] node)
* and literal arguments for Java class file annotations (the [[scala.reflect.api.Annotations#LiteralArgument]] class).
diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala
index c86d08e925..5b20d9db8e 100644
--- a/src/reflect/scala/reflect/internal/Definitions.scala
+++ b/src/reflect/scala/reflect/internal/Definitions.scala
@@ -1513,6 +1513,10 @@ trait Definitions extends api.StandardDefinitions {
def isPolymorphicSignature(sym: Symbol) = PolySigMethods(sym)
private lazy val PolySigMethods: Set[Symbol] = Set[Symbol](MethodHandle.info.decl(sn.Invoke), MethodHandle.info.decl(sn.InvokeExact)).filter(_.exists)
+
+ lazy val Scala_Java8_CompatPackage = rootMirror.getPackageIfDefined("scala.compat.java8")
+ lazy val Scala_Java8_CompatPackage_JFunction = (0 to MaxTupleArity).toArray map (i => getMemberIfDefined(Scala_Java8_CompatPackage.moduleClass, TypeName("JFunction" + i)))
+ lazy val Scala_Java8_CompatPackage_JProcedure = (0 to MaxTupleArity).toArray map (i => getMemberIfDefined(Scala_Java8_CompatPackage.moduleClass, TypeName("JProcedure" + i)))
}
}
}
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index 2b6c73c8eb..f9ebae64d2 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -794,7 +794,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
final def isAnonymousFunction = isSynthetic && (name containsName tpnme.ANON_FUN_NAME)
final def isDelambdafyFunction = isSynthetic && (name containsName tpnme.DELAMBDAFY_LAMBDA_CLASS_NAME)
- final def isDelambdafyTarget = isSynthetic && isMethod && (name containsName tpnme.ANON_FUN_NAME)
+ final def isDelambdafyTarget = isArtifact && isMethod && (name containsName tpnme.ANON_FUN_NAME)
final def isDefinedInPackage = effectiveOwner.isPackageClass
final def needsFlatClasses = phase.flatClasses && rawowner != NoSymbol && !rawowner.isPackageClass
diff --git a/src/reflect/scala/reflect/internal/transform/Erasure.scala b/src/reflect/scala/reflect/internal/transform/Erasure.scala
index ac7839bcfd..5a03c1eeaa 100644
--- a/src/reflect/scala/reflect/internal/transform/Erasure.scala
+++ b/src/reflect/scala/reflect/internal/transform/Erasure.scala
@@ -254,6 +254,8 @@ trait Erasure {
def mergeParents(parents: List[Type]): Type =
if (parents.isEmpty) ObjectTpe
else parents.head
+
+ override protected def eraseDerivedValueClassRef(tref: TypeRef): Type = eraseNormalClassRef(tref)
}
object scalaErasure extends ScalaErasureMap
diff --git a/src/reflect/scala/reflect/runtime/JavaMirrors.scala b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
index 237efd004f..ce60ade9f5 100644
--- a/src/reflect/scala/reflect/runtime/JavaMirrors.scala
+++ b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
@@ -591,6 +591,7 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
// don't use classOf[scala.reflect.ScalaSignature] here, because it will use getClass.getClassLoader, not mirror's classLoader
// don't use asInstanceOf either because of the same reason (lol, I cannot believe I fell for it)
// don't use structural types to simplify reflective invocations because of the same reason
+ // TODO SI-9296 duplicated code, refactor
def loadAnnotation(name: String): Option[java.lang.annotation.Annotation] =
tryJavaClass(name) flatMap { annotClass =>
val anns = jclazz.getAnnotations
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala
deleted file mode 100644
index 37145756d9..0000000000
--- a/src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala
+++ /dev/null
@@ -1,127 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2007-2013 LAMP/EPFL
- * @author David Bernard, Manohar Jonnalagedda
- */
-
-package scala.tools.nsc
-package doc
-package html
-package page
-
-import scala.xml.NodeSeq
-import java.io.File
-
-class Source(sourceFile: File) extends HtmlPage {
-
- val path = List("source.html")
-
- val title = "Scaladoc: page source"
-
- val headers =
- NodeSeq.Empty
-
- val body =
- <body>
- <h1>Page source is not implemented yet</h1>
- </body>
-
- /*
-
-
- def readTextFromSrcDir(subPath: String) :Option[String] = {
- readTextFromFile(new File(sourceDir, subPath))
- }
-
- def readTextFromFile(f : File) :Option[String] = {
- if (f.exists) {
- Some(Source.fromFile(f)(Codec.default).getLines().mkString(""))
- } else {
- None
- }
- }
-
-
- def writeTextToFile(f : File, txt : String, header: Option[String], footer: Option[String]) {
- val out = new FileOutputStream(f)
- try {
- val enc = "UTF-8"
- header.foreach(s => out.write(s.getBytes(enc)))
- out.write(txt.getBytes(enc))
- footer.foreach(s => out.write(s.getBytes(enc)))
- } finally {
- try {
- out.close()
- } catch {
- case _ => //ignore
- }
- }
- }
-
- trait SourceHtmlizer {
- def scalaToHtml(src :File) : Option[File]
- }
-
- lazy val sourceHtmlizer : SourceHtmlizer = {
- if (cfg.htmlizeSource) {
- new SourceHtmlizer {
-
- val inDir: File = cfg.sourcedir
- val outDir: File = cfg.outputdir
-
- private def relativize(uri: URI, from: URI) = linkHelper.relativize(uri, from).getOrElse("__notFound__" + uri.getPath)
-
- def header(dest: URI) = Some("""
- <html>
- <head>
- <link href='""" + relativize(new URI("site:/_highlighter/SyntaxHighlighter.css"), dest) + """' rel='stylesheet' type='text/css'/>
- <script language='javascript' src='""" + relativize(new URI("site:/_highlighter/shAll.js"), dest) + """'></script>
- </head>
- <body>
- <pre name="code" class="scala" style="width:100%">
- """)
-
- def footer(dest: URI) = Some("""</pre>
- <script language='javascript'>
- dp.SyntaxHighlighter.ClipboardSwf = '""" + relativize(new URI("site:/_highlighter/clipboard.swf"), dest) + """';
- dp.SyntaxHighlighter.HighlightAll('code');
- </script>
- </body>
- </html>
- """)
-
- //TODO: escape the source code
- def scalaToHtml(src :File) = {
- val dest = new File(outDir, fileHelper.relativePathUnderDir(src, inDir) + ".html")
- if (!dest.exists || dest.lastModified < src.lastModified) {
-
- //we need to verify whether the directory we are trying to write to has already been created or not
- if(!dest.getParentFile.exists) dest.getParentFile.mkdirs
-
- val uri = linkHelper.uriFor(dest).get
- var txt = fileHelper.readTextFromFile(src).getOrElse("")
- txt = txt.replace("<", "&lt;")
- fileHelper.writeTextToFile(dest, txt, header(uri), footer(uri))
- }
- Some(dest)
- }
-
- def copyResources() {
- val loader = this.getClass().getClassLoader()
- val buf = new Array[Byte](1024)
- def copyResource(name: String) = fileHelper.copyResource("/scala/tools/nsc/doc/html/resource/", name, outDir, loader, buf)
- copyResource("_highlighter/clipboard.swf")
- copyResource("_highlighter/shAll.js")
- copyResource("_highlighter/SyntaxHighlighter.css")
- }
-
- copyResources()
- }
- } else {
- new SourceHtmlizer {
- def scalaToHtml(src :File) = None
- }
- }
- }
- */
-
-}
diff --git a/src/scalap/scala/tools/scalap/Main.scala b/src/scalap/scala/tools/scalap/Main.scala
index 7c554d196c..3d2bfd7251 100644
--- a/src/scalap/scala/tools/scalap/Main.scala
+++ b/src/scalap/scala/tools/scalap/Main.scala
@@ -28,6 +28,7 @@ import scalax.rules.scalasig._
class Main {
val SCALA_SIG = "ScalaSig"
val SCALA_SIG_ANNOTATION = "Lscala/reflect/ScalaSignature;"
+ val SCALA_LONG_SIG_ANNOTATION = "Lscala/reflect/ScalaLongSignature;"
val BYTES_VALUE = "bytes"
val versionMsg = "Scala classfile decoder %s -- %s\n".format(Properties.versionString, Properties.copyrightString)
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala
index e3076322dd..c36fdd02cd 100644
--- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala
+++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala
@@ -14,20 +14,32 @@ package scalasig
import scala.language.postfixOps
import scala.language.implicitConversions
-import ClassFileParser.{ ConstValueIndex, Annotation }
+import ClassFileParser._
import scala.reflect.internal.pickling.ByteCodecs
object ScalaSigParser {
- import Main.{ SCALA_SIG, SCALA_SIG_ANNOTATION, BYTES_VALUE }
+ import Main.{ BYTES_VALUE, SCALA_LONG_SIG_ANNOTATION, SCALA_SIG, SCALA_SIG_ANNOTATION }
+ // TODO SI-9296 duplicated code, refactor
def scalaSigFromAnnotation(classFile: ClassFile): Option[ScalaSig] = {
import classFile._
- classFile.annotation(SCALA_SIG_ANNOTATION) map {
+ def getBytes(bytesElem: AnnotationElement): Array[Byte] = bytesElem.elementValue match {
+ case ConstValueIndex(index) => bytesForIndex(index)
+ case ArrayValue(signatureParts) => mergedLongSignatureBytes(signatureParts)
+ }
+
+ def mergedLongSignatureBytes(signatureParts: Seq[ElementValue]): Array[Byte] = signatureParts.flatMap {
+ case ConstValueIndex(index) => bytesForIndex(index)
+ }(collection.breakOut)
+
+ def bytesForIndex(index: Int) = constantWrapped(index).asInstanceOf[StringBytesPair].bytes
+
+ classFile.annotation(SCALA_SIG_ANNOTATION)
+ .orElse(classFile.annotation(SCALA_LONG_SIG_ANNOTATION)).map {
case Annotation(_, elements) =>
val bytesElem = elements.find(elem => constant(elem.elementNameIndex) == BYTES_VALUE).get
- val bytes = ((bytesElem.elementValue match {case ConstValueIndex(index) => constantWrapped(index)})
- .asInstanceOf[StringBytesPair].bytes)
+ val bytes = getBytes(bytesElem)
val length = ByteCodecs.decode(bytes)
ScalaSigAttributeParsers.parse(ByteCode(bytes.take(length)))
diff --git a/test/disabled/presentation/timeofday/src/timeofday.scala b/test/disabled/presentation/timeofday/src/timeofday.scala
index d6355097f1..c8dc7cf820 100644
--- a/test/disabled/presentation/timeofday/src/timeofday.scala
+++ b/test/disabled/presentation/timeofday/src/timeofday.scala
@@ -2,7 +2,7 @@ object timeofday {
class DateError extends Exception
/** Simulating properties in Scala
- * (example 4.2.1 in ScalaReference.pdf)
+ * (example 4.2.1 in the Scala Language Specification)
*/
class TimeOfDayVar {
private var h, m, s: Int = 0
@@ -32,4 +32,4 @@ object timeofday {
d.hours = 8; d./*!*/minutes = 30; d.seconds = 0
d.hours/*#*/ = 25 // throws a DateError exception
}
-} \ No newline at end of file
+}
diff --git a/src/intellij/test/files/neg/virtpatmat_exhaust_big.check b/test/files/neg/virtpatmat_exhaust_big.check
index fddc85a362..fddc85a362 100644
--- a/src/intellij/test/files/neg/virtpatmat_exhaust_big.check
+++ b/test/files/neg/virtpatmat_exhaust_big.check
diff --git a/src/intellij/test/files/neg/virtpatmat_exhaust_big.flags b/test/files/neg/virtpatmat_exhaust_big.flags
index b5a8748652..b5a8748652 100644
--- a/src/intellij/test/files/neg/virtpatmat_exhaust_big.flags
+++ b/test/files/neg/virtpatmat_exhaust_big.flags
diff --git a/src/intellij/test/files/neg/virtpatmat_exhaust_big.scala b/test/files/neg/virtpatmat_exhaust_big.scala
index dd639eb56e..dd639eb56e 100644
--- a/src/intellij/test/files/neg/virtpatmat_exhaust_big.scala
+++ b/test/files/neg/virtpatmat_exhaust_big.scala
diff --git a/test/files/pos/t9285.flags b/test/files/pos/t9285.flags
new file mode 100644
index 0000000000..85d8eb2ba2
--- /dev/null
+++ b/test/files/pos/t9285.flags
@@ -0,0 +1 @@
+-Xfatal-warnings
diff --git a/test/files/pos/t9285.scala b/test/files/pos/t9285.scala
new file mode 100644
index 0000000000..b7146cdf1c
--- /dev/null
+++ b/test/files/pos/t9285.scala
@@ -0,0 +1 @@
+case class C(placeholder: Unit)
diff --git a/src/intellij/test/files/pos/virtpatmat_exhaust_big.scala b/test/files/pos/virtpatmat_exhaust_big.scala
index 41aef3226e..9850933540 100644
--- a/src/intellij/test/files/pos/virtpatmat_exhaust_big.scala
+++ b/test/files/pos/virtpatmat_exhaust_big.scala
@@ -30,5 +30,4 @@ object Test {
Z10 | Z11() | Z12 | Z13() | Z14 | Z15() | Z16 | Z17() | Z18 | Z19()
=>
}
-}
--
+} \ No newline at end of file
diff --git a/test/files/run/disable-assertions.flags b/test/files/run/disable-assertions.flags
new file mode 100644
index 0000000000..afaa521a12
--- /dev/null
+++ b/test/files/run/disable-assertions.flags
@@ -0,0 +1 @@
+-Xdisable-assertions
diff --git a/test/files/run/disable-assertions.scala b/test/files/run/disable-assertions.scala
new file mode 100644
index 0000000000..7ec4cfb495
--- /dev/null
+++ b/test/files/run/disable-assertions.scala
@@ -0,0 +1,14 @@
+
+object Elided {
+ import annotation._, elidable._
+ @elidable(INFO) def info(): Boolean = true
+ @elidable(10000) def f(): Boolean = true
+ def g(): Boolean = { assert(false); true }
+}
+
+object Test extends App {
+ import Elided._
+ if (info()) println("Bad info.")
+ if (!f()) println("Elided f.")
+ if (!g()) println("Elided g?") // assert should be off
+}
diff --git a/test/files/run/reify_timeofday.scala b/test/files/run/reify_timeofday.scala
index efeb81debf..4950ebfae1 100644
--- a/test/files/run/reify_timeofday.scala
+++ b/test/files/run/reify_timeofday.scala
@@ -6,7 +6,7 @@ object Test extends App {
class DateError extends Exception
/** Simulating properties in Scala
- * (example 4.2.1 in ScalaReference.pdf)
+ * (example 4.2.1 in the Scala Language Specification)
*/
class TimeOfDayVar {
private var h, m, s: Int = 0
@@ -39,4 +39,4 @@ object Test extends App {
case e: Exception => println("Exception")
}
}.eval
-} \ No newline at end of file
+}
diff --git a/test/files/run/t2318.scala b/test/files/run/t2318.scala
index b638c433f5..4239c017b8 100644
--- a/test/files/run/t2318.scala
+++ b/test/files/run/t2318.scala
@@ -11,6 +11,7 @@ object Test {
case _: java.io.FilePermission => ()
case x: java.security.SecurityPermission if x.getName contains ".networkaddress." => () // generality ftw
case x: java.util.PropertyPermission if x.getName == "sun.net.inetaddr.ttl" => ()
+ case _: java.lang.reflect.ReflectPermission => () // needed for LambdaMetaFactory
case _ => super.checkPermission(perm)
}
}
diff --git a/test/files/run/t9298/Test.java b/test/files/run/t9298/Test.java
new file mode 100644
index 0000000000..81f5265985
--- /dev/null
+++ b/test/files/run/t9298/Test.java
@@ -0,0 +1,7 @@
+public class Test {
+ public void consume(VC vc) {}
+
+ public static void main(String[] args) {
+ new Client().test();
+ }
+}
diff --git a/test/files/run/t9298/VC.scala b/test/files/run/t9298/VC.scala
new file mode 100644
index 0000000000..916e62dc59
--- /dev/null
+++ b/test/files/run/t9298/VC.scala
@@ -0,0 +1,5 @@
+class VC(val s: String) extends AnyVal
+
+class Client {
+ def test = new Test().consume(new VC(""))
+}
diff --git a/test/files/run/t9298b/Test.java b/test/files/run/t9298b/Test.java
new file mode 100644
index 0000000000..f369b26f36
--- /dev/null
+++ b/test/files/run/t9298b/Test.java
@@ -0,0 +1,7 @@
+public class Test {
+ public VC identity(VC vc) { return vc; }
+
+ public static void main(String[] args) {
+ new Client().test();
+ }
+}
diff --git a/test/files/run/t9298b/VC.scala b/test/files/run/t9298b/VC.scala
new file mode 100644
index 0000000000..bb5978b6e4
--- /dev/null
+++ b/test/files/run/t9298b/VC.scala
@@ -0,0 +1,8 @@
+class VC(val s: Int) extends AnyVal
+
+class Client {
+ def test = {
+ val vc: VC = new Test().identity(new VC(42))
+ assert(vc.s == 42)
+ }
+}
diff --git a/test/files/scalap/t8679.check b/test/files/scalap/t8679.check
new file mode 100644
index 0000000000..938b76783f
--- /dev/null
+++ b/test/files/scalap/t8679.check
@@ -0,0 +1,3503 @@
+class T8679 extends scala.AnyRef {
+ def this() = { /* compiled code */ }
+ def foo1(): scala.Int = { /* compiled code */ }
+ def foo2(): scala.Int = { /* compiled code */ }
+ def foo3(): scala.Int = { /* compiled code */ }
+ def foo4(): scala.Int = { /* compiled code */ }
+ def foo5(): scala.Int = { /* compiled code */ }
+ def foo6(): scala.Int = { /* compiled code */ }
+ def foo7(): scala.Int = { /* compiled code */ }
+ def foo8(): scala.Int = { /* compiled code */ }
+ def foo9(): scala.Int = { /* compiled code */ }
+ def foo10(): scala.Int = { /* compiled code */ }
+ def foo11(): scala.Int = { /* compiled code */ }
+ def foo12(): scala.Int = { /* compiled code */ }
+ def foo13(): scala.Int = { /* compiled code */ }
+ def foo14(): scala.Int = { /* compiled code */ }
+ def foo15(): scala.Int = { /* compiled code */ }
+ def foo16(): scala.Int = { /* compiled code */ }
+ def foo17(): scala.Int = { /* compiled code */ }
+ def foo18(): scala.Int = { /* compiled code */ }
+ def foo19(): scala.Int = { /* compiled code */ }
+ def foo20(): scala.Int = { /* compiled code */ }
+ def foo21(): scala.Int = { /* compiled code */ }
+ def foo22(): scala.Int = { /* compiled code */ }
+ def foo23(): scala.Int = { /* compiled code */ }
+ def foo24(): scala.Int = { /* compiled code */ }
+ def foo25(): scala.Int = { /* compiled code */ }
+ def foo26(): scala.Int = { /* compiled code */ }
+ def foo27(): scala.Int = { /* compiled code */ }
+ def foo28(): scala.Int = { /* compiled code */ }
+ def foo29(): scala.Int = { /* compiled code */ }
+ def foo30(): scala.Int = { /* compiled code */ }
+ def foo31(): scala.Int = { /* compiled code */ }
+ def foo32(): scala.Int = { /* compiled code */ }
+ def foo33(): scala.Int = { /* compiled code */ }
+ def foo34(): scala.Int = { /* compiled code */ }
+ def foo35(): scala.Int = { /* compiled code */ }
+ def foo36(): scala.Int = { /* compiled code */ }
+ def foo37(): scala.Int = { /* compiled code */ }
+ def foo38(): scala.Int = { /* compiled code */ }
+ def foo39(): scala.Int = { /* compiled code */ }
+ def foo40(): scala.Int = { /* compiled code */ }
+ def foo41(): scala.Int = { /* compiled code */ }
+ def foo42(): scala.Int = { /* compiled code */ }
+ def foo43(): scala.Int = { /* compiled code */ }
+ def foo44(): scala.Int = { /* compiled code */ }
+ def foo45(): scala.Int = { /* compiled code */ }
+ def foo46(): scala.Int = { /* compiled code */ }
+ def foo47(): scala.Int = { /* compiled code */ }
+ def foo48(): scala.Int = { /* compiled code */ }
+ def foo49(): scala.Int = { /* compiled code */ }
+ def foo50(): scala.Int = { /* compiled code */ }
+ def foo51(): scala.Int = { /* compiled code */ }
+ def foo52(): scala.Int = { /* compiled code */ }
+ def foo53(): scala.Int = { /* compiled code */ }
+ def foo54(): scala.Int = { /* compiled code */ }
+ def foo55(): scala.Int = { /* compiled code */ }
+ def foo56(): scala.Int = { /* compiled code */ }
+ def foo57(): scala.Int = { /* compiled code */ }
+ def foo58(): scala.Int = { /* compiled code */ }
+ def foo59(): scala.Int = { /* compiled code */ }
+ def foo60(): scala.Int = { /* compiled code */ }
+ def foo61(): scala.Int = { /* compiled code */ }
+ def foo62(): scala.Int = { /* compiled code */ }
+ def foo63(): scala.Int = { /* compiled code */ }
+ def foo64(): scala.Int = { /* compiled code */ }
+ def foo65(): scala.Int = { /* compiled code */ }
+ def foo66(): scala.Int = { /* compiled code */ }
+ def foo67(): scala.Int = { /* compiled code */ }
+ def foo68(): scala.Int = { /* compiled code */ }
+ def foo69(): scala.Int = { /* compiled code */ }
+ def foo70(): scala.Int = { /* compiled code */ }
+ def foo71(): scala.Int = { /* compiled code */ }
+ def foo72(): scala.Int = { /* compiled code */ }
+ def foo73(): scala.Int = { /* compiled code */ }
+ def foo74(): scala.Int = { /* compiled code */ }
+ def foo75(): scala.Int = { /* compiled code */ }
+ def foo76(): scala.Int = { /* compiled code */ }
+ def foo77(): scala.Int = { /* compiled code */ }
+ def foo78(): scala.Int = { /* compiled code */ }
+ def foo79(): scala.Int = { /* compiled code */ }
+ def foo80(): scala.Int = { /* compiled code */ }
+ def foo81(): scala.Int = { /* compiled code */ }
+ def foo82(): scala.Int = { /* compiled code */ }
+ def foo83(): scala.Int = { /* compiled code */ }
+ def foo84(): scala.Int = { /* compiled code */ }
+ def foo85(): scala.Int = { /* compiled code */ }
+ def foo86(): scala.Int = { /* compiled code */ }
+ def foo87(): scala.Int = { /* compiled code */ }
+ def foo88(): scala.Int = { /* compiled code */ }
+ def foo89(): scala.Int = { /* compiled code */ }
+ def foo90(): scala.Int = { /* compiled code */ }
+ def foo91(): scala.Int = { /* compiled code */ }
+ def foo92(): scala.Int = { /* compiled code */ }
+ def foo93(): scala.Int = { /* compiled code */ }
+ def foo94(): scala.Int = { /* compiled code */ }
+ def foo95(): scala.Int = { /* compiled code */ }
+ def foo96(): scala.Int = { /* compiled code */ }
+ def foo97(): scala.Int = { /* compiled code */ }
+ def foo98(): scala.Int = { /* compiled code */ }
+ def foo99(): scala.Int = { /* compiled code */ }
+ def foo100(): scala.Int = { /* compiled code */ }
+ def foo101(): scala.Int = { /* compiled code */ }
+ def foo102(): scala.Int = { /* compiled code */ }
+ def foo103(): scala.Int = { /* compiled code */ }
+ def foo104(): scala.Int = { /* compiled code */ }
+ def foo105(): scala.Int = { /* compiled code */ }
+ def foo106(): scala.Int = { /* compiled code */ }
+ def foo107(): scala.Int = { /* compiled code */ }
+ def foo108(): scala.Int = { /* compiled code */ }
+ def foo109(): scala.Int = { /* compiled code */ }
+ def foo110(): scala.Int = { /* compiled code */ }
+ def foo111(): scala.Int = { /* compiled code */ }
+ def foo112(): scala.Int = { /* compiled code */ }
+ def foo113(): scala.Int = { /* compiled code */ }
+ def foo114(): scala.Int = { /* compiled code */ }
+ def foo115(): scala.Int = { /* compiled code */ }
+ def foo116(): scala.Int = { /* compiled code */ }
+ def foo117(): scala.Int = { /* compiled code */ }
+ def foo118(): scala.Int = { /* compiled code */ }
+ def foo119(): scala.Int = { /* compiled code */ }
+ def foo120(): scala.Int = { /* compiled code */ }
+ def foo121(): scala.Int = { /* compiled code */ }
+ def foo122(): scala.Int = { /* compiled code */ }
+ def foo123(): scala.Int = { /* compiled code */ }
+ def foo124(): scala.Int = { /* compiled code */ }
+ def foo125(): scala.Int = { /* compiled code */ }
+ def foo126(): scala.Int = { /* compiled code */ }
+ def foo127(): scala.Int = { /* compiled code */ }
+ def foo128(): scala.Int = { /* compiled code */ }
+ def foo129(): scala.Int = { /* compiled code */ }
+ def foo130(): scala.Int = { /* compiled code */ }
+ def foo131(): scala.Int = { /* compiled code */ }
+ def foo132(): scala.Int = { /* compiled code */ }
+ def foo133(): scala.Int = { /* compiled code */ }
+ def foo134(): scala.Int = { /* compiled code */ }
+ def foo135(): scala.Int = { /* compiled code */ }
+ def foo136(): scala.Int = { /* compiled code */ }
+ def foo137(): scala.Int = { /* compiled code */ }
+ def foo138(): scala.Int = { /* compiled code */ }
+ def foo139(): scala.Int = { /* compiled code */ }
+ def foo140(): scala.Int = { /* compiled code */ }
+ def foo141(): scala.Int = { /* compiled code */ }
+ def foo142(): scala.Int = { /* compiled code */ }
+ def foo143(): scala.Int = { /* compiled code */ }
+ def foo144(): scala.Int = { /* compiled code */ }
+ def foo145(): scala.Int = { /* compiled code */ }
+ def foo146(): scala.Int = { /* compiled code */ }
+ def foo147(): scala.Int = { /* compiled code */ }
+ def foo148(): scala.Int = { /* compiled code */ }
+ def foo149(): scala.Int = { /* compiled code */ }
+ def foo150(): scala.Int = { /* compiled code */ }
+ def foo151(): scala.Int = { /* compiled code */ }
+ def foo152(): scala.Int = { /* compiled code */ }
+ def foo153(): scala.Int = { /* compiled code */ }
+ def foo154(): scala.Int = { /* compiled code */ }
+ def foo155(): scala.Int = { /* compiled code */ }
+ def foo156(): scala.Int = { /* compiled code */ }
+ def foo157(): scala.Int = { /* compiled code */ }
+ def foo158(): scala.Int = { /* compiled code */ }
+ def foo159(): scala.Int = { /* compiled code */ }
+ def foo160(): scala.Int = { /* compiled code */ }
+ def foo161(): scala.Int = { /* compiled code */ }
+ def foo162(): scala.Int = { /* compiled code */ }
+ def foo163(): scala.Int = { /* compiled code */ }
+ def foo164(): scala.Int = { /* compiled code */ }
+ def foo165(): scala.Int = { /* compiled code */ }
+ def foo166(): scala.Int = { /* compiled code */ }
+ def foo167(): scala.Int = { /* compiled code */ }
+ def foo168(): scala.Int = { /* compiled code */ }
+ def foo169(): scala.Int = { /* compiled code */ }
+ def foo170(): scala.Int = { /* compiled code */ }
+ def foo171(): scala.Int = { /* compiled code */ }
+ def foo172(): scala.Int = { /* compiled code */ }
+ def foo173(): scala.Int = { /* compiled code */ }
+ def foo174(): scala.Int = { /* compiled code */ }
+ def foo175(): scala.Int = { /* compiled code */ }
+ def foo176(): scala.Int = { /* compiled code */ }
+ def foo177(): scala.Int = { /* compiled code */ }
+ def foo178(): scala.Int = { /* compiled code */ }
+ def foo179(): scala.Int = { /* compiled code */ }
+ def foo180(): scala.Int = { /* compiled code */ }
+ def foo181(): scala.Int = { /* compiled code */ }
+ def foo182(): scala.Int = { /* compiled code */ }
+ def foo183(): scala.Int = { /* compiled code */ }
+ def foo184(): scala.Int = { /* compiled code */ }
+ def foo185(): scala.Int = { /* compiled code */ }
+ def foo186(): scala.Int = { /* compiled code */ }
+ def foo187(): scala.Int = { /* compiled code */ }
+ def foo188(): scala.Int = { /* compiled code */ }
+ def foo189(): scala.Int = { /* compiled code */ }
+ def foo190(): scala.Int = { /* compiled code */ }
+ def foo191(): scala.Int = { /* compiled code */ }
+ def foo192(): scala.Int = { /* compiled code */ }
+ def foo193(): scala.Int = { /* compiled code */ }
+ def foo194(): scala.Int = { /* compiled code */ }
+ def foo195(): scala.Int = { /* compiled code */ }
+ def foo196(): scala.Int = { /* compiled code */ }
+ def foo197(): scala.Int = { /* compiled code */ }
+ def foo198(): scala.Int = { /* compiled code */ }
+ def foo199(): scala.Int = { /* compiled code */ }
+ def foo200(): scala.Int = { /* compiled code */ }
+ def foo201(): scala.Int = { /* compiled code */ }
+ def foo202(): scala.Int = { /* compiled code */ }
+ def foo203(): scala.Int = { /* compiled code */ }
+ def foo204(): scala.Int = { /* compiled code */ }
+ def foo205(): scala.Int = { /* compiled code */ }
+ def foo206(): scala.Int = { /* compiled code */ }
+ def foo207(): scala.Int = { /* compiled code */ }
+ def foo208(): scala.Int = { /* compiled code */ }
+ def foo209(): scala.Int = { /* compiled code */ }
+ def foo210(): scala.Int = { /* compiled code */ }
+ def foo211(): scala.Int = { /* compiled code */ }
+ def foo212(): scala.Int = { /* compiled code */ }
+ def foo213(): scala.Int = { /* compiled code */ }
+ def foo214(): scala.Int = { /* compiled code */ }
+ def foo215(): scala.Int = { /* compiled code */ }
+ def foo216(): scala.Int = { /* compiled code */ }
+ def foo217(): scala.Int = { /* compiled code */ }
+ def foo218(): scala.Int = { /* compiled code */ }
+ def foo219(): scala.Int = { /* compiled code */ }
+ def foo220(): scala.Int = { /* compiled code */ }
+ def foo221(): scala.Int = { /* compiled code */ }
+ def foo222(): scala.Int = { /* compiled code */ }
+ def foo223(): scala.Int = { /* compiled code */ }
+ def foo224(): scala.Int = { /* compiled code */ }
+ def foo225(): scala.Int = { /* compiled code */ }
+ def foo226(): scala.Int = { /* compiled code */ }
+ def foo227(): scala.Int = { /* compiled code */ }
+ def foo228(): scala.Int = { /* compiled code */ }
+ def foo229(): scala.Int = { /* compiled code */ }
+ def foo230(): scala.Int = { /* compiled code */ }
+ def foo231(): scala.Int = { /* compiled code */ }
+ def foo232(): scala.Int = { /* compiled code */ }
+ def foo233(): scala.Int = { /* compiled code */ }
+ def foo234(): scala.Int = { /* compiled code */ }
+ def foo235(): scala.Int = { /* compiled code */ }
+ def foo236(): scala.Int = { /* compiled code */ }
+ def foo237(): scala.Int = { /* compiled code */ }
+ def foo238(): scala.Int = { /* compiled code */ }
+ def foo239(): scala.Int = { /* compiled code */ }
+ def foo240(): scala.Int = { /* compiled code */ }
+ def foo241(): scala.Int = { /* compiled code */ }
+ def foo242(): scala.Int = { /* compiled code */ }
+ def foo243(): scala.Int = { /* compiled code */ }
+ def foo244(): scala.Int = { /* compiled code */ }
+ def foo245(): scala.Int = { /* compiled code */ }
+ def foo246(): scala.Int = { /* compiled code */ }
+ def foo247(): scala.Int = { /* compiled code */ }
+ def foo248(): scala.Int = { /* compiled code */ }
+ def foo249(): scala.Int = { /* compiled code */ }
+ def foo250(): scala.Int = { /* compiled code */ }
+ def foo251(): scala.Int = { /* compiled code */ }
+ def foo252(): scala.Int = { /* compiled code */ }
+ def foo253(): scala.Int = { /* compiled code */ }
+ def foo254(): scala.Int = { /* compiled code */ }
+ def foo255(): scala.Int = { /* compiled code */ }
+ def foo256(): scala.Int = { /* compiled code */ }
+ def foo257(): scala.Int = { /* compiled code */ }
+ def foo258(): scala.Int = { /* compiled code */ }
+ def foo259(): scala.Int = { /* compiled code */ }
+ def foo260(): scala.Int = { /* compiled code */ }
+ def foo261(): scala.Int = { /* compiled code */ }
+ def foo262(): scala.Int = { /* compiled code */ }
+ def foo263(): scala.Int = { /* compiled code */ }
+ def foo264(): scala.Int = { /* compiled code */ }
+ def foo265(): scala.Int = { /* compiled code */ }
+ def foo266(): scala.Int = { /* compiled code */ }
+ def foo267(): scala.Int = { /* compiled code */ }
+ def foo268(): scala.Int = { /* compiled code */ }
+ def foo269(): scala.Int = { /* compiled code */ }
+ def foo270(): scala.Int = { /* compiled code */ }
+ def foo271(): scala.Int = { /* compiled code */ }
+ def foo272(): scala.Int = { /* compiled code */ }
+ def foo273(): scala.Int = { /* compiled code */ }
+ def foo274(): scala.Int = { /* compiled code */ }
+ def foo275(): scala.Int = { /* compiled code */ }
+ def foo276(): scala.Int = { /* compiled code */ }
+ def foo277(): scala.Int = { /* compiled code */ }
+ def foo278(): scala.Int = { /* compiled code */ }
+ def foo279(): scala.Int = { /* compiled code */ }
+ def foo280(): scala.Int = { /* compiled code */ }
+ def foo281(): scala.Int = { /* compiled code */ }
+ def foo282(): scala.Int = { /* compiled code */ }
+ def foo283(): scala.Int = { /* compiled code */ }
+ def foo284(): scala.Int = { /* compiled code */ }
+ def foo285(): scala.Int = { /* compiled code */ }
+ def foo286(): scala.Int = { /* compiled code */ }
+ def foo287(): scala.Int = { /* compiled code */ }
+ def foo288(): scala.Int = { /* compiled code */ }
+ def foo289(): scala.Int = { /* compiled code */ }
+ def foo290(): scala.Int = { /* compiled code */ }
+ def foo291(): scala.Int = { /* compiled code */ }
+ def foo292(): scala.Int = { /* compiled code */ }
+ def foo293(): scala.Int = { /* compiled code */ }
+ def foo294(): scala.Int = { /* compiled code */ }
+ def foo295(): scala.Int = { /* compiled code */ }
+ def foo296(): scala.Int = { /* compiled code */ }
+ def foo297(): scala.Int = { /* compiled code */ }
+ def foo298(): scala.Int = { /* compiled code */ }
+ def foo299(): scala.Int = { /* compiled code */ }
+ def foo300(): scala.Int = { /* compiled code */ }
+ def foo301(): scala.Int = { /* compiled code */ }
+ def foo302(): scala.Int = { /* compiled code */ }
+ def foo303(): scala.Int = { /* compiled code */ }
+ def foo304(): scala.Int = { /* compiled code */ }
+ def foo305(): scala.Int = { /* compiled code */ }
+ def foo306(): scala.Int = { /* compiled code */ }
+ def foo307(): scala.Int = { /* compiled code */ }
+ def foo308(): scala.Int = { /* compiled code */ }
+ def foo309(): scala.Int = { /* compiled code */ }
+ def foo310(): scala.Int = { /* compiled code */ }
+ def foo311(): scala.Int = { /* compiled code */ }
+ def foo312(): scala.Int = { /* compiled code */ }
+ def foo313(): scala.Int = { /* compiled code */ }
+ def foo314(): scala.Int = { /* compiled code */ }
+ def foo315(): scala.Int = { /* compiled code */ }
+ def foo316(): scala.Int = { /* compiled code */ }
+ def foo317(): scala.Int = { /* compiled code */ }
+ def foo318(): scala.Int = { /* compiled code */ }
+ def foo319(): scala.Int = { /* compiled code */ }
+ def foo320(): scala.Int = { /* compiled code */ }
+ def foo321(): scala.Int = { /* compiled code */ }
+ def foo322(): scala.Int = { /* compiled code */ }
+ def foo323(): scala.Int = { /* compiled code */ }
+ def foo324(): scala.Int = { /* compiled code */ }
+ def foo325(): scala.Int = { /* compiled code */ }
+ def foo326(): scala.Int = { /* compiled code */ }
+ def foo327(): scala.Int = { /* compiled code */ }
+ def foo328(): scala.Int = { /* compiled code */ }
+ def foo329(): scala.Int = { /* compiled code */ }
+ def foo330(): scala.Int = { /* compiled code */ }
+ def foo331(): scala.Int = { /* compiled code */ }
+ def foo332(): scala.Int = { /* compiled code */ }
+ def foo333(): scala.Int = { /* compiled code */ }
+ def foo334(): scala.Int = { /* compiled code */ }
+ def foo335(): scala.Int = { /* compiled code */ }
+ def foo336(): scala.Int = { /* compiled code */ }
+ def foo337(): scala.Int = { /* compiled code */ }
+ def foo338(): scala.Int = { /* compiled code */ }
+ def foo339(): scala.Int = { /* compiled code */ }
+ def foo340(): scala.Int = { /* compiled code */ }
+ def foo341(): scala.Int = { /* compiled code */ }
+ def foo342(): scala.Int = { /* compiled code */ }
+ def foo343(): scala.Int = { /* compiled code */ }
+ def foo344(): scala.Int = { /* compiled code */ }
+ def foo345(): scala.Int = { /* compiled code */ }
+ def foo346(): scala.Int = { /* compiled code */ }
+ def foo347(): scala.Int = { /* compiled code */ }
+ def foo348(): scala.Int = { /* compiled code */ }
+ def foo349(): scala.Int = { /* compiled code */ }
+ def foo350(): scala.Int = { /* compiled code */ }
+ def foo351(): scala.Int = { /* compiled code */ }
+ def foo352(): scala.Int = { /* compiled code */ }
+ def foo353(): scala.Int = { /* compiled code */ }
+ def foo354(): scala.Int = { /* compiled code */ }
+ def foo355(): scala.Int = { /* compiled code */ }
+ def foo356(): scala.Int = { /* compiled code */ }
+ def foo357(): scala.Int = { /* compiled code */ }
+ def foo358(): scala.Int = { /* compiled code */ }
+ def foo359(): scala.Int = { /* compiled code */ }
+ def foo360(): scala.Int = { /* compiled code */ }
+ def foo361(): scala.Int = { /* compiled code */ }
+ def foo362(): scala.Int = { /* compiled code */ }
+ def foo363(): scala.Int = { /* compiled code */ }
+ def foo364(): scala.Int = { /* compiled code */ }
+ def foo365(): scala.Int = { /* compiled code */ }
+ def foo366(): scala.Int = { /* compiled code */ }
+ def foo367(): scala.Int = { /* compiled code */ }
+ def foo368(): scala.Int = { /* compiled code */ }
+ def foo369(): scala.Int = { /* compiled code */ }
+ def foo370(): scala.Int = { /* compiled code */ }
+ def foo371(): scala.Int = { /* compiled code */ }
+ def foo372(): scala.Int = { /* compiled code */ }
+ def foo373(): scala.Int = { /* compiled code */ }
+ def foo374(): scala.Int = { /* compiled code */ }
+ def foo375(): scala.Int = { /* compiled code */ }
+ def foo376(): scala.Int = { /* compiled code */ }
+ def foo377(): scala.Int = { /* compiled code */ }
+ def foo378(): scala.Int = { /* compiled code */ }
+ def foo379(): scala.Int = { /* compiled code */ }
+ def foo380(): scala.Int = { /* compiled code */ }
+ def foo381(): scala.Int = { /* compiled code */ }
+ def foo382(): scala.Int = { /* compiled code */ }
+ def foo383(): scala.Int = { /* compiled code */ }
+ def foo384(): scala.Int = { /* compiled code */ }
+ def foo385(): scala.Int = { /* compiled code */ }
+ def foo386(): scala.Int = { /* compiled code */ }
+ def foo387(): scala.Int = { /* compiled code */ }
+ def foo388(): scala.Int = { /* compiled code */ }
+ def foo389(): scala.Int = { /* compiled code */ }
+ def foo390(): scala.Int = { /* compiled code */ }
+ def foo391(): scala.Int = { /* compiled code */ }
+ def foo392(): scala.Int = { /* compiled code */ }
+ def foo393(): scala.Int = { /* compiled code */ }
+ def foo394(): scala.Int = { /* compiled code */ }
+ def foo395(): scala.Int = { /* compiled code */ }
+ def foo396(): scala.Int = { /* compiled code */ }
+ def foo397(): scala.Int = { /* compiled code */ }
+ def foo398(): scala.Int = { /* compiled code */ }
+ def foo399(): scala.Int = { /* compiled code */ }
+ def foo400(): scala.Int = { /* compiled code */ }
+ def foo401(): scala.Int = { /* compiled code */ }
+ def foo402(): scala.Int = { /* compiled code */ }
+ def foo403(): scala.Int = { /* compiled code */ }
+ def foo404(): scala.Int = { /* compiled code */ }
+ def foo405(): scala.Int = { /* compiled code */ }
+ def foo406(): scala.Int = { /* compiled code */ }
+ def foo407(): scala.Int = { /* compiled code */ }
+ def foo408(): scala.Int = { /* compiled code */ }
+ def foo409(): scala.Int = { /* compiled code */ }
+ def foo410(): scala.Int = { /* compiled code */ }
+ def foo411(): scala.Int = { /* compiled code */ }
+ def foo412(): scala.Int = { /* compiled code */ }
+ def foo413(): scala.Int = { /* compiled code */ }
+ def foo414(): scala.Int = { /* compiled code */ }
+ def foo415(): scala.Int = { /* compiled code */ }
+ def foo416(): scala.Int = { /* compiled code */ }
+ def foo417(): scala.Int = { /* compiled code */ }
+ def foo418(): scala.Int = { /* compiled code */ }
+ def foo419(): scala.Int = { /* compiled code */ }
+ def foo420(): scala.Int = { /* compiled code */ }
+ def foo421(): scala.Int = { /* compiled code */ }
+ def foo422(): scala.Int = { /* compiled code */ }
+ def foo423(): scala.Int = { /* compiled code */ }
+ def foo424(): scala.Int = { /* compiled code */ }
+ def foo425(): scala.Int = { /* compiled code */ }
+ def foo426(): scala.Int = { /* compiled code */ }
+ def foo427(): scala.Int = { /* compiled code */ }
+ def foo428(): scala.Int = { /* compiled code */ }
+ def foo429(): scala.Int = { /* compiled code */ }
+ def foo430(): scala.Int = { /* compiled code */ }
+ def foo431(): scala.Int = { /* compiled code */ }
+ def foo432(): scala.Int = { /* compiled code */ }
+ def foo433(): scala.Int = { /* compiled code */ }
+ def foo434(): scala.Int = { /* compiled code */ }
+ def foo435(): scala.Int = { /* compiled code */ }
+ def foo436(): scala.Int = { /* compiled code */ }
+ def foo437(): scala.Int = { /* compiled code */ }
+ def foo438(): scala.Int = { /* compiled code */ }
+ def foo439(): scala.Int = { /* compiled code */ }
+ def foo440(): scala.Int = { /* compiled code */ }
+ def foo441(): scala.Int = { /* compiled code */ }
+ def foo442(): scala.Int = { /* compiled code */ }
+ def foo443(): scala.Int = { /* compiled code */ }
+ def foo444(): scala.Int = { /* compiled code */ }
+ def foo445(): scala.Int = { /* compiled code */ }
+ def foo446(): scala.Int = { /* compiled code */ }
+ def foo447(): scala.Int = { /* compiled code */ }
+ def foo448(): scala.Int = { /* compiled code */ }
+ def foo449(): scala.Int = { /* compiled code */ }
+ def foo450(): scala.Int = { /* compiled code */ }
+ def foo451(): scala.Int = { /* compiled code */ }
+ def foo452(): scala.Int = { /* compiled code */ }
+ def foo453(): scala.Int = { /* compiled code */ }
+ def foo454(): scala.Int = { /* compiled code */ }
+ def foo455(): scala.Int = { /* compiled code */ }
+ def foo456(): scala.Int = { /* compiled code */ }
+ def foo457(): scala.Int = { /* compiled code */ }
+ def foo458(): scala.Int = { /* compiled code */ }
+ def foo459(): scala.Int = { /* compiled code */ }
+ def foo460(): scala.Int = { /* compiled code */ }
+ def foo461(): scala.Int = { /* compiled code */ }
+ def foo462(): scala.Int = { /* compiled code */ }
+ def foo463(): scala.Int = { /* compiled code */ }
+ def foo464(): scala.Int = { /* compiled code */ }
+ def foo465(): scala.Int = { /* compiled code */ }
+ def foo466(): scala.Int = { /* compiled code */ }
+ def foo467(): scala.Int = { /* compiled code */ }
+ def foo468(): scala.Int = { /* compiled code */ }
+ def foo469(): scala.Int = { /* compiled code */ }
+ def foo470(): scala.Int = { /* compiled code */ }
+ def foo471(): scala.Int = { /* compiled code */ }
+ def foo472(): scala.Int = { /* compiled code */ }
+ def foo473(): scala.Int = { /* compiled code */ }
+ def foo474(): scala.Int = { /* compiled code */ }
+ def foo475(): scala.Int = { /* compiled code */ }
+ def foo476(): scala.Int = { /* compiled code */ }
+ def foo477(): scala.Int = { /* compiled code */ }
+ def foo478(): scala.Int = { /* compiled code */ }
+ def foo479(): scala.Int = { /* compiled code */ }
+ def foo480(): scala.Int = { /* compiled code */ }
+ def foo481(): scala.Int = { /* compiled code */ }
+ def foo482(): scala.Int = { /* compiled code */ }
+ def foo483(): scala.Int = { /* compiled code */ }
+ def foo484(): scala.Int = { /* compiled code */ }
+ def foo485(): scala.Int = { /* compiled code */ }
+ def foo486(): scala.Int = { /* compiled code */ }
+ def foo487(): scala.Int = { /* compiled code */ }
+ def foo488(): scala.Int = { /* compiled code */ }
+ def foo489(): scala.Int = { /* compiled code */ }
+ def foo490(): scala.Int = { /* compiled code */ }
+ def foo491(): scala.Int = { /* compiled code */ }
+ def foo492(): scala.Int = { /* compiled code */ }
+ def foo493(): scala.Int = { /* compiled code */ }
+ def foo494(): scala.Int = { /* compiled code */ }
+ def foo495(): scala.Int = { /* compiled code */ }
+ def foo496(): scala.Int = { /* compiled code */ }
+ def foo497(): scala.Int = { /* compiled code */ }
+ def foo498(): scala.Int = { /* compiled code */ }
+ def foo499(): scala.Int = { /* compiled code */ }
+ def foo500(): scala.Int = { /* compiled code */ }
+ def foo501(): scala.Int = { /* compiled code */ }
+ def foo502(): scala.Int = { /* compiled code */ }
+ def foo503(): scala.Int = { /* compiled code */ }
+ def foo504(): scala.Int = { /* compiled code */ }
+ def foo505(): scala.Int = { /* compiled code */ }
+ def foo506(): scala.Int = { /* compiled code */ }
+ def foo507(): scala.Int = { /* compiled code */ }
+ def foo508(): scala.Int = { /* compiled code */ }
+ def foo509(): scala.Int = { /* compiled code */ }
+ def foo510(): scala.Int = { /* compiled code */ }
+ def foo511(): scala.Int = { /* compiled code */ }
+ def foo512(): scala.Int = { /* compiled code */ }
+ def foo513(): scala.Int = { /* compiled code */ }
+ def foo514(): scala.Int = { /* compiled code */ }
+ def foo515(): scala.Int = { /* compiled code */ }
+ def foo516(): scala.Int = { /* compiled code */ }
+ def foo517(): scala.Int = { /* compiled code */ }
+ def foo518(): scala.Int = { /* compiled code */ }
+ def foo519(): scala.Int = { /* compiled code */ }
+ def foo520(): scala.Int = { /* compiled code */ }
+ def foo521(): scala.Int = { /* compiled code */ }
+ def foo522(): scala.Int = { /* compiled code */ }
+ def foo523(): scala.Int = { /* compiled code */ }
+ def foo524(): scala.Int = { /* compiled code */ }
+ def foo525(): scala.Int = { /* compiled code */ }
+ def foo526(): scala.Int = { /* compiled code */ }
+ def foo527(): scala.Int = { /* compiled code */ }
+ def foo528(): scala.Int = { /* compiled code */ }
+ def foo529(): scala.Int = { /* compiled code */ }
+ def foo530(): scala.Int = { /* compiled code */ }
+ def foo531(): scala.Int = { /* compiled code */ }
+ def foo532(): scala.Int = { /* compiled code */ }
+ def foo533(): scala.Int = { /* compiled code */ }
+ def foo534(): scala.Int = { /* compiled code */ }
+ def foo535(): scala.Int = { /* compiled code */ }
+ def foo536(): scala.Int = { /* compiled code */ }
+ def foo537(): scala.Int = { /* compiled code */ }
+ def foo538(): scala.Int = { /* compiled code */ }
+ def foo539(): scala.Int = { /* compiled code */ }
+ def foo540(): scala.Int = { /* compiled code */ }
+ def foo541(): scala.Int = { /* compiled code */ }
+ def foo542(): scala.Int = { /* compiled code */ }
+ def foo543(): scala.Int = { /* compiled code */ }
+ def foo544(): scala.Int = { /* compiled code */ }
+ def foo545(): scala.Int = { /* compiled code */ }
+ def foo546(): scala.Int = { /* compiled code */ }
+ def foo547(): scala.Int = { /* compiled code */ }
+ def foo548(): scala.Int = { /* compiled code */ }
+ def foo549(): scala.Int = { /* compiled code */ }
+ def foo550(): scala.Int = { /* compiled code */ }
+ def foo551(): scala.Int = { /* compiled code */ }
+ def foo552(): scala.Int = { /* compiled code */ }
+ def foo553(): scala.Int = { /* compiled code */ }
+ def foo554(): scala.Int = { /* compiled code */ }
+ def foo555(): scala.Int = { /* compiled code */ }
+ def foo556(): scala.Int = { /* compiled code */ }
+ def foo557(): scala.Int = { /* compiled code */ }
+ def foo558(): scala.Int = { /* compiled code */ }
+ def foo559(): scala.Int = { /* compiled code */ }
+ def foo560(): scala.Int = { /* compiled code */ }
+ def foo561(): scala.Int = { /* compiled code */ }
+ def foo562(): scala.Int = { /* compiled code */ }
+ def foo563(): scala.Int = { /* compiled code */ }
+ def foo564(): scala.Int = { /* compiled code */ }
+ def foo565(): scala.Int = { /* compiled code */ }
+ def foo566(): scala.Int = { /* compiled code */ }
+ def foo567(): scala.Int = { /* compiled code */ }
+ def foo568(): scala.Int = { /* compiled code */ }
+ def foo569(): scala.Int = { /* compiled code */ }
+ def foo570(): scala.Int = { /* compiled code */ }
+ def foo571(): scala.Int = { /* compiled code */ }
+ def foo572(): scala.Int = { /* compiled code */ }
+ def foo573(): scala.Int = { /* compiled code */ }
+ def foo574(): scala.Int = { /* compiled code */ }
+ def foo575(): scala.Int = { /* compiled code */ }
+ def foo576(): scala.Int = { /* compiled code */ }
+ def foo577(): scala.Int = { /* compiled code */ }
+ def foo578(): scala.Int = { /* compiled code */ }
+ def foo579(): scala.Int = { /* compiled code */ }
+ def foo580(): scala.Int = { /* compiled code */ }
+ def foo581(): scala.Int = { /* compiled code */ }
+ def foo582(): scala.Int = { /* compiled code */ }
+ def foo583(): scala.Int = { /* compiled code */ }
+ def foo584(): scala.Int = { /* compiled code */ }
+ def foo585(): scala.Int = { /* compiled code */ }
+ def foo586(): scala.Int = { /* compiled code */ }
+ def foo587(): scala.Int = { /* compiled code */ }
+ def foo588(): scala.Int = { /* compiled code */ }
+ def foo589(): scala.Int = { /* compiled code */ }
+ def foo590(): scala.Int = { /* compiled code */ }
+ def foo591(): scala.Int = { /* compiled code */ }
+ def foo592(): scala.Int = { /* compiled code */ }
+ def foo593(): scala.Int = { /* compiled code */ }
+ def foo594(): scala.Int = { /* compiled code */ }
+ def foo595(): scala.Int = { /* compiled code */ }
+ def foo596(): scala.Int = { /* compiled code */ }
+ def foo597(): scala.Int = { /* compiled code */ }
+ def foo598(): scala.Int = { /* compiled code */ }
+ def foo599(): scala.Int = { /* compiled code */ }
+ def foo600(): scala.Int = { /* compiled code */ }
+ def foo601(): scala.Int = { /* compiled code */ }
+ def foo602(): scala.Int = { /* compiled code */ }
+ def foo603(): scala.Int = { /* compiled code */ }
+ def foo604(): scala.Int = { /* compiled code */ }
+ def foo605(): scala.Int = { /* compiled code */ }
+ def foo606(): scala.Int = { /* compiled code */ }
+ def foo607(): scala.Int = { /* compiled code */ }
+ def foo608(): scala.Int = { /* compiled code */ }
+ def foo609(): scala.Int = { /* compiled code */ }
+ def foo610(): scala.Int = { /* compiled code */ }
+ def foo611(): scala.Int = { /* compiled code */ }
+ def foo612(): scala.Int = { /* compiled code */ }
+ def foo613(): scala.Int = { /* compiled code */ }
+ def foo614(): scala.Int = { /* compiled code */ }
+ def foo615(): scala.Int = { /* compiled code */ }
+ def foo616(): scala.Int = { /* compiled code */ }
+ def foo617(): scala.Int = { /* compiled code */ }
+ def foo618(): scala.Int = { /* compiled code */ }
+ def foo619(): scala.Int = { /* compiled code */ }
+ def foo620(): scala.Int = { /* compiled code */ }
+ def foo621(): scala.Int = { /* compiled code */ }
+ def foo622(): scala.Int = { /* compiled code */ }
+ def foo623(): scala.Int = { /* compiled code */ }
+ def foo624(): scala.Int = { /* compiled code */ }
+ def foo625(): scala.Int = { /* compiled code */ }
+ def foo626(): scala.Int = { /* compiled code */ }
+ def foo627(): scala.Int = { /* compiled code */ }
+ def foo628(): scala.Int = { /* compiled code */ }
+ def foo629(): scala.Int = { /* compiled code */ }
+ def foo630(): scala.Int = { /* compiled code */ }
+ def foo631(): scala.Int = { /* compiled code */ }
+ def foo632(): scala.Int = { /* compiled code */ }
+ def foo633(): scala.Int = { /* compiled code */ }
+ def foo634(): scala.Int = { /* compiled code */ }
+ def foo635(): scala.Int = { /* compiled code */ }
+ def foo636(): scala.Int = { /* compiled code */ }
+ def foo637(): scala.Int = { /* compiled code */ }
+ def foo638(): scala.Int = { /* compiled code */ }
+ def foo639(): scala.Int = { /* compiled code */ }
+ def foo640(): scala.Int = { /* compiled code */ }
+ def foo641(): scala.Int = { /* compiled code */ }
+ def foo642(): scala.Int = { /* compiled code */ }
+ def foo643(): scala.Int = { /* compiled code */ }
+ def foo644(): scala.Int = { /* compiled code */ }
+ def foo645(): scala.Int = { /* compiled code */ }
+ def foo646(): scala.Int = { /* compiled code */ }
+ def foo647(): scala.Int = { /* compiled code */ }
+ def foo648(): scala.Int = { /* compiled code */ }
+ def foo649(): scala.Int = { /* compiled code */ }
+ def foo650(): scala.Int = { /* compiled code */ }
+ def foo651(): scala.Int = { /* compiled code */ }
+ def foo652(): scala.Int = { /* compiled code */ }
+ def foo653(): scala.Int = { /* compiled code */ }
+ def foo654(): scala.Int = { /* compiled code */ }
+ def foo655(): scala.Int = { /* compiled code */ }
+ def foo656(): scala.Int = { /* compiled code */ }
+ def foo657(): scala.Int = { /* compiled code */ }
+ def foo658(): scala.Int = { /* compiled code */ }
+ def foo659(): scala.Int = { /* compiled code */ }
+ def foo660(): scala.Int = { /* compiled code */ }
+ def foo661(): scala.Int = { /* compiled code */ }
+ def foo662(): scala.Int = { /* compiled code */ }
+ def foo663(): scala.Int = { /* compiled code */ }
+ def foo664(): scala.Int = { /* compiled code */ }
+ def foo665(): scala.Int = { /* compiled code */ }
+ def foo666(): scala.Int = { /* compiled code */ }
+ def foo667(): scala.Int = { /* compiled code */ }
+ def foo668(): scala.Int = { /* compiled code */ }
+ def foo669(): scala.Int = { /* compiled code */ }
+ def foo670(): scala.Int = { /* compiled code */ }
+ def foo671(): scala.Int = { /* compiled code */ }
+ def foo672(): scala.Int = { /* compiled code */ }
+ def foo673(): scala.Int = { /* compiled code */ }
+ def foo674(): scala.Int = { /* compiled code */ }
+ def foo675(): scala.Int = { /* compiled code */ }
+ def foo676(): scala.Int = { /* compiled code */ }
+ def foo677(): scala.Int = { /* compiled code */ }
+ def foo678(): scala.Int = { /* compiled code */ }
+ def foo679(): scala.Int = { /* compiled code */ }
+ def foo680(): scala.Int = { /* compiled code */ }
+ def foo681(): scala.Int = { /* compiled code */ }
+ def foo682(): scala.Int = { /* compiled code */ }
+ def foo683(): scala.Int = { /* compiled code */ }
+ def foo684(): scala.Int = { /* compiled code */ }
+ def foo685(): scala.Int = { /* compiled code */ }
+ def foo686(): scala.Int = { /* compiled code */ }
+ def foo687(): scala.Int = { /* compiled code */ }
+ def foo688(): scala.Int = { /* compiled code */ }
+ def foo689(): scala.Int = { /* compiled code */ }
+ def foo690(): scala.Int = { /* compiled code */ }
+ def foo691(): scala.Int = { /* compiled code */ }
+ def foo692(): scala.Int = { /* compiled code */ }
+ def foo693(): scala.Int = { /* compiled code */ }
+ def foo694(): scala.Int = { /* compiled code */ }
+ def foo695(): scala.Int = { /* compiled code */ }
+ def foo696(): scala.Int = { /* compiled code */ }
+ def foo697(): scala.Int = { /* compiled code */ }
+ def foo698(): scala.Int = { /* compiled code */ }
+ def foo699(): scala.Int = { /* compiled code */ }
+ def foo700(): scala.Int = { /* compiled code */ }
+ def foo701(): scala.Int = { /* compiled code */ }
+ def foo702(): scala.Int = { /* compiled code */ }
+ def foo703(): scala.Int = { /* compiled code */ }
+ def foo704(): scala.Int = { /* compiled code */ }
+ def foo705(): scala.Int = { /* compiled code */ }
+ def foo706(): scala.Int = { /* compiled code */ }
+ def foo707(): scala.Int = { /* compiled code */ }
+ def foo708(): scala.Int = { /* compiled code */ }
+ def foo709(): scala.Int = { /* compiled code */ }
+ def foo710(): scala.Int = { /* compiled code */ }
+ def foo711(): scala.Int = { /* compiled code */ }
+ def foo712(): scala.Int = { /* compiled code */ }
+ def foo713(): scala.Int = { /* compiled code */ }
+ def foo714(): scala.Int = { /* compiled code */ }
+ def foo715(): scala.Int = { /* compiled code */ }
+ def foo716(): scala.Int = { /* compiled code */ }
+ def foo717(): scala.Int = { /* compiled code */ }
+ def foo718(): scala.Int = { /* compiled code */ }
+ def foo719(): scala.Int = { /* compiled code */ }
+ def foo720(): scala.Int = { /* compiled code */ }
+ def foo721(): scala.Int = { /* compiled code */ }
+ def foo722(): scala.Int = { /* compiled code */ }
+ def foo723(): scala.Int = { /* compiled code */ }
+ def foo724(): scala.Int = { /* compiled code */ }
+ def foo725(): scala.Int = { /* compiled code */ }
+ def foo726(): scala.Int = { /* compiled code */ }
+ def foo727(): scala.Int = { /* compiled code */ }
+ def foo728(): scala.Int = { /* compiled code */ }
+ def foo729(): scala.Int = { /* compiled code */ }
+ def foo730(): scala.Int = { /* compiled code */ }
+ def foo731(): scala.Int = { /* compiled code */ }
+ def foo732(): scala.Int = { /* compiled code */ }
+ def foo733(): scala.Int = { /* compiled code */ }
+ def foo734(): scala.Int = { /* compiled code */ }
+ def foo735(): scala.Int = { /* compiled code */ }
+ def foo736(): scala.Int = { /* compiled code */ }
+ def foo737(): scala.Int = { /* compiled code */ }
+ def foo738(): scala.Int = { /* compiled code */ }
+ def foo739(): scala.Int = { /* compiled code */ }
+ def foo740(): scala.Int = { /* compiled code */ }
+ def foo741(): scala.Int = { /* compiled code */ }
+ def foo742(): scala.Int = { /* compiled code */ }
+ def foo743(): scala.Int = { /* compiled code */ }
+ def foo744(): scala.Int = { /* compiled code */ }
+ def foo745(): scala.Int = { /* compiled code */ }
+ def foo746(): scala.Int = { /* compiled code */ }
+ def foo747(): scala.Int = { /* compiled code */ }
+ def foo748(): scala.Int = { /* compiled code */ }
+ def foo749(): scala.Int = { /* compiled code */ }
+ def foo750(): scala.Int = { /* compiled code */ }
+ def foo751(): scala.Int = { /* compiled code */ }
+ def foo752(): scala.Int = { /* compiled code */ }
+ def foo753(): scala.Int = { /* compiled code */ }
+ def foo754(): scala.Int = { /* compiled code */ }
+ def foo755(): scala.Int = { /* compiled code */ }
+ def foo756(): scala.Int = { /* compiled code */ }
+ def foo757(): scala.Int = { /* compiled code */ }
+ def foo758(): scala.Int = { /* compiled code */ }
+ def foo759(): scala.Int = { /* compiled code */ }
+ def foo760(): scala.Int = { /* compiled code */ }
+ def foo761(): scala.Int = { /* compiled code */ }
+ def foo762(): scala.Int = { /* compiled code */ }
+ def foo763(): scala.Int = { /* compiled code */ }
+ def foo764(): scala.Int = { /* compiled code */ }
+ def foo765(): scala.Int = { /* compiled code */ }
+ def foo766(): scala.Int = { /* compiled code */ }
+ def foo767(): scala.Int = { /* compiled code */ }
+ def foo768(): scala.Int = { /* compiled code */ }
+ def foo769(): scala.Int = { /* compiled code */ }
+ def foo770(): scala.Int = { /* compiled code */ }
+ def foo771(): scala.Int = { /* compiled code */ }
+ def foo772(): scala.Int = { /* compiled code */ }
+ def foo773(): scala.Int = { /* compiled code */ }
+ def foo774(): scala.Int = { /* compiled code */ }
+ def foo775(): scala.Int = { /* compiled code */ }
+ def foo776(): scala.Int = { /* compiled code */ }
+ def foo777(): scala.Int = { /* compiled code */ }
+ def foo778(): scala.Int = { /* compiled code */ }
+ def foo779(): scala.Int = { /* compiled code */ }
+ def foo780(): scala.Int = { /* compiled code */ }
+ def foo781(): scala.Int = { /* compiled code */ }
+ def foo782(): scala.Int = { /* compiled code */ }
+ def foo783(): scala.Int = { /* compiled code */ }
+ def foo784(): scala.Int = { /* compiled code */ }
+ def foo785(): scala.Int = { /* compiled code */ }
+ def foo786(): scala.Int = { /* compiled code */ }
+ def foo787(): scala.Int = { /* compiled code */ }
+ def foo788(): scala.Int = { /* compiled code */ }
+ def foo789(): scala.Int = { /* compiled code */ }
+ def foo790(): scala.Int = { /* compiled code */ }
+ def foo791(): scala.Int = { /* compiled code */ }
+ def foo792(): scala.Int = { /* compiled code */ }
+ def foo793(): scala.Int = { /* compiled code */ }
+ def foo794(): scala.Int = { /* compiled code */ }
+ def foo795(): scala.Int = { /* compiled code */ }
+ def foo796(): scala.Int = { /* compiled code */ }
+ def foo797(): scala.Int = { /* compiled code */ }
+ def foo798(): scala.Int = { /* compiled code */ }
+ def foo799(): scala.Int = { /* compiled code */ }
+ def foo800(): scala.Int = { /* compiled code */ }
+ def foo801(): scala.Int = { /* compiled code */ }
+ def foo802(): scala.Int = { /* compiled code */ }
+ def foo803(): scala.Int = { /* compiled code */ }
+ def foo804(): scala.Int = { /* compiled code */ }
+ def foo805(): scala.Int = { /* compiled code */ }
+ def foo806(): scala.Int = { /* compiled code */ }
+ def foo807(): scala.Int = { /* compiled code */ }
+ def foo808(): scala.Int = { /* compiled code */ }
+ def foo809(): scala.Int = { /* compiled code */ }
+ def foo810(): scala.Int = { /* compiled code */ }
+ def foo811(): scala.Int = { /* compiled code */ }
+ def foo812(): scala.Int = { /* compiled code */ }
+ def foo813(): scala.Int = { /* compiled code */ }
+ def foo814(): scala.Int = { /* compiled code */ }
+ def foo815(): scala.Int = { /* compiled code */ }
+ def foo816(): scala.Int = { /* compiled code */ }
+ def foo817(): scala.Int = { /* compiled code */ }
+ def foo818(): scala.Int = { /* compiled code */ }
+ def foo819(): scala.Int = { /* compiled code */ }
+ def foo820(): scala.Int = { /* compiled code */ }
+ def foo821(): scala.Int = { /* compiled code */ }
+ def foo822(): scala.Int = { /* compiled code */ }
+ def foo823(): scala.Int = { /* compiled code */ }
+ def foo824(): scala.Int = { /* compiled code */ }
+ def foo825(): scala.Int = { /* compiled code */ }
+ def foo826(): scala.Int = { /* compiled code */ }
+ def foo827(): scala.Int = { /* compiled code */ }
+ def foo828(): scala.Int = { /* compiled code */ }
+ def foo829(): scala.Int = { /* compiled code */ }
+ def foo830(): scala.Int = { /* compiled code */ }
+ def foo831(): scala.Int = { /* compiled code */ }
+ def foo832(): scala.Int = { /* compiled code */ }
+ def foo833(): scala.Int = { /* compiled code */ }
+ def foo834(): scala.Int = { /* compiled code */ }
+ def foo835(): scala.Int = { /* compiled code */ }
+ def foo836(): scala.Int = { /* compiled code */ }
+ def foo837(): scala.Int = { /* compiled code */ }
+ def foo838(): scala.Int = { /* compiled code */ }
+ def foo839(): scala.Int = { /* compiled code */ }
+ def foo840(): scala.Int = { /* compiled code */ }
+ def foo841(): scala.Int = { /* compiled code */ }
+ def foo842(): scala.Int = { /* compiled code */ }
+ def foo843(): scala.Int = { /* compiled code */ }
+ def foo844(): scala.Int = { /* compiled code */ }
+ def foo845(): scala.Int = { /* compiled code */ }
+ def foo846(): scala.Int = { /* compiled code */ }
+ def foo847(): scala.Int = { /* compiled code */ }
+ def foo848(): scala.Int = { /* compiled code */ }
+ def foo849(): scala.Int = { /* compiled code */ }
+ def foo850(): scala.Int = { /* compiled code */ }
+ def foo851(): scala.Int = { /* compiled code */ }
+ def foo852(): scala.Int = { /* compiled code */ }
+ def foo853(): scala.Int = { /* compiled code */ }
+ def foo854(): scala.Int = { /* compiled code */ }
+ def foo855(): scala.Int = { /* compiled code */ }
+ def foo856(): scala.Int = { /* compiled code */ }
+ def foo857(): scala.Int = { /* compiled code */ }
+ def foo858(): scala.Int = { /* compiled code */ }
+ def foo859(): scala.Int = { /* compiled code */ }
+ def foo860(): scala.Int = { /* compiled code */ }
+ def foo861(): scala.Int = { /* compiled code */ }
+ def foo862(): scala.Int = { /* compiled code */ }
+ def foo863(): scala.Int = { /* compiled code */ }
+ def foo864(): scala.Int = { /* compiled code */ }
+ def foo865(): scala.Int = { /* compiled code */ }
+ def foo866(): scala.Int = { /* compiled code */ }
+ def foo867(): scala.Int = { /* compiled code */ }
+ def foo868(): scala.Int = { /* compiled code */ }
+ def foo869(): scala.Int = { /* compiled code */ }
+ def foo870(): scala.Int = { /* compiled code */ }
+ def foo871(): scala.Int = { /* compiled code */ }
+ def foo872(): scala.Int = { /* compiled code */ }
+ def foo873(): scala.Int = { /* compiled code */ }
+ def foo874(): scala.Int = { /* compiled code */ }
+ def foo875(): scala.Int = { /* compiled code */ }
+ def foo876(): scala.Int = { /* compiled code */ }
+ def foo877(): scala.Int = { /* compiled code */ }
+ def foo878(): scala.Int = { /* compiled code */ }
+ def foo879(): scala.Int = { /* compiled code */ }
+ def foo880(): scala.Int = { /* compiled code */ }
+ def foo881(): scala.Int = { /* compiled code */ }
+ def foo882(): scala.Int = { /* compiled code */ }
+ def foo883(): scala.Int = { /* compiled code */ }
+ def foo884(): scala.Int = { /* compiled code */ }
+ def foo885(): scala.Int = { /* compiled code */ }
+ def foo886(): scala.Int = { /* compiled code */ }
+ def foo887(): scala.Int = { /* compiled code */ }
+ def foo888(): scala.Int = { /* compiled code */ }
+ def foo889(): scala.Int = { /* compiled code */ }
+ def foo890(): scala.Int = { /* compiled code */ }
+ def foo891(): scala.Int = { /* compiled code */ }
+ def foo892(): scala.Int = { /* compiled code */ }
+ def foo893(): scala.Int = { /* compiled code */ }
+ def foo894(): scala.Int = { /* compiled code */ }
+ def foo895(): scala.Int = { /* compiled code */ }
+ def foo896(): scala.Int = { /* compiled code */ }
+ def foo897(): scala.Int = { /* compiled code */ }
+ def foo898(): scala.Int = { /* compiled code */ }
+ def foo899(): scala.Int = { /* compiled code */ }
+ def foo900(): scala.Int = { /* compiled code */ }
+ def foo901(): scala.Int = { /* compiled code */ }
+ def foo902(): scala.Int = { /* compiled code */ }
+ def foo903(): scala.Int = { /* compiled code */ }
+ def foo904(): scala.Int = { /* compiled code */ }
+ def foo905(): scala.Int = { /* compiled code */ }
+ def foo906(): scala.Int = { /* compiled code */ }
+ def foo907(): scala.Int = { /* compiled code */ }
+ def foo908(): scala.Int = { /* compiled code */ }
+ def foo909(): scala.Int = { /* compiled code */ }
+ def foo910(): scala.Int = { /* compiled code */ }
+ def foo911(): scala.Int = { /* compiled code */ }
+ def foo912(): scala.Int = { /* compiled code */ }
+ def foo913(): scala.Int = { /* compiled code */ }
+ def foo914(): scala.Int = { /* compiled code */ }
+ def foo915(): scala.Int = { /* compiled code */ }
+ def foo916(): scala.Int = { /* compiled code */ }
+ def foo917(): scala.Int = { /* compiled code */ }
+ def foo918(): scala.Int = { /* compiled code */ }
+ def foo919(): scala.Int = { /* compiled code */ }
+ def foo920(): scala.Int = { /* compiled code */ }
+ def foo921(): scala.Int = { /* compiled code */ }
+ def foo922(): scala.Int = { /* compiled code */ }
+ def foo923(): scala.Int = { /* compiled code */ }
+ def foo924(): scala.Int = { /* compiled code */ }
+ def foo925(): scala.Int = { /* compiled code */ }
+ def foo926(): scala.Int = { /* compiled code */ }
+ def foo927(): scala.Int = { /* compiled code */ }
+ def foo928(): scala.Int = { /* compiled code */ }
+ def foo929(): scala.Int = { /* compiled code */ }
+ def foo930(): scala.Int = { /* compiled code */ }
+ def foo931(): scala.Int = { /* compiled code */ }
+ def foo932(): scala.Int = { /* compiled code */ }
+ def foo933(): scala.Int = { /* compiled code */ }
+ def foo934(): scala.Int = { /* compiled code */ }
+ def foo935(): scala.Int = { /* compiled code */ }
+ def foo936(): scala.Int = { /* compiled code */ }
+ def foo937(): scala.Int = { /* compiled code */ }
+ def foo938(): scala.Int = { /* compiled code */ }
+ def foo939(): scala.Int = { /* compiled code */ }
+ def foo940(): scala.Int = { /* compiled code */ }
+ def foo941(): scala.Int = { /* compiled code */ }
+ def foo942(): scala.Int = { /* compiled code */ }
+ def foo943(): scala.Int = { /* compiled code */ }
+ def foo944(): scala.Int = { /* compiled code */ }
+ def foo945(): scala.Int = { /* compiled code */ }
+ def foo946(): scala.Int = { /* compiled code */ }
+ def foo947(): scala.Int = { /* compiled code */ }
+ def foo948(): scala.Int = { /* compiled code */ }
+ def foo949(): scala.Int = { /* compiled code */ }
+ def foo950(): scala.Int = { /* compiled code */ }
+ def foo951(): scala.Int = { /* compiled code */ }
+ def foo952(): scala.Int = { /* compiled code */ }
+ def foo953(): scala.Int = { /* compiled code */ }
+ def foo954(): scala.Int = { /* compiled code */ }
+ def foo955(): scala.Int = { /* compiled code */ }
+ def foo956(): scala.Int = { /* compiled code */ }
+ def foo957(): scala.Int = { /* compiled code */ }
+ def foo958(): scala.Int = { /* compiled code */ }
+ def foo959(): scala.Int = { /* compiled code */ }
+ def foo960(): scala.Int = { /* compiled code */ }
+ def foo961(): scala.Int = { /* compiled code */ }
+ def foo962(): scala.Int = { /* compiled code */ }
+ def foo963(): scala.Int = { /* compiled code */ }
+ def foo964(): scala.Int = { /* compiled code */ }
+ def foo965(): scala.Int = { /* compiled code */ }
+ def foo966(): scala.Int = { /* compiled code */ }
+ def foo967(): scala.Int = { /* compiled code */ }
+ def foo968(): scala.Int = { /* compiled code */ }
+ def foo969(): scala.Int = { /* compiled code */ }
+ def foo970(): scala.Int = { /* compiled code */ }
+ def foo971(): scala.Int = { /* compiled code */ }
+ def foo972(): scala.Int = { /* compiled code */ }
+ def foo973(): scala.Int = { /* compiled code */ }
+ def foo974(): scala.Int = { /* compiled code */ }
+ def foo975(): scala.Int = { /* compiled code */ }
+ def foo976(): scala.Int = { /* compiled code */ }
+ def foo977(): scala.Int = { /* compiled code */ }
+ def foo978(): scala.Int = { /* compiled code */ }
+ def foo979(): scala.Int = { /* compiled code */ }
+ def foo980(): scala.Int = { /* compiled code */ }
+ def foo981(): scala.Int = { /* compiled code */ }
+ def foo982(): scala.Int = { /* compiled code */ }
+ def foo983(): scala.Int = { /* compiled code */ }
+ def foo984(): scala.Int = { /* compiled code */ }
+ def foo985(): scala.Int = { /* compiled code */ }
+ def foo986(): scala.Int = { /* compiled code */ }
+ def foo987(): scala.Int = { /* compiled code */ }
+ def foo988(): scala.Int = { /* compiled code */ }
+ def foo989(): scala.Int = { /* compiled code */ }
+ def foo990(): scala.Int = { /* compiled code */ }
+ def foo991(): scala.Int = { /* compiled code */ }
+ def foo992(): scala.Int = { /* compiled code */ }
+ def foo993(): scala.Int = { /* compiled code */ }
+ def foo994(): scala.Int = { /* compiled code */ }
+ def foo995(): scala.Int = { /* compiled code */ }
+ def foo996(): scala.Int = { /* compiled code */ }
+ def foo997(): scala.Int = { /* compiled code */ }
+ def foo998(): scala.Int = { /* compiled code */ }
+ def foo999(): scala.Int = { /* compiled code */ }
+ def foo1000(): scala.Int = { /* compiled code */ }
+ def foo1001(): scala.Int = { /* compiled code */ }
+ def foo1002(): scala.Int = { /* compiled code */ }
+ def foo1003(): scala.Int = { /* compiled code */ }
+ def foo1004(): scala.Int = { /* compiled code */ }
+ def foo1005(): scala.Int = { /* compiled code */ }
+ def foo1006(): scala.Int = { /* compiled code */ }
+ def foo1007(): scala.Int = { /* compiled code */ }
+ def foo1008(): scala.Int = { /* compiled code */ }
+ def foo1009(): scala.Int = { /* compiled code */ }
+ def foo1010(): scala.Int = { /* compiled code */ }
+ def foo1011(): scala.Int = { /* compiled code */ }
+ def foo1012(): scala.Int = { /* compiled code */ }
+ def foo1013(): scala.Int = { /* compiled code */ }
+ def foo1014(): scala.Int = { /* compiled code */ }
+ def foo1015(): scala.Int = { /* compiled code */ }
+ def foo1016(): scala.Int = { /* compiled code */ }
+ def foo1017(): scala.Int = { /* compiled code */ }
+ def foo1018(): scala.Int = { /* compiled code */ }
+ def foo1019(): scala.Int = { /* compiled code */ }
+ def foo1020(): scala.Int = { /* compiled code */ }
+ def foo1021(): scala.Int = { /* compiled code */ }
+ def foo1022(): scala.Int = { /* compiled code */ }
+ def foo1023(): scala.Int = { /* compiled code */ }
+ def foo1024(): scala.Int = { /* compiled code */ }
+ def foo1025(): scala.Int = { /* compiled code */ }
+ def foo1026(): scala.Int = { /* compiled code */ }
+ def foo1027(): scala.Int = { /* compiled code */ }
+ def foo1028(): scala.Int = { /* compiled code */ }
+ def foo1029(): scala.Int = { /* compiled code */ }
+ def foo1030(): scala.Int = { /* compiled code */ }
+ def foo1031(): scala.Int = { /* compiled code */ }
+ def foo1032(): scala.Int = { /* compiled code */ }
+ def foo1033(): scala.Int = { /* compiled code */ }
+ def foo1034(): scala.Int = { /* compiled code */ }
+ def foo1035(): scala.Int = { /* compiled code */ }
+ def foo1036(): scala.Int = { /* compiled code */ }
+ def foo1037(): scala.Int = { /* compiled code */ }
+ def foo1038(): scala.Int = { /* compiled code */ }
+ def foo1039(): scala.Int = { /* compiled code */ }
+ def foo1040(): scala.Int = { /* compiled code */ }
+ def foo1041(): scala.Int = { /* compiled code */ }
+ def foo1042(): scala.Int = { /* compiled code */ }
+ def foo1043(): scala.Int = { /* compiled code */ }
+ def foo1044(): scala.Int = { /* compiled code */ }
+ def foo1045(): scala.Int = { /* compiled code */ }
+ def foo1046(): scala.Int = { /* compiled code */ }
+ def foo1047(): scala.Int = { /* compiled code */ }
+ def foo1048(): scala.Int = { /* compiled code */ }
+ def foo1049(): scala.Int = { /* compiled code */ }
+ def foo1050(): scala.Int = { /* compiled code */ }
+ def foo1051(): scala.Int = { /* compiled code */ }
+ def foo1052(): scala.Int = { /* compiled code */ }
+ def foo1053(): scala.Int = { /* compiled code */ }
+ def foo1054(): scala.Int = { /* compiled code */ }
+ def foo1055(): scala.Int = { /* compiled code */ }
+ def foo1056(): scala.Int = { /* compiled code */ }
+ def foo1057(): scala.Int = { /* compiled code */ }
+ def foo1058(): scala.Int = { /* compiled code */ }
+ def foo1059(): scala.Int = { /* compiled code */ }
+ def foo1060(): scala.Int = { /* compiled code */ }
+ def foo1061(): scala.Int = { /* compiled code */ }
+ def foo1062(): scala.Int = { /* compiled code */ }
+ def foo1063(): scala.Int = { /* compiled code */ }
+ def foo1064(): scala.Int = { /* compiled code */ }
+ def foo1065(): scala.Int = { /* compiled code */ }
+ def foo1066(): scala.Int = { /* compiled code */ }
+ def foo1067(): scala.Int = { /* compiled code */ }
+ def foo1068(): scala.Int = { /* compiled code */ }
+ def foo1069(): scala.Int = { /* compiled code */ }
+ def foo1070(): scala.Int = { /* compiled code */ }
+ def foo1071(): scala.Int = { /* compiled code */ }
+ def foo1072(): scala.Int = { /* compiled code */ }
+ def foo1073(): scala.Int = { /* compiled code */ }
+ def foo1074(): scala.Int = { /* compiled code */ }
+ def foo1075(): scala.Int = { /* compiled code */ }
+ def foo1076(): scala.Int = { /* compiled code */ }
+ def foo1077(): scala.Int = { /* compiled code */ }
+ def foo1078(): scala.Int = { /* compiled code */ }
+ def foo1079(): scala.Int = { /* compiled code */ }
+ def foo1080(): scala.Int = { /* compiled code */ }
+ def foo1081(): scala.Int = { /* compiled code */ }
+ def foo1082(): scala.Int = { /* compiled code */ }
+ def foo1083(): scala.Int = { /* compiled code */ }
+ def foo1084(): scala.Int = { /* compiled code */ }
+ def foo1085(): scala.Int = { /* compiled code */ }
+ def foo1086(): scala.Int = { /* compiled code */ }
+ def foo1087(): scala.Int = { /* compiled code */ }
+ def foo1088(): scala.Int = { /* compiled code */ }
+ def foo1089(): scala.Int = { /* compiled code */ }
+ def foo1090(): scala.Int = { /* compiled code */ }
+ def foo1091(): scala.Int = { /* compiled code */ }
+ def foo1092(): scala.Int = { /* compiled code */ }
+ def foo1093(): scala.Int = { /* compiled code */ }
+ def foo1094(): scala.Int = { /* compiled code */ }
+ def foo1095(): scala.Int = { /* compiled code */ }
+ def foo1096(): scala.Int = { /* compiled code */ }
+ def foo1097(): scala.Int = { /* compiled code */ }
+ def foo1098(): scala.Int = { /* compiled code */ }
+ def foo1099(): scala.Int = { /* compiled code */ }
+ def foo1100(): scala.Int = { /* compiled code */ }
+ def foo1101(): scala.Int = { /* compiled code */ }
+ def foo1102(): scala.Int = { /* compiled code */ }
+ def foo1103(): scala.Int = { /* compiled code */ }
+ def foo1104(): scala.Int = { /* compiled code */ }
+ def foo1105(): scala.Int = { /* compiled code */ }
+ def foo1106(): scala.Int = { /* compiled code */ }
+ def foo1107(): scala.Int = { /* compiled code */ }
+ def foo1108(): scala.Int = { /* compiled code */ }
+ def foo1109(): scala.Int = { /* compiled code */ }
+ def foo1110(): scala.Int = { /* compiled code */ }
+ def foo1111(): scala.Int = { /* compiled code */ }
+ def foo1112(): scala.Int = { /* compiled code */ }
+ def foo1113(): scala.Int = { /* compiled code */ }
+ def foo1114(): scala.Int = { /* compiled code */ }
+ def foo1115(): scala.Int = { /* compiled code */ }
+ def foo1116(): scala.Int = { /* compiled code */ }
+ def foo1117(): scala.Int = { /* compiled code */ }
+ def foo1118(): scala.Int = { /* compiled code */ }
+ def foo1119(): scala.Int = { /* compiled code */ }
+ def foo1120(): scala.Int = { /* compiled code */ }
+ def foo1121(): scala.Int = { /* compiled code */ }
+ def foo1122(): scala.Int = { /* compiled code */ }
+ def foo1123(): scala.Int = { /* compiled code */ }
+ def foo1124(): scala.Int = { /* compiled code */ }
+ def foo1125(): scala.Int = { /* compiled code */ }
+ def foo1126(): scala.Int = { /* compiled code */ }
+ def foo1127(): scala.Int = { /* compiled code */ }
+ def foo1128(): scala.Int = { /* compiled code */ }
+ def foo1129(): scala.Int = { /* compiled code */ }
+ def foo1130(): scala.Int = { /* compiled code */ }
+ def foo1131(): scala.Int = { /* compiled code */ }
+ def foo1132(): scala.Int = { /* compiled code */ }
+ def foo1133(): scala.Int = { /* compiled code */ }
+ def foo1134(): scala.Int = { /* compiled code */ }
+ def foo1135(): scala.Int = { /* compiled code */ }
+ def foo1136(): scala.Int = { /* compiled code */ }
+ def foo1137(): scala.Int = { /* compiled code */ }
+ def foo1138(): scala.Int = { /* compiled code */ }
+ def foo1139(): scala.Int = { /* compiled code */ }
+ def foo1140(): scala.Int = { /* compiled code */ }
+ def foo1141(): scala.Int = { /* compiled code */ }
+ def foo1142(): scala.Int = { /* compiled code */ }
+ def foo1143(): scala.Int = { /* compiled code */ }
+ def foo1144(): scala.Int = { /* compiled code */ }
+ def foo1145(): scala.Int = { /* compiled code */ }
+ def foo1146(): scala.Int = { /* compiled code */ }
+ def foo1147(): scala.Int = { /* compiled code */ }
+ def foo1148(): scala.Int = { /* compiled code */ }
+ def foo1149(): scala.Int = { /* compiled code */ }
+ def foo1150(): scala.Int = { /* compiled code */ }
+ def foo1151(): scala.Int = { /* compiled code */ }
+ def foo1152(): scala.Int = { /* compiled code */ }
+ def foo1153(): scala.Int = { /* compiled code */ }
+ def foo1154(): scala.Int = { /* compiled code */ }
+ def foo1155(): scala.Int = { /* compiled code */ }
+ def foo1156(): scala.Int = { /* compiled code */ }
+ def foo1157(): scala.Int = { /* compiled code */ }
+ def foo1158(): scala.Int = { /* compiled code */ }
+ def foo1159(): scala.Int = { /* compiled code */ }
+ def foo1160(): scala.Int = { /* compiled code */ }
+ def foo1161(): scala.Int = { /* compiled code */ }
+ def foo1162(): scala.Int = { /* compiled code */ }
+ def foo1163(): scala.Int = { /* compiled code */ }
+ def foo1164(): scala.Int = { /* compiled code */ }
+ def foo1165(): scala.Int = { /* compiled code */ }
+ def foo1166(): scala.Int = { /* compiled code */ }
+ def foo1167(): scala.Int = { /* compiled code */ }
+ def foo1168(): scala.Int = { /* compiled code */ }
+ def foo1169(): scala.Int = { /* compiled code */ }
+ def foo1170(): scala.Int = { /* compiled code */ }
+ def foo1171(): scala.Int = { /* compiled code */ }
+ def foo1172(): scala.Int = { /* compiled code */ }
+ def foo1173(): scala.Int = { /* compiled code */ }
+ def foo1174(): scala.Int = { /* compiled code */ }
+ def foo1175(): scala.Int = { /* compiled code */ }
+ def foo1176(): scala.Int = { /* compiled code */ }
+ def foo1177(): scala.Int = { /* compiled code */ }
+ def foo1178(): scala.Int = { /* compiled code */ }
+ def foo1179(): scala.Int = { /* compiled code */ }
+ def foo1180(): scala.Int = { /* compiled code */ }
+ def foo1181(): scala.Int = { /* compiled code */ }
+ def foo1182(): scala.Int = { /* compiled code */ }
+ def foo1183(): scala.Int = { /* compiled code */ }
+ def foo1184(): scala.Int = { /* compiled code */ }
+ def foo1185(): scala.Int = { /* compiled code */ }
+ def foo1186(): scala.Int = { /* compiled code */ }
+ def foo1187(): scala.Int = { /* compiled code */ }
+ def foo1188(): scala.Int = { /* compiled code */ }
+ def foo1189(): scala.Int = { /* compiled code */ }
+ def foo1190(): scala.Int = { /* compiled code */ }
+ def foo1191(): scala.Int = { /* compiled code */ }
+ def foo1192(): scala.Int = { /* compiled code */ }
+ def foo1193(): scala.Int = { /* compiled code */ }
+ def foo1194(): scala.Int = { /* compiled code */ }
+ def foo1195(): scala.Int = { /* compiled code */ }
+ def foo1196(): scala.Int = { /* compiled code */ }
+ def foo1197(): scala.Int = { /* compiled code */ }
+ def foo1198(): scala.Int = { /* compiled code */ }
+ def foo1199(): scala.Int = { /* compiled code */ }
+ def foo1200(): scala.Int = { /* compiled code */ }
+ def foo1201(): scala.Int = { /* compiled code */ }
+ def foo1202(): scala.Int = { /* compiled code */ }
+ def foo1203(): scala.Int = { /* compiled code */ }
+ def foo1204(): scala.Int = { /* compiled code */ }
+ def foo1205(): scala.Int = { /* compiled code */ }
+ def foo1206(): scala.Int = { /* compiled code */ }
+ def foo1207(): scala.Int = { /* compiled code */ }
+ def foo1208(): scala.Int = { /* compiled code */ }
+ def foo1209(): scala.Int = { /* compiled code */ }
+ def foo1210(): scala.Int = { /* compiled code */ }
+ def foo1211(): scala.Int = { /* compiled code */ }
+ def foo1212(): scala.Int = { /* compiled code */ }
+ def foo1213(): scala.Int = { /* compiled code */ }
+ def foo1214(): scala.Int = { /* compiled code */ }
+ def foo1215(): scala.Int = { /* compiled code */ }
+ def foo1216(): scala.Int = { /* compiled code */ }
+ def foo1217(): scala.Int = { /* compiled code */ }
+ def foo1218(): scala.Int = { /* compiled code */ }
+ def foo1219(): scala.Int = { /* compiled code */ }
+ def foo1220(): scala.Int = { /* compiled code */ }
+ def foo1221(): scala.Int = { /* compiled code */ }
+ def foo1222(): scala.Int = { /* compiled code */ }
+ def foo1223(): scala.Int = { /* compiled code */ }
+ def foo1224(): scala.Int = { /* compiled code */ }
+ def foo1225(): scala.Int = { /* compiled code */ }
+ def foo1226(): scala.Int = { /* compiled code */ }
+ def foo1227(): scala.Int = { /* compiled code */ }
+ def foo1228(): scala.Int = { /* compiled code */ }
+ def foo1229(): scala.Int = { /* compiled code */ }
+ def foo1230(): scala.Int = { /* compiled code */ }
+ def foo1231(): scala.Int = { /* compiled code */ }
+ def foo1232(): scala.Int = { /* compiled code */ }
+ def foo1233(): scala.Int = { /* compiled code */ }
+ def foo1234(): scala.Int = { /* compiled code */ }
+ def foo1235(): scala.Int = { /* compiled code */ }
+ def foo1236(): scala.Int = { /* compiled code */ }
+ def foo1237(): scala.Int = { /* compiled code */ }
+ def foo1238(): scala.Int = { /* compiled code */ }
+ def foo1239(): scala.Int = { /* compiled code */ }
+ def foo1240(): scala.Int = { /* compiled code */ }
+ def foo1241(): scala.Int = { /* compiled code */ }
+ def foo1242(): scala.Int = { /* compiled code */ }
+ def foo1243(): scala.Int = { /* compiled code */ }
+ def foo1244(): scala.Int = { /* compiled code */ }
+ def foo1245(): scala.Int = { /* compiled code */ }
+ def foo1246(): scala.Int = { /* compiled code */ }
+ def foo1247(): scala.Int = { /* compiled code */ }
+ def foo1248(): scala.Int = { /* compiled code */ }
+ def foo1249(): scala.Int = { /* compiled code */ }
+ def foo1250(): scala.Int = { /* compiled code */ }
+ def foo1251(): scala.Int = { /* compiled code */ }
+ def foo1252(): scala.Int = { /* compiled code */ }
+ def foo1253(): scala.Int = { /* compiled code */ }
+ def foo1254(): scala.Int = { /* compiled code */ }
+ def foo1255(): scala.Int = { /* compiled code */ }
+ def foo1256(): scala.Int = { /* compiled code */ }
+ def foo1257(): scala.Int = { /* compiled code */ }
+ def foo1258(): scala.Int = { /* compiled code */ }
+ def foo1259(): scala.Int = { /* compiled code */ }
+ def foo1260(): scala.Int = { /* compiled code */ }
+ def foo1261(): scala.Int = { /* compiled code */ }
+ def foo1262(): scala.Int = { /* compiled code */ }
+ def foo1263(): scala.Int = { /* compiled code */ }
+ def foo1264(): scala.Int = { /* compiled code */ }
+ def foo1265(): scala.Int = { /* compiled code */ }
+ def foo1266(): scala.Int = { /* compiled code */ }
+ def foo1267(): scala.Int = { /* compiled code */ }
+ def foo1268(): scala.Int = { /* compiled code */ }
+ def foo1269(): scala.Int = { /* compiled code */ }
+ def foo1270(): scala.Int = { /* compiled code */ }
+ def foo1271(): scala.Int = { /* compiled code */ }
+ def foo1272(): scala.Int = { /* compiled code */ }
+ def foo1273(): scala.Int = { /* compiled code */ }
+ def foo1274(): scala.Int = { /* compiled code */ }
+ def foo1275(): scala.Int = { /* compiled code */ }
+ def foo1276(): scala.Int = { /* compiled code */ }
+ def foo1277(): scala.Int = { /* compiled code */ }
+ def foo1278(): scala.Int = { /* compiled code */ }
+ def foo1279(): scala.Int = { /* compiled code */ }
+ def foo1280(): scala.Int = { /* compiled code */ }
+ def foo1281(): scala.Int = { /* compiled code */ }
+ def foo1282(): scala.Int = { /* compiled code */ }
+ def foo1283(): scala.Int = { /* compiled code */ }
+ def foo1284(): scala.Int = { /* compiled code */ }
+ def foo1285(): scala.Int = { /* compiled code */ }
+ def foo1286(): scala.Int = { /* compiled code */ }
+ def foo1287(): scala.Int = { /* compiled code */ }
+ def foo1288(): scala.Int = { /* compiled code */ }
+ def foo1289(): scala.Int = { /* compiled code */ }
+ def foo1290(): scala.Int = { /* compiled code */ }
+ def foo1291(): scala.Int = { /* compiled code */ }
+ def foo1292(): scala.Int = { /* compiled code */ }
+ def foo1293(): scala.Int = { /* compiled code */ }
+ def foo1294(): scala.Int = { /* compiled code */ }
+ def foo1295(): scala.Int = { /* compiled code */ }
+ def foo1296(): scala.Int = { /* compiled code */ }
+ def foo1297(): scala.Int = { /* compiled code */ }
+ def foo1298(): scala.Int = { /* compiled code */ }
+ def foo1299(): scala.Int = { /* compiled code */ }
+ def foo1300(): scala.Int = { /* compiled code */ }
+ def foo1301(): scala.Int = { /* compiled code */ }
+ def foo1302(): scala.Int = { /* compiled code */ }
+ def foo1303(): scala.Int = { /* compiled code */ }
+ def foo1304(): scala.Int = { /* compiled code */ }
+ def foo1305(): scala.Int = { /* compiled code */ }
+ def foo1306(): scala.Int = { /* compiled code */ }
+ def foo1307(): scala.Int = { /* compiled code */ }
+ def foo1308(): scala.Int = { /* compiled code */ }
+ def foo1309(): scala.Int = { /* compiled code */ }
+ def foo1310(): scala.Int = { /* compiled code */ }
+ def foo1311(): scala.Int = { /* compiled code */ }
+ def foo1312(): scala.Int = { /* compiled code */ }
+ def foo1313(): scala.Int = { /* compiled code */ }
+ def foo1314(): scala.Int = { /* compiled code */ }
+ def foo1315(): scala.Int = { /* compiled code */ }
+ def foo1316(): scala.Int = { /* compiled code */ }
+ def foo1317(): scala.Int = { /* compiled code */ }
+ def foo1318(): scala.Int = { /* compiled code */ }
+ def foo1319(): scala.Int = { /* compiled code */ }
+ def foo1320(): scala.Int = { /* compiled code */ }
+ def foo1321(): scala.Int = { /* compiled code */ }
+ def foo1322(): scala.Int = { /* compiled code */ }
+ def foo1323(): scala.Int = { /* compiled code */ }
+ def foo1324(): scala.Int = { /* compiled code */ }
+ def foo1325(): scala.Int = { /* compiled code */ }
+ def foo1326(): scala.Int = { /* compiled code */ }
+ def foo1327(): scala.Int = { /* compiled code */ }
+ def foo1328(): scala.Int = { /* compiled code */ }
+ def foo1329(): scala.Int = { /* compiled code */ }
+ def foo1330(): scala.Int = { /* compiled code */ }
+ def foo1331(): scala.Int = { /* compiled code */ }
+ def foo1332(): scala.Int = { /* compiled code */ }
+ def foo1333(): scala.Int = { /* compiled code */ }
+ def foo1334(): scala.Int = { /* compiled code */ }
+ def foo1335(): scala.Int = { /* compiled code */ }
+ def foo1336(): scala.Int = { /* compiled code */ }
+ def foo1337(): scala.Int = { /* compiled code */ }
+ def foo1338(): scala.Int = { /* compiled code */ }
+ def foo1339(): scala.Int = { /* compiled code */ }
+ def foo1340(): scala.Int = { /* compiled code */ }
+ def foo1341(): scala.Int = { /* compiled code */ }
+ def foo1342(): scala.Int = { /* compiled code */ }
+ def foo1343(): scala.Int = { /* compiled code */ }
+ def foo1344(): scala.Int = { /* compiled code */ }
+ def foo1345(): scala.Int = { /* compiled code */ }
+ def foo1346(): scala.Int = { /* compiled code */ }
+ def foo1347(): scala.Int = { /* compiled code */ }
+ def foo1348(): scala.Int = { /* compiled code */ }
+ def foo1349(): scala.Int = { /* compiled code */ }
+ def foo1350(): scala.Int = { /* compiled code */ }
+ def foo1351(): scala.Int = { /* compiled code */ }
+ def foo1352(): scala.Int = { /* compiled code */ }
+ def foo1353(): scala.Int = { /* compiled code */ }
+ def foo1354(): scala.Int = { /* compiled code */ }
+ def foo1355(): scala.Int = { /* compiled code */ }
+ def foo1356(): scala.Int = { /* compiled code */ }
+ def foo1357(): scala.Int = { /* compiled code */ }
+ def foo1358(): scala.Int = { /* compiled code */ }
+ def foo1359(): scala.Int = { /* compiled code */ }
+ def foo1360(): scala.Int = { /* compiled code */ }
+ def foo1361(): scala.Int = { /* compiled code */ }
+ def foo1362(): scala.Int = { /* compiled code */ }
+ def foo1363(): scala.Int = { /* compiled code */ }
+ def foo1364(): scala.Int = { /* compiled code */ }
+ def foo1365(): scala.Int = { /* compiled code */ }
+ def foo1366(): scala.Int = { /* compiled code */ }
+ def foo1367(): scala.Int = { /* compiled code */ }
+ def foo1368(): scala.Int = { /* compiled code */ }
+ def foo1369(): scala.Int = { /* compiled code */ }
+ def foo1370(): scala.Int = { /* compiled code */ }
+ def foo1371(): scala.Int = { /* compiled code */ }
+ def foo1372(): scala.Int = { /* compiled code */ }
+ def foo1373(): scala.Int = { /* compiled code */ }
+ def foo1374(): scala.Int = { /* compiled code */ }
+ def foo1375(): scala.Int = { /* compiled code */ }
+ def foo1376(): scala.Int = { /* compiled code */ }
+ def foo1377(): scala.Int = { /* compiled code */ }
+ def foo1378(): scala.Int = { /* compiled code */ }
+ def foo1379(): scala.Int = { /* compiled code */ }
+ def foo1380(): scala.Int = { /* compiled code */ }
+ def foo1381(): scala.Int = { /* compiled code */ }
+ def foo1382(): scala.Int = { /* compiled code */ }
+ def foo1383(): scala.Int = { /* compiled code */ }
+ def foo1384(): scala.Int = { /* compiled code */ }
+ def foo1385(): scala.Int = { /* compiled code */ }
+ def foo1386(): scala.Int = { /* compiled code */ }
+ def foo1387(): scala.Int = { /* compiled code */ }
+ def foo1388(): scala.Int = { /* compiled code */ }
+ def foo1389(): scala.Int = { /* compiled code */ }
+ def foo1390(): scala.Int = { /* compiled code */ }
+ def foo1391(): scala.Int = { /* compiled code */ }
+ def foo1392(): scala.Int = { /* compiled code */ }
+ def foo1393(): scala.Int = { /* compiled code */ }
+ def foo1394(): scala.Int = { /* compiled code */ }
+ def foo1395(): scala.Int = { /* compiled code */ }
+ def foo1396(): scala.Int = { /* compiled code */ }
+ def foo1397(): scala.Int = { /* compiled code */ }
+ def foo1398(): scala.Int = { /* compiled code */ }
+ def foo1399(): scala.Int = { /* compiled code */ }
+ def foo1400(): scala.Int = { /* compiled code */ }
+ def foo1401(): scala.Int = { /* compiled code */ }
+ def foo1402(): scala.Int = { /* compiled code */ }
+ def foo1403(): scala.Int = { /* compiled code */ }
+ def foo1404(): scala.Int = { /* compiled code */ }
+ def foo1405(): scala.Int = { /* compiled code */ }
+ def foo1406(): scala.Int = { /* compiled code */ }
+ def foo1407(): scala.Int = { /* compiled code */ }
+ def foo1408(): scala.Int = { /* compiled code */ }
+ def foo1409(): scala.Int = { /* compiled code */ }
+ def foo1410(): scala.Int = { /* compiled code */ }
+ def foo1411(): scala.Int = { /* compiled code */ }
+ def foo1412(): scala.Int = { /* compiled code */ }
+ def foo1413(): scala.Int = { /* compiled code */ }
+ def foo1414(): scala.Int = { /* compiled code */ }
+ def foo1415(): scala.Int = { /* compiled code */ }
+ def foo1416(): scala.Int = { /* compiled code */ }
+ def foo1417(): scala.Int = { /* compiled code */ }
+ def foo1418(): scala.Int = { /* compiled code */ }
+ def foo1419(): scala.Int = { /* compiled code */ }
+ def foo1420(): scala.Int = { /* compiled code */ }
+ def foo1421(): scala.Int = { /* compiled code */ }
+ def foo1422(): scala.Int = { /* compiled code */ }
+ def foo1423(): scala.Int = { /* compiled code */ }
+ def foo1424(): scala.Int = { /* compiled code */ }
+ def foo1425(): scala.Int = { /* compiled code */ }
+ def foo1426(): scala.Int = { /* compiled code */ }
+ def foo1427(): scala.Int = { /* compiled code */ }
+ def foo1428(): scala.Int = { /* compiled code */ }
+ def foo1429(): scala.Int = { /* compiled code */ }
+ def foo1430(): scala.Int = { /* compiled code */ }
+ def foo1431(): scala.Int = { /* compiled code */ }
+ def foo1432(): scala.Int = { /* compiled code */ }
+ def foo1433(): scala.Int = { /* compiled code */ }
+ def foo1434(): scala.Int = { /* compiled code */ }
+ def foo1435(): scala.Int = { /* compiled code */ }
+ def foo1436(): scala.Int = { /* compiled code */ }
+ def foo1437(): scala.Int = { /* compiled code */ }
+ def foo1438(): scala.Int = { /* compiled code */ }
+ def foo1439(): scala.Int = { /* compiled code */ }
+ def foo1440(): scala.Int = { /* compiled code */ }
+ def foo1441(): scala.Int = { /* compiled code */ }
+ def foo1442(): scala.Int = { /* compiled code */ }
+ def foo1443(): scala.Int = { /* compiled code */ }
+ def foo1444(): scala.Int = { /* compiled code */ }
+ def foo1445(): scala.Int = { /* compiled code */ }
+ def foo1446(): scala.Int = { /* compiled code */ }
+ def foo1447(): scala.Int = { /* compiled code */ }
+ def foo1448(): scala.Int = { /* compiled code */ }
+ def foo1449(): scala.Int = { /* compiled code */ }
+ def foo1450(): scala.Int = { /* compiled code */ }
+ def foo1451(): scala.Int = { /* compiled code */ }
+ def foo1452(): scala.Int = { /* compiled code */ }
+ def foo1453(): scala.Int = { /* compiled code */ }
+ def foo1454(): scala.Int = { /* compiled code */ }
+ def foo1455(): scala.Int = { /* compiled code */ }
+ def foo1456(): scala.Int = { /* compiled code */ }
+ def foo1457(): scala.Int = { /* compiled code */ }
+ def foo1458(): scala.Int = { /* compiled code */ }
+ def foo1459(): scala.Int = { /* compiled code */ }
+ def foo1460(): scala.Int = { /* compiled code */ }
+ def foo1461(): scala.Int = { /* compiled code */ }
+ def foo1462(): scala.Int = { /* compiled code */ }
+ def foo1463(): scala.Int = { /* compiled code */ }
+ def foo1464(): scala.Int = { /* compiled code */ }
+ def foo1465(): scala.Int = { /* compiled code */ }
+ def foo1466(): scala.Int = { /* compiled code */ }
+ def foo1467(): scala.Int = { /* compiled code */ }
+ def foo1468(): scala.Int = { /* compiled code */ }
+ def foo1469(): scala.Int = { /* compiled code */ }
+ def foo1470(): scala.Int = { /* compiled code */ }
+ def foo1471(): scala.Int = { /* compiled code */ }
+ def foo1472(): scala.Int = { /* compiled code */ }
+ def foo1473(): scala.Int = { /* compiled code */ }
+ def foo1474(): scala.Int = { /* compiled code */ }
+ def foo1475(): scala.Int = { /* compiled code */ }
+ def foo1476(): scala.Int = { /* compiled code */ }
+ def foo1477(): scala.Int = { /* compiled code */ }
+ def foo1478(): scala.Int = { /* compiled code */ }
+ def foo1479(): scala.Int = { /* compiled code */ }
+ def foo1480(): scala.Int = { /* compiled code */ }
+ def foo1481(): scala.Int = { /* compiled code */ }
+ def foo1482(): scala.Int = { /* compiled code */ }
+ def foo1483(): scala.Int = { /* compiled code */ }
+ def foo1484(): scala.Int = { /* compiled code */ }
+ def foo1485(): scala.Int = { /* compiled code */ }
+ def foo1486(): scala.Int = { /* compiled code */ }
+ def foo1487(): scala.Int = { /* compiled code */ }
+ def foo1488(): scala.Int = { /* compiled code */ }
+ def foo1489(): scala.Int = { /* compiled code */ }
+ def foo1490(): scala.Int = { /* compiled code */ }
+ def foo1491(): scala.Int = { /* compiled code */ }
+ def foo1492(): scala.Int = { /* compiled code */ }
+ def foo1493(): scala.Int = { /* compiled code */ }
+ def foo1494(): scala.Int = { /* compiled code */ }
+ def foo1495(): scala.Int = { /* compiled code */ }
+ def foo1496(): scala.Int = { /* compiled code */ }
+ def foo1497(): scala.Int = { /* compiled code */ }
+ def foo1498(): scala.Int = { /* compiled code */ }
+ def foo1499(): scala.Int = { /* compiled code */ }
+ def foo1500(): scala.Int = { /* compiled code */ }
+ def foo1501(): scala.Int = { /* compiled code */ }
+ def foo1502(): scala.Int = { /* compiled code */ }
+ def foo1503(): scala.Int = { /* compiled code */ }
+ def foo1504(): scala.Int = { /* compiled code */ }
+ def foo1505(): scala.Int = { /* compiled code */ }
+ def foo1506(): scala.Int = { /* compiled code */ }
+ def foo1507(): scala.Int = { /* compiled code */ }
+ def foo1508(): scala.Int = { /* compiled code */ }
+ def foo1509(): scala.Int = { /* compiled code */ }
+ def foo1510(): scala.Int = { /* compiled code */ }
+ def foo1511(): scala.Int = { /* compiled code */ }
+ def foo1512(): scala.Int = { /* compiled code */ }
+ def foo1513(): scala.Int = { /* compiled code */ }
+ def foo1514(): scala.Int = { /* compiled code */ }
+ def foo1515(): scala.Int = { /* compiled code */ }
+ def foo1516(): scala.Int = { /* compiled code */ }
+ def foo1517(): scala.Int = { /* compiled code */ }
+ def foo1518(): scala.Int = { /* compiled code */ }
+ def foo1519(): scala.Int = { /* compiled code */ }
+ def foo1520(): scala.Int = { /* compiled code */ }
+ def foo1521(): scala.Int = { /* compiled code */ }
+ def foo1522(): scala.Int = { /* compiled code */ }
+ def foo1523(): scala.Int = { /* compiled code */ }
+ def foo1524(): scala.Int = { /* compiled code */ }
+ def foo1525(): scala.Int = { /* compiled code */ }
+ def foo1526(): scala.Int = { /* compiled code */ }
+ def foo1527(): scala.Int = { /* compiled code */ }
+ def foo1528(): scala.Int = { /* compiled code */ }
+ def foo1529(): scala.Int = { /* compiled code */ }
+ def foo1530(): scala.Int = { /* compiled code */ }
+ def foo1531(): scala.Int = { /* compiled code */ }
+ def foo1532(): scala.Int = { /* compiled code */ }
+ def foo1533(): scala.Int = { /* compiled code */ }
+ def foo1534(): scala.Int = { /* compiled code */ }
+ def foo1535(): scala.Int = { /* compiled code */ }
+ def foo1536(): scala.Int = { /* compiled code */ }
+ def foo1537(): scala.Int = { /* compiled code */ }
+ def foo1538(): scala.Int = { /* compiled code */ }
+ def foo1539(): scala.Int = { /* compiled code */ }
+ def foo1540(): scala.Int = { /* compiled code */ }
+ def foo1541(): scala.Int = { /* compiled code */ }
+ def foo1542(): scala.Int = { /* compiled code */ }
+ def foo1543(): scala.Int = { /* compiled code */ }
+ def foo1544(): scala.Int = { /* compiled code */ }
+ def foo1545(): scala.Int = { /* compiled code */ }
+ def foo1546(): scala.Int = { /* compiled code */ }
+ def foo1547(): scala.Int = { /* compiled code */ }
+ def foo1548(): scala.Int = { /* compiled code */ }
+ def foo1549(): scala.Int = { /* compiled code */ }
+ def foo1550(): scala.Int = { /* compiled code */ }
+ def foo1551(): scala.Int = { /* compiled code */ }
+ def foo1552(): scala.Int = { /* compiled code */ }
+ def foo1553(): scala.Int = { /* compiled code */ }
+ def foo1554(): scala.Int = { /* compiled code */ }
+ def foo1555(): scala.Int = { /* compiled code */ }
+ def foo1556(): scala.Int = { /* compiled code */ }
+ def foo1557(): scala.Int = { /* compiled code */ }
+ def foo1558(): scala.Int = { /* compiled code */ }
+ def foo1559(): scala.Int = { /* compiled code */ }
+ def foo1560(): scala.Int = { /* compiled code */ }
+ def foo1561(): scala.Int = { /* compiled code */ }
+ def foo1562(): scala.Int = { /* compiled code */ }
+ def foo1563(): scala.Int = { /* compiled code */ }
+ def foo1564(): scala.Int = { /* compiled code */ }
+ def foo1565(): scala.Int = { /* compiled code */ }
+ def foo1566(): scala.Int = { /* compiled code */ }
+ def foo1567(): scala.Int = { /* compiled code */ }
+ def foo1568(): scala.Int = { /* compiled code */ }
+ def foo1569(): scala.Int = { /* compiled code */ }
+ def foo1570(): scala.Int = { /* compiled code */ }
+ def foo1571(): scala.Int = { /* compiled code */ }
+ def foo1572(): scala.Int = { /* compiled code */ }
+ def foo1573(): scala.Int = { /* compiled code */ }
+ def foo1574(): scala.Int = { /* compiled code */ }
+ def foo1575(): scala.Int = { /* compiled code */ }
+ def foo1576(): scala.Int = { /* compiled code */ }
+ def foo1577(): scala.Int = { /* compiled code */ }
+ def foo1578(): scala.Int = { /* compiled code */ }
+ def foo1579(): scala.Int = { /* compiled code */ }
+ def foo1580(): scala.Int = { /* compiled code */ }
+ def foo1581(): scala.Int = { /* compiled code */ }
+ def foo1582(): scala.Int = { /* compiled code */ }
+ def foo1583(): scala.Int = { /* compiled code */ }
+ def foo1584(): scala.Int = { /* compiled code */ }
+ def foo1585(): scala.Int = { /* compiled code */ }
+ def foo1586(): scala.Int = { /* compiled code */ }
+ def foo1587(): scala.Int = { /* compiled code */ }
+ def foo1588(): scala.Int = { /* compiled code */ }
+ def foo1589(): scala.Int = { /* compiled code */ }
+ def foo1590(): scala.Int = { /* compiled code */ }
+ def foo1591(): scala.Int = { /* compiled code */ }
+ def foo1592(): scala.Int = { /* compiled code */ }
+ def foo1593(): scala.Int = { /* compiled code */ }
+ def foo1594(): scala.Int = { /* compiled code */ }
+ def foo1595(): scala.Int = { /* compiled code */ }
+ def foo1596(): scala.Int = { /* compiled code */ }
+ def foo1597(): scala.Int = { /* compiled code */ }
+ def foo1598(): scala.Int = { /* compiled code */ }
+ def foo1599(): scala.Int = { /* compiled code */ }
+ def foo1600(): scala.Int = { /* compiled code */ }
+ def foo1601(): scala.Int = { /* compiled code */ }
+ def foo1602(): scala.Int = { /* compiled code */ }
+ def foo1603(): scala.Int = { /* compiled code */ }
+ def foo1604(): scala.Int = { /* compiled code */ }
+ def foo1605(): scala.Int = { /* compiled code */ }
+ def foo1606(): scala.Int = { /* compiled code */ }
+ def foo1607(): scala.Int = { /* compiled code */ }
+ def foo1608(): scala.Int = { /* compiled code */ }
+ def foo1609(): scala.Int = { /* compiled code */ }
+ def foo1610(): scala.Int = { /* compiled code */ }
+ def foo1611(): scala.Int = { /* compiled code */ }
+ def foo1612(): scala.Int = { /* compiled code */ }
+ def foo1613(): scala.Int = { /* compiled code */ }
+ def foo1614(): scala.Int = { /* compiled code */ }
+ def foo1615(): scala.Int = { /* compiled code */ }
+ def foo1616(): scala.Int = { /* compiled code */ }
+ def foo1617(): scala.Int = { /* compiled code */ }
+ def foo1618(): scala.Int = { /* compiled code */ }
+ def foo1619(): scala.Int = { /* compiled code */ }
+ def foo1620(): scala.Int = { /* compiled code */ }
+ def foo1621(): scala.Int = { /* compiled code */ }
+ def foo1622(): scala.Int = { /* compiled code */ }
+ def foo1623(): scala.Int = { /* compiled code */ }
+ def foo1624(): scala.Int = { /* compiled code */ }
+ def foo1625(): scala.Int = { /* compiled code */ }
+ def foo1626(): scala.Int = { /* compiled code */ }
+ def foo1627(): scala.Int = { /* compiled code */ }
+ def foo1628(): scala.Int = { /* compiled code */ }
+ def foo1629(): scala.Int = { /* compiled code */ }
+ def foo1630(): scala.Int = { /* compiled code */ }
+ def foo1631(): scala.Int = { /* compiled code */ }
+ def foo1632(): scala.Int = { /* compiled code */ }
+ def foo1633(): scala.Int = { /* compiled code */ }
+ def foo1634(): scala.Int = { /* compiled code */ }
+ def foo1635(): scala.Int = { /* compiled code */ }
+ def foo1636(): scala.Int = { /* compiled code */ }
+ def foo1637(): scala.Int = { /* compiled code */ }
+ def foo1638(): scala.Int = { /* compiled code */ }
+ def foo1639(): scala.Int = { /* compiled code */ }
+ def foo1640(): scala.Int = { /* compiled code */ }
+ def foo1641(): scala.Int = { /* compiled code */ }
+ def foo1642(): scala.Int = { /* compiled code */ }
+ def foo1643(): scala.Int = { /* compiled code */ }
+ def foo1644(): scala.Int = { /* compiled code */ }
+ def foo1645(): scala.Int = { /* compiled code */ }
+ def foo1646(): scala.Int = { /* compiled code */ }
+ def foo1647(): scala.Int = { /* compiled code */ }
+ def foo1648(): scala.Int = { /* compiled code */ }
+ def foo1649(): scala.Int = { /* compiled code */ }
+ def foo1650(): scala.Int = { /* compiled code */ }
+ def foo1651(): scala.Int = { /* compiled code */ }
+ def foo1652(): scala.Int = { /* compiled code */ }
+ def foo1653(): scala.Int = { /* compiled code */ }
+ def foo1654(): scala.Int = { /* compiled code */ }
+ def foo1655(): scala.Int = { /* compiled code */ }
+ def foo1656(): scala.Int = { /* compiled code */ }
+ def foo1657(): scala.Int = { /* compiled code */ }
+ def foo1658(): scala.Int = { /* compiled code */ }
+ def foo1659(): scala.Int = { /* compiled code */ }
+ def foo1660(): scala.Int = { /* compiled code */ }
+ def foo1661(): scala.Int = { /* compiled code */ }
+ def foo1662(): scala.Int = { /* compiled code */ }
+ def foo1663(): scala.Int = { /* compiled code */ }
+ def foo1664(): scala.Int = { /* compiled code */ }
+ def foo1665(): scala.Int = { /* compiled code */ }
+ def foo1666(): scala.Int = { /* compiled code */ }
+ def foo1667(): scala.Int = { /* compiled code */ }
+ def foo1668(): scala.Int = { /* compiled code */ }
+ def foo1669(): scala.Int = { /* compiled code */ }
+ def foo1670(): scala.Int = { /* compiled code */ }
+ def foo1671(): scala.Int = { /* compiled code */ }
+ def foo1672(): scala.Int = { /* compiled code */ }
+ def foo1673(): scala.Int = { /* compiled code */ }
+ def foo1674(): scala.Int = { /* compiled code */ }
+ def foo1675(): scala.Int = { /* compiled code */ }
+ def foo1676(): scala.Int = { /* compiled code */ }
+ def foo1677(): scala.Int = { /* compiled code */ }
+ def foo1678(): scala.Int = { /* compiled code */ }
+ def foo1679(): scala.Int = { /* compiled code */ }
+ def foo1680(): scala.Int = { /* compiled code */ }
+ def foo1681(): scala.Int = { /* compiled code */ }
+ def foo1682(): scala.Int = { /* compiled code */ }
+ def foo1683(): scala.Int = { /* compiled code */ }
+ def foo1684(): scala.Int = { /* compiled code */ }
+ def foo1685(): scala.Int = { /* compiled code */ }
+ def foo1686(): scala.Int = { /* compiled code */ }
+ def foo1687(): scala.Int = { /* compiled code */ }
+ def foo1688(): scala.Int = { /* compiled code */ }
+ def foo1689(): scala.Int = { /* compiled code */ }
+ def foo1690(): scala.Int = { /* compiled code */ }
+ def foo1691(): scala.Int = { /* compiled code */ }
+ def foo1692(): scala.Int = { /* compiled code */ }
+ def foo1693(): scala.Int = { /* compiled code */ }
+ def foo1694(): scala.Int = { /* compiled code */ }
+ def foo1695(): scala.Int = { /* compiled code */ }
+ def foo1696(): scala.Int = { /* compiled code */ }
+ def foo1697(): scala.Int = { /* compiled code */ }
+ def foo1698(): scala.Int = { /* compiled code */ }
+ def foo1699(): scala.Int = { /* compiled code */ }
+ def foo1700(): scala.Int = { /* compiled code */ }
+ def foo1701(): scala.Int = { /* compiled code */ }
+ def foo1702(): scala.Int = { /* compiled code */ }
+ def foo1703(): scala.Int = { /* compiled code */ }
+ def foo1704(): scala.Int = { /* compiled code */ }
+ def foo1705(): scala.Int = { /* compiled code */ }
+ def foo1706(): scala.Int = { /* compiled code */ }
+ def foo1707(): scala.Int = { /* compiled code */ }
+ def foo1708(): scala.Int = { /* compiled code */ }
+ def foo1709(): scala.Int = { /* compiled code */ }
+ def foo1710(): scala.Int = { /* compiled code */ }
+ def foo1711(): scala.Int = { /* compiled code */ }
+ def foo1712(): scala.Int = { /* compiled code */ }
+ def foo1713(): scala.Int = { /* compiled code */ }
+ def foo1714(): scala.Int = { /* compiled code */ }
+ def foo1715(): scala.Int = { /* compiled code */ }
+ def foo1716(): scala.Int = { /* compiled code */ }
+ def foo1717(): scala.Int = { /* compiled code */ }
+ def foo1718(): scala.Int = { /* compiled code */ }
+ def foo1719(): scala.Int = { /* compiled code */ }
+ def foo1720(): scala.Int = { /* compiled code */ }
+ def foo1721(): scala.Int = { /* compiled code */ }
+ def foo1722(): scala.Int = { /* compiled code */ }
+ def foo1723(): scala.Int = { /* compiled code */ }
+ def foo1724(): scala.Int = { /* compiled code */ }
+ def foo1725(): scala.Int = { /* compiled code */ }
+ def foo1726(): scala.Int = { /* compiled code */ }
+ def foo1727(): scala.Int = { /* compiled code */ }
+ def foo1728(): scala.Int = { /* compiled code */ }
+ def foo1729(): scala.Int = { /* compiled code */ }
+ def foo1730(): scala.Int = { /* compiled code */ }
+ def foo1731(): scala.Int = { /* compiled code */ }
+ def foo1732(): scala.Int = { /* compiled code */ }
+ def foo1733(): scala.Int = { /* compiled code */ }
+ def foo1734(): scala.Int = { /* compiled code */ }
+ def foo1735(): scala.Int = { /* compiled code */ }
+ def foo1736(): scala.Int = { /* compiled code */ }
+ def foo1737(): scala.Int = { /* compiled code */ }
+ def foo1738(): scala.Int = { /* compiled code */ }
+ def foo1739(): scala.Int = { /* compiled code */ }
+ def foo1740(): scala.Int = { /* compiled code */ }
+ def foo1741(): scala.Int = { /* compiled code */ }
+ def foo1742(): scala.Int = { /* compiled code */ }
+ def foo1743(): scala.Int = { /* compiled code */ }
+ def foo1744(): scala.Int = { /* compiled code */ }
+ def foo1745(): scala.Int = { /* compiled code */ }
+ def foo1746(): scala.Int = { /* compiled code */ }
+ def foo1747(): scala.Int = { /* compiled code */ }
+ def foo1748(): scala.Int = { /* compiled code */ }
+ def foo1749(): scala.Int = { /* compiled code */ }
+ def foo1750(): scala.Int = { /* compiled code */ }
+ def foo1751(): scala.Int = { /* compiled code */ }
+ def foo1752(): scala.Int = { /* compiled code */ }
+ def foo1753(): scala.Int = { /* compiled code */ }
+ def foo1754(): scala.Int = { /* compiled code */ }
+ def foo1755(): scala.Int = { /* compiled code */ }
+ def foo1756(): scala.Int = { /* compiled code */ }
+ def foo1757(): scala.Int = { /* compiled code */ }
+ def foo1758(): scala.Int = { /* compiled code */ }
+ def foo1759(): scala.Int = { /* compiled code */ }
+ def foo1760(): scala.Int = { /* compiled code */ }
+ def foo1761(): scala.Int = { /* compiled code */ }
+ def foo1762(): scala.Int = { /* compiled code */ }
+ def foo1763(): scala.Int = { /* compiled code */ }
+ def foo1764(): scala.Int = { /* compiled code */ }
+ def foo1765(): scala.Int = { /* compiled code */ }
+ def foo1766(): scala.Int = { /* compiled code */ }
+ def foo1767(): scala.Int = { /* compiled code */ }
+ def foo1768(): scala.Int = { /* compiled code */ }
+ def foo1769(): scala.Int = { /* compiled code */ }
+ def foo1770(): scala.Int = { /* compiled code */ }
+ def foo1771(): scala.Int = { /* compiled code */ }
+ def foo1772(): scala.Int = { /* compiled code */ }
+ def foo1773(): scala.Int = { /* compiled code */ }
+ def foo1774(): scala.Int = { /* compiled code */ }
+ def foo1775(): scala.Int = { /* compiled code */ }
+ def foo1776(): scala.Int = { /* compiled code */ }
+ def foo1777(): scala.Int = { /* compiled code */ }
+ def foo1778(): scala.Int = { /* compiled code */ }
+ def foo1779(): scala.Int = { /* compiled code */ }
+ def foo1780(): scala.Int = { /* compiled code */ }
+ def foo1781(): scala.Int = { /* compiled code */ }
+ def foo1782(): scala.Int = { /* compiled code */ }
+ def foo1783(): scala.Int = { /* compiled code */ }
+ def foo1784(): scala.Int = { /* compiled code */ }
+ def foo1785(): scala.Int = { /* compiled code */ }
+ def foo1786(): scala.Int = { /* compiled code */ }
+ def foo1787(): scala.Int = { /* compiled code */ }
+ def foo1788(): scala.Int = { /* compiled code */ }
+ def foo1789(): scala.Int = { /* compiled code */ }
+ def foo1790(): scala.Int = { /* compiled code */ }
+ def foo1791(): scala.Int = { /* compiled code */ }
+ def foo1792(): scala.Int = { /* compiled code */ }
+ def foo1793(): scala.Int = { /* compiled code */ }
+ def foo1794(): scala.Int = { /* compiled code */ }
+ def foo1795(): scala.Int = { /* compiled code */ }
+ def foo1796(): scala.Int = { /* compiled code */ }
+ def foo1797(): scala.Int = { /* compiled code */ }
+ def foo1798(): scala.Int = { /* compiled code */ }
+ def foo1799(): scala.Int = { /* compiled code */ }
+ def foo1800(): scala.Int = { /* compiled code */ }
+ def foo1801(): scala.Int = { /* compiled code */ }
+ def foo1802(): scala.Int = { /* compiled code */ }
+ def foo1803(): scala.Int = { /* compiled code */ }
+ def foo1804(): scala.Int = { /* compiled code */ }
+ def foo1805(): scala.Int = { /* compiled code */ }
+ def foo1806(): scala.Int = { /* compiled code */ }
+ def foo1807(): scala.Int = { /* compiled code */ }
+ def foo1808(): scala.Int = { /* compiled code */ }
+ def foo1809(): scala.Int = { /* compiled code */ }
+ def foo1810(): scala.Int = { /* compiled code */ }
+ def foo1811(): scala.Int = { /* compiled code */ }
+ def foo1812(): scala.Int = { /* compiled code */ }
+ def foo1813(): scala.Int = { /* compiled code */ }
+ def foo1814(): scala.Int = { /* compiled code */ }
+ def foo1815(): scala.Int = { /* compiled code */ }
+ def foo1816(): scala.Int = { /* compiled code */ }
+ def foo1817(): scala.Int = { /* compiled code */ }
+ def foo1818(): scala.Int = { /* compiled code */ }
+ def foo1819(): scala.Int = { /* compiled code */ }
+ def foo1820(): scala.Int = { /* compiled code */ }
+ def foo1821(): scala.Int = { /* compiled code */ }
+ def foo1822(): scala.Int = { /* compiled code */ }
+ def foo1823(): scala.Int = { /* compiled code */ }
+ def foo1824(): scala.Int = { /* compiled code */ }
+ def foo1825(): scala.Int = { /* compiled code */ }
+ def foo1826(): scala.Int = { /* compiled code */ }
+ def foo1827(): scala.Int = { /* compiled code */ }
+ def foo1828(): scala.Int = { /* compiled code */ }
+ def foo1829(): scala.Int = { /* compiled code */ }
+ def foo1830(): scala.Int = { /* compiled code */ }
+ def foo1831(): scala.Int = { /* compiled code */ }
+ def foo1832(): scala.Int = { /* compiled code */ }
+ def foo1833(): scala.Int = { /* compiled code */ }
+ def foo1834(): scala.Int = { /* compiled code */ }
+ def foo1835(): scala.Int = { /* compiled code */ }
+ def foo1836(): scala.Int = { /* compiled code */ }
+ def foo1837(): scala.Int = { /* compiled code */ }
+ def foo1838(): scala.Int = { /* compiled code */ }
+ def foo1839(): scala.Int = { /* compiled code */ }
+ def foo1840(): scala.Int = { /* compiled code */ }
+ def foo1841(): scala.Int = { /* compiled code */ }
+ def foo1842(): scala.Int = { /* compiled code */ }
+ def foo1843(): scala.Int = { /* compiled code */ }
+ def foo1844(): scala.Int = { /* compiled code */ }
+ def foo1845(): scala.Int = { /* compiled code */ }
+ def foo1846(): scala.Int = { /* compiled code */ }
+ def foo1847(): scala.Int = { /* compiled code */ }
+ def foo1848(): scala.Int = { /* compiled code */ }
+ def foo1849(): scala.Int = { /* compiled code */ }
+ def foo1850(): scala.Int = { /* compiled code */ }
+ def foo1851(): scala.Int = { /* compiled code */ }
+ def foo1852(): scala.Int = { /* compiled code */ }
+ def foo1853(): scala.Int = { /* compiled code */ }
+ def foo1854(): scala.Int = { /* compiled code */ }
+ def foo1855(): scala.Int = { /* compiled code */ }
+ def foo1856(): scala.Int = { /* compiled code */ }
+ def foo1857(): scala.Int = { /* compiled code */ }
+ def foo1858(): scala.Int = { /* compiled code */ }
+ def foo1859(): scala.Int = { /* compiled code */ }
+ def foo1860(): scala.Int = { /* compiled code */ }
+ def foo1861(): scala.Int = { /* compiled code */ }
+ def foo1862(): scala.Int = { /* compiled code */ }
+ def foo1863(): scala.Int = { /* compiled code */ }
+ def foo1864(): scala.Int = { /* compiled code */ }
+ def foo1865(): scala.Int = { /* compiled code */ }
+ def foo1866(): scala.Int = { /* compiled code */ }
+ def foo1867(): scala.Int = { /* compiled code */ }
+ def foo1868(): scala.Int = { /* compiled code */ }
+ def foo1869(): scala.Int = { /* compiled code */ }
+ def foo1870(): scala.Int = { /* compiled code */ }
+ def foo1871(): scala.Int = { /* compiled code */ }
+ def foo1872(): scala.Int = { /* compiled code */ }
+ def foo1873(): scala.Int = { /* compiled code */ }
+ def foo1874(): scala.Int = { /* compiled code */ }
+ def foo1875(): scala.Int = { /* compiled code */ }
+ def foo1876(): scala.Int = { /* compiled code */ }
+ def foo1877(): scala.Int = { /* compiled code */ }
+ def foo1878(): scala.Int = { /* compiled code */ }
+ def foo1879(): scala.Int = { /* compiled code */ }
+ def foo1880(): scala.Int = { /* compiled code */ }
+ def foo1881(): scala.Int = { /* compiled code */ }
+ def foo1882(): scala.Int = { /* compiled code */ }
+ def foo1883(): scala.Int = { /* compiled code */ }
+ def foo1884(): scala.Int = { /* compiled code */ }
+ def foo1885(): scala.Int = { /* compiled code */ }
+ def foo1886(): scala.Int = { /* compiled code */ }
+ def foo1887(): scala.Int = { /* compiled code */ }
+ def foo1888(): scala.Int = { /* compiled code */ }
+ def foo1889(): scala.Int = { /* compiled code */ }
+ def foo1890(): scala.Int = { /* compiled code */ }
+ def foo1891(): scala.Int = { /* compiled code */ }
+ def foo1892(): scala.Int = { /* compiled code */ }
+ def foo1893(): scala.Int = { /* compiled code */ }
+ def foo1894(): scala.Int = { /* compiled code */ }
+ def foo1895(): scala.Int = { /* compiled code */ }
+ def foo1896(): scala.Int = { /* compiled code */ }
+ def foo1897(): scala.Int = { /* compiled code */ }
+ def foo1898(): scala.Int = { /* compiled code */ }
+ def foo1899(): scala.Int = { /* compiled code */ }
+ def foo1900(): scala.Int = { /* compiled code */ }
+ def foo1901(): scala.Int = { /* compiled code */ }
+ def foo1902(): scala.Int = { /* compiled code */ }
+ def foo1903(): scala.Int = { /* compiled code */ }
+ def foo1904(): scala.Int = { /* compiled code */ }
+ def foo1905(): scala.Int = { /* compiled code */ }
+ def foo1906(): scala.Int = { /* compiled code */ }
+ def foo1907(): scala.Int = { /* compiled code */ }
+ def foo1908(): scala.Int = { /* compiled code */ }
+ def foo1909(): scala.Int = { /* compiled code */ }
+ def foo1910(): scala.Int = { /* compiled code */ }
+ def foo1911(): scala.Int = { /* compiled code */ }
+ def foo1912(): scala.Int = { /* compiled code */ }
+ def foo1913(): scala.Int = { /* compiled code */ }
+ def foo1914(): scala.Int = { /* compiled code */ }
+ def foo1915(): scala.Int = { /* compiled code */ }
+ def foo1916(): scala.Int = { /* compiled code */ }
+ def foo1917(): scala.Int = { /* compiled code */ }
+ def foo1918(): scala.Int = { /* compiled code */ }
+ def foo1919(): scala.Int = { /* compiled code */ }
+ def foo1920(): scala.Int = { /* compiled code */ }
+ def foo1921(): scala.Int = { /* compiled code */ }
+ def foo1922(): scala.Int = { /* compiled code */ }
+ def foo1923(): scala.Int = { /* compiled code */ }
+ def foo1924(): scala.Int = { /* compiled code */ }
+ def foo1925(): scala.Int = { /* compiled code */ }
+ def foo1926(): scala.Int = { /* compiled code */ }
+ def foo1927(): scala.Int = { /* compiled code */ }
+ def foo1928(): scala.Int = { /* compiled code */ }
+ def foo1929(): scala.Int = { /* compiled code */ }
+ def foo1930(): scala.Int = { /* compiled code */ }
+ def foo1931(): scala.Int = { /* compiled code */ }
+ def foo1932(): scala.Int = { /* compiled code */ }
+ def foo1933(): scala.Int = { /* compiled code */ }
+ def foo1934(): scala.Int = { /* compiled code */ }
+ def foo1935(): scala.Int = { /* compiled code */ }
+ def foo1936(): scala.Int = { /* compiled code */ }
+ def foo1937(): scala.Int = { /* compiled code */ }
+ def foo1938(): scala.Int = { /* compiled code */ }
+ def foo1939(): scala.Int = { /* compiled code */ }
+ def foo1940(): scala.Int = { /* compiled code */ }
+ def foo1941(): scala.Int = { /* compiled code */ }
+ def foo1942(): scala.Int = { /* compiled code */ }
+ def foo1943(): scala.Int = { /* compiled code */ }
+ def foo1944(): scala.Int = { /* compiled code */ }
+ def foo1945(): scala.Int = { /* compiled code */ }
+ def foo1946(): scala.Int = { /* compiled code */ }
+ def foo1947(): scala.Int = { /* compiled code */ }
+ def foo1948(): scala.Int = { /* compiled code */ }
+ def foo1949(): scala.Int = { /* compiled code */ }
+ def foo1950(): scala.Int = { /* compiled code */ }
+ def foo1951(): scala.Int = { /* compiled code */ }
+ def foo1952(): scala.Int = { /* compiled code */ }
+ def foo1953(): scala.Int = { /* compiled code */ }
+ def foo1954(): scala.Int = { /* compiled code */ }
+ def foo1955(): scala.Int = { /* compiled code */ }
+ def foo1956(): scala.Int = { /* compiled code */ }
+ def foo1957(): scala.Int = { /* compiled code */ }
+ def foo1958(): scala.Int = { /* compiled code */ }
+ def foo1959(): scala.Int = { /* compiled code */ }
+ def foo1960(): scala.Int = { /* compiled code */ }
+ def foo1961(): scala.Int = { /* compiled code */ }
+ def foo1962(): scala.Int = { /* compiled code */ }
+ def foo1963(): scala.Int = { /* compiled code */ }
+ def foo1964(): scala.Int = { /* compiled code */ }
+ def foo1965(): scala.Int = { /* compiled code */ }
+ def foo1966(): scala.Int = { /* compiled code */ }
+ def foo1967(): scala.Int = { /* compiled code */ }
+ def foo1968(): scala.Int = { /* compiled code */ }
+ def foo1969(): scala.Int = { /* compiled code */ }
+ def foo1970(): scala.Int = { /* compiled code */ }
+ def foo1971(): scala.Int = { /* compiled code */ }
+ def foo1972(): scala.Int = { /* compiled code */ }
+ def foo1973(): scala.Int = { /* compiled code */ }
+ def foo1974(): scala.Int = { /* compiled code */ }
+ def foo1975(): scala.Int = { /* compiled code */ }
+ def foo1976(): scala.Int = { /* compiled code */ }
+ def foo1977(): scala.Int = { /* compiled code */ }
+ def foo1978(): scala.Int = { /* compiled code */ }
+ def foo1979(): scala.Int = { /* compiled code */ }
+ def foo1980(): scala.Int = { /* compiled code */ }
+ def foo1981(): scala.Int = { /* compiled code */ }
+ def foo1982(): scala.Int = { /* compiled code */ }
+ def foo1983(): scala.Int = { /* compiled code */ }
+ def foo1984(): scala.Int = { /* compiled code */ }
+ def foo1985(): scala.Int = { /* compiled code */ }
+ def foo1986(): scala.Int = { /* compiled code */ }
+ def foo1987(): scala.Int = { /* compiled code */ }
+ def foo1988(): scala.Int = { /* compiled code */ }
+ def foo1989(): scala.Int = { /* compiled code */ }
+ def foo1990(): scala.Int = { /* compiled code */ }
+ def foo1991(): scala.Int = { /* compiled code */ }
+ def foo1992(): scala.Int = { /* compiled code */ }
+ def foo1993(): scala.Int = { /* compiled code */ }
+ def foo1994(): scala.Int = { /* compiled code */ }
+ def foo1995(): scala.Int = { /* compiled code */ }
+ def foo1996(): scala.Int = { /* compiled code */ }
+ def foo1997(): scala.Int = { /* compiled code */ }
+ def foo1998(): scala.Int = { /* compiled code */ }
+ def foo1999(): scala.Int = { /* compiled code */ }
+ def foo2000(): scala.Int = { /* compiled code */ }
+ def foo2001(): scala.Int = { /* compiled code */ }
+ def foo2002(): scala.Int = { /* compiled code */ }
+ def foo2003(): scala.Int = { /* compiled code */ }
+ def foo2004(): scala.Int = { /* compiled code */ }
+ def foo2005(): scala.Int = { /* compiled code */ }
+ def foo2006(): scala.Int = { /* compiled code */ }
+ def foo2007(): scala.Int = { /* compiled code */ }
+ def foo2008(): scala.Int = { /* compiled code */ }
+ def foo2009(): scala.Int = { /* compiled code */ }
+ def foo2010(): scala.Int = { /* compiled code */ }
+ def foo2011(): scala.Int = { /* compiled code */ }
+ def foo2012(): scala.Int = { /* compiled code */ }
+ def foo2013(): scala.Int = { /* compiled code */ }
+ def foo2014(): scala.Int = { /* compiled code */ }
+ def foo2015(): scala.Int = { /* compiled code */ }
+ def foo2016(): scala.Int = { /* compiled code */ }
+ def foo2017(): scala.Int = { /* compiled code */ }
+ def foo2018(): scala.Int = { /* compiled code */ }
+ def foo2019(): scala.Int = { /* compiled code */ }
+ def foo2020(): scala.Int = { /* compiled code */ }
+ def foo2021(): scala.Int = { /* compiled code */ }
+ def foo2022(): scala.Int = { /* compiled code */ }
+ def foo2023(): scala.Int = { /* compiled code */ }
+ def foo2024(): scala.Int = { /* compiled code */ }
+ def foo2025(): scala.Int = { /* compiled code */ }
+ def foo2026(): scala.Int = { /* compiled code */ }
+ def foo2027(): scala.Int = { /* compiled code */ }
+ def foo2028(): scala.Int = { /* compiled code */ }
+ def foo2029(): scala.Int = { /* compiled code */ }
+ def foo2030(): scala.Int = { /* compiled code */ }
+ def foo2031(): scala.Int = { /* compiled code */ }
+ def foo2032(): scala.Int = { /* compiled code */ }
+ def foo2033(): scala.Int = { /* compiled code */ }
+ def foo2034(): scala.Int = { /* compiled code */ }
+ def foo2035(): scala.Int = { /* compiled code */ }
+ def foo2036(): scala.Int = { /* compiled code */ }
+ def foo2037(): scala.Int = { /* compiled code */ }
+ def foo2038(): scala.Int = { /* compiled code */ }
+ def foo2039(): scala.Int = { /* compiled code */ }
+ def foo2040(): scala.Int = { /* compiled code */ }
+ def foo2041(): scala.Int = { /* compiled code */ }
+ def foo2042(): scala.Int = { /* compiled code */ }
+ def foo2043(): scala.Int = { /* compiled code */ }
+ def foo2044(): scala.Int = { /* compiled code */ }
+ def foo2045(): scala.Int = { /* compiled code */ }
+ def foo2046(): scala.Int = { /* compiled code */ }
+ def foo2047(): scala.Int = { /* compiled code */ }
+ def foo2048(): scala.Int = { /* compiled code */ }
+ def foo2049(): scala.Int = { /* compiled code */ }
+ def foo2050(): scala.Int = { /* compiled code */ }
+ def foo2051(): scala.Int = { /* compiled code */ }
+ def foo2052(): scala.Int = { /* compiled code */ }
+ def foo2053(): scala.Int = { /* compiled code */ }
+ def foo2054(): scala.Int = { /* compiled code */ }
+ def foo2055(): scala.Int = { /* compiled code */ }
+ def foo2056(): scala.Int = { /* compiled code */ }
+ def foo2057(): scala.Int = { /* compiled code */ }
+ def foo2058(): scala.Int = { /* compiled code */ }
+ def foo2059(): scala.Int = { /* compiled code */ }
+ def foo2060(): scala.Int = { /* compiled code */ }
+ def foo2061(): scala.Int = { /* compiled code */ }
+ def foo2062(): scala.Int = { /* compiled code */ }
+ def foo2063(): scala.Int = { /* compiled code */ }
+ def foo2064(): scala.Int = { /* compiled code */ }
+ def foo2065(): scala.Int = { /* compiled code */ }
+ def foo2066(): scala.Int = { /* compiled code */ }
+ def foo2067(): scala.Int = { /* compiled code */ }
+ def foo2068(): scala.Int = { /* compiled code */ }
+ def foo2069(): scala.Int = { /* compiled code */ }
+ def foo2070(): scala.Int = { /* compiled code */ }
+ def foo2071(): scala.Int = { /* compiled code */ }
+ def foo2072(): scala.Int = { /* compiled code */ }
+ def foo2073(): scala.Int = { /* compiled code */ }
+ def foo2074(): scala.Int = { /* compiled code */ }
+ def foo2075(): scala.Int = { /* compiled code */ }
+ def foo2076(): scala.Int = { /* compiled code */ }
+ def foo2077(): scala.Int = { /* compiled code */ }
+ def foo2078(): scala.Int = { /* compiled code */ }
+ def foo2079(): scala.Int = { /* compiled code */ }
+ def foo2080(): scala.Int = { /* compiled code */ }
+ def foo2081(): scala.Int = { /* compiled code */ }
+ def foo2082(): scala.Int = { /* compiled code */ }
+ def foo2083(): scala.Int = { /* compiled code */ }
+ def foo2084(): scala.Int = { /* compiled code */ }
+ def foo2085(): scala.Int = { /* compiled code */ }
+ def foo2086(): scala.Int = { /* compiled code */ }
+ def foo2087(): scala.Int = { /* compiled code */ }
+ def foo2088(): scala.Int = { /* compiled code */ }
+ def foo2089(): scala.Int = { /* compiled code */ }
+ def foo2090(): scala.Int = { /* compiled code */ }
+ def foo2091(): scala.Int = { /* compiled code */ }
+ def foo2092(): scala.Int = { /* compiled code */ }
+ def foo2093(): scala.Int = { /* compiled code */ }
+ def foo2094(): scala.Int = { /* compiled code */ }
+ def foo2095(): scala.Int = { /* compiled code */ }
+ def foo2096(): scala.Int = { /* compiled code */ }
+ def foo2097(): scala.Int = { /* compiled code */ }
+ def foo2098(): scala.Int = { /* compiled code */ }
+ def foo2099(): scala.Int = { /* compiled code */ }
+ def foo2100(): scala.Int = { /* compiled code */ }
+ def foo2101(): scala.Int = { /* compiled code */ }
+ def foo2102(): scala.Int = { /* compiled code */ }
+ def foo2103(): scala.Int = { /* compiled code */ }
+ def foo2104(): scala.Int = { /* compiled code */ }
+ def foo2105(): scala.Int = { /* compiled code */ }
+ def foo2106(): scala.Int = { /* compiled code */ }
+ def foo2107(): scala.Int = { /* compiled code */ }
+ def foo2108(): scala.Int = { /* compiled code */ }
+ def foo2109(): scala.Int = { /* compiled code */ }
+ def foo2110(): scala.Int = { /* compiled code */ }
+ def foo2111(): scala.Int = { /* compiled code */ }
+ def foo2112(): scala.Int = { /* compiled code */ }
+ def foo2113(): scala.Int = { /* compiled code */ }
+ def foo2114(): scala.Int = { /* compiled code */ }
+ def foo2115(): scala.Int = { /* compiled code */ }
+ def foo2116(): scala.Int = { /* compiled code */ }
+ def foo2117(): scala.Int = { /* compiled code */ }
+ def foo2118(): scala.Int = { /* compiled code */ }
+ def foo2119(): scala.Int = { /* compiled code */ }
+ def foo2120(): scala.Int = { /* compiled code */ }
+ def foo2121(): scala.Int = { /* compiled code */ }
+ def foo2122(): scala.Int = { /* compiled code */ }
+ def foo2123(): scala.Int = { /* compiled code */ }
+ def foo2124(): scala.Int = { /* compiled code */ }
+ def foo2125(): scala.Int = { /* compiled code */ }
+ def foo2126(): scala.Int = { /* compiled code */ }
+ def foo2127(): scala.Int = { /* compiled code */ }
+ def foo2128(): scala.Int = { /* compiled code */ }
+ def foo2129(): scala.Int = { /* compiled code */ }
+ def foo2130(): scala.Int = { /* compiled code */ }
+ def foo2131(): scala.Int = { /* compiled code */ }
+ def foo2132(): scala.Int = { /* compiled code */ }
+ def foo2133(): scala.Int = { /* compiled code */ }
+ def foo2134(): scala.Int = { /* compiled code */ }
+ def foo2135(): scala.Int = { /* compiled code */ }
+ def foo2136(): scala.Int = { /* compiled code */ }
+ def foo2137(): scala.Int = { /* compiled code */ }
+ def foo2138(): scala.Int = { /* compiled code */ }
+ def foo2139(): scala.Int = { /* compiled code */ }
+ def foo2140(): scala.Int = { /* compiled code */ }
+ def foo2141(): scala.Int = { /* compiled code */ }
+ def foo2142(): scala.Int = { /* compiled code */ }
+ def foo2143(): scala.Int = { /* compiled code */ }
+ def foo2144(): scala.Int = { /* compiled code */ }
+ def foo2145(): scala.Int = { /* compiled code */ }
+ def foo2146(): scala.Int = { /* compiled code */ }
+ def foo2147(): scala.Int = { /* compiled code */ }
+ def foo2148(): scala.Int = { /* compiled code */ }
+ def foo2149(): scala.Int = { /* compiled code */ }
+ def foo2150(): scala.Int = { /* compiled code */ }
+ def foo2151(): scala.Int = { /* compiled code */ }
+ def foo2152(): scala.Int = { /* compiled code */ }
+ def foo2153(): scala.Int = { /* compiled code */ }
+ def foo2154(): scala.Int = { /* compiled code */ }
+ def foo2155(): scala.Int = { /* compiled code */ }
+ def foo2156(): scala.Int = { /* compiled code */ }
+ def foo2157(): scala.Int = { /* compiled code */ }
+ def foo2158(): scala.Int = { /* compiled code */ }
+ def foo2159(): scala.Int = { /* compiled code */ }
+ def foo2160(): scala.Int = { /* compiled code */ }
+ def foo2161(): scala.Int = { /* compiled code */ }
+ def foo2162(): scala.Int = { /* compiled code */ }
+ def foo2163(): scala.Int = { /* compiled code */ }
+ def foo2164(): scala.Int = { /* compiled code */ }
+ def foo2165(): scala.Int = { /* compiled code */ }
+ def foo2166(): scala.Int = { /* compiled code */ }
+ def foo2167(): scala.Int = { /* compiled code */ }
+ def foo2168(): scala.Int = { /* compiled code */ }
+ def foo2169(): scala.Int = { /* compiled code */ }
+ def foo2170(): scala.Int = { /* compiled code */ }
+ def foo2171(): scala.Int = { /* compiled code */ }
+ def foo2172(): scala.Int = { /* compiled code */ }
+ def foo2173(): scala.Int = { /* compiled code */ }
+ def foo2174(): scala.Int = { /* compiled code */ }
+ def foo2175(): scala.Int = { /* compiled code */ }
+ def foo2176(): scala.Int = { /* compiled code */ }
+ def foo2177(): scala.Int = { /* compiled code */ }
+ def foo2178(): scala.Int = { /* compiled code */ }
+ def foo2179(): scala.Int = { /* compiled code */ }
+ def foo2180(): scala.Int = { /* compiled code */ }
+ def foo2181(): scala.Int = { /* compiled code */ }
+ def foo2182(): scala.Int = { /* compiled code */ }
+ def foo2183(): scala.Int = { /* compiled code */ }
+ def foo2184(): scala.Int = { /* compiled code */ }
+ def foo2185(): scala.Int = { /* compiled code */ }
+ def foo2186(): scala.Int = { /* compiled code */ }
+ def foo2187(): scala.Int = { /* compiled code */ }
+ def foo2188(): scala.Int = { /* compiled code */ }
+ def foo2189(): scala.Int = { /* compiled code */ }
+ def foo2190(): scala.Int = { /* compiled code */ }
+ def foo2191(): scala.Int = { /* compiled code */ }
+ def foo2192(): scala.Int = { /* compiled code */ }
+ def foo2193(): scala.Int = { /* compiled code */ }
+ def foo2194(): scala.Int = { /* compiled code */ }
+ def foo2195(): scala.Int = { /* compiled code */ }
+ def foo2196(): scala.Int = { /* compiled code */ }
+ def foo2197(): scala.Int = { /* compiled code */ }
+ def foo2198(): scala.Int = { /* compiled code */ }
+ def foo2199(): scala.Int = { /* compiled code */ }
+ def foo2200(): scala.Int = { /* compiled code */ }
+ def foo2201(): scala.Int = { /* compiled code */ }
+ def foo2202(): scala.Int = { /* compiled code */ }
+ def foo2203(): scala.Int = { /* compiled code */ }
+ def foo2204(): scala.Int = { /* compiled code */ }
+ def foo2205(): scala.Int = { /* compiled code */ }
+ def foo2206(): scala.Int = { /* compiled code */ }
+ def foo2207(): scala.Int = { /* compiled code */ }
+ def foo2208(): scala.Int = { /* compiled code */ }
+ def foo2209(): scala.Int = { /* compiled code */ }
+ def foo2210(): scala.Int = { /* compiled code */ }
+ def foo2211(): scala.Int = { /* compiled code */ }
+ def foo2212(): scala.Int = { /* compiled code */ }
+ def foo2213(): scala.Int = { /* compiled code */ }
+ def foo2214(): scala.Int = { /* compiled code */ }
+ def foo2215(): scala.Int = { /* compiled code */ }
+ def foo2216(): scala.Int = { /* compiled code */ }
+ def foo2217(): scala.Int = { /* compiled code */ }
+ def foo2218(): scala.Int = { /* compiled code */ }
+ def foo2219(): scala.Int = { /* compiled code */ }
+ def foo2220(): scala.Int = { /* compiled code */ }
+ def foo2221(): scala.Int = { /* compiled code */ }
+ def foo2222(): scala.Int = { /* compiled code */ }
+ def foo2223(): scala.Int = { /* compiled code */ }
+ def foo2224(): scala.Int = { /* compiled code */ }
+ def foo2225(): scala.Int = { /* compiled code */ }
+ def foo2226(): scala.Int = { /* compiled code */ }
+ def foo2227(): scala.Int = { /* compiled code */ }
+ def foo2228(): scala.Int = { /* compiled code */ }
+ def foo2229(): scala.Int = { /* compiled code */ }
+ def foo2230(): scala.Int = { /* compiled code */ }
+ def foo2231(): scala.Int = { /* compiled code */ }
+ def foo2232(): scala.Int = { /* compiled code */ }
+ def foo2233(): scala.Int = { /* compiled code */ }
+ def foo2234(): scala.Int = { /* compiled code */ }
+ def foo2235(): scala.Int = { /* compiled code */ }
+ def foo2236(): scala.Int = { /* compiled code */ }
+ def foo2237(): scala.Int = { /* compiled code */ }
+ def foo2238(): scala.Int = { /* compiled code */ }
+ def foo2239(): scala.Int = { /* compiled code */ }
+ def foo2240(): scala.Int = { /* compiled code */ }
+ def foo2241(): scala.Int = { /* compiled code */ }
+ def foo2242(): scala.Int = { /* compiled code */ }
+ def foo2243(): scala.Int = { /* compiled code */ }
+ def foo2244(): scala.Int = { /* compiled code */ }
+ def foo2245(): scala.Int = { /* compiled code */ }
+ def foo2246(): scala.Int = { /* compiled code */ }
+ def foo2247(): scala.Int = { /* compiled code */ }
+ def foo2248(): scala.Int = { /* compiled code */ }
+ def foo2249(): scala.Int = { /* compiled code */ }
+ def foo2250(): scala.Int = { /* compiled code */ }
+ def foo2251(): scala.Int = { /* compiled code */ }
+ def foo2252(): scala.Int = { /* compiled code */ }
+ def foo2253(): scala.Int = { /* compiled code */ }
+ def foo2254(): scala.Int = { /* compiled code */ }
+ def foo2255(): scala.Int = { /* compiled code */ }
+ def foo2256(): scala.Int = { /* compiled code */ }
+ def foo2257(): scala.Int = { /* compiled code */ }
+ def foo2258(): scala.Int = { /* compiled code */ }
+ def foo2259(): scala.Int = { /* compiled code */ }
+ def foo2260(): scala.Int = { /* compiled code */ }
+ def foo2261(): scala.Int = { /* compiled code */ }
+ def foo2262(): scala.Int = { /* compiled code */ }
+ def foo2263(): scala.Int = { /* compiled code */ }
+ def foo2264(): scala.Int = { /* compiled code */ }
+ def foo2265(): scala.Int = { /* compiled code */ }
+ def foo2266(): scala.Int = { /* compiled code */ }
+ def foo2267(): scala.Int = { /* compiled code */ }
+ def foo2268(): scala.Int = { /* compiled code */ }
+ def foo2269(): scala.Int = { /* compiled code */ }
+ def foo2270(): scala.Int = { /* compiled code */ }
+ def foo2271(): scala.Int = { /* compiled code */ }
+ def foo2272(): scala.Int = { /* compiled code */ }
+ def foo2273(): scala.Int = { /* compiled code */ }
+ def foo2274(): scala.Int = { /* compiled code */ }
+ def foo2275(): scala.Int = { /* compiled code */ }
+ def foo2276(): scala.Int = { /* compiled code */ }
+ def foo2277(): scala.Int = { /* compiled code */ }
+ def foo2278(): scala.Int = { /* compiled code */ }
+ def foo2279(): scala.Int = { /* compiled code */ }
+ def foo2280(): scala.Int = { /* compiled code */ }
+ def foo2281(): scala.Int = { /* compiled code */ }
+ def foo2282(): scala.Int = { /* compiled code */ }
+ def foo2283(): scala.Int = { /* compiled code */ }
+ def foo2284(): scala.Int = { /* compiled code */ }
+ def foo2285(): scala.Int = { /* compiled code */ }
+ def foo2286(): scala.Int = { /* compiled code */ }
+ def foo2287(): scala.Int = { /* compiled code */ }
+ def foo2288(): scala.Int = { /* compiled code */ }
+ def foo2289(): scala.Int = { /* compiled code */ }
+ def foo2290(): scala.Int = { /* compiled code */ }
+ def foo2291(): scala.Int = { /* compiled code */ }
+ def foo2292(): scala.Int = { /* compiled code */ }
+ def foo2293(): scala.Int = { /* compiled code */ }
+ def foo2294(): scala.Int = { /* compiled code */ }
+ def foo2295(): scala.Int = { /* compiled code */ }
+ def foo2296(): scala.Int = { /* compiled code */ }
+ def foo2297(): scala.Int = { /* compiled code */ }
+ def foo2298(): scala.Int = { /* compiled code */ }
+ def foo2299(): scala.Int = { /* compiled code */ }
+ def foo2300(): scala.Int = { /* compiled code */ }
+ def foo2301(): scala.Int = { /* compiled code */ }
+ def foo2302(): scala.Int = { /* compiled code */ }
+ def foo2303(): scala.Int = { /* compiled code */ }
+ def foo2304(): scala.Int = { /* compiled code */ }
+ def foo2305(): scala.Int = { /* compiled code */ }
+ def foo2306(): scala.Int = { /* compiled code */ }
+ def foo2307(): scala.Int = { /* compiled code */ }
+ def foo2308(): scala.Int = { /* compiled code */ }
+ def foo2309(): scala.Int = { /* compiled code */ }
+ def foo2310(): scala.Int = { /* compiled code */ }
+ def foo2311(): scala.Int = { /* compiled code */ }
+ def foo2312(): scala.Int = { /* compiled code */ }
+ def foo2313(): scala.Int = { /* compiled code */ }
+ def foo2314(): scala.Int = { /* compiled code */ }
+ def foo2315(): scala.Int = { /* compiled code */ }
+ def foo2316(): scala.Int = { /* compiled code */ }
+ def foo2317(): scala.Int = { /* compiled code */ }
+ def foo2318(): scala.Int = { /* compiled code */ }
+ def foo2319(): scala.Int = { /* compiled code */ }
+ def foo2320(): scala.Int = { /* compiled code */ }
+ def foo2321(): scala.Int = { /* compiled code */ }
+ def foo2322(): scala.Int = { /* compiled code */ }
+ def foo2323(): scala.Int = { /* compiled code */ }
+ def foo2324(): scala.Int = { /* compiled code */ }
+ def foo2325(): scala.Int = { /* compiled code */ }
+ def foo2326(): scala.Int = { /* compiled code */ }
+ def foo2327(): scala.Int = { /* compiled code */ }
+ def foo2328(): scala.Int = { /* compiled code */ }
+ def foo2329(): scala.Int = { /* compiled code */ }
+ def foo2330(): scala.Int = { /* compiled code */ }
+ def foo2331(): scala.Int = { /* compiled code */ }
+ def foo2332(): scala.Int = { /* compiled code */ }
+ def foo2333(): scala.Int = { /* compiled code */ }
+ def foo2334(): scala.Int = { /* compiled code */ }
+ def foo2335(): scala.Int = { /* compiled code */ }
+ def foo2336(): scala.Int = { /* compiled code */ }
+ def foo2337(): scala.Int = { /* compiled code */ }
+ def foo2338(): scala.Int = { /* compiled code */ }
+ def foo2339(): scala.Int = { /* compiled code */ }
+ def foo2340(): scala.Int = { /* compiled code */ }
+ def foo2341(): scala.Int = { /* compiled code */ }
+ def foo2342(): scala.Int = { /* compiled code */ }
+ def foo2343(): scala.Int = { /* compiled code */ }
+ def foo2344(): scala.Int = { /* compiled code */ }
+ def foo2345(): scala.Int = { /* compiled code */ }
+ def foo2346(): scala.Int = { /* compiled code */ }
+ def foo2347(): scala.Int = { /* compiled code */ }
+ def foo2348(): scala.Int = { /* compiled code */ }
+ def foo2349(): scala.Int = { /* compiled code */ }
+ def foo2350(): scala.Int = { /* compiled code */ }
+ def foo2351(): scala.Int = { /* compiled code */ }
+ def foo2352(): scala.Int = { /* compiled code */ }
+ def foo2353(): scala.Int = { /* compiled code */ }
+ def foo2354(): scala.Int = { /* compiled code */ }
+ def foo2355(): scala.Int = { /* compiled code */ }
+ def foo2356(): scala.Int = { /* compiled code */ }
+ def foo2357(): scala.Int = { /* compiled code */ }
+ def foo2358(): scala.Int = { /* compiled code */ }
+ def foo2359(): scala.Int = { /* compiled code */ }
+ def foo2360(): scala.Int = { /* compiled code */ }
+ def foo2361(): scala.Int = { /* compiled code */ }
+ def foo2362(): scala.Int = { /* compiled code */ }
+ def foo2363(): scala.Int = { /* compiled code */ }
+ def foo2364(): scala.Int = { /* compiled code */ }
+ def foo2365(): scala.Int = { /* compiled code */ }
+ def foo2366(): scala.Int = { /* compiled code */ }
+ def foo2367(): scala.Int = { /* compiled code */ }
+ def foo2368(): scala.Int = { /* compiled code */ }
+ def foo2369(): scala.Int = { /* compiled code */ }
+ def foo2370(): scala.Int = { /* compiled code */ }
+ def foo2371(): scala.Int = { /* compiled code */ }
+ def foo2372(): scala.Int = { /* compiled code */ }
+ def foo2373(): scala.Int = { /* compiled code */ }
+ def foo2374(): scala.Int = { /* compiled code */ }
+ def foo2375(): scala.Int = { /* compiled code */ }
+ def foo2376(): scala.Int = { /* compiled code */ }
+ def foo2377(): scala.Int = { /* compiled code */ }
+ def foo2378(): scala.Int = { /* compiled code */ }
+ def foo2379(): scala.Int = { /* compiled code */ }
+ def foo2380(): scala.Int = { /* compiled code */ }
+ def foo2381(): scala.Int = { /* compiled code */ }
+ def foo2382(): scala.Int = { /* compiled code */ }
+ def foo2383(): scala.Int = { /* compiled code */ }
+ def foo2384(): scala.Int = { /* compiled code */ }
+ def foo2385(): scala.Int = { /* compiled code */ }
+ def foo2386(): scala.Int = { /* compiled code */ }
+ def foo2387(): scala.Int = { /* compiled code */ }
+ def foo2388(): scala.Int = { /* compiled code */ }
+ def foo2389(): scala.Int = { /* compiled code */ }
+ def foo2390(): scala.Int = { /* compiled code */ }
+ def foo2391(): scala.Int = { /* compiled code */ }
+ def foo2392(): scala.Int = { /* compiled code */ }
+ def foo2393(): scala.Int = { /* compiled code */ }
+ def foo2394(): scala.Int = { /* compiled code */ }
+ def foo2395(): scala.Int = { /* compiled code */ }
+ def foo2396(): scala.Int = { /* compiled code */ }
+ def foo2397(): scala.Int = { /* compiled code */ }
+ def foo2398(): scala.Int = { /* compiled code */ }
+ def foo2399(): scala.Int = { /* compiled code */ }
+ def foo2400(): scala.Int = { /* compiled code */ }
+ def foo2401(): scala.Int = { /* compiled code */ }
+ def foo2402(): scala.Int = { /* compiled code */ }
+ def foo2403(): scala.Int = { /* compiled code */ }
+ def foo2404(): scala.Int = { /* compiled code */ }
+ def foo2405(): scala.Int = { /* compiled code */ }
+ def foo2406(): scala.Int = { /* compiled code */ }
+ def foo2407(): scala.Int = { /* compiled code */ }
+ def foo2408(): scala.Int = { /* compiled code */ }
+ def foo2409(): scala.Int = { /* compiled code */ }
+ def foo2410(): scala.Int = { /* compiled code */ }
+ def foo2411(): scala.Int = { /* compiled code */ }
+ def foo2412(): scala.Int = { /* compiled code */ }
+ def foo2413(): scala.Int = { /* compiled code */ }
+ def foo2414(): scala.Int = { /* compiled code */ }
+ def foo2415(): scala.Int = { /* compiled code */ }
+ def foo2416(): scala.Int = { /* compiled code */ }
+ def foo2417(): scala.Int = { /* compiled code */ }
+ def foo2418(): scala.Int = { /* compiled code */ }
+ def foo2419(): scala.Int = { /* compiled code */ }
+ def foo2420(): scala.Int = { /* compiled code */ }
+ def foo2421(): scala.Int = { /* compiled code */ }
+ def foo2422(): scala.Int = { /* compiled code */ }
+ def foo2423(): scala.Int = { /* compiled code */ }
+ def foo2424(): scala.Int = { /* compiled code */ }
+ def foo2425(): scala.Int = { /* compiled code */ }
+ def foo2426(): scala.Int = { /* compiled code */ }
+ def foo2427(): scala.Int = { /* compiled code */ }
+ def foo2428(): scala.Int = { /* compiled code */ }
+ def foo2429(): scala.Int = { /* compiled code */ }
+ def foo2430(): scala.Int = { /* compiled code */ }
+ def foo2431(): scala.Int = { /* compiled code */ }
+ def foo2432(): scala.Int = { /* compiled code */ }
+ def foo2433(): scala.Int = { /* compiled code */ }
+ def foo2434(): scala.Int = { /* compiled code */ }
+ def foo2435(): scala.Int = { /* compiled code */ }
+ def foo2436(): scala.Int = { /* compiled code */ }
+ def foo2437(): scala.Int = { /* compiled code */ }
+ def foo2438(): scala.Int = { /* compiled code */ }
+ def foo2439(): scala.Int = { /* compiled code */ }
+ def foo2440(): scala.Int = { /* compiled code */ }
+ def foo2441(): scala.Int = { /* compiled code */ }
+ def foo2442(): scala.Int = { /* compiled code */ }
+ def foo2443(): scala.Int = { /* compiled code */ }
+ def foo2444(): scala.Int = { /* compiled code */ }
+ def foo2445(): scala.Int = { /* compiled code */ }
+ def foo2446(): scala.Int = { /* compiled code */ }
+ def foo2447(): scala.Int = { /* compiled code */ }
+ def foo2448(): scala.Int = { /* compiled code */ }
+ def foo2449(): scala.Int = { /* compiled code */ }
+ def foo2450(): scala.Int = { /* compiled code */ }
+ def foo2451(): scala.Int = { /* compiled code */ }
+ def foo2452(): scala.Int = { /* compiled code */ }
+ def foo2453(): scala.Int = { /* compiled code */ }
+ def foo2454(): scala.Int = { /* compiled code */ }
+ def foo2455(): scala.Int = { /* compiled code */ }
+ def foo2456(): scala.Int = { /* compiled code */ }
+ def foo2457(): scala.Int = { /* compiled code */ }
+ def foo2458(): scala.Int = { /* compiled code */ }
+ def foo2459(): scala.Int = { /* compiled code */ }
+ def foo2460(): scala.Int = { /* compiled code */ }
+ def foo2461(): scala.Int = { /* compiled code */ }
+ def foo2462(): scala.Int = { /* compiled code */ }
+ def foo2463(): scala.Int = { /* compiled code */ }
+ def foo2464(): scala.Int = { /* compiled code */ }
+ def foo2465(): scala.Int = { /* compiled code */ }
+ def foo2466(): scala.Int = { /* compiled code */ }
+ def foo2467(): scala.Int = { /* compiled code */ }
+ def foo2468(): scala.Int = { /* compiled code */ }
+ def foo2469(): scala.Int = { /* compiled code */ }
+ def foo2470(): scala.Int = { /* compiled code */ }
+ def foo2471(): scala.Int = { /* compiled code */ }
+ def foo2472(): scala.Int = { /* compiled code */ }
+ def foo2473(): scala.Int = { /* compiled code */ }
+ def foo2474(): scala.Int = { /* compiled code */ }
+ def foo2475(): scala.Int = { /* compiled code */ }
+ def foo2476(): scala.Int = { /* compiled code */ }
+ def foo2477(): scala.Int = { /* compiled code */ }
+ def foo2478(): scala.Int = { /* compiled code */ }
+ def foo2479(): scala.Int = { /* compiled code */ }
+ def foo2480(): scala.Int = { /* compiled code */ }
+ def foo2481(): scala.Int = { /* compiled code */ }
+ def foo2482(): scala.Int = { /* compiled code */ }
+ def foo2483(): scala.Int = { /* compiled code */ }
+ def foo2484(): scala.Int = { /* compiled code */ }
+ def foo2485(): scala.Int = { /* compiled code */ }
+ def foo2486(): scala.Int = { /* compiled code */ }
+ def foo2487(): scala.Int = { /* compiled code */ }
+ def foo2488(): scala.Int = { /* compiled code */ }
+ def foo2489(): scala.Int = { /* compiled code */ }
+ def foo2490(): scala.Int = { /* compiled code */ }
+ def foo2491(): scala.Int = { /* compiled code */ }
+ def foo2492(): scala.Int = { /* compiled code */ }
+ def foo2493(): scala.Int = { /* compiled code */ }
+ def foo2494(): scala.Int = { /* compiled code */ }
+ def foo2495(): scala.Int = { /* compiled code */ }
+ def foo2496(): scala.Int = { /* compiled code */ }
+ def foo2497(): scala.Int = { /* compiled code */ }
+ def foo2498(): scala.Int = { /* compiled code */ }
+ def foo2499(): scala.Int = { /* compiled code */ }
+ def foo2500(): scala.Int = { /* compiled code */ }
+ def foo2501(): scala.Int = { /* compiled code */ }
+ def foo2502(): scala.Int = { /* compiled code */ }
+ def foo2503(): scala.Int = { /* compiled code */ }
+ def foo2504(): scala.Int = { /* compiled code */ }
+ def foo2505(): scala.Int = { /* compiled code */ }
+ def foo2506(): scala.Int = { /* compiled code */ }
+ def foo2507(): scala.Int = { /* compiled code */ }
+ def foo2508(): scala.Int = { /* compiled code */ }
+ def foo2509(): scala.Int = { /* compiled code */ }
+ def foo2510(): scala.Int = { /* compiled code */ }
+ def foo2511(): scala.Int = { /* compiled code */ }
+ def foo2512(): scala.Int = { /* compiled code */ }
+ def foo2513(): scala.Int = { /* compiled code */ }
+ def foo2514(): scala.Int = { /* compiled code */ }
+ def foo2515(): scala.Int = { /* compiled code */ }
+ def foo2516(): scala.Int = { /* compiled code */ }
+ def foo2517(): scala.Int = { /* compiled code */ }
+ def foo2518(): scala.Int = { /* compiled code */ }
+ def foo2519(): scala.Int = { /* compiled code */ }
+ def foo2520(): scala.Int = { /* compiled code */ }
+ def foo2521(): scala.Int = { /* compiled code */ }
+ def foo2522(): scala.Int = { /* compiled code */ }
+ def foo2523(): scala.Int = { /* compiled code */ }
+ def foo2524(): scala.Int = { /* compiled code */ }
+ def foo2525(): scala.Int = { /* compiled code */ }
+ def foo2526(): scala.Int = { /* compiled code */ }
+ def foo2527(): scala.Int = { /* compiled code */ }
+ def foo2528(): scala.Int = { /* compiled code */ }
+ def foo2529(): scala.Int = { /* compiled code */ }
+ def foo2530(): scala.Int = { /* compiled code */ }
+ def foo2531(): scala.Int = { /* compiled code */ }
+ def foo2532(): scala.Int = { /* compiled code */ }
+ def foo2533(): scala.Int = { /* compiled code */ }
+ def foo2534(): scala.Int = { /* compiled code */ }
+ def foo2535(): scala.Int = { /* compiled code */ }
+ def foo2536(): scala.Int = { /* compiled code */ }
+ def foo2537(): scala.Int = { /* compiled code */ }
+ def foo2538(): scala.Int = { /* compiled code */ }
+ def foo2539(): scala.Int = { /* compiled code */ }
+ def foo2540(): scala.Int = { /* compiled code */ }
+ def foo2541(): scala.Int = { /* compiled code */ }
+ def foo2542(): scala.Int = { /* compiled code */ }
+ def foo2543(): scala.Int = { /* compiled code */ }
+ def foo2544(): scala.Int = { /* compiled code */ }
+ def foo2545(): scala.Int = { /* compiled code */ }
+ def foo2546(): scala.Int = { /* compiled code */ }
+ def foo2547(): scala.Int = { /* compiled code */ }
+ def foo2548(): scala.Int = { /* compiled code */ }
+ def foo2549(): scala.Int = { /* compiled code */ }
+ def foo2550(): scala.Int = { /* compiled code */ }
+ def foo2551(): scala.Int = { /* compiled code */ }
+ def foo2552(): scala.Int = { /* compiled code */ }
+ def foo2553(): scala.Int = { /* compiled code */ }
+ def foo2554(): scala.Int = { /* compiled code */ }
+ def foo2555(): scala.Int = { /* compiled code */ }
+ def foo2556(): scala.Int = { /* compiled code */ }
+ def foo2557(): scala.Int = { /* compiled code */ }
+ def foo2558(): scala.Int = { /* compiled code */ }
+ def foo2559(): scala.Int = { /* compiled code */ }
+ def foo2560(): scala.Int = { /* compiled code */ }
+ def foo2561(): scala.Int = { /* compiled code */ }
+ def foo2562(): scala.Int = { /* compiled code */ }
+ def foo2563(): scala.Int = { /* compiled code */ }
+ def foo2564(): scala.Int = { /* compiled code */ }
+ def foo2565(): scala.Int = { /* compiled code */ }
+ def foo2566(): scala.Int = { /* compiled code */ }
+ def foo2567(): scala.Int = { /* compiled code */ }
+ def foo2568(): scala.Int = { /* compiled code */ }
+ def foo2569(): scala.Int = { /* compiled code */ }
+ def foo2570(): scala.Int = { /* compiled code */ }
+ def foo2571(): scala.Int = { /* compiled code */ }
+ def foo2572(): scala.Int = { /* compiled code */ }
+ def foo2573(): scala.Int = { /* compiled code */ }
+ def foo2574(): scala.Int = { /* compiled code */ }
+ def foo2575(): scala.Int = { /* compiled code */ }
+ def foo2576(): scala.Int = { /* compiled code */ }
+ def foo2577(): scala.Int = { /* compiled code */ }
+ def foo2578(): scala.Int = { /* compiled code */ }
+ def foo2579(): scala.Int = { /* compiled code */ }
+ def foo2580(): scala.Int = { /* compiled code */ }
+ def foo2581(): scala.Int = { /* compiled code */ }
+ def foo2582(): scala.Int = { /* compiled code */ }
+ def foo2583(): scala.Int = { /* compiled code */ }
+ def foo2584(): scala.Int = { /* compiled code */ }
+ def foo2585(): scala.Int = { /* compiled code */ }
+ def foo2586(): scala.Int = { /* compiled code */ }
+ def foo2587(): scala.Int = { /* compiled code */ }
+ def foo2588(): scala.Int = { /* compiled code */ }
+ def foo2589(): scala.Int = { /* compiled code */ }
+ def foo2590(): scala.Int = { /* compiled code */ }
+ def foo2591(): scala.Int = { /* compiled code */ }
+ def foo2592(): scala.Int = { /* compiled code */ }
+ def foo2593(): scala.Int = { /* compiled code */ }
+ def foo2594(): scala.Int = { /* compiled code */ }
+ def foo2595(): scala.Int = { /* compiled code */ }
+ def foo2596(): scala.Int = { /* compiled code */ }
+ def foo2597(): scala.Int = { /* compiled code */ }
+ def foo2598(): scala.Int = { /* compiled code */ }
+ def foo2599(): scala.Int = { /* compiled code */ }
+ def foo2600(): scala.Int = { /* compiled code */ }
+ def foo2601(): scala.Int = { /* compiled code */ }
+ def foo2602(): scala.Int = { /* compiled code */ }
+ def foo2603(): scala.Int = { /* compiled code */ }
+ def foo2604(): scala.Int = { /* compiled code */ }
+ def foo2605(): scala.Int = { /* compiled code */ }
+ def foo2606(): scala.Int = { /* compiled code */ }
+ def foo2607(): scala.Int = { /* compiled code */ }
+ def foo2608(): scala.Int = { /* compiled code */ }
+ def foo2609(): scala.Int = { /* compiled code */ }
+ def foo2610(): scala.Int = { /* compiled code */ }
+ def foo2611(): scala.Int = { /* compiled code */ }
+ def foo2612(): scala.Int = { /* compiled code */ }
+ def foo2613(): scala.Int = { /* compiled code */ }
+ def foo2614(): scala.Int = { /* compiled code */ }
+ def foo2615(): scala.Int = { /* compiled code */ }
+ def foo2616(): scala.Int = { /* compiled code */ }
+ def foo2617(): scala.Int = { /* compiled code */ }
+ def foo2618(): scala.Int = { /* compiled code */ }
+ def foo2619(): scala.Int = { /* compiled code */ }
+ def foo2620(): scala.Int = { /* compiled code */ }
+ def foo2621(): scala.Int = { /* compiled code */ }
+ def foo2622(): scala.Int = { /* compiled code */ }
+ def foo2623(): scala.Int = { /* compiled code */ }
+ def foo2624(): scala.Int = { /* compiled code */ }
+ def foo2625(): scala.Int = { /* compiled code */ }
+ def foo2626(): scala.Int = { /* compiled code */ }
+ def foo2627(): scala.Int = { /* compiled code */ }
+ def foo2628(): scala.Int = { /* compiled code */ }
+ def foo2629(): scala.Int = { /* compiled code */ }
+ def foo2630(): scala.Int = { /* compiled code */ }
+ def foo2631(): scala.Int = { /* compiled code */ }
+ def foo2632(): scala.Int = { /* compiled code */ }
+ def foo2633(): scala.Int = { /* compiled code */ }
+ def foo2634(): scala.Int = { /* compiled code */ }
+ def foo2635(): scala.Int = { /* compiled code */ }
+ def foo2636(): scala.Int = { /* compiled code */ }
+ def foo2637(): scala.Int = { /* compiled code */ }
+ def foo2638(): scala.Int = { /* compiled code */ }
+ def foo2639(): scala.Int = { /* compiled code */ }
+ def foo2640(): scala.Int = { /* compiled code */ }
+ def foo2641(): scala.Int = { /* compiled code */ }
+ def foo2642(): scala.Int = { /* compiled code */ }
+ def foo2643(): scala.Int = { /* compiled code */ }
+ def foo2644(): scala.Int = { /* compiled code */ }
+ def foo2645(): scala.Int = { /* compiled code */ }
+ def foo2646(): scala.Int = { /* compiled code */ }
+ def foo2647(): scala.Int = { /* compiled code */ }
+ def foo2648(): scala.Int = { /* compiled code */ }
+ def foo2649(): scala.Int = { /* compiled code */ }
+ def foo2650(): scala.Int = { /* compiled code */ }
+ def foo2651(): scala.Int = { /* compiled code */ }
+ def foo2652(): scala.Int = { /* compiled code */ }
+ def foo2653(): scala.Int = { /* compiled code */ }
+ def foo2654(): scala.Int = { /* compiled code */ }
+ def foo2655(): scala.Int = { /* compiled code */ }
+ def foo2656(): scala.Int = { /* compiled code */ }
+ def foo2657(): scala.Int = { /* compiled code */ }
+ def foo2658(): scala.Int = { /* compiled code */ }
+ def foo2659(): scala.Int = { /* compiled code */ }
+ def foo2660(): scala.Int = { /* compiled code */ }
+ def foo2661(): scala.Int = { /* compiled code */ }
+ def foo2662(): scala.Int = { /* compiled code */ }
+ def foo2663(): scala.Int = { /* compiled code */ }
+ def foo2664(): scala.Int = { /* compiled code */ }
+ def foo2665(): scala.Int = { /* compiled code */ }
+ def foo2666(): scala.Int = { /* compiled code */ }
+ def foo2667(): scala.Int = { /* compiled code */ }
+ def foo2668(): scala.Int = { /* compiled code */ }
+ def foo2669(): scala.Int = { /* compiled code */ }
+ def foo2670(): scala.Int = { /* compiled code */ }
+ def foo2671(): scala.Int = { /* compiled code */ }
+ def foo2672(): scala.Int = { /* compiled code */ }
+ def foo2673(): scala.Int = { /* compiled code */ }
+ def foo2674(): scala.Int = { /* compiled code */ }
+ def foo2675(): scala.Int = { /* compiled code */ }
+ def foo2676(): scala.Int = { /* compiled code */ }
+ def foo2677(): scala.Int = { /* compiled code */ }
+ def foo2678(): scala.Int = { /* compiled code */ }
+ def foo2679(): scala.Int = { /* compiled code */ }
+ def foo2680(): scala.Int = { /* compiled code */ }
+ def foo2681(): scala.Int = { /* compiled code */ }
+ def foo2682(): scala.Int = { /* compiled code */ }
+ def foo2683(): scala.Int = { /* compiled code */ }
+ def foo2684(): scala.Int = { /* compiled code */ }
+ def foo2685(): scala.Int = { /* compiled code */ }
+ def foo2686(): scala.Int = { /* compiled code */ }
+ def foo2687(): scala.Int = { /* compiled code */ }
+ def foo2688(): scala.Int = { /* compiled code */ }
+ def foo2689(): scala.Int = { /* compiled code */ }
+ def foo2690(): scala.Int = { /* compiled code */ }
+ def foo2691(): scala.Int = { /* compiled code */ }
+ def foo2692(): scala.Int = { /* compiled code */ }
+ def foo2693(): scala.Int = { /* compiled code */ }
+ def foo2694(): scala.Int = { /* compiled code */ }
+ def foo2695(): scala.Int = { /* compiled code */ }
+ def foo2696(): scala.Int = { /* compiled code */ }
+ def foo2697(): scala.Int = { /* compiled code */ }
+ def foo2698(): scala.Int = { /* compiled code */ }
+ def foo2699(): scala.Int = { /* compiled code */ }
+ def foo2700(): scala.Int = { /* compiled code */ }
+ def foo2701(): scala.Int = { /* compiled code */ }
+ def foo2702(): scala.Int = { /* compiled code */ }
+ def foo2703(): scala.Int = { /* compiled code */ }
+ def foo2704(): scala.Int = { /* compiled code */ }
+ def foo2705(): scala.Int = { /* compiled code */ }
+ def foo2706(): scala.Int = { /* compiled code */ }
+ def foo2707(): scala.Int = { /* compiled code */ }
+ def foo2708(): scala.Int = { /* compiled code */ }
+ def foo2709(): scala.Int = { /* compiled code */ }
+ def foo2710(): scala.Int = { /* compiled code */ }
+ def foo2711(): scala.Int = { /* compiled code */ }
+ def foo2712(): scala.Int = { /* compiled code */ }
+ def foo2713(): scala.Int = { /* compiled code */ }
+ def foo2714(): scala.Int = { /* compiled code */ }
+ def foo2715(): scala.Int = { /* compiled code */ }
+ def foo2716(): scala.Int = { /* compiled code */ }
+ def foo2717(): scala.Int = { /* compiled code */ }
+ def foo2718(): scala.Int = { /* compiled code */ }
+ def foo2719(): scala.Int = { /* compiled code */ }
+ def foo2720(): scala.Int = { /* compiled code */ }
+ def foo2721(): scala.Int = { /* compiled code */ }
+ def foo2722(): scala.Int = { /* compiled code */ }
+ def foo2723(): scala.Int = { /* compiled code */ }
+ def foo2724(): scala.Int = { /* compiled code */ }
+ def foo2725(): scala.Int = { /* compiled code */ }
+ def foo2726(): scala.Int = { /* compiled code */ }
+ def foo2727(): scala.Int = { /* compiled code */ }
+ def foo2728(): scala.Int = { /* compiled code */ }
+ def foo2729(): scala.Int = { /* compiled code */ }
+ def foo2730(): scala.Int = { /* compiled code */ }
+ def foo2731(): scala.Int = { /* compiled code */ }
+ def foo2732(): scala.Int = { /* compiled code */ }
+ def foo2733(): scala.Int = { /* compiled code */ }
+ def foo2734(): scala.Int = { /* compiled code */ }
+ def foo2735(): scala.Int = { /* compiled code */ }
+ def foo2736(): scala.Int = { /* compiled code */ }
+ def foo2737(): scala.Int = { /* compiled code */ }
+ def foo2738(): scala.Int = { /* compiled code */ }
+ def foo2739(): scala.Int = { /* compiled code */ }
+ def foo2740(): scala.Int = { /* compiled code */ }
+ def foo2741(): scala.Int = { /* compiled code */ }
+ def foo2742(): scala.Int = { /* compiled code */ }
+ def foo2743(): scala.Int = { /* compiled code */ }
+ def foo2744(): scala.Int = { /* compiled code */ }
+ def foo2745(): scala.Int = { /* compiled code */ }
+ def foo2746(): scala.Int = { /* compiled code */ }
+ def foo2747(): scala.Int = { /* compiled code */ }
+ def foo2748(): scala.Int = { /* compiled code */ }
+ def foo2749(): scala.Int = { /* compiled code */ }
+ def foo2750(): scala.Int = { /* compiled code */ }
+ def foo2751(): scala.Int = { /* compiled code */ }
+ def foo2752(): scala.Int = { /* compiled code */ }
+ def foo2753(): scala.Int = { /* compiled code */ }
+ def foo2754(): scala.Int = { /* compiled code */ }
+ def foo2755(): scala.Int = { /* compiled code */ }
+ def foo2756(): scala.Int = { /* compiled code */ }
+ def foo2757(): scala.Int = { /* compiled code */ }
+ def foo2758(): scala.Int = { /* compiled code */ }
+ def foo2759(): scala.Int = { /* compiled code */ }
+ def foo2760(): scala.Int = { /* compiled code */ }
+ def foo2761(): scala.Int = { /* compiled code */ }
+ def foo2762(): scala.Int = { /* compiled code */ }
+ def foo2763(): scala.Int = { /* compiled code */ }
+ def foo2764(): scala.Int = { /* compiled code */ }
+ def foo2765(): scala.Int = { /* compiled code */ }
+ def foo2766(): scala.Int = { /* compiled code */ }
+ def foo2767(): scala.Int = { /* compiled code */ }
+ def foo2768(): scala.Int = { /* compiled code */ }
+ def foo2769(): scala.Int = { /* compiled code */ }
+ def foo2770(): scala.Int = { /* compiled code */ }
+ def foo2771(): scala.Int = { /* compiled code */ }
+ def foo2772(): scala.Int = { /* compiled code */ }
+ def foo2773(): scala.Int = { /* compiled code */ }
+ def foo2774(): scala.Int = { /* compiled code */ }
+ def foo2775(): scala.Int = { /* compiled code */ }
+ def foo2776(): scala.Int = { /* compiled code */ }
+ def foo2777(): scala.Int = { /* compiled code */ }
+ def foo2778(): scala.Int = { /* compiled code */ }
+ def foo2779(): scala.Int = { /* compiled code */ }
+ def foo2780(): scala.Int = { /* compiled code */ }
+ def foo2781(): scala.Int = { /* compiled code */ }
+ def foo2782(): scala.Int = { /* compiled code */ }
+ def foo2783(): scala.Int = { /* compiled code */ }
+ def foo2784(): scala.Int = { /* compiled code */ }
+ def foo2785(): scala.Int = { /* compiled code */ }
+ def foo2786(): scala.Int = { /* compiled code */ }
+ def foo2787(): scala.Int = { /* compiled code */ }
+ def foo2788(): scala.Int = { /* compiled code */ }
+ def foo2789(): scala.Int = { /* compiled code */ }
+ def foo2790(): scala.Int = { /* compiled code */ }
+ def foo2791(): scala.Int = { /* compiled code */ }
+ def foo2792(): scala.Int = { /* compiled code */ }
+ def foo2793(): scala.Int = { /* compiled code */ }
+ def foo2794(): scala.Int = { /* compiled code */ }
+ def foo2795(): scala.Int = { /* compiled code */ }
+ def foo2796(): scala.Int = { /* compiled code */ }
+ def foo2797(): scala.Int = { /* compiled code */ }
+ def foo2798(): scala.Int = { /* compiled code */ }
+ def foo2799(): scala.Int = { /* compiled code */ }
+ def foo2800(): scala.Int = { /* compiled code */ }
+ def foo2801(): scala.Int = { /* compiled code */ }
+ def foo2802(): scala.Int = { /* compiled code */ }
+ def foo2803(): scala.Int = { /* compiled code */ }
+ def foo2804(): scala.Int = { /* compiled code */ }
+ def foo2805(): scala.Int = { /* compiled code */ }
+ def foo2806(): scala.Int = { /* compiled code */ }
+ def foo2807(): scala.Int = { /* compiled code */ }
+ def foo2808(): scala.Int = { /* compiled code */ }
+ def foo2809(): scala.Int = { /* compiled code */ }
+ def foo2810(): scala.Int = { /* compiled code */ }
+ def foo2811(): scala.Int = { /* compiled code */ }
+ def foo2812(): scala.Int = { /* compiled code */ }
+ def foo2813(): scala.Int = { /* compiled code */ }
+ def foo2814(): scala.Int = { /* compiled code */ }
+ def foo2815(): scala.Int = { /* compiled code */ }
+ def foo2816(): scala.Int = { /* compiled code */ }
+ def foo2817(): scala.Int = { /* compiled code */ }
+ def foo2818(): scala.Int = { /* compiled code */ }
+ def foo2819(): scala.Int = { /* compiled code */ }
+ def foo2820(): scala.Int = { /* compiled code */ }
+ def foo2821(): scala.Int = { /* compiled code */ }
+ def foo2822(): scala.Int = { /* compiled code */ }
+ def foo2823(): scala.Int = { /* compiled code */ }
+ def foo2824(): scala.Int = { /* compiled code */ }
+ def foo2825(): scala.Int = { /* compiled code */ }
+ def foo2826(): scala.Int = { /* compiled code */ }
+ def foo2827(): scala.Int = { /* compiled code */ }
+ def foo2828(): scala.Int = { /* compiled code */ }
+ def foo2829(): scala.Int = { /* compiled code */ }
+ def foo2830(): scala.Int = { /* compiled code */ }
+ def foo2831(): scala.Int = { /* compiled code */ }
+ def foo2832(): scala.Int = { /* compiled code */ }
+ def foo2833(): scala.Int = { /* compiled code */ }
+ def foo2834(): scala.Int = { /* compiled code */ }
+ def foo2835(): scala.Int = { /* compiled code */ }
+ def foo2836(): scala.Int = { /* compiled code */ }
+ def foo2837(): scala.Int = { /* compiled code */ }
+ def foo2838(): scala.Int = { /* compiled code */ }
+ def foo2839(): scala.Int = { /* compiled code */ }
+ def foo2840(): scala.Int = { /* compiled code */ }
+ def foo2841(): scala.Int = { /* compiled code */ }
+ def foo2842(): scala.Int = { /* compiled code */ }
+ def foo2843(): scala.Int = { /* compiled code */ }
+ def foo2844(): scala.Int = { /* compiled code */ }
+ def foo2845(): scala.Int = { /* compiled code */ }
+ def foo2846(): scala.Int = { /* compiled code */ }
+ def foo2847(): scala.Int = { /* compiled code */ }
+ def foo2848(): scala.Int = { /* compiled code */ }
+ def foo2849(): scala.Int = { /* compiled code */ }
+ def foo2850(): scala.Int = { /* compiled code */ }
+ def foo2851(): scala.Int = { /* compiled code */ }
+ def foo2852(): scala.Int = { /* compiled code */ }
+ def foo2853(): scala.Int = { /* compiled code */ }
+ def foo2854(): scala.Int = { /* compiled code */ }
+ def foo2855(): scala.Int = { /* compiled code */ }
+ def foo2856(): scala.Int = { /* compiled code */ }
+ def foo2857(): scala.Int = { /* compiled code */ }
+ def foo2858(): scala.Int = { /* compiled code */ }
+ def foo2859(): scala.Int = { /* compiled code */ }
+ def foo2860(): scala.Int = { /* compiled code */ }
+ def foo2861(): scala.Int = { /* compiled code */ }
+ def foo2862(): scala.Int = { /* compiled code */ }
+ def foo2863(): scala.Int = { /* compiled code */ }
+ def foo2864(): scala.Int = { /* compiled code */ }
+ def foo2865(): scala.Int = { /* compiled code */ }
+ def foo2866(): scala.Int = { /* compiled code */ }
+ def foo2867(): scala.Int = { /* compiled code */ }
+ def foo2868(): scala.Int = { /* compiled code */ }
+ def foo2869(): scala.Int = { /* compiled code */ }
+ def foo2870(): scala.Int = { /* compiled code */ }
+ def foo2871(): scala.Int = { /* compiled code */ }
+ def foo2872(): scala.Int = { /* compiled code */ }
+ def foo2873(): scala.Int = { /* compiled code */ }
+ def foo2874(): scala.Int = { /* compiled code */ }
+ def foo2875(): scala.Int = { /* compiled code */ }
+ def foo2876(): scala.Int = { /* compiled code */ }
+ def foo2877(): scala.Int = { /* compiled code */ }
+ def foo2878(): scala.Int = { /* compiled code */ }
+ def foo2879(): scala.Int = { /* compiled code */ }
+ def foo2880(): scala.Int = { /* compiled code */ }
+ def foo2881(): scala.Int = { /* compiled code */ }
+ def foo2882(): scala.Int = { /* compiled code */ }
+ def foo2883(): scala.Int = { /* compiled code */ }
+ def foo2884(): scala.Int = { /* compiled code */ }
+ def foo2885(): scala.Int = { /* compiled code */ }
+ def foo2886(): scala.Int = { /* compiled code */ }
+ def foo2887(): scala.Int = { /* compiled code */ }
+ def foo2888(): scala.Int = { /* compiled code */ }
+ def foo2889(): scala.Int = { /* compiled code */ }
+ def foo2890(): scala.Int = { /* compiled code */ }
+ def foo2891(): scala.Int = { /* compiled code */ }
+ def foo2892(): scala.Int = { /* compiled code */ }
+ def foo2893(): scala.Int = { /* compiled code */ }
+ def foo2894(): scala.Int = { /* compiled code */ }
+ def foo2895(): scala.Int = { /* compiled code */ }
+ def foo2896(): scala.Int = { /* compiled code */ }
+ def foo2897(): scala.Int = { /* compiled code */ }
+ def foo2898(): scala.Int = { /* compiled code */ }
+ def foo2899(): scala.Int = { /* compiled code */ }
+ def foo2900(): scala.Int = { /* compiled code */ }
+ def foo2901(): scala.Int = { /* compiled code */ }
+ def foo2902(): scala.Int = { /* compiled code */ }
+ def foo2903(): scala.Int = { /* compiled code */ }
+ def foo2904(): scala.Int = { /* compiled code */ }
+ def foo2905(): scala.Int = { /* compiled code */ }
+ def foo2906(): scala.Int = { /* compiled code */ }
+ def foo2907(): scala.Int = { /* compiled code */ }
+ def foo2908(): scala.Int = { /* compiled code */ }
+ def foo2909(): scala.Int = { /* compiled code */ }
+ def foo2910(): scala.Int = { /* compiled code */ }
+ def foo2911(): scala.Int = { /* compiled code */ }
+ def foo2912(): scala.Int = { /* compiled code */ }
+ def foo2913(): scala.Int = { /* compiled code */ }
+ def foo2914(): scala.Int = { /* compiled code */ }
+ def foo2915(): scala.Int = { /* compiled code */ }
+ def foo2916(): scala.Int = { /* compiled code */ }
+ def foo2917(): scala.Int = { /* compiled code */ }
+ def foo2918(): scala.Int = { /* compiled code */ }
+ def foo2919(): scala.Int = { /* compiled code */ }
+ def foo2920(): scala.Int = { /* compiled code */ }
+ def foo2921(): scala.Int = { /* compiled code */ }
+ def foo2922(): scala.Int = { /* compiled code */ }
+ def foo2923(): scala.Int = { /* compiled code */ }
+ def foo2924(): scala.Int = { /* compiled code */ }
+ def foo2925(): scala.Int = { /* compiled code */ }
+ def foo2926(): scala.Int = { /* compiled code */ }
+ def foo2927(): scala.Int = { /* compiled code */ }
+ def foo2928(): scala.Int = { /* compiled code */ }
+ def foo2929(): scala.Int = { /* compiled code */ }
+ def foo2930(): scala.Int = { /* compiled code */ }
+ def foo2931(): scala.Int = { /* compiled code */ }
+ def foo2932(): scala.Int = { /* compiled code */ }
+ def foo2933(): scala.Int = { /* compiled code */ }
+ def foo2934(): scala.Int = { /* compiled code */ }
+ def foo2935(): scala.Int = { /* compiled code */ }
+ def foo2936(): scala.Int = { /* compiled code */ }
+ def foo2937(): scala.Int = { /* compiled code */ }
+ def foo2938(): scala.Int = { /* compiled code */ }
+ def foo2939(): scala.Int = { /* compiled code */ }
+ def foo2940(): scala.Int = { /* compiled code */ }
+ def foo2941(): scala.Int = { /* compiled code */ }
+ def foo2942(): scala.Int = { /* compiled code */ }
+ def foo2943(): scala.Int = { /* compiled code */ }
+ def foo2944(): scala.Int = { /* compiled code */ }
+ def foo2945(): scala.Int = { /* compiled code */ }
+ def foo2946(): scala.Int = { /* compiled code */ }
+ def foo2947(): scala.Int = { /* compiled code */ }
+ def foo2948(): scala.Int = { /* compiled code */ }
+ def foo2949(): scala.Int = { /* compiled code */ }
+ def foo2950(): scala.Int = { /* compiled code */ }
+ def foo2951(): scala.Int = { /* compiled code */ }
+ def foo2952(): scala.Int = { /* compiled code */ }
+ def foo2953(): scala.Int = { /* compiled code */ }
+ def foo2954(): scala.Int = { /* compiled code */ }
+ def foo2955(): scala.Int = { /* compiled code */ }
+ def foo2956(): scala.Int = { /* compiled code */ }
+ def foo2957(): scala.Int = { /* compiled code */ }
+ def foo2958(): scala.Int = { /* compiled code */ }
+ def foo2959(): scala.Int = { /* compiled code */ }
+ def foo2960(): scala.Int = { /* compiled code */ }
+ def foo2961(): scala.Int = { /* compiled code */ }
+ def foo2962(): scala.Int = { /* compiled code */ }
+ def foo2963(): scala.Int = { /* compiled code */ }
+ def foo2964(): scala.Int = { /* compiled code */ }
+ def foo2965(): scala.Int = { /* compiled code */ }
+ def foo2966(): scala.Int = { /* compiled code */ }
+ def foo2967(): scala.Int = { /* compiled code */ }
+ def foo2968(): scala.Int = { /* compiled code */ }
+ def foo2969(): scala.Int = { /* compiled code */ }
+ def foo2970(): scala.Int = { /* compiled code */ }
+ def foo2971(): scala.Int = { /* compiled code */ }
+ def foo2972(): scala.Int = { /* compiled code */ }
+ def foo2973(): scala.Int = { /* compiled code */ }
+ def foo2974(): scala.Int = { /* compiled code */ }
+ def foo2975(): scala.Int = { /* compiled code */ }
+ def foo2976(): scala.Int = { /* compiled code */ }
+ def foo2977(): scala.Int = { /* compiled code */ }
+ def foo2978(): scala.Int = { /* compiled code */ }
+ def foo2979(): scala.Int = { /* compiled code */ }
+ def foo2980(): scala.Int = { /* compiled code */ }
+ def foo2981(): scala.Int = { /* compiled code */ }
+ def foo2982(): scala.Int = { /* compiled code */ }
+ def foo2983(): scala.Int = { /* compiled code */ }
+ def foo2984(): scala.Int = { /* compiled code */ }
+ def foo2985(): scala.Int = { /* compiled code */ }
+ def foo2986(): scala.Int = { /* compiled code */ }
+ def foo2987(): scala.Int = { /* compiled code */ }
+ def foo2988(): scala.Int = { /* compiled code */ }
+ def foo2989(): scala.Int = { /* compiled code */ }
+ def foo2990(): scala.Int = { /* compiled code */ }
+ def foo2991(): scala.Int = { /* compiled code */ }
+ def foo2992(): scala.Int = { /* compiled code */ }
+ def foo2993(): scala.Int = { /* compiled code */ }
+ def foo2994(): scala.Int = { /* compiled code */ }
+ def foo2995(): scala.Int = { /* compiled code */ }
+ def foo2996(): scala.Int = { /* compiled code */ }
+ def foo2997(): scala.Int = { /* compiled code */ }
+ def foo2998(): scala.Int = { /* compiled code */ }
+ def foo2999(): scala.Int = { /* compiled code */ }
+ def foo3000(): scala.Int = { /* compiled code */ }
+ def foo3001(): scala.Int = { /* compiled code */ }
+ def foo3002(): scala.Int = { /* compiled code */ }
+ def foo3003(): scala.Int = { /* compiled code */ }
+ def foo3004(): scala.Int = { /* compiled code */ }
+ def foo3005(): scala.Int = { /* compiled code */ }
+ def foo3006(): scala.Int = { /* compiled code */ }
+ def foo3007(): scala.Int = { /* compiled code */ }
+ def foo3008(): scala.Int = { /* compiled code */ }
+ def foo3009(): scala.Int = { /* compiled code */ }
+ def foo3010(): scala.Int = { /* compiled code */ }
+ def foo3011(): scala.Int = { /* compiled code */ }
+ def foo3012(): scala.Int = { /* compiled code */ }
+ def foo3013(): scala.Int = { /* compiled code */ }
+ def foo3014(): scala.Int = { /* compiled code */ }
+ def foo3015(): scala.Int = { /* compiled code */ }
+ def foo3016(): scala.Int = { /* compiled code */ }
+ def foo3017(): scala.Int = { /* compiled code */ }
+ def foo3018(): scala.Int = { /* compiled code */ }
+ def foo3019(): scala.Int = { /* compiled code */ }
+ def foo3020(): scala.Int = { /* compiled code */ }
+ def foo3021(): scala.Int = { /* compiled code */ }
+ def foo3022(): scala.Int = { /* compiled code */ }
+ def foo3023(): scala.Int = { /* compiled code */ }
+ def foo3024(): scala.Int = { /* compiled code */ }
+ def foo3025(): scala.Int = { /* compiled code */ }
+ def foo3026(): scala.Int = { /* compiled code */ }
+ def foo3027(): scala.Int = { /* compiled code */ }
+ def foo3028(): scala.Int = { /* compiled code */ }
+ def foo3029(): scala.Int = { /* compiled code */ }
+ def foo3030(): scala.Int = { /* compiled code */ }
+ def foo3031(): scala.Int = { /* compiled code */ }
+ def foo3032(): scala.Int = { /* compiled code */ }
+ def foo3033(): scala.Int = { /* compiled code */ }
+ def foo3034(): scala.Int = { /* compiled code */ }
+ def foo3035(): scala.Int = { /* compiled code */ }
+ def foo3036(): scala.Int = { /* compiled code */ }
+ def foo3037(): scala.Int = { /* compiled code */ }
+ def foo3038(): scala.Int = { /* compiled code */ }
+ def foo3039(): scala.Int = { /* compiled code */ }
+ def foo3040(): scala.Int = { /* compiled code */ }
+ def foo3041(): scala.Int = { /* compiled code */ }
+ def foo3042(): scala.Int = { /* compiled code */ }
+ def foo3043(): scala.Int = { /* compiled code */ }
+ def foo3044(): scala.Int = { /* compiled code */ }
+ def foo3045(): scala.Int = { /* compiled code */ }
+ def foo3046(): scala.Int = { /* compiled code */ }
+ def foo3047(): scala.Int = { /* compiled code */ }
+ def foo3048(): scala.Int = { /* compiled code */ }
+ def foo3049(): scala.Int = { /* compiled code */ }
+ def foo3050(): scala.Int = { /* compiled code */ }
+ def foo3051(): scala.Int = { /* compiled code */ }
+ def foo3052(): scala.Int = { /* compiled code */ }
+ def foo3053(): scala.Int = { /* compiled code */ }
+ def foo3054(): scala.Int = { /* compiled code */ }
+ def foo3055(): scala.Int = { /* compiled code */ }
+ def foo3056(): scala.Int = { /* compiled code */ }
+ def foo3057(): scala.Int = { /* compiled code */ }
+ def foo3058(): scala.Int = { /* compiled code */ }
+ def foo3059(): scala.Int = { /* compiled code */ }
+ def foo3060(): scala.Int = { /* compiled code */ }
+ def foo3061(): scala.Int = { /* compiled code */ }
+ def foo3062(): scala.Int = { /* compiled code */ }
+ def foo3063(): scala.Int = { /* compiled code */ }
+ def foo3064(): scala.Int = { /* compiled code */ }
+ def foo3065(): scala.Int = { /* compiled code */ }
+ def foo3066(): scala.Int = { /* compiled code */ }
+ def foo3067(): scala.Int = { /* compiled code */ }
+ def foo3068(): scala.Int = { /* compiled code */ }
+ def foo3069(): scala.Int = { /* compiled code */ }
+ def foo3070(): scala.Int = { /* compiled code */ }
+ def foo3071(): scala.Int = { /* compiled code */ }
+ def foo3072(): scala.Int = { /* compiled code */ }
+ def foo3073(): scala.Int = { /* compiled code */ }
+ def foo3074(): scala.Int = { /* compiled code */ }
+ def foo3075(): scala.Int = { /* compiled code */ }
+ def foo3076(): scala.Int = { /* compiled code */ }
+ def foo3077(): scala.Int = { /* compiled code */ }
+ def foo3078(): scala.Int = { /* compiled code */ }
+ def foo3079(): scala.Int = { /* compiled code */ }
+ def foo3080(): scala.Int = { /* compiled code */ }
+ def foo3081(): scala.Int = { /* compiled code */ }
+ def foo3082(): scala.Int = { /* compiled code */ }
+ def foo3083(): scala.Int = { /* compiled code */ }
+ def foo3084(): scala.Int = { /* compiled code */ }
+ def foo3085(): scala.Int = { /* compiled code */ }
+ def foo3086(): scala.Int = { /* compiled code */ }
+ def foo3087(): scala.Int = { /* compiled code */ }
+ def foo3088(): scala.Int = { /* compiled code */ }
+ def foo3089(): scala.Int = { /* compiled code */ }
+ def foo3090(): scala.Int = { /* compiled code */ }
+ def foo3091(): scala.Int = { /* compiled code */ }
+ def foo3092(): scala.Int = { /* compiled code */ }
+ def foo3093(): scala.Int = { /* compiled code */ }
+ def foo3094(): scala.Int = { /* compiled code */ }
+ def foo3095(): scala.Int = { /* compiled code */ }
+ def foo3096(): scala.Int = { /* compiled code */ }
+ def foo3097(): scala.Int = { /* compiled code */ }
+ def foo3098(): scala.Int = { /* compiled code */ }
+ def foo3099(): scala.Int = { /* compiled code */ }
+ def foo3100(): scala.Int = { /* compiled code */ }
+ def foo3101(): scala.Int = { /* compiled code */ }
+ def foo3102(): scala.Int = { /* compiled code */ }
+ def foo3103(): scala.Int = { /* compiled code */ }
+ def foo3104(): scala.Int = { /* compiled code */ }
+ def foo3105(): scala.Int = { /* compiled code */ }
+ def foo3106(): scala.Int = { /* compiled code */ }
+ def foo3107(): scala.Int = { /* compiled code */ }
+ def foo3108(): scala.Int = { /* compiled code */ }
+ def foo3109(): scala.Int = { /* compiled code */ }
+ def foo3110(): scala.Int = { /* compiled code */ }
+ def foo3111(): scala.Int = { /* compiled code */ }
+ def foo3112(): scala.Int = { /* compiled code */ }
+ def foo3113(): scala.Int = { /* compiled code */ }
+ def foo3114(): scala.Int = { /* compiled code */ }
+ def foo3115(): scala.Int = { /* compiled code */ }
+ def foo3116(): scala.Int = { /* compiled code */ }
+ def foo3117(): scala.Int = { /* compiled code */ }
+ def foo3118(): scala.Int = { /* compiled code */ }
+ def foo3119(): scala.Int = { /* compiled code */ }
+ def foo3120(): scala.Int = { /* compiled code */ }
+ def foo3121(): scala.Int = { /* compiled code */ }
+ def foo3122(): scala.Int = { /* compiled code */ }
+ def foo3123(): scala.Int = { /* compiled code */ }
+ def foo3124(): scala.Int = { /* compiled code */ }
+ def foo3125(): scala.Int = { /* compiled code */ }
+ def foo3126(): scala.Int = { /* compiled code */ }
+ def foo3127(): scala.Int = { /* compiled code */ }
+ def foo3128(): scala.Int = { /* compiled code */ }
+ def foo3129(): scala.Int = { /* compiled code */ }
+ def foo3130(): scala.Int = { /* compiled code */ }
+ def foo3131(): scala.Int = { /* compiled code */ }
+ def foo3132(): scala.Int = { /* compiled code */ }
+ def foo3133(): scala.Int = { /* compiled code */ }
+ def foo3134(): scala.Int = { /* compiled code */ }
+ def foo3135(): scala.Int = { /* compiled code */ }
+ def foo3136(): scala.Int = { /* compiled code */ }
+ def foo3137(): scala.Int = { /* compiled code */ }
+ def foo3138(): scala.Int = { /* compiled code */ }
+ def foo3139(): scala.Int = { /* compiled code */ }
+ def foo3140(): scala.Int = { /* compiled code */ }
+ def foo3141(): scala.Int = { /* compiled code */ }
+ def foo3142(): scala.Int = { /* compiled code */ }
+ def foo3143(): scala.Int = { /* compiled code */ }
+ def foo3144(): scala.Int = { /* compiled code */ }
+ def foo3145(): scala.Int = { /* compiled code */ }
+ def foo3146(): scala.Int = { /* compiled code */ }
+ def foo3147(): scala.Int = { /* compiled code */ }
+ def foo3148(): scala.Int = { /* compiled code */ }
+ def foo3149(): scala.Int = { /* compiled code */ }
+ def foo3150(): scala.Int = { /* compiled code */ }
+ def foo3151(): scala.Int = { /* compiled code */ }
+ def foo3152(): scala.Int = { /* compiled code */ }
+ def foo3153(): scala.Int = { /* compiled code */ }
+ def foo3154(): scala.Int = { /* compiled code */ }
+ def foo3155(): scala.Int = { /* compiled code */ }
+ def foo3156(): scala.Int = { /* compiled code */ }
+ def foo3157(): scala.Int = { /* compiled code */ }
+ def foo3158(): scala.Int = { /* compiled code */ }
+ def foo3159(): scala.Int = { /* compiled code */ }
+ def foo3160(): scala.Int = { /* compiled code */ }
+ def foo3161(): scala.Int = { /* compiled code */ }
+ def foo3162(): scala.Int = { /* compiled code */ }
+ def foo3163(): scala.Int = { /* compiled code */ }
+ def foo3164(): scala.Int = { /* compiled code */ }
+ def foo3165(): scala.Int = { /* compiled code */ }
+ def foo3166(): scala.Int = { /* compiled code */ }
+ def foo3167(): scala.Int = { /* compiled code */ }
+ def foo3168(): scala.Int = { /* compiled code */ }
+ def foo3169(): scala.Int = { /* compiled code */ }
+ def foo3170(): scala.Int = { /* compiled code */ }
+ def foo3171(): scala.Int = { /* compiled code */ }
+ def foo3172(): scala.Int = { /* compiled code */ }
+ def foo3173(): scala.Int = { /* compiled code */ }
+ def foo3174(): scala.Int = { /* compiled code */ }
+ def foo3175(): scala.Int = { /* compiled code */ }
+ def foo3176(): scala.Int = { /* compiled code */ }
+ def foo3177(): scala.Int = { /* compiled code */ }
+ def foo3178(): scala.Int = { /* compiled code */ }
+ def foo3179(): scala.Int = { /* compiled code */ }
+ def foo3180(): scala.Int = { /* compiled code */ }
+ def foo3181(): scala.Int = { /* compiled code */ }
+ def foo3182(): scala.Int = { /* compiled code */ }
+ def foo3183(): scala.Int = { /* compiled code */ }
+ def foo3184(): scala.Int = { /* compiled code */ }
+ def foo3185(): scala.Int = { /* compiled code */ }
+ def foo3186(): scala.Int = { /* compiled code */ }
+ def foo3187(): scala.Int = { /* compiled code */ }
+ def foo3188(): scala.Int = { /* compiled code */ }
+ def foo3189(): scala.Int = { /* compiled code */ }
+ def foo3190(): scala.Int = { /* compiled code */ }
+ def foo3191(): scala.Int = { /* compiled code */ }
+ def foo3192(): scala.Int = { /* compiled code */ }
+ def foo3193(): scala.Int = { /* compiled code */ }
+ def foo3194(): scala.Int = { /* compiled code */ }
+ def foo3195(): scala.Int = { /* compiled code */ }
+ def foo3196(): scala.Int = { /* compiled code */ }
+ def foo3197(): scala.Int = { /* compiled code */ }
+ def foo3198(): scala.Int = { /* compiled code */ }
+ def foo3199(): scala.Int = { /* compiled code */ }
+ def foo3200(): scala.Int = { /* compiled code */ }
+ def foo3201(): scala.Int = { /* compiled code */ }
+ def foo3202(): scala.Int = { /* compiled code */ }
+ def foo3203(): scala.Int = { /* compiled code */ }
+ def foo3204(): scala.Int = { /* compiled code */ }
+ def foo3205(): scala.Int = { /* compiled code */ }
+ def foo3206(): scala.Int = { /* compiled code */ }
+ def foo3207(): scala.Int = { /* compiled code */ }
+ def foo3208(): scala.Int = { /* compiled code */ }
+ def foo3209(): scala.Int = { /* compiled code */ }
+ def foo3210(): scala.Int = { /* compiled code */ }
+ def foo3211(): scala.Int = { /* compiled code */ }
+ def foo3212(): scala.Int = { /* compiled code */ }
+ def foo3213(): scala.Int = { /* compiled code */ }
+ def foo3214(): scala.Int = { /* compiled code */ }
+ def foo3215(): scala.Int = { /* compiled code */ }
+ def foo3216(): scala.Int = { /* compiled code */ }
+ def foo3217(): scala.Int = { /* compiled code */ }
+ def foo3218(): scala.Int = { /* compiled code */ }
+ def foo3219(): scala.Int = { /* compiled code */ }
+ def foo3220(): scala.Int = { /* compiled code */ }
+ def foo3221(): scala.Int = { /* compiled code */ }
+ def foo3222(): scala.Int = { /* compiled code */ }
+ def foo3223(): scala.Int = { /* compiled code */ }
+ def foo3224(): scala.Int = { /* compiled code */ }
+ def foo3225(): scala.Int = { /* compiled code */ }
+ def foo3226(): scala.Int = { /* compiled code */ }
+ def foo3227(): scala.Int = { /* compiled code */ }
+ def foo3228(): scala.Int = { /* compiled code */ }
+ def foo3229(): scala.Int = { /* compiled code */ }
+ def foo3230(): scala.Int = { /* compiled code */ }
+ def foo3231(): scala.Int = { /* compiled code */ }
+ def foo3232(): scala.Int = { /* compiled code */ }
+ def foo3233(): scala.Int = { /* compiled code */ }
+ def foo3234(): scala.Int = { /* compiled code */ }
+ def foo3235(): scala.Int = { /* compiled code */ }
+ def foo3236(): scala.Int = { /* compiled code */ }
+ def foo3237(): scala.Int = { /* compiled code */ }
+ def foo3238(): scala.Int = { /* compiled code */ }
+ def foo3239(): scala.Int = { /* compiled code */ }
+ def foo3240(): scala.Int = { /* compiled code */ }
+ def foo3241(): scala.Int = { /* compiled code */ }
+ def foo3242(): scala.Int = { /* compiled code */ }
+ def foo3243(): scala.Int = { /* compiled code */ }
+ def foo3244(): scala.Int = { /* compiled code */ }
+ def foo3245(): scala.Int = { /* compiled code */ }
+ def foo3246(): scala.Int = { /* compiled code */ }
+ def foo3247(): scala.Int = { /* compiled code */ }
+ def foo3248(): scala.Int = { /* compiled code */ }
+ def foo3249(): scala.Int = { /* compiled code */ }
+ def foo3250(): scala.Int = { /* compiled code */ }
+ def foo3251(): scala.Int = { /* compiled code */ }
+ def foo3252(): scala.Int = { /* compiled code */ }
+ def foo3253(): scala.Int = { /* compiled code */ }
+ def foo3254(): scala.Int = { /* compiled code */ }
+ def foo3255(): scala.Int = { /* compiled code */ }
+ def foo3256(): scala.Int = { /* compiled code */ }
+ def foo3257(): scala.Int = { /* compiled code */ }
+ def foo3258(): scala.Int = { /* compiled code */ }
+ def foo3259(): scala.Int = { /* compiled code */ }
+ def foo3260(): scala.Int = { /* compiled code */ }
+ def foo3261(): scala.Int = { /* compiled code */ }
+ def foo3262(): scala.Int = { /* compiled code */ }
+ def foo3263(): scala.Int = { /* compiled code */ }
+ def foo3264(): scala.Int = { /* compiled code */ }
+ def foo3265(): scala.Int = { /* compiled code */ }
+ def foo3266(): scala.Int = { /* compiled code */ }
+ def foo3267(): scala.Int = { /* compiled code */ }
+ def foo3268(): scala.Int = { /* compiled code */ }
+ def foo3269(): scala.Int = { /* compiled code */ }
+ def foo3270(): scala.Int = { /* compiled code */ }
+ def foo3271(): scala.Int = { /* compiled code */ }
+ def foo3272(): scala.Int = { /* compiled code */ }
+ def foo3273(): scala.Int = { /* compiled code */ }
+ def foo3274(): scala.Int = { /* compiled code */ }
+ def foo3275(): scala.Int = { /* compiled code */ }
+ def foo3276(): scala.Int = { /* compiled code */ }
+ def foo3277(): scala.Int = { /* compiled code */ }
+ def foo3278(): scala.Int = { /* compiled code */ }
+ def foo3279(): scala.Int = { /* compiled code */ }
+ def foo3280(): scala.Int = { /* compiled code */ }
+ def foo3281(): scala.Int = { /* compiled code */ }
+ def foo3282(): scala.Int = { /* compiled code */ }
+ def foo3283(): scala.Int = { /* compiled code */ }
+ def foo3284(): scala.Int = { /* compiled code */ }
+ def foo3285(): scala.Int = { /* compiled code */ }
+ def foo3286(): scala.Int = { /* compiled code */ }
+ def foo3287(): scala.Int = { /* compiled code */ }
+ def foo3288(): scala.Int = { /* compiled code */ }
+ def foo3289(): scala.Int = { /* compiled code */ }
+ def foo3290(): scala.Int = { /* compiled code */ }
+ def foo3291(): scala.Int = { /* compiled code */ }
+ def foo3292(): scala.Int = { /* compiled code */ }
+ def foo3293(): scala.Int = { /* compiled code */ }
+ def foo3294(): scala.Int = { /* compiled code */ }
+ def foo3295(): scala.Int = { /* compiled code */ }
+ def foo3296(): scala.Int = { /* compiled code */ }
+ def foo3297(): scala.Int = { /* compiled code */ }
+ def foo3298(): scala.Int = { /* compiled code */ }
+ def foo3299(): scala.Int = { /* compiled code */ }
+ def foo3300(): scala.Int = { /* compiled code */ }
+ def foo3301(): scala.Int = { /* compiled code */ }
+ def foo3302(): scala.Int = { /* compiled code */ }
+ def foo3303(): scala.Int = { /* compiled code */ }
+ def foo3304(): scala.Int = { /* compiled code */ }
+ def foo3305(): scala.Int = { /* compiled code */ }
+ def foo3306(): scala.Int = { /* compiled code */ }
+ def foo3307(): scala.Int = { /* compiled code */ }
+ def foo3308(): scala.Int = { /* compiled code */ }
+ def foo3309(): scala.Int = { /* compiled code */ }
+ def foo3310(): scala.Int = { /* compiled code */ }
+ def foo3311(): scala.Int = { /* compiled code */ }
+ def foo3312(): scala.Int = { /* compiled code */ }
+ def foo3313(): scala.Int = { /* compiled code */ }
+ def foo3314(): scala.Int = { /* compiled code */ }
+ def foo3315(): scala.Int = { /* compiled code */ }
+ def foo3316(): scala.Int = { /* compiled code */ }
+ def foo3317(): scala.Int = { /* compiled code */ }
+ def foo3318(): scala.Int = { /* compiled code */ }
+ def foo3319(): scala.Int = { /* compiled code */ }
+ def foo3320(): scala.Int = { /* compiled code */ }
+ def foo3321(): scala.Int = { /* compiled code */ }
+ def foo3322(): scala.Int = { /* compiled code */ }
+ def foo3323(): scala.Int = { /* compiled code */ }
+ def foo3324(): scala.Int = { /* compiled code */ }
+ def foo3325(): scala.Int = { /* compiled code */ }
+ def foo3326(): scala.Int = { /* compiled code */ }
+ def foo3327(): scala.Int = { /* compiled code */ }
+ def foo3328(): scala.Int = { /* compiled code */ }
+ def foo3329(): scala.Int = { /* compiled code */ }
+ def foo3330(): scala.Int = { /* compiled code */ }
+ def foo3331(): scala.Int = { /* compiled code */ }
+ def foo3332(): scala.Int = { /* compiled code */ }
+ def foo3333(): scala.Int = { /* compiled code */ }
+ def foo3334(): scala.Int = { /* compiled code */ }
+ def foo3335(): scala.Int = { /* compiled code */ }
+ def foo3336(): scala.Int = { /* compiled code */ }
+ def foo3337(): scala.Int = { /* compiled code */ }
+ def foo3338(): scala.Int = { /* compiled code */ }
+ def foo3339(): scala.Int = { /* compiled code */ }
+ def foo3340(): scala.Int = { /* compiled code */ }
+ def foo3341(): scala.Int = { /* compiled code */ }
+ def foo3342(): scala.Int = { /* compiled code */ }
+ def foo3343(): scala.Int = { /* compiled code */ }
+ def foo3344(): scala.Int = { /* compiled code */ }
+ def foo3345(): scala.Int = { /* compiled code */ }
+ def foo3346(): scala.Int = { /* compiled code */ }
+ def foo3347(): scala.Int = { /* compiled code */ }
+ def foo3348(): scala.Int = { /* compiled code */ }
+ def foo3349(): scala.Int = { /* compiled code */ }
+ def foo3350(): scala.Int = { /* compiled code */ }
+ def foo3351(): scala.Int = { /* compiled code */ }
+ def foo3352(): scala.Int = { /* compiled code */ }
+ def foo3353(): scala.Int = { /* compiled code */ }
+ def foo3354(): scala.Int = { /* compiled code */ }
+ def foo3355(): scala.Int = { /* compiled code */ }
+ def foo3356(): scala.Int = { /* compiled code */ }
+ def foo3357(): scala.Int = { /* compiled code */ }
+ def foo3358(): scala.Int = { /* compiled code */ }
+ def foo3359(): scala.Int = { /* compiled code */ }
+ def foo3360(): scala.Int = { /* compiled code */ }
+ def foo3361(): scala.Int = { /* compiled code */ }
+ def foo3362(): scala.Int = { /* compiled code */ }
+ def foo3363(): scala.Int = { /* compiled code */ }
+ def foo3364(): scala.Int = { /* compiled code */ }
+ def foo3365(): scala.Int = { /* compiled code */ }
+ def foo3366(): scala.Int = { /* compiled code */ }
+ def foo3367(): scala.Int = { /* compiled code */ }
+ def foo3368(): scala.Int = { /* compiled code */ }
+ def foo3369(): scala.Int = { /* compiled code */ }
+ def foo3370(): scala.Int = { /* compiled code */ }
+ def foo3371(): scala.Int = { /* compiled code */ }
+ def foo3372(): scala.Int = { /* compiled code */ }
+ def foo3373(): scala.Int = { /* compiled code */ }
+ def foo3374(): scala.Int = { /* compiled code */ }
+ def foo3375(): scala.Int = { /* compiled code */ }
+ def foo3376(): scala.Int = { /* compiled code */ }
+ def foo3377(): scala.Int = { /* compiled code */ }
+ def foo3378(): scala.Int = { /* compiled code */ }
+ def foo3379(): scala.Int = { /* compiled code */ }
+ def foo3380(): scala.Int = { /* compiled code */ }
+ def foo3381(): scala.Int = { /* compiled code */ }
+ def foo3382(): scala.Int = { /* compiled code */ }
+ def foo3383(): scala.Int = { /* compiled code */ }
+ def foo3384(): scala.Int = { /* compiled code */ }
+ def foo3385(): scala.Int = { /* compiled code */ }
+ def foo3386(): scala.Int = { /* compiled code */ }
+ def foo3387(): scala.Int = { /* compiled code */ }
+ def foo3388(): scala.Int = { /* compiled code */ }
+ def foo3389(): scala.Int = { /* compiled code */ }
+ def foo3390(): scala.Int = { /* compiled code */ }
+ def foo3391(): scala.Int = { /* compiled code */ }
+ def foo3392(): scala.Int = { /* compiled code */ }
+ def foo3393(): scala.Int = { /* compiled code */ }
+ def foo3394(): scala.Int = { /* compiled code */ }
+ def foo3395(): scala.Int = { /* compiled code */ }
+ def foo3396(): scala.Int = { /* compiled code */ }
+ def foo3397(): scala.Int = { /* compiled code */ }
+ def foo3398(): scala.Int = { /* compiled code */ }
+ def foo3399(): scala.Int = { /* compiled code */ }
+ def foo3400(): scala.Int = { /* compiled code */ }
+ def foo3401(): scala.Int = { /* compiled code */ }
+ def foo3402(): scala.Int = { /* compiled code */ }
+ def foo3403(): scala.Int = { /* compiled code */ }
+ def foo3404(): scala.Int = { /* compiled code */ }
+ def foo3405(): scala.Int = { /* compiled code */ }
+ def foo3406(): scala.Int = { /* compiled code */ }
+ def foo3407(): scala.Int = { /* compiled code */ }
+ def foo3408(): scala.Int = { /* compiled code */ }
+ def foo3409(): scala.Int = { /* compiled code */ }
+ def foo3410(): scala.Int = { /* compiled code */ }
+ def foo3411(): scala.Int = { /* compiled code */ }
+ def foo3412(): scala.Int = { /* compiled code */ }
+ def foo3413(): scala.Int = { /* compiled code */ }
+ def foo3414(): scala.Int = { /* compiled code */ }
+ def foo3415(): scala.Int = { /* compiled code */ }
+ def foo3416(): scala.Int = { /* compiled code */ }
+ def foo3417(): scala.Int = { /* compiled code */ }
+ def foo3418(): scala.Int = { /* compiled code */ }
+ def foo3419(): scala.Int = { /* compiled code */ }
+ def foo3420(): scala.Int = { /* compiled code */ }
+ def foo3421(): scala.Int = { /* compiled code */ }
+ def foo3422(): scala.Int = { /* compiled code */ }
+ def foo3423(): scala.Int = { /* compiled code */ }
+ def foo3424(): scala.Int = { /* compiled code */ }
+ def foo3425(): scala.Int = { /* compiled code */ }
+ def foo3426(): scala.Int = { /* compiled code */ }
+ def foo3427(): scala.Int = { /* compiled code */ }
+ def foo3428(): scala.Int = { /* compiled code */ }
+ def foo3429(): scala.Int = { /* compiled code */ }
+ def foo3430(): scala.Int = { /* compiled code */ }
+ def foo3431(): scala.Int = { /* compiled code */ }
+ def foo3432(): scala.Int = { /* compiled code */ }
+ def foo3433(): scala.Int = { /* compiled code */ }
+ def foo3434(): scala.Int = { /* compiled code */ }
+ def foo3435(): scala.Int = { /* compiled code */ }
+ def foo3436(): scala.Int = { /* compiled code */ }
+ def foo3437(): scala.Int = { /* compiled code */ }
+ def foo3438(): scala.Int = { /* compiled code */ }
+ def foo3439(): scala.Int = { /* compiled code */ }
+ def foo3440(): scala.Int = { /* compiled code */ }
+ def foo3441(): scala.Int = { /* compiled code */ }
+ def foo3442(): scala.Int = { /* compiled code */ }
+ def foo3443(): scala.Int = { /* compiled code */ }
+ def foo3444(): scala.Int = { /* compiled code */ }
+ def foo3445(): scala.Int = { /* compiled code */ }
+ def foo3446(): scala.Int = { /* compiled code */ }
+ def foo3447(): scala.Int = { /* compiled code */ }
+ def foo3448(): scala.Int = { /* compiled code */ }
+ def foo3449(): scala.Int = { /* compiled code */ }
+ def foo3450(): scala.Int = { /* compiled code */ }
+ def foo3451(): scala.Int = { /* compiled code */ }
+ def foo3452(): scala.Int = { /* compiled code */ }
+ def foo3453(): scala.Int = { /* compiled code */ }
+ def foo3454(): scala.Int = { /* compiled code */ }
+ def foo3455(): scala.Int = { /* compiled code */ }
+ def foo3456(): scala.Int = { /* compiled code */ }
+ def foo3457(): scala.Int = { /* compiled code */ }
+ def foo3458(): scala.Int = { /* compiled code */ }
+ def foo3459(): scala.Int = { /* compiled code */ }
+ def foo3460(): scala.Int = { /* compiled code */ }
+ def foo3461(): scala.Int = { /* compiled code */ }
+ def foo3462(): scala.Int = { /* compiled code */ }
+ def foo3463(): scala.Int = { /* compiled code */ }
+ def foo3464(): scala.Int = { /* compiled code */ }
+ def foo3465(): scala.Int = { /* compiled code */ }
+ def foo3466(): scala.Int = { /* compiled code */ }
+ def foo3467(): scala.Int = { /* compiled code */ }
+ def foo3468(): scala.Int = { /* compiled code */ }
+ def foo3469(): scala.Int = { /* compiled code */ }
+ def foo3470(): scala.Int = { /* compiled code */ }
+ def foo3471(): scala.Int = { /* compiled code */ }
+ def foo3472(): scala.Int = { /* compiled code */ }
+ def foo3473(): scala.Int = { /* compiled code */ }
+ def foo3474(): scala.Int = { /* compiled code */ }
+ def foo3475(): scala.Int = { /* compiled code */ }
+ def foo3476(): scala.Int = { /* compiled code */ }
+ def foo3477(): scala.Int = { /* compiled code */ }
+ def foo3478(): scala.Int = { /* compiled code */ }
+ def foo3479(): scala.Int = { /* compiled code */ }
+ def foo3480(): scala.Int = { /* compiled code */ }
+ def foo3481(): scala.Int = { /* compiled code */ }
+ def foo3482(): scala.Int = { /* compiled code */ }
+ def foo3483(): scala.Int = { /* compiled code */ }
+ def foo3484(): scala.Int = { /* compiled code */ }
+ def foo3485(): scala.Int = { /* compiled code */ }
+ def foo3486(): scala.Int = { /* compiled code */ }
+ def foo3487(): scala.Int = { /* compiled code */ }
+ def foo3488(): scala.Int = { /* compiled code */ }
+ def foo3489(): scala.Int = { /* compiled code */ }
+ def foo3490(): scala.Int = { /* compiled code */ }
+ def foo3491(): scala.Int = { /* compiled code */ }
+ def foo3492(): scala.Int = { /* compiled code */ }
+ def foo3493(): scala.Int = { /* compiled code */ }
+ def foo3494(): scala.Int = { /* compiled code */ }
+ def foo3495(): scala.Int = { /* compiled code */ }
+ def foo3496(): scala.Int = { /* compiled code */ }
+ def foo3497(): scala.Int = { /* compiled code */ }
+ def foo3498(): scala.Int = { /* compiled code */ }
+ def foo3499(): scala.Int = { /* compiled code */ }
+ def foo3500(): scala.Int = { /* compiled code */ }
+}
diff --git a/test/files/scalap/t8679.scala b/test/files/scalap/t8679.scala
new file mode 100644
index 0000000000..f008a7af35
--- /dev/null
+++ b/test/files/scalap/t8679.scala
@@ -0,0 +1,3502 @@
+class T8679 {
+ def foo1(): Int = 3
+ def foo2(): Int = 4
+ def foo3(): Int = 5
+ def foo4(): Int = 6
+ def foo5(): Int = 7
+ def foo6(): Int = 8
+ def foo7(): Int = 9
+ def foo8(): Int = 10
+ def foo9(): Int = 11
+ def foo10(): Int = 12
+ def foo11(): Int = 13
+ def foo12(): Int = 14
+ def foo13(): Int = 15
+ def foo14(): Int = 16
+ def foo15(): Int = 17
+ def foo16(): Int = 18
+ def foo17(): Int = 19
+ def foo18(): Int = 20
+ def foo19(): Int = 21
+ def foo20(): Int = 22
+ def foo21(): Int = 23
+ def foo22(): Int = 24
+ def foo23(): Int = 25
+ def foo24(): Int = 26
+ def foo25(): Int = 27
+ def foo26(): Int = 28
+ def foo27(): Int = 29
+ def foo28(): Int = 30
+ def foo29(): Int = 31
+ def foo30(): Int = 32
+ def foo31(): Int = 33
+ def foo32(): Int = 34
+ def foo33(): Int = 35
+ def foo34(): Int = 36
+ def foo35(): Int = 37
+ def foo36(): Int = 38
+ def foo37(): Int = 39
+ def foo38(): Int = 40
+ def foo39(): Int = 41
+ def foo40(): Int = 42
+ def foo41(): Int = 43
+ def foo42(): Int = 44
+ def foo43(): Int = 45
+ def foo44(): Int = 46
+ def foo45(): Int = 47
+ def foo46(): Int = 48
+ def foo47(): Int = 49
+ def foo48(): Int = 50
+ def foo49(): Int = 51
+ def foo50(): Int = 52
+ def foo51(): Int = 53
+ def foo52(): Int = 54
+ def foo53(): Int = 55
+ def foo54(): Int = 56
+ def foo55(): Int = 57
+ def foo56(): Int = 58
+ def foo57(): Int = 59
+ def foo58(): Int = 60
+ def foo59(): Int = 61
+ def foo60(): Int = 62
+ def foo61(): Int = 63
+ def foo62(): Int = 64
+ def foo63(): Int = 65
+ def foo64(): Int = 66
+ def foo65(): Int = 67
+ def foo66(): Int = 68
+ def foo67(): Int = 69
+ def foo68(): Int = 70
+ def foo69(): Int = 71
+ def foo70(): Int = 72
+ def foo71(): Int = 73
+ def foo72(): Int = 74
+ def foo73(): Int = 75
+ def foo74(): Int = 76
+ def foo75(): Int = 77
+ def foo76(): Int = 78
+ def foo77(): Int = 79
+ def foo78(): Int = 80
+ def foo79(): Int = 81
+ def foo80(): Int = 82
+ def foo81(): Int = 83
+ def foo82(): Int = 84
+ def foo83(): Int = 85
+ def foo84(): Int = 86
+ def foo85(): Int = 87
+ def foo86(): Int = 88
+ def foo87(): Int = 89
+ def foo88(): Int = 90
+ def foo89(): Int = 91
+ def foo90(): Int = 92
+ def foo91(): Int = 93
+ def foo92(): Int = 94
+ def foo93(): Int = 95
+ def foo94(): Int = 96
+ def foo95(): Int = 97
+ def foo96(): Int = 98
+ def foo97(): Int = 99
+ def foo98(): Int = 100
+ def foo99(): Int = 101
+ def foo100(): Int = 102
+ def foo101(): Int = 103
+ def foo102(): Int = 104
+ def foo103(): Int = 105
+ def foo104(): Int = 106
+ def foo105(): Int = 107
+ def foo106(): Int = 108
+ def foo107(): Int = 109
+ def foo108(): Int = 110
+ def foo109(): Int = 111
+ def foo110(): Int = 112
+ def foo111(): Int = 113
+ def foo112(): Int = 114
+ def foo113(): Int = 115
+ def foo114(): Int = 116
+ def foo115(): Int = 117
+ def foo116(): Int = 118
+ def foo117(): Int = 119
+ def foo118(): Int = 120
+ def foo119(): Int = 121
+ def foo120(): Int = 122
+ def foo121(): Int = 123
+ def foo122(): Int = 124
+ def foo123(): Int = 125
+ def foo124(): Int = 126
+ def foo125(): Int = 127
+ def foo126(): Int = 128
+ def foo127(): Int = 129
+ def foo128(): Int = 130
+ def foo129(): Int = 131
+ def foo130(): Int = 132
+ def foo131(): Int = 133
+ def foo132(): Int = 134
+ def foo133(): Int = 135
+ def foo134(): Int = 136
+ def foo135(): Int = 137
+ def foo136(): Int = 138
+ def foo137(): Int = 139
+ def foo138(): Int = 140
+ def foo139(): Int = 141
+ def foo140(): Int = 142
+ def foo141(): Int = 143
+ def foo142(): Int = 144
+ def foo143(): Int = 145
+ def foo144(): Int = 146
+ def foo145(): Int = 147
+ def foo146(): Int = 148
+ def foo147(): Int = 149
+ def foo148(): Int = 150
+ def foo149(): Int = 151
+ def foo150(): Int = 152
+ def foo151(): Int = 153
+ def foo152(): Int = 154
+ def foo153(): Int = 155
+ def foo154(): Int = 156
+ def foo155(): Int = 157
+ def foo156(): Int = 158
+ def foo157(): Int = 159
+ def foo158(): Int = 160
+ def foo159(): Int = 161
+ def foo160(): Int = 162
+ def foo161(): Int = 163
+ def foo162(): Int = 164
+ def foo163(): Int = 165
+ def foo164(): Int = 166
+ def foo165(): Int = 167
+ def foo166(): Int = 168
+ def foo167(): Int = 169
+ def foo168(): Int = 170
+ def foo169(): Int = 171
+ def foo170(): Int = 172
+ def foo171(): Int = 173
+ def foo172(): Int = 174
+ def foo173(): Int = 175
+ def foo174(): Int = 176
+ def foo175(): Int = 177
+ def foo176(): Int = 178
+ def foo177(): Int = 179
+ def foo178(): Int = 180
+ def foo179(): Int = 181
+ def foo180(): Int = 182
+ def foo181(): Int = 183
+ def foo182(): Int = 184
+ def foo183(): Int = 185
+ def foo184(): Int = 186
+ def foo185(): Int = 187
+ def foo186(): Int = 188
+ def foo187(): Int = 189
+ def foo188(): Int = 190
+ def foo189(): Int = 191
+ def foo190(): Int = 192
+ def foo191(): Int = 193
+ def foo192(): Int = 194
+ def foo193(): Int = 195
+ def foo194(): Int = 196
+ def foo195(): Int = 197
+ def foo196(): Int = 198
+ def foo197(): Int = 199
+ def foo198(): Int = 200
+ def foo199(): Int = 201
+ def foo200(): Int = 202
+ def foo201(): Int = 203
+ def foo202(): Int = 204
+ def foo203(): Int = 205
+ def foo204(): Int = 206
+ def foo205(): Int = 207
+ def foo206(): Int = 208
+ def foo207(): Int = 209
+ def foo208(): Int = 210
+ def foo209(): Int = 211
+ def foo210(): Int = 212
+ def foo211(): Int = 213
+ def foo212(): Int = 214
+ def foo213(): Int = 215
+ def foo214(): Int = 216
+ def foo215(): Int = 217
+ def foo216(): Int = 218
+ def foo217(): Int = 219
+ def foo218(): Int = 220
+ def foo219(): Int = 221
+ def foo220(): Int = 222
+ def foo221(): Int = 223
+ def foo222(): Int = 224
+ def foo223(): Int = 225
+ def foo224(): Int = 226
+ def foo225(): Int = 227
+ def foo226(): Int = 228
+ def foo227(): Int = 229
+ def foo228(): Int = 230
+ def foo229(): Int = 231
+ def foo230(): Int = 232
+ def foo231(): Int = 233
+ def foo232(): Int = 234
+ def foo233(): Int = 235
+ def foo234(): Int = 236
+ def foo235(): Int = 237
+ def foo236(): Int = 238
+ def foo237(): Int = 239
+ def foo238(): Int = 240
+ def foo239(): Int = 241
+ def foo240(): Int = 242
+ def foo241(): Int = 243
+ def foo242(): Int = 244
+ def foo243(): Int = 245
+ def foo244(): Int = 246
+ def foo245(): Int = 247
+ def foo246(): Int = 248
+ def foo247(): Int = 249
+ def foo248(): Int = 250
+ def foo249(): Int = 251
+ def foo250(): Int = 252
+ def foo251(): Int = 253
+ def foo252(): Int = 254
+ def foo253(): Int = 255
+ def foo254(): Int = 256
+ def foo255(): Int = 257
+ def foo256(): Int = 258
+ def foo257(): Int = 259
+ def foo258(): Int = 260
+ def foo259(): Int = 261
+ def foo260(): Int = 262
+ def foo261(): Int = 263
+ def foo262(): Int = 264
+ def foo263(): Int = 265
+ def foo264(): Int = 266
+ def foo265(): Int = 267
+ def foo266(): Int = 268
+ def foo267(): Int = 269
+ def foo268(): Int = 270
+ def foo269(): Int = 271
+ def foo270(): Int = 272
+ def foo271(): Int = 273
+ def foo272(): Int = 274
+ def foo273(): Int = 275
+ def foo274(): Int = 276
+ def foo275(): Int = 277
+ def foo276(): Int = 278
+ def foo277(): Int = 279
+ def foo278(): Int = 280
+ def foo279(): Int = 281
+ def foo280(): Int = 282
+ def foo281(): Int = 283
+ def foo282(): Int = 284
+ def foo283(): Int = 285
+ def foo284(): Int = 286
+ def foo285(): Int = 287
+ def foo286(): Int = 288
+ def foo287(): Int = 289
+ def foo288(): Int = 290
+ def foo289(): Int = 291
+ def foo290(): Int = 292
+ def foo291(): Int = 293
+ def foo292(): Int = 294
+ def foo293(): Int = 295
+ def foo294(): Int = 296
+ def foo295(): Int = 297
+ def foo296(): Int = 298
+ def foo297(): Int = 299
+ def foo298(): Int = 300
+ def foo299(): Int = 301
+ def foo300(): Int = 302
+ def foo301(): Int = 303
+ def foo302(): Int = 304
+ def foo303(): Int = 305
+ def foo304(): Int = 306
+ def foo305(): Int = 307
+ def foo306(): Int = 308
+ def foo307(): Int = 309
+ def foo308(): Int = 310
+ def foo309(): Int = 311
+ def foo310(): Int = 312
+ def foo311(): Int = 313
+ def foo312(): Int = 314
+ def foo313(): Int = 315
+ def foo314(): Int = 316
+ def foo315(): Int = 317
+ def foo316(): Int = 318
+ def foo317(): Int = 319
+ def foo318(): Int = 320
+ def foo319(): Int = 321
+ def foo320(): Int = 322
+ def foo321(): Int = 323
+ def foo322(): Int = 324
+ def foo323(): Int = 325
+ def foo324(): Int = 326
+ def foo325(): Int = 327
+ def foo326(): Int = 328
+ def foo327(): Int = 329
+ def foo328(): Int = 330
+ def foo329(): Int = 331
+ def foo330(): Int = 332
+ def foo331(): Int = 333
+ def foo332(): Int = 334
+ def foo333(): Int = 335
+ def foo334(): Int = 336
+ def foo335(): Int = 337
+ def foo336(): Int = 338
+ def foo337(): Int = 339
+ def foo338(): Int = 340
+ def foo339(): Int = 341
+ def foo340(): Int = 342
+ def foo341(): Int = 343
+ def foo342(): Int = 344
+ def foo343(): Int = 345
+ def foo344(): Int = 346
+ def foo345(): Int = 347
+ def foo346(): Int = 348
+ def foo347(): Int = 349
+ def foo348(): Int = 350
+ def foo349(): Int = 351
+ def foo350(): Int = 352
+ def foo351(): Int = 353
+ def foo352(): Int = 354
+ def foo353(): Int = 355
+ def foo354(): Int = 356
+ def foo355(): Int = 357
+ def foo356(): Int = 358
+ def foo357(): Int = 359
+ def foo358(): Int = 360
+ def foo359(): Int = 361
+ def foo360(): Int = 362
+ def foo361(): Int = 363
+ def foo362(): Int = 364
+ def foo363(): Int = 365
+ def foo364(): Int = 366
+ def foo365(): Int = 367
+ def foo366(): Int = 368
+ def foo367(): Int = 369
+ def foo368(): Int = 370
+ def foo369(): Int = 371
+ def foo370(): Int = 372
+ def foo371(): Int = 373
+ def foo372(): Int = 374
+ def foo373(): Int = 375
+ def foo374(): Int = 376
+ def foo375(): Int = 377
+ def foo376(): Int = 378
+ def foo377(): Int = 379
+ def foo378(): Int = 380
+ def foo379(): Int = 381
+ def foo380(): Int = 382
+ def foo381(): Int = 383
+ def foo382(): Int = 384
+ def foo383(): Int = 385
+ def foo384(): Int = 386
+ def foo385(): Int = 387
+ def foo386(): Int = 388
+ def foo387(): Int = 389
+ def foo388(): Int = 390
+ def foo389(): Int = 391
+ def foo390(): Int = 392
+ def foo391(): Int = 393
+ def foo392(): Int = 394
+ def foo393(): Int = 395
+ def foo394(): Int = 396
+ def foo395(): Int = 397
+ def foo396(): Int = 398
+ def foo397(): Int = 399
+ def foo398(): Int = 400
+ def foo399(): Int = 401
+ def foo400(): Int = 402
+ def foo401(): Int = 403
+ def foo402(): Int = 404
+ def foo403(): Int = 405
+ def foo404(): Int = 406
+ def foo405(): Int = 407
+ def foo406(): Int = 408
+ def foo407(): Int = 409
+ def foo408(): Int = 410
+ def foo409(): Int = 411
+ def foo410(): Int = 412
+ def foo411(): Int = 413
+ def foo412(): Int = 414
+ def foo413(): Int = 415
+ def foo414(): Int = 416
+ def foo415(): Int = 417
+ def foo416(): Int = 418
+ def foo417(): Int = 419
+ def foo418(): Int = 420
+ def foo419(): Int = 421
+ def foo420(): Int = 422
+ def foo421(): Int = 423
+ def foo422(): Int = 424
+ def foo423(): Int = 425
+ def foo424(): Int = 426
+ def foo425(): Int = 427
+ def foo426(): Int = 428
+ def foo427(): Int = 429
+ def foo428(): Int = 430
+ def foo429(): Int = 431
+ def foo430(): Int = 432
+ def foo431(): Int = 433
+ def foo432(): Int = 434
+ def foo433(): Int = 435
+ def foo434(): Int = 436
+ def foo435(): Int = 437
+ def foo436(): Int = 438
+ def foo437(): Int = 439
+ def foo438(): Int = 440
+ def foo439(): Int = 441
+ def foo440(): Int = 442
+ def foo441(): Int = 443
+ def foo442(): Int = 444
+ def foo443(): Int = 445
+ def foo444(): Int = 446
+ def foo445(): Int = 447
+ def foo446(): Int = 448
+ def foo447(): Int = 449
+ def foo448(): Int = 450
+ def foo449(): Int = 451
+ def foo450(): Int = 452
+ def foo451(): Int = 453
+ def foo452(): Int = 454
+ def foo453(): Int = 455
+ def foo454(): Int = 456
+ def foo455(): Int = 457
+ def foo456(): Int = 458
+ def foo457(): Int = 459
+ def foo458(): Int = 460
+ def foo459(): Int = 461
+ def foo460(): Int = 462
+ def foo461(): Int = 463
+ def foo462(): Int = 464
+ def foo463(): Int = 465
+ def foo464(): Int = 466
+ def foo465(): Int = 467
+ def foo466(): Int = 468
+ def foo467(): Int = 469
+ def foo468(): Int = 470
+ def foo469(): Int = 471
+ def foo470(): Int = 472
+ def foo471(): Int = 473
+ def foo472(): Int = 474
+ def foo473(): Int = 475
+ def foo474(): Int = 476
+ def foo475(): Int = 477
+ def foo476(): Int = 478
+ def foo477(): Int = 479
+ def foo478(): Int = 480
+ def foo479(): Int = 481
+ def foo480(): Int = 482
+ def foo481(): Int = 483
+ def foo482(): Int = 484
+ def foo483(): Int = 485
+ def foo484(): Int = 486
+ def foo485(): Int = 487
+ def foo486(): Int = 488
+ def foo487(): Int = 489
+ def foo488(): Int = 490
+ def foo489(): Int = 491
+ def foo490(): Int = 492
+ def foo491(): Int = 493
+ def foo492(): Int = 494
+ def foo493(): Int = 495
+ def foo494(): Int = 496
+ def foo495(): Int = 497
+ def foo496(): Int = 498
+ def foo497(): Int = 499
+ def foo498(): Int = 500
+ def foo499(): Int = 501
+ def foo500(): Int = 502
+ def foo501(): Int = 503
+ def foo502(): Int = 504
+ def foo503(): Int = 505
+ def foo504(): Int = 506
+ def foo505(): Int = 507
+ def foo506(): Int = 508
+ def foo507(): Int = 509
+ def foo508(): Int = 510
+ def foo509(): Int = 511
+ def foo510(): Int = 512
+ def foo511(): Int = 513
+ def foo512(): Int = 514
+ def foo513(): Int = 515
+ def foo514(): Int = 516
+ def foo515(): Int = 517
+ def foo516(): Int = 518
+ def foo517(): Int = 519
+ def foo518(): Int = 520
+ def foo519(): Int = 521
+ def foo520(): Int = 522
+ def foo521(): Int = 523
+ def foo522(): Int = 524
+ def foo523(): Int = 525
+ def foo524(): Int = 526
+ def foo525(): Int = 527
+ def foo526(): Int = 528
+ def foo527(): Int = 529
+ def foo528(): Int = 530
+ def foo529(): Int = 531
+ def foo530(): Int = 532
+ def foo531(): Int = 533
+ def foo532(): Int = 534
+ def foo533(): Int = 535
+ def foo534(): Int = 536
+ def foo535(): Int = 537
+ def foo536(): Int = 538
+ def foo537(): Int = 539
+ def foo538(): Int = 540
+ def foo539(): Int = 541
+ def foo540(): Int = 542
+ def foo541(): Int = 543
+ def foo542(): Int = 544
+ def foo543(): Int = 545
+ def foo544(): Int = 546
+ def foo545(): Int = 547
+ def foo546(): Int = 548
+ def foo547(): Int = 549
+ def foo548(): Int = 550
+ def foo549(): Int = 551
+ def foo550(): Int = 552
+ def foo551(): Int = 553
+ def foo552(): Int = 554
+ def foo553(): Int = 555
+ def foo554(): Int = 556
+ def foo555(): Int = 557
+ def foo556(): Int = 558
+ def foo557(): Int = 559
+ def foo558(): Int = 560
+ def foo559(): Int = 561
+ def foo560(): Int = 562
+ def foo561(): Int = 563
+ def foo562(): Int = 564
+ def foo563(): Int = 565
+ def foo564(): Int = 566
+ def foo565(): Int = 567
+ def foo566(): Int = 568
+ def foo567(): Int = 569
+ def foo568(): Int = 570
+ def foo569(): Int = 571
+ def foo570(): Int = 572
+ def foo571(): Int = 573
+ def foo572(): Int = 574
+ def foo573(): Int = 575
+ def foo574(): Int = 576
+ def foo575(): Int = 577
+ def foo576(): Int = 578
+ def foo577(): Int = 579
+ def foo578(): Int = 580
+ def foo579(): Int = 581
+ def foo580(): Int = 582
+ def foo581(): Int = 583
+ def foo582(): Int = 584
+ def foo583(): Int = 585
+ def foo584(): Int = 586
+ def foo585(): Int = 587
+ def foo586(): Int = 588
+ def foo587(): Int = 589
+ def foo588(): Int = 590
+ def foo589(): Int = 591
+ def foo590(): Int = 592
+ def foo591(): Int = 593
+ def foo592(): Int = 594
+ def foo593(): Int = 595
+ def foo594(): Int = 596
+ def foo595(): Int = 597
+ def foo596(): Int = 598
+ def foo597(): Int = 599
+ def foo598(): Int = 600
+ def foo599(): Int = 601
+ def foo600(): Int = 602
+ def foo601(): Int = 603
+ def foo602(): Int = 604
+ def foo603(): Int = 605
+ def foo604(): Int = 606
+ def foo605(): Int = 607
+ def foo606(): Int = 608
+ def foo607(): Int = 609
+ def foo608(): Int = 610
+ def foo609(): Int = 611
+ def foo610(): Int = 612
+ def foo611(): Int = 613
+ def foo612(): Int = 614
+ def foo613(): Int = 615
+ def foo614(): Int = 616
+ def foo615(): Int = 617
+ def foo616(): Int = 618
+ def foo617(): Int = 619
+ def foo618(): Int = 620
+ def foo619(): Int = 621
+ def foo620(): Int = 622
+ def foo621(): Int = 623
+ def foo622(): Int = 624
+ def foo623(): Int = 625
+ def foo624(): Int = 626
+ def foo625(): Int = 627
+ def foo626(): Int = 628
+ def foo627(): Int = 629
+ def foo628(): Int = 630
+ def foo629(): Int = 631
+ def foo630(): Int = 632
+ def foo631(): Int = 633
+ def foo632(): Int = 634
+ def foo633(): Int = 635
+ def foo634(): Int = 636
+ def foo635(): Int = 637
+ def foo636(): Int = 638
+ def foo637(): Int = 639
+ def foo638(): Int = 640
+ def foo639(): Int = 641
+ def foo640(): Int = 642
+ def foo641(): Int = 643
+ def foo642(): Int = 644
+ def foo643(): Int = 645
+ def foo644(): Int = 646
+ def foo645(): Int = 647
+ def foo646(): Int = 648
+ def foo647(): Int = 649
+ def foo648(): Int = 650
+ def foo649(): Int = 651
+ def foo650(): Int = 652
+ def foo651(): Int = 653
+ def foo652(): Int = 654
+ def foo653(): Int = 655
+ def foo654(): Int = 656
+ def foo655(): Int = 657
+ def foo656(): Int = 658
+ def foo657(): Int = 659
+ def foo658(): Int = 660
+ def foo659(): Int = 661
+ def foo660(): Int = 662
+ def foo661(): Int = 663
+ def foo662(): Int = 664
+ def foo663(): Int = 665
+ def foo664(): Int = 666
+ def foo665(): Int = 667
+ def foo666(): Int = 668
+ def foo667(): Int = 669
+ def foo668(): Int = 670
+ def foo669(): Int = 671
+ def foo670(): Int = 672
+ def foo671(): Int = 673
+ def foo672(): Int = 674
+ def foo673(): Int = 675
+ def foo674(): Int = 676
+ def foo675(): Int = 677
+ def foo676(): Int = 678
+ def foo677(): Int = 679
+ def foo678(): Int = 680
+ def foo679(): Int = 681
+ def foo680(): Int = 682
+ def foo681(): Int = 683
+ def foo682(): Int = 684
+ def foo683(): Int = 685
+ def foo684(): Int = 686
+ def foo685(): Int = 687
+ def foo686(): Int = 688
+ def foo687(): Int = 689
+ def foo688(): Int = 690
+ def foo689(): Int = 691
+ def foo690(): Int = 692
+ def foo691(): Int = 693
+ def foo692(): Int = 694
+ def foo693(): Int = 695
+ def foo694(): Int = 696
+ def foo695(): Int = 697
+ def foo696(): Int = 698
+ def foo697(): Int = 699
+ def foo698(): Int = 700
+ def foo699(): Int = 701
+ def foo700(): Int = 702
+ def foo701(): Int = 703
+ def foo702(): Int = 704
+ def foo703(): Int = 705
+ def foo704(): Int = 706
+ def foo705(): Int = 707
+ def foo706(): Int = 708
+ def foo707(): Int = 709
+ def foo708(): Int = 710
+ def foo709(): Int = 711
+ def foo710(): Int = 712
+ def foo711(): Int = 713
+ def foo712(): Int = 714
+ def foo713(): Int = 715
+ def foo714(): Int = 716
+ def foo715(): Int = 717
+ def foo716(): Int = 718
+ def foo717(): Int = 719
+ def foo718(): Int = 720
+ def foo719(): Int = 721
+ def foo720(): Int = 722
+ def foo721(): Int = 723
+ def foo722(): Int = 724
+ def foo723(): Int = 725
+ def foo724(): Int = 726
+ def foo725(): Int = 727
+ def foo726(): Int = 728
+ def foo727(): Int = 729
+ def foo728(): Int = 730
+ def foo729(): Int = 731
+ def foo730(): Int = 732
+ def foo731(): Int = 733
+ def foo732(): Int = 734
+ def foo733(): Int = 735
+ def foo734(): Int = 736
+ def foo735(): Int = 737
+ def foo736(): Int = 738
+ def foo737(): Int = 739
+ def foo738(): Int = 740
+ def foo739(): Int = 741
+ def foo740(): Int = 742
+ def foo741(): Int = 743
+ def foo742(): Int = 744
+ def foo743(): Int = 745
+ def foo744(): Int = 746
+ def foo745(): Int = 747
+ def foo746(): Int = 748
+ def foo747(): Int = 749
+ def foo748(): Int = 750
+ def foo749(): Int = 751
+ def foo750(): Int = 752
+ def foo751(): Int = 753
+ def foo752(): Int = 754
+ def foo753(): Int = 755
+ def foo754(): Int = 756
+ def foo755(): Int = 757
+ def foo756(): Int = 758
+ def foo757(): Int = 759
+ def foo758(): Int = 760
+ def foo759(): Int = 761
+ def foo760(): Int = 762
+ def foo761(): Int = 763
+ def foo762(): Int = 764
+ def foo763(): Int = 765
+ def foo764(): Int = 766
+ def foo765(): Int = 767
+ def foo766(): Int = 768
+ def foo767(): Int = 769
+ def foo768(): Int = 770
+ def foo769(): Int = 771
+ def foo770(): Int = 772
+ def foo771(): Int = 773
+ def foo772(): Int = 774
+ def foo773(): Int = 775
+ def foo774(): Int = 776
+ def foo775(): Int = 777
+ def foo776(): Int = 778
+ def foo777(): Int = 779
+ def foo778(): Int = 780
+ def foo779(): Int = 781
+ def foo780(): Int = 782
+ def foo781(): Int = 783
+ def foo782(): Int = 784
+ def foo783(): Int = 785
+ def foo784(): Int = 786
+ def foo785(): Int = 787
+ def foo786(): Int = 788
+ def foo787(): Int = 789
+ def foo788(): Int = 790
+ def foo789(): Int = 791
+ def foo790(): Int = 792
+ def foo791(): Int = 793
+ def foo792(): Int = 794
+ def foo793(): Int = 795
+ def foo794(): Int = 796
+ def foo795(): Int = 797
+ def foo796(): Int = 798
+ def foo797(): Int = 799
+ def foo798(): Int = 800
+ def foo799(): Int = 801
+ def foo800(): Int = 802
+ def foo801(): Int = 803
+ def foo802(): Int = 804
+ def foo803(): Int = 805
+ def foo804(): Int = 806
+ def foo805(): Int = 807
+ def foo806(): Int = 808
+ def foo807(): Int = 809
+ def foo808(): Int = 810
+ def foo809(): Int = 811
+ def foo810(): Int = 812
+ def foo811(): Int = 813
+ def foo812(): Int = 814
+ def foo813(): Int = 815
+ def foo814(): Int = 816
+ def foo815(): Int = 817
+ def foo816(): Int = 818
+ def foo817(): Int = 819
+ def foo818(): Int = 820
+ def foo819(): Int = 821
+ def foo820(): Int = 822
+ def foo821(): Int = 823
+ def foo822(): Int = 824
+ def foo823(): Int = 825
+ def foo824(): Int = 826
+ def foo825(): Int = 827
+ def foo826(): Int = 828
+ def foo827(): Int = 829
+ def foo828(): Int = 830
+ def foo829(): Int = 831
+ def foo830(): Int = 832
+ def foo831(): Int = 833
+ def foo832(): Int = 834
+ def foo833(): Int = 835
+ def foo834(): Int = 836
+ def foo835(): Int = 837
+ def foo836(): Int = 838
+ def foo837(): Int = 839
+ def foo838(): Int = 840
+ def foo839(): Int = 841
+ def foo840(): Int = 842
+ def foo841(): Int = 843
+ def foo842(): Int = 844
+ def foo843(): Int = 845
+ def foo844(): Int = 846
+ def foo845(): Int = 847
+ def foo846(): Int = 848
+ def foo847(): Int = 849
+ def foo848(): Int = 850
+ def foo849(): Int = 851
+ def foo850(): Int = 852
+ def foo851(): Int = 853
+ def foo852(): Int = 854
+ def foo853(): Int = 855
+ def foo854(): Int = 856
+ def foo855(): Int = 857
+ def foo856(): Int = 858
+ def foo857(): Int = 859
+ def foo858(): Int = 860
+ def foo859(): Int = 861
+ def foo860(): Int = 862
+ def foo861(): Int = 863
+ def foo862(): Int = 864
+ def foo863(): Int = 865
+ def foo864(): Int = 866
+ def foo865(): Int = 867
+ def foo866(): Int = 868
+ def foo867(): Int = 869
+ def foo868(): Int = 870
+ def foo869(): Int = 871
+ def foo870(): Int = 872
+ def foo871(): Int = 873
+ def foo872(): Int = 874
+ def foo873(): Int = 875
+ def foo874(): Int = 876
+ def foo875(): Int = 877
+ def foo876(): Int = 878
+ def foo877(): Int = 879
+ def foo878(): Int = 880
+ def foo879(): Int = 881
+ def foo880(): Int = 882
+ def foo881(): Int = 883
+ def foo882(): Int = 884
+ def foo883(): Int = 885
+ def foo884(): Int = 886
+ def foo885(): Int = 887
+ def foo886(): Int = 888
+ def foo887(): Int = 889
+ def foo888(): Int = 890
+ def foo889(): Int = 891
+ def foo890(): Int = 892
+ def foo891(): Int = 893
+ def foo892(): Int = 894
+ def foo893(): Int = 895
+ def foo894(): Int = 896
+ def foo895(): Int = 897
+ def foo896(): Int = 898
+ def foo897(): Int = 899
+ def foo898(): Int = 900
+ def foo899(): Int = 901
+ def foo900(): Int = 902
+ def foo901(): Int = 903
+ def foo902(): Int = 904
+ def foo903(): Int = 905
+ def foo904(): Int = 906
+ def foo905(): Int = 907
+ def foo906(): Int = 908
+ def foo907(): Int = 909
+ def foo908(): Int = 910
+ def foo909(): Int = 911
+ def foo910(): Int = 912
+ def foo911(): Int = 913
+ def foo912(): Int = 914
+ def foo913(): Int = 915
+ def foo914(): Int = 916
+ def foo915(): Int = 917
+ def foo916(): Int = 918
+ def foo917(): Int = 919
+ def foo918(): Int = 920
+ def foo919(): Int = 921
+ def foo920(): Int = 922
+ def foo921(): Int = 923
+ def foo922(): Int = 924
+ def foo923(): Int = 925
+ def foo924(): Int = 926
+ def foo925(): Int = 927
+ def foo926(): Int = 928
+ def foo927(): Int = 929
+ def foo928(): Int = 930
+ def foo929(): Int = 931
+ def foo930(): Int = 932
+ def foo931(): Int = 933
+ def foo932(): Int = 934
+ def foo933(): Int = 935
+ def foo934(): Int = 936
+ def foo935(): Int = 937
+ def foo936(): Int = 938
+ def foo937(): Int = 939
+ def foo938(): Int = 940
+ def foo939(): Int = 941
+ def foo940(): Int = 942
+ def foo941(): Int = 943
+ def foo942(): Int = 944
+ def foo943(): Int = 945
+ def foo944(): Int = 946
+ def foo945(): Int = 947
+ def foo946(): Int = 948
+ def foo947(): Int = 949
+ def foo948(): Int = 950
+ def foo949(): Int = 951
+ def foo950(): Int = 952
+ def foo951(): Int = 953
+ def foo952(): Int = 954
+ def foo953(): Int = 955
+ def foo954(): Int = 956
+ def foo955(): Int = 957
+ def foo956(): Int = 958
+ def foo957(): Int = 959
+ def foo958(): Int = 960
+ def foo959(): Int = 961
+ def foo960(): Int = 962
+ def foo961(): Int = 963
+ def foo962(): Int = 964
+ def foo963(): Int = 965
+ def foo964(): Int = 966
+ def foo965(): Int = 967
+ def foo966(): Int = 968
+ def foo967(): Int = 969
+ def foo968(): Int = 970
+ def foo969(): Int = 971
+ def foo970(): Int = 972
+ def foo971(): Int = 973
+ def foo972(): Int = 974
+ def foo973(): Int = 975
+ def foo974(): Int = 976
+ def foo975(): Int = 977
+ def foo976(): Int = 978
+ def foo977(): Int = 979
+ def foo978(): Int = 980
+ def foo979(): Int = 981
+ def foo980(): Int = 982
+ def foo981(): Int = 983
+ def foo982(): Int = 984
+ def foo983(): Int = 985
+ def foo984(): Int = 986
+ def foo985(): Int = 987
+ def foo986(): Int = 988
+ def foo987(): Int = 989
+ def foo988(): Int = 990
+ def foo989(): Int = 991
+ def foo990(): Int = 992
+ def foo991(): Int = 993
+ def foo992(): Int = 994
+ def foo993(): Int = 995
+ def foo994(): Int = 996
+ def foo995(): Int = 997
+ def foo996(): Int = 998
+ def foo997(): Int = 999
+ def foo998(): Int = 1000
+ def foo999(): Int = 1001
+ def foo1000(): Int = 1002
+ def foo1001(): Int = 1003
+ def foo1002(): Int = 1004
+ def foo1003(): Int = 1005
+ def foo1004(): Int = 1006
+ def foo1005(): Int = 1007
+ def foo1006(): Int = 1008
+ def foo1007(): Int = 1009
+ def foo1008(): Int = 1010
+ def foo1009(): Int = 1011
+ def foo1010(): Int = 1012
+ def foo1011(): Int = 1013
+ def foo1012(): Int = 1014
+ def foo1013(): Int = 1015
+ def foo1014(): Int = 1016
+ def foo1015(): Int = 1017
+ def foo1016(): Int = 1018
+ def foo1017(): Int = 1019
+ def foo1018(): Int = 1020
+ def foo1019(): Int = 1021
+ def foo1020(): Int = 1022
+ def foo1021(): Int = 1023
+ def foo1022(): Int = 1024
+ def foo1023(): Int = 1025
+ def foo1024(): Int = 1026
+ def foo1025(): Int = 1027
+ def foo1026(): Int = 1028
+ def foo1027(): Int = 1029
+ def foo1028(): Int = 1030
+ def foo1029(): Int = 1031
+ def foo1030(): Int = 1032
+ def foo1031(): Int = 1033
+ def foo1032(): Int = 1034
+ def foo1033(): Int = 1035
+ def foo1034(): Int = 1036
+ def foo1035(): Int = 1037
+ def foo1036(): Int = 1038
+ def foo1037(): Int = 1039
+ def foo1038(): Int = 1040
+ def foo1039(): Int = 1041
+ def foo1040(): Int = 1042
+ def foo1041(): Int = 1043
+ def foo1042(): Int = 1044
+ def foo1043(): Int = 1045
+ def foo1044(): Int = 1046
+ def foo1045(): Int = 1047
+ def foo1046(): Int = 1048
+ def foo1047(): Int = 1049
+ def foo1048(): Int = 1050
+ def foo1049(): Int = 1051
+ def foo1050(): Int = 1052
+ def foo1051(): Int = 1053
+ def foo1052(): Int = 1054
+ def foo1053(): Int = 1055
+ def foo1054(): Int = 1056
+ def foo1055(): Int = 1057
+ def foo1056(): Int = 1058
+ def foo1057(): Int = 1059
+ def foo1058(): Int = 1060
+ def foo1059(): Int = 1061
+ def foo1060(): Int = 1062
+ def foo1061(): Int = 1063
+ def foo1062(): Int = 1064
+ def foo1063(): Int = 1065
+ def foo1064(): Int = 1066
+ def foo1065(): Int = 1067
+ def foo1066(): Int = 1068
+ def foo1067(): Int = 1069
+ def foo1068(): Int = 1070
+ def foo1069(): Int = 1071
+ def foo1070(): Int = 1072
+ def foo1071(): Int = 1073
+ def foo1072(): Int = 1074
+ def foo1073(): Int = 1075
+ def foo1074(): Int = 1076
+ def foo1075(): Int = 1077
+ def foo1076(): Int = 1078
+ def foo1077(): Int = 1079
+ def foo1078(): Int = 1080
+ def foo1079(): Int = 1081
+ def foo1080(): Int = 1082
+ def foo1081(): Int = 1083
+ def foo1082(): Int = 1084
+ def foo1083(): Int = 1085
+ def foo1084(): Int = 1086
+ def foo1085(): Int = 1087
+ def foo1086(): Int = 1088
+ def foo1087(): Int = 1089
+ def foo1088(): Int = 1090
+ def foo1089(): Int = 1091
+ def foo1090(): Int = 1092
+ def foo1091(): Int = 1093
+ def foo1092(): Int = 1094
+ def foo1093(): Int = 1095
+ def foo1094(): Int = 1096
+ def foo1095(): Int = 1097
+ def foo1096(): Int = 1098
+ def foo1097(): Int = 1099
+ def foo1098(): Int = 1100
+ def foo1099(): Int = 1101
+ def foo1100(): Int = 1102
+ def foo1101(): Int = 1103
+ def foo1102(): Int = 1104
+ def foo1103(): Int = 1105
+ def foo1104(): Int = 1106
+ def foo1105(): Int = 1107
+ def foo1106(): Int = 1108
+ def foo1107(): Int = 1109
+ def foo1108(): Int = 1110
+ def foo1109(): Int = 1111
+ def foo1110(): Int = 1112
+ def foo1111(): Int = 1113
+ def foo1112(): Int = 1114
+ def foo1113(): Int = 1115
+ def foo1114(): Int = 1116
+ def foo1115(): Int = 1117
+ def foo1116(): Int = 1118
+ def foo1117(): Int = 1119
+ def foo1118(): Int = 1120
+ def foo1119(): Int = 1121
+ def foo1120(): Int = 1122
+ def foo1121(): Int = 1123
+ def foo1122(): Int = 1124
+ def foo1123(): Int = 1125
+ def foo1124(): Int = 1126
+ def foo1125(): Int = 1127
+ def foo1126(): Int = 1128
+ def foo1127(): Int = 1129
+ def foo1128(): Int = 1130
+ def foo1129(): Int = 1131
+ def foo1130(): Int = 1132
+ def foo1131(): Int = 1133
+ def foo1132(): Int = 1134
+ def foo1133(): Int = 1135
+ def foo1134(): Int = 1136
+ def foo1135(): Int = 1137
+ def foo1136(): Int = 1138
+ def foo1137(): Int = 1139
+ def foo1138(): Int = 1140
+ def foo1139(): Int = 1141
+ def foo1140(): Int = 1142
+ def foo1141(): Int = 1143
+ def foo1142(): Int = 1144
+ def foo1143(): Int = 1145
+ def foo1144(): Int = 1146
+ def foo1145(): Int = 1147
+ def foo1146(): Int = 1148
+ def foo1147(): Int = 1149
+ def foo1148(): Int = 1150
+ def foo1149(): Int = 1151
+ def foo1150(): Int = 1152
+ def foo1151(): Int = 1153
+ def foo1152(): Int = 1154
+ def foo1153(): Int = 1155
+ def foo1154(): Int = 1156
+ def foo1155(): Int = 1157
+ def foo1156(): Int = 1158
+ def foo1157(): Int = 1159
+ def foo1158(): Int = 1160
+ def foo1159(): Int = 1161
+ def foo1160(): Int = 1162
+ def foo1161(): Int = 1163
+ def foo1162(): Int = 1164
+ def foo1163(): Int = 1165
+ def foo1164(): Int = 1166
+ def foo1165(): Int = 1167
+ def foo1166(): Int = 1168
+ def foo1167(): Int = 1169
+ def foo1168(): Int = 1170
+ def foo1169(): Int = 1171
+ def foo1170(): Int = 1172
+ def foo1171(): Int = 1173
+ def foo1172(): Int = 1174
+ def foo1173(): Int = 1175
+ def foo1174(): Int = 1176
+ def foo1175(): Int = 1177
+ def foo1176(): Int = 1178
+ def foo1177(): Int = 1179
+ def foo1178(): Int = 1180
+ def foo1179(): Int = 1181
+ def foo1180(): Int = 1182
+ def foo1181(): Int = 1183
+ def foo1182(): Int = 1184
+ def foo1183(): Int = 1185
+ def foo1184(): Int = 1186
+ def foo1185(): Int = 1187
+ def foo1186(): Int = 1188
+ def foo1187(): Int = 1189
+ def foo1188(): Int = 1190
+ def foo1189(): Int = 1191
+ def foo1190(): Int = 1192
+ def foo1191(): Int = 1193
+ def foo1192(): Int = 1194
+ def foo1193(): Int = 1195
+ def foo1194(): Int = 1196
+ def foo1195(): Int = 1197
+ def foo1196(): Int = 1198
+ def foo1197(): Int = 1199
+ def foo1198(): Int = 1200
+ def foo1199(): Int = 1201
+ def foo1200(): Int = 1202
+ def foo1201(): Int = 1203
+ def foo1202(): Int = 1204
+ def foo1203(): Int = 1205
+ def foo1204(): Int = 1206
+ def foo1205(): Int = 1207
+ def foo1206(): Int = 1208
+ def foo1207(): Int = 1209
+ def foo1208(): Int = 1210
+ def foo1209(): Int = 1211
+ def foo1210(): Int = 1212
+ def foo1211(): Int = 1213
+ def foo1212(): Int = 1214
+ def foo1213(): Int = 1215
+ def foo1214(): Int = 1216
+ def foo1215(): Int = 1217
+ def foo1216(): Int = 1218
+ def foo1217(): Int = 1219
+ def foo1218(): Int = 1220
+ def foo1219(): Int = 1221
+ def foo1220(): Int = 1222
+ def foo1221(): Int = 1223
+ def foo1222(): Int = 1224
+ def foo1223(): Int = 1225
+ def foo1224(): Int = 1226
+ def foo1225(): Int = 1227
+ def foo1226(): Int = 1228
+ def foo1227(): Int = 1229
+ def foo1228(): Int = 1230
+ def foo1229(): Int = 1231
+ def foo1230(): Int = 1232
+ def foo1231(): Int = 1233
+ def foo1232(): Int = 1234
+ def foo1233(): Int = 1235
+ def foo1234(): Int = 1236
+ def foo1235(): Int = 1237
+ def foo1236(): Int = 1238
+ def foo1237(): Int = 1239
+ def foo1238(): Int = 1240
+ def foo1239(): Int = 1241
+ def foo1240(): Int = 1242
+ def foo1241(): Int = 1243
+ def foo1242(): Int = 1244
+ def foo1243(): Int = 1245
+ def foo1244(): Int = 1246
+ def foo1245(): Int = 1247
+ def foo1246(): Int = 1248
+ def foo1247(): Int = 1249
+ def foo1248(): Int = 1250
+ def foo1249(): Int = 1251
+ def foo1250(): Int = 1252
+ def foo1251(): Int = 1253
+ def foo1252(): Int = 1254
+ def foo1253(): Int = 1255
+ def foo1254(): Int = 1256
+ def foo1255(): Int = 1257
+ def foo1256(): Int = 1258
+ def foo1257(): Int = 1259
+ def foo1258(): Int = 1260
+ def foo1259(): Int = 1261
+ def foo1260(): Int = 1262
+ def foo1261(): Int = 1263
+ def foo1262(): Int = 1264
+ def foo1263(): Int = 1265
+ def foo1264(): Int = 1266
+ def foo1265(): Int = 1267
+ def foo1266(): Int = 1268
+ def foo1267(): Int = 1269
+ def foo1268(): Int = 1270
+ def foo1269(): Int = 1271
+ def foo1270(): Int = 1272
+ def foo1271(): Int = 1273
+ def foo1272(): Int = 1274
+ def foo1273(): Int = 1275
+ def foo1274(): Int = 1276
+ def foo1275(): Int = 1277
+ def foo1276(): Int = 1278
+ def foo1277(): Int = 1279
+ def foo1278(): Int = 1280
+ def foo1279(): Int = 1281
+ def foo1280(): Int = 1282
+ def foo1281(): Int = 1283
+ def foo1282(): Int = 1284
+ def foo1283(): Int = 1285
+ def foo1284(): Int = 1286
+ def foo1285(): Int = 1287
+ def foo1286(): Int = 1288
+ def foo1287(): Int = 1289
+ def foo1288(): Int = 1290
+ def foo1289(): Int = 1291
+ def foo1290(): Int = 1292
+ def foo1291(): Int = 1293
+ def foo1292(): Int = 1294
+ def foo1293(): Int = 1295
+ def foo1294(): Int = 1296
+ def foo1295(): Int = 1297
+ def foo1296(): Int = 1298
+ def foo1297(): Int = 1299
+ def foo1298(): Int = 1300
+ def foo1299(): Int = 1301
+ def foo1300(): Int = 1302
+ def foo1301(): Int = 1303
+ def foo1302(): Int = 1304
+ def foo1303(): Int = 1305
+ def foo1304(): Int = 1306
+ def foo1305(): Int = 1307
+ def foo1306(): Int = 1308
+ def foo1307(): Int = 1309
+ def foo1308(): Int = 1310
+ def foo1309(): Int = 1311
+ def foo1310(): Int = 1312
+ def foo1311(): Int = 1313
+ def foo1312(): Int = 1314
+ def foo1313(): Int = 1315
+ def foo1314(): Int = 1316
+ def foo1315(): Int = 1317
+ def foo1316(): Int = 1318
+ def foo1317(): Int = 1319
+ def foo1318(): Int = 1320
+ def foo1319(): Int = 1321
+ def foo1320(): Int = 1322
+ def foo1321(): Int = 1323
+ def foo1322(): Int = 1324
+ def foo1323(): Int = 1325
+ def foo1324(): Int = 1326
+ def foo1325(): Int = 1327
+ def foo1326(): Int = 1328
+ def foo1327(): Int = 1329
+ def foo1328(): Int = 1330
+ def foo1329(): Int = 1331
+ def foo1330(): Int = 1332
+ def foo1331(): Int = 1333
+ def foo1332(): Int = 1334
+ def foo1333(): Int = 1335
+ def foo1334(): Int = 1336
+ def foo1335(): Int = 1337
+ def foo1336(): Int = 1338
+ def foo1337(): Int = 1339
+ def foo1338(): Int = 1340
+ def foo1339(): Int = 1341
+ def foo1340(): Int = 1342
+ def foo1341(): Int = 1343
+ def foo1342(): Int = 1344
+ def foo1343(): Int = 1345
+ def foo1344(): Int = 1346
+ def foo1345(): Int = 1347
+ def foo1346(): Int = 1348
+ def foo1347(): Int = 1349
+ def foo1348(): Int = 1350
+ def foo1349(): Int = 1351
+ def foo1350(): Int = 1352
+ def foo1351(): Int = 1353
+ def foo1352(): Int = 1354
+ def foo1353(): Int = 1355
+ def foo1354(): Int = 1356
+ def foo1355(): Int = 1357
+ def foo1356(): Int = 1358
+ def foo1357(): Int = 1359
+ def foo1358(): Int = 1360
+ def foo1359(): Int = 1361
+ def foo1360(): Int = 1362
+ def foo1361(): Int = 1363
+ def foo1362(): Int = 1364
+ def foo1363(): Int = 1365
+ def foo1364(): Int = 1366
+ def foo1365(): Int = 1367
+ def foo1366(): Int = 1368
+ def foo1367(): Int = 1369
+ def foo1368(): Int = 1370
+ def foo1369(): Int = 1371
+ def foo1370(): Int = 1372
+ def foo1371(): Int = 1373
+ def foo1372(): Int = 1374
+ def foo1373(): Int = 1375
+ def foo1374(): Int = 1376
+ def foo1375(): Int = 1377
+ def foo1376(): Int = 1378
+ def foo1377(): Int = 1379
+ def foo1378(): Int = 1380
+ def foo1379(): Int = 1381
+ def foo1380(): Int = 1382
+ def foo1381(): Int = 1383
+ def foo1382(): Int = 1384
+ def foo1383(): Int = 1385
+ def foo1384(): Int = 1386
+ def foo1385(): Int = 1387
+ def foo1386(): Int = 1388
+ def foo1387(): Int = 1389
+ def foo1388(): Int = 1390
+ def foo1389(): Int = 1391
+ def foo1390(): Int = 1392
+ def foo1391(): Int = 1393
+ def foo1392(): Int = 1394
+ def foo1393(): Int = 1395
+ def foo1394(): Int = 1396
+ def foo1395(): Int = 1397
+ def foo1396(): Int = 1398
+ def foo1397(): Int = 1399
+ def foo1398(): Int = 1400
+ def foo1399(): Int = 1401
+ def foo1400(): Int = 1402
+ def foo1401(): Int = 1403
+ def foo1402(): Int = 1404
+ def foo1403(): Int = 1405
+ def foo1404(): Int = 1406
+ def foo1405(): Int = 1407
+ def foo1406(): Int = 1408
+ def foo1407(): Int = 1409
+ def foo1408(): Int = 1410
+ def foo1409(): Int = 1411
+ def foo1410(): Int = 1412
+ def foo1411(): Int = 1413
+ def foo1412(): Int = 1414
+ def foo1413(): Int = 1415
+ def foo1414(): Int = 1416
+ def foo1415(): Int = 1417
+ def foo1416(): Int = 1418
+ def foo1417(): Int = 1419
+ def foo1418(): Int = 1420
+ def foo1419(): Int = 1421
+ def foo1420(): Int = 1422
+ def foo1421(): Int = 1423
+ def foo1422(): Int = 1424
+ def foo1423(): Int = 1425
+ def foo1424(): Int = 1426
+ def foo1425(): Int = 1427
+ def foo1426(): Int = 1428
+ def foo1427(): Int = 1429
+ def foo1428(): Int = 1430
+ def foo1429(): Int = 1431
+ def foo1430(): Int = 1432
+ def foo1431(): Int = 1433
+ def foo1432(): Int = 1434
+ def foo1433(): Int = 1435
+ def foo1434(): Int = 1436
+ def foo1435(): Int = 1437
+ def foo1436(): Int = 1438
+ def foo1437(): Int = 1439
+ def foo1438(): Int = 1440
+ def foo1439(): Int = 1441
+ def foo1440(): Int = 1442
+ def foo1441(): Int = 1443
+ def foo1442(): Int = 1444
+ def foo1443(): Int = 1445
+ def foo1444(): Int = 1446
+ def foo1445(): Int = 1447
+ def foo1446(): Int = 1448
+ def foo1447(): Int = 1449
+ def foo1448(): Int = 1450
+ def foo1449(): Int = 1451
+ def foo1450(): Int = 1452
+ def foo1451(): Int = 1453
+ def foo1452(): Int = 1454
+ def foo1453(): Int = 1455
+ def foo1454(): Int = 1456
+ def foo1455(): Int = 1457
+ def foo1456(): Int = 1458
+ def foo1457(): Int = 1459
+ def foo1458(): Int = 1460
+ def foo1459(): Int = 1461
+ def foo1460(): Int = 1462
+ def foo1461(): Int = 1463
+ def foo1462(): Int = 1464
+ def foo1463(): Int = 1465
+ def foo1464(): Int = 1466
+ def foo1465(): Int = 1467
+ def foo1466(): Int = 1468
+ def foo1467(): Int = 1469
+ def foo1468(): Int = 1470
+ def foo1469(): Int = 1471
+ def foo1470(): Int = 1472
+ def foo1471(): Int = 1473
+ def foo1472(): Int = 1474
+ def foo1473(): Int = 1475
+ def foo1474(): Int = 1476
+ def foo1475(): Int = 1477
+ def foo1476(): Int = 1478
+ def foo1477(): Int = 1479
+ def foo1478(): Int = 1480
+ def foo1479(): Int = 1481
+ def foo1480(): Int = 1482
+ def foo1481(): Int = 1483
+ def foo1482(): Int = 1484
+ def foo1483(): Int = 1485
+ def foo1484(): Int = 1486
+ def foo1485(): Int = 1487
+ def foo1486(): Int = 1488
+ def foo1487(): Int = 1489
+ def foo1488(): Int = 1490
+ def foo1489(): Int = 1491
+ def foo1490(): Int = 1492
+ def foo1491(): Int = 1493
+ def foo1492(): Int = 1494
+ def foo1493(): Int = 1495
+ def foo1494(): Int = 1496
+ def foo1495(): Int = 1497
+ def foo1496(): Int = 1498
+ def foo1497(): Int = 1499
+ def foo1498(): Int = 1500
+ def foo1499(): Int = 1501
+ def foo1500(): Int = 1502
+ def foo1501(): Int = 1503
+ def foo1502(): Int = 1504
+ def foo1503(): Int = 1505
+ def foo1504(): Int = 1506
+ def foo1505(): Int = 1507
+ def foo1506(): Int = 1508
+ def foo1507(): Int = 1509
+ def foo1508(): Int = 1510
+ def foo1509(): Int = 1511
+ def foo1510(): Int = 1512
+ def foo1511(): Int = 1513
+ def foo1512(): Int = 1514
+ def foo1513(): Int = 1515
+ def foo1514(): Int = 1516
+ def foo1515(): Int = 1517
+ def foo1516(): Int = 1518
+ def foo1517(): Int = 1519
+ def foo1518(): Int = 1520
+ def foo1519(): Int = 1521
+ def foo1520(): Int = 1522
+ def foo1521(): Int = 1523
+ def foo1522(): Int = 1524
+ def foo1523(): Int = 1525
+ def foo1524(): Int = 1526
+ def foo1525(): Int = 1527
+ def foo1526(): Int = 1528
+ def foo1527(): Int = 1529
+ def foo1528(): Int = 1530
+ def foo1529(): Int = 1531
+ def foo1530(): Int = 1532
+ def foo1531(): Int = 1533
+ def foo1532(): Int = 1534
+ def foo1533(): Int = 1535
+ def foo1534(): Int = 1536
+ def foo1535(): Int = 1537
+ def foo1536(): Int = 1538
+ def foo1537(): Int = 1539
+ def foo1538(): Int = 1540
+ def foo1539(): Int = 1541
+ def foo1540(): Int = 1542
+ def foo1541(): Int = 1543
+ def foo1542(): Int = 1544
+ def foo1543(): Int = 1545
+ def foo1544(): Int = 1546
+ def foo1545(): Int = 1547
+ def foo1546(): Int = 1548
+ def foo1547(): Int = 1549
+ def foo1548(): Int = 1550
+ def foo1549(): Int = 1551
+ def foo1550(): Int = 1552
+ def foo1551(): Int = 1553
+ def foo1552(): Int = 1554
+ def foo1553(): Int = 1555
+ def foo1554(): Int = 1556
+ def foo1555(): Int = 1557
+ def foo1556(): Int = 1558
+ def foo1557(): Int = 1559
+ def foo1558(): Int = 1560
+ def foo1559(): Int = 1561
+ def foo1560(): Int = 1562
+ def foo1561(): Int = 1563
+ def foo1562(): Int = 1564
+ def foo1563(): Int = 1565
+ def foo1564(): Int = 1566
+ def foo1565(): Int = 1567
+ def foo1566(): Int = 1568
+ def foo1567(): Int = 1569
+ def foo1568(): Int = 1570
+ def foo1569(): Int = 1571
+ def foo1570(): Int = 1572
+ def foo1571(): Int = 1573
+ def foo1572(): Int = 1574
+ def foo1573(): Int = 1575
+ def foo1574(): Int = 1576
+ def foo1575(): Int = 1577
+ def foo1576(): Int = 1578
+ def foo1577(): Int = 1579
+ def foo1578(): Int = 1580
+ def foo1579(): Int = 1581
+ def foo1580(): Int = 1582
+ def foo1581(): Int = 1583
+ def foo1582(): Int = 1584
+ def foo1583(): Int = 1585
+ def foo1584(): Int = 1586
+ def foo1585(): Int = 1587
+ def foo1586(): Int = 1588
+ def foo1587(): Int = 1589
+ def foo1588(): Int = 1590
+ def foo1589(): Int = 1591
+ def foo1590(): Int = 1592
+ def foo1591(): Int = 1593
+ def foo1592(): Int = 1594
+ def foo1593(): Int = 1595
+ def foo1594(): Int = 1596
+ def foo1595(): Int = 1597
+ def foo1596(): Int = 1598
+ def foo1597(): Int = 1599
+ def foo1598(): Int = 1600
+ def foo1599(): Int = 1601
+ def foo1600(): Int = 1602
+ def foo1601(): Int = 1603
+ def foo1602(): Int = 1604
+ def foo1603(): Int = 1605
+ def foo1604(): Int = 1606
+ def foo1605(): Int = 1607
+ def foo1606(): Int = 1608
+ def foo1607(): Int = 1609
+ def foo1608(): Int = 1610
+ def foo1609(): Int = 1611
+ def foo1610(): Int = 1612
+ def foo1611(): Int = 1613
+ def foo1612(): Int = 1614
+ def foo1613(): Int = 1615
+ def foo1614(): Int = 1616
+ def foo1615(): Int = 1617
+ def foo1616(): Int = 1618
+ def foo1617(): Int = 1619
+ def foo1618(): Int = 1620
+ def foo1619(): Int = 1621
+ def foo1620(): Int = 1622
+ def foo1621(): Int = 1623
+ def foo1622(): Int = 1624
+ def foo1623(): Int = 1625
+ def foo1624(): Int = 1626
+ def foo1625(): Int = 1627
+ def foo1626(): Int = 1628
+ def foo1627(): Int = 1629
+ def foo1628(): Int = 1630
+ def foo1629(): Int = 1631
+ def foo1630(): Int = 1632
+ def foo1631(): Int = 1633
+ def foo1632(): Int = 1634
+ def foo1633(): Int = 1635
+ def foo1634(): Int = 1636
+ def foo1635(): Int = 1637
+ def foo1636(): Int = 1638
+ def foo1637(): Int = 1639
+ def foo1638(): Int = 1640
+ def foo1639(): Int = 1641
+ def foo1640(): Int = 1642
+ def foo1641(): Int = 1643
+ def foo1642(): Int = 1644
+ def foo1643(): Int = 1645
+ def foo1644(): Int = 1646
+ def foo1645(): Int = 1647
+ def foo1646(): Int = 1648
+ def foo1647(): Int = 1649
+ def foo1648(): Int = 1650
+ def foo1649(): Int = 1651
+ def foo1650(): Int = 1652
+ def foo1651(): Int = 1653
+ def foo1652(): Int = 1654
+ def foo1653(): Int = 1655
+ def foo1654(): Int = 1656
+ def foo1655(): Int = 1657
+ def foo1656(): Int = 1658
+ def foo1657(): Int = 1659
+ def foo1658(): Int = 1660
+ def foo1659(): Int = 1661
+ def foo1660(): Int = 1662
+ def foo1661(): Int = 1663
+ def foo1662(): Int = 1664
+ def foo1663(): Int = 1665
+ def foo1664(): Int = 1666
+ def foo1665(): Int = 1667
+ def foo1666(): Int = 1668
+ def foo1667(): Int = 1669
+ def foo1668(): Int = 1670
+ def foo1669(): Int = 1671
+ def foo1670(): Int = 1672
+ def foo1671(): Int = 1673
+ def foo1672(): Int = 1674
+ def foo1673(): Int = 1675
+ def foo1674(): Int = 1676
+ def foo1675(): Int = 1677
+ def foo1676(): Int = 1678
+ def foo1677(): Int = 1679
+ def foo1678(): Int = 1680
+ def foo1679(): Int = 1681
+ def foo1680(): Int = 1682
+ def foo1681(): Int = 1683
+ def foo1682(): Int = 1684
+ def foo1683(): Int = 1685
+ def foo1684(): Int = 1686
+ def foo1685(): Int = 1687
+ def foo1686(): Int = 1688
+ def foo1687(): Int = 1689
+ def foo1688(): Int = 1690
+ def foo1689(): Int = 1691
+ def foo1690(): Int = 1692
+ def foo1691(): Int = 1693
+ def foo1692(): Int = 1694
+ def foo1693(): Int = 1695
+ def foo1694(): Int = 1696
+ def foo1695(): Int = 1697
+ def foo1696(): Int = 1698
+ def foo1697(): Int = 1699
+ def foo1698(): Int = 1700
+ def foo1699(): Int = 1701
+ def foo1700(): Int = 1702
+ def foo1701(): Int = 1703
+ def foo1702(): Int = 1704
+ def foo1703(): Int = 1705
+ def foo1704(): Int = 1706
+ def foo1705(): Int = 1707
+ def foo1706(): Int = 1708
+ def foo1707(): Int = 1709
+ def foo1708(): Int = 1710
+ def foo1709(): Int = 1711
+ def foo1710(): Int = 1712
+ def foo1711(): Int = 1713
+ def foo1712(): Int = 1714
+ def foo1713(): Int = 1715
+ def foo1714(): Int = 1716
+ def foo1715(): Int = 1717
+ def foo1716(): Int = 1718
+ def foo1717(): Int = 1719
+ def foo1718(): Int = 1720
+ def foo1719(): Int = 1721
+ def foo1720(): Int = 1722
+ def foo1721(): Int = 1723
+ def foo1722(): Int = 1724
+ def foo1723(): Int = 1725
+ def foo1724(): Int = 1726
+ def foo1725(): Int = 1727
+ def foo1726(): Int = 1728
+ def foo1727(): Int = 1729
+ def foo1728(): Int = 1730
+ def foo1729(): Int = 1731
+ def foo1730(): Int = 1732
+ def foo1731(): Int = 1733
+ def foo1732(): Int = 1734
+ def foo1733(): Int = 1735
+ def foo1734(): Int = 1736
+ def foo1735(): Int = 1737
+ def foo1736(): Int = 1738
+ def foo1737(): Int = 1739
+ def foo1738(): Int = 1740
+ def foo1739(): Int = 1741
+ def foo1740(): Int = 1742
+ def foo1741(): Int = 1743
+ def foo1742(): Int = 1744
+ def foo1743(): Int = 1745
+ def foo1744(): Int = 1746
+ def foo1745(): Int = 1747
+ def foo1746(): Int = 1748
+ def foo1747(): Int = 1749
+ def foo1748(): Int = 1750
+ def foo1749(): Int = 1751
+ def foo1750(): Int = 1752
+ def foo1751(): Int = 1753
+ def foo1752(): Int = 1754
+ def foo1753(): Int = 1755
+ def foo1754(): Int = 1756
+ def foo1755(): Int = 1757
+ def foo1756(): Int = 1758
+ def foo1757(): Int = 1759
+ def foo1758(): Int = 1760
+ def foo1759(): Int = 1761
+ def foo1760(): Int = 1762
+ def foo1761(): Int = 1763
+ def foo1762(): Int = 1764
+ def foo1763(): Int = 1765
+ def foo1764(): Int = 1766
+ def foo1765(): Int = 1767
+ def foo1766(): Int = 1768
+ def foo1767(): Int = 1769
+ def foo1768(): Int = 1770
+ def foo1769(): Int = 1771
+ def foo1770(): Int = 1772
+ def foo1771(): Int = 1773
+ def foo1772(): Int = 1774
+ def foo1773(): Int = 1775
+ def foo1774(): Int = 1776
+ def foo1775(): Int = 1777
+ def foo1776(): Int = 1778
+ def foo1777(): Int = 1779
+ def foo1778(): Int = 1780
+ def foo1779(): Int = 1781
+ def foo1780(): Int = 1782
+ def foo1781(): Int = 1783
+ def foo1782(): Int = 1784
+ def foo1783(): Int = 1785
+ def foo1784(): Int = 1786
+ def foo1785(): Int = 1787
+ def foo1786(): Int = 1788
+ def foo1787(): Int = 1789
+ def foo1788(): Int = 1790
+ def foo1789(): Int = 1791
+ def foo1790(): Int = 1792
+ def foo1791(): Int = 1793
+ def foo1792(): Int = 1794
+ def foo1793(): Int = 1795
+ def foo1794(): Int = 1796
+ def foo1795(): Int = 1797
+ def foo1796(): Int = 1798
+ def foo1797(): Int = 1799
+ def foo1798(): Int = 1800
+ def foo1799(): Int = 1801
+ def foo1800(): Int = 1802
+ def foo1801(): Int = 1803
+ def foo1802(): Int = 1804
+ def foo1803(): Int = 1805
+ def foo1804(): Int = 1806
+ def foo1805(): Int = 1807
+ def foo1806(): Int = 1808
+ def foo1807(): Int = 1809
+ def foo1808(): Int = 1810
+ def foo1809(): Int = 1811
+ def foo1810(): Int = 1812
+ def foo1811(): Int = 1813
+ def foo1812(): Int = 1814
+ def foo1813(): Int = 1815
+ def foo1814(): Int = 1816
+ def foo1815(): Int = 1817
+ def foo1816(): Int = 1818
+ def foo1817(): Int = 1819
+ def foo1818(): Int = 1820
+ def foo1819(): Int = 1821
+ def foo1820(): Int = 1822
+ def foo1821(): Int = 1823
+ def foo1822(): Int = 1824
+ def foo1823(): Int = 1825
+ def foo1824(): Int = 1826
+ def foo1825(): Int = 1827
+ def foo1826(): Int = 1828
+ def foo1827(): Int = 1829
+ def foo1828(): Int = 1830
+ def foo1829(): Int = 1831
+ def foo1830(): Int = 1832
+ def foo1831(): Int = 1833
+ def foo1832(): Int = 1834
+ def foo1833(): Int = 1835
+ def foo1834(): Int = 1836
+ def foo1835(): Int = 1837
+ def foo1836(): Int = 1838
+ def foo1837(): Int = 1839
+ def foo1838(): Int = 1840
+ def foo1839(): Int = 1841
+ def foo1840(): Int = 1842
+ def foo1841(): Int = 1843
+ def foo1842(): Int = 1844
+ def foo1843(): Int = 1845
+ def foo1844(): Int = 1846
+ def foo1845(): Int = 1847
+ def foo1846(): Int = 1848
+ def foo1847(): Int = 1849
+ def foo1848(): Int = 1850
+ def foo1849(): Int = 1851
+ def foo1850(): Int = 1852
+ def foo1851(): Int = 1853
+ def foo1852(): Int = 1854
+ def foo1853(): Int = 1855
+ def foo1854(): Int = 1856
+ def foo1855(): Int = 1857
+ def foo1856(): Int = 1858
+ def foo1857(): Int = 1859
+ def foo1858(): Int = 1860
+ def foo1859(): Int = 1861
+ def foo1860(): Int = 1862
+ def foo1861(): Int = 1863
+ def foo1862(): Int = 1864
+ def foo1863(): Int = 1865
+ def foo1864(): Int = 1866
+ def foo1865(): Int = 1867
+ def foo1866(): Int = 1868
+ def foo1867(): Int = 1869
+ def foo1868(): Int = 1870
+ def foo1869(): Int = 1871
+ def foo1870(): Int = 1872
+ def foo1871(): Int = 1873
+ def foo1872(): Int = 1874
+ def foo1873(): Int = 1875
+ def foo1874(): Int = 1876
+ def foo1875(): Int = 1877
+ def foo1876(): Int = 1878
+ def foo1877(): Int = 1879
+ def foo1878(): Int = 1880
+ def foo1879(): Int = 1881
+ def foo1880(): Int = 1882
+ def foo1881(): Int = 1883
+ def foo1882(): Int = 1884
+ def foo1883(): Int = 1885
+ def foo1884(): Int = 1886
+ def foo1885(): Int = 1887
+ def foo1886(): Int = 1888
+ def foo1887(): Int = 1889
+ def foo1888(): Int = 1890
+ def foo1889(): Int = 1891
+ def foo1890(): Int = 1892
+ def foo1891(): Int = 1893
+ def foo1892(): Int = 1894
+ def foo1893(): Int = 1895
+ def foo1894(): Int = 1896
+ def foo1895(): Int = 1897
+ def foo1896(): Int = 1898
+ def foo1897(): Int = 1899
+ def foo1898(): Int = 1900
+ def foo1899(): Int = 1901
+ def foo1900(): Int = 1902
+ def foo1901(): Int = 1903
+ def foo1902(): Int = 1904
+ def foo1903(): Int = 1905
+ def foo1904(): Int = 1906
+ def foo1905(): Int = 1907
+ def foo1906(): Int = 1908
+ def foo1907(): Int = 1909
+ def foo1908(): Int = 1910
+ def foo1909(): Int = 1911
+ def foo1910(): Int = 1912
+ def foo1911(): Int = 1913
+ def foo1912(): Int = 1914
+ def foo1913(): Int = 1915
+ def foo1914(): Int = 1916
+ def foo1915(): Int = 1917
+ def foo1916(): Int = 1918
+ def foo1917(): Int = 1919
+ def foo1918(): Int = 1920
+ def foo1919(): Int = 1921
+ def foo1920(): Int = 1922
+ def foo1921(): Int = 1923
+ def foo1922(): Int = 1924
+ def foo1923(): Int = 1925
+ def foo1924(): Int = 1926
+ def foo1925(): Int = 1927
+ def foo1926(): Int = 1928
+ def foo1927(): Int = 1929
+ def foo1928(): Int = 1930
+ def foo1929(): Int = 1931
+ def foo1930(): Int = 1932
+ def foo1931(): Int = 1933
+ def foo1932(): Int = 1934
+ def foo1933(): Int = 1935
+ def foo1934(): Int = 1936
+ def foo1935(): Int = 1937
+ def foo1936(): Int = 1938
+ def foo1937(): Int = 1939
+ def foo1938(): Int = 1940
+ def foo1939(): Int = 1941
+ def foo1940(): Int = 1942
+ def foo1941(): Int = 1943
+ def foo1942(): Int = 1944
+ def foo1943(): Int = 1945
+ def foo1944(): Int = 1946
+ def foo1945(): Int = 1947
+ def foo1946(): Int = 1948
+ def foo1947(): Int = 1949
+ def foo1948(): Int = 1950
+ def foo1949(): Int = 1951
+ def foo1950(): Int = 1952
+ def foo1951(): Int = 1953
+ def foo1952(): Int = 1954
+ def foo1953(): Int = 1955
+ def foo1954(): Int = 1956
+ def foo1955(): Int = 1957
+ def foo1956(): Int = 1958
+ def foo1957(): Int = 1959
+ def foo1958(): Int = 1960
+ def foo1959(): Int = 1961
+ def foo1960(): Int = 1962
+ def foo1961(): Int = 1963
+ def foo1962(): Int = 1964
+ def foo1963(): Int = 1965
+ def foo1964(): Int = 1966
+ def foo1965(): Int = 1967
+ def foo1966(): Int = 1968
+ def foo1967(): Int = 1969
+ def foo1968(): Int = 1970
+ def foo1969(): Int = 1971
+ def foo1970(): Int = 1972
+ def foo1971(): Int = 1973
+ def foo1972(): Int = 1974
+ def foo1973(): Int = 1975
+ def foo1974(): Int = 1976
+ def foo1975(): Int = 1977
+ def foo1976(): Int = 1978
+ def foo1977(): Int = 1979
+ def foo1978(): Int = 1980
+ def foo1979(): Int = 1981
+ def foo1980(): Int = 1982
+ def foo1981(): Int = 1983
+ def foo1982(): Int = 1984
+ def foo1983(): Int = 1985
+ def foo1984(): Int = 1986
+ def foo1985(): Int = 1987
+ def foo1986(): Int = 1988
+ def foo1987(): Int = 1989
+ def foo1988(): Int = 1990
+ def foo1989(): Int = 1991
+ def foo1990(): Int = 1992
+ def foo1991(): Int = 1993
+ def foo1992(): Int = 1994
+ def foo1993(): Int = 1995
+ def foo1994(): Int = 1996
+ def foo1995(): Int = 1997
+ def foo1996(): Int = 1998
+ def foo1997(): Int = 1999
+ def foo1998(): Int = 2000
+ def foo1999(): Int = 2001
+ def foo2000(): Int = 2002
+ def foo2001(): Int = 2003
+ def foo2002(): Int = 2004
+ def foo2003(): Int = 2005
+ def foo2004(): Int = 2006
+ def foo2005(): Int = 2007
+ def foo2006(): Int = 2008
+ def foo2007(): Int = 2009
+ def foo2008(): Int = 2010
+ def foo2009(): Int = 2011
+ def foo2010(): Int = 2012
+ def foo2011(): Int = 2013
+ def foo2012(): Int = 2014
+ def foo2013(): Int = 2015
+ def foo2014(): Int = 2016
+ def foo2015(): Int = 2017
+ def foo2016(): Int = 2018
+ def foo2017(): Int = 2019
+ def foo2018(): Int = 2020
+ def foo2019(): Int = 2021
+ def foo2020(): Int = 2022
+ def foo2021(): Int = 2023
+ def foo2022(): Int = 2024
+ def foo2023(): Int = 2025
+ def foo2024(): Int = 2026
+ def foo2025(): Int = 2027
+ def foo2026(): Int = 2028
+ def foo2027(): Int = 2029
+ def foo2028(): Int = 2030
+ def foo2029(): Int = 2031
+ def foo2030(): Int = 2032
+ def foo2031(): Int = 2033
+ def foo2032(): Int = 2034
+ def foo2033(): Int = 2035
+ def foo2034(): Int = 2036
+ def foo2035(): Int = 2037
+ def foo2036(): Int = 2038
+ def foo2037(): Int = 2039
+ def foo2038(): Int = 2040
+ def foo2039(): Int = 2041
+ def foo2040(): Int = 2042
+ def foo2041(): Int = 2043
+ def foo2042(): Int = 2044
+ def foo2043(): Int = 2045
+ def foo2044(): Int = 2046
+ def foo2045(): Int = 2047
+ def foo2046(): Int = 2048
+ def foo2047(): Int = 2049
+ def foo2048(): Int = 2050
+ def foo2049(): Int = 2051
+ def foo2050(): Int = 2052
+ def foo2051(): Int = 2053
+ def foo2052(): Int = 2054
+ def foo2053(): Int = 2055
+ def foo2054(): Int = 2056
+ def foo2055(): Int = 2057
+ def foo2056(): Int = 2058
+ def foo2057(): Int = 2059
+ def foo2058(): Int = 2060
+ def foo2059(): Int = 2061
+ def foo2060(): Int = 2062
+ def foo2061(): Int = 2063
+ def foo2062(): Int = 2064
+ def foo2063(): Int = 2065
+ def foo2064(): Int = 2066
+ def foo2065(): Int = 2067
+ def foo2066(): Int = 2068
+ def foo2067(): Int = 2069
+ def foo2068(): Int = 2070
+ def foo2069(): Int = 2071
+ def foo2070(): Int = 2072
+ def foo2071(): Int = 2073
+ def foo2072(): Int = 2074
+ def foo2073(): Int = 2075
+ def foo2074(): Int = 2076
+ def foo2075(): Int = 2077
+ def foo2076(): Int = 2078
+ def foo2077(): Int = 2079
+ def foo2078(): Int = 2080
+ def foo2079(): Int = 2081
+ def foo2080(): Int = 2082
+ def foo2081(): Int = 2083
+ def foo2082(): Int = 2084
+ def foo2083(): Int = 2085
+ def foo2084(): Int = 2086
+ def foo2085(): Int = 2087
+ def foo2086(): Int = 2088
+ def foo2087(): Int = 2089
+ def foo2088(): Int = 2090
+ def foo2089(): Int = 2091
+ def foo2090(): Int = 2092
+ def foo2091(): Int = 2093
+ def foo2092(): Int = 2094
+ def foo2093(): Int = 2095
+ def foo2094(): Int = 2096
+ def foo2095(): Int = 2097
+ def foo2096(): Int = 2098
+ def foo2097(): Int = 2099
+ def foo2098(): Int = 2100
+ def foo2099(): Int = 2101
+ def foo2100(): Int = 2102
+ def foo2101(): Int = 2103
+ def foo2102(): Int = 2104
+ def foo2103(): Int = 2105
+ def foo2104(): Int = 2106
+ def foo2105(): Int = 2107
+ def foo2106(): Int = 2108
+ def foo2107(): Int = 2109
+ def foo2108(): Int = 2110
+ def foo2109(): Int = 2111
+ def foo2110(): Int = 2112
+ def foo2111(): Int = 2113
+ def foo2112(): Int = 2114
+ def foo2113(): Int = 2115
+ def foo2114(): Int = 2116
+ def foo2115(): Int = 2117
+ def foo2116(): Int = 2118
+ def foo2117(): Int = 2119
+ def foo2118(): Int = 2120
+ def foo2119(): Int = 2121
+ def foo2120(): Int = 2122
+ def foo2121(): Int = 2123
+ def foo2122(): Int = 2124
+ def foo2123(): Int = 2125
+ def foo2124(): Int = 2126
+ def foo2125(): Int = 2127
+ def foo2126(): Int = 2128
+ def foo2127(): Int = 2129
+ def foo2128(): Int = 2130
+ def foo2129(): Int = 2131
+ def foo2130(): Int = 2132
+ def foo2131(): Int = 2133
+ def foo2132(): Int = 2134
+ def foo2133(): Int = 2135
+ def foo2134(): Int = 2136
+ def foo2135(): Int = 2137
+ def foo2136(): Int = 2138
+ def foo2137(): Int = 2139
+ def foo2138(): Int = 2140
+ def foo2139(): Int = 2141
+ def foo2140(): Int = 2142
+ def foo2141(): Int = 2143
+ def foo2142(): Int = 2144
+ def foo2143(): Int = 2145
+ def foo2144(): Int = 2146
+ def foo2145(): Int = 2147
+ def foo2146(): Int = 2148
+ def foo2147(): Int = 2149
+ def foo2148(): Int = 2150
+ def foo2149(): Int = 2151
+ def foo2150(): Int = 2152
+ def foo2151(): Int = 2153
+ def foo2152(): Int = 2154
+ def foo2153(): Int = 2155
+ def foo2154(): Int = 2156
+ def foo2155(): Int = 2157
+ def foo2156(): Int = 2158
+ def foo2157(): Int = 2159
+ def foo2158(): Int = 2160
+ def foo2159(): Int = 2161
+ def foo2160(): Int = 2162
+ def foo2161(): Int = 2163
+ def foo2162(): Int = 2164
+ def foo2163(): Int = 2165
+ def foo2164(): Int = 2166
+ def foo2165(): Int = 2167
+ def foo2166(): Int = 2168
+ def foo2167(): Int = 2169
+ def foo2168(): Int = 2170
+ def foo2169(): Int = 2171
+ def foo2170(): Int = 2172
+ def foo2171(): Int = 2173
+ def foo2172(): Int = 2174
+ def foo2173(): Int = 2175
+ def foo2174(): Int = 2176
+ def foo2175(): Int = 2177
+ def foo2176(): Int = 2178
+ def foo2177(): Int = 2179
+ def foo2178(): Int = 2180
+ def foo2179(): Int = 2181
+ def foo2180(): Int = 2182
+ def foo2181(): Int = 2183
+ def foo2182(): Int = 2184
+ def foo2183(): Int = 2185
+ def foo2184(): Int = 2186
+ def foo2185(): Int = 2187
+ def foo2186(): Int = 2188
+ def foo2187(): Int = 2189
+ def foo2188(): Int = 2190
+ def foo2189(): Int = 2191
+ def foo2190(): Int = 2192
+ def foo2191(): Int = 2193
+ def foo2192(): Int = 2194
+ def foo2193(): Int = 2195
+ def foo2194(): Int = 2196
+ def foo2195(): Int = 2197
+ def foo2196(): Int = 2198
+ def foo2197(): Int = 2199
+ def foo2198(): Int = 2200
+ def foo2199(): Int = 2201
+ def foo2200(): Int = 2202
+ def foo2201(): Int = 2203
+ def foo2202(): Int = 2204
+ def foo2203(): Int = 2205
+ def foo2204(): Int = 2206
+ def foo2205(): Int = 2207
+ def foo2206(): Int = 2208
+ def foo2207(): Int = 2209
+ def foo2208(): Int = 2210
+ def foo2209(): Int = 2211
+ def foo2210(): Int = 2212
+ def foo2211(): Int = 2213
+ def foo2212(): Int = 2214
+ def foo2213(): Int = 2215
+ def foo2214(): Int = 2216
+ def foo2215(): Int = 2217
+ def foo2216(): Int = 2218
+ def foo2217(): Int = 2219
+ def foo2218(): Int = 2220
+ def foo2219(): Int = 2221
+ def foo2220(): Int = 2222
+ def foo2221(): Int = 2223
+ def foo2222(): Int = 2224
+ def foo2223(): Int = 2225
+ def foo2224(): Int = 2226
+ def foo2225(): Int = 2227
+ def foo2226(): Int = 2228
+ def foo2227(): Int = 2229
+ def foo2228(): Int = 2230
+ def foo2229(): Int = 2231
+ def foo2230(): Int = 2232
+ def foo2231(): Int = 2233
+ def foo2232(): Int = 2234
+ def foo2233(): Int = 2235
+ def foo2234(): Int = 2236
+ def foo2235(): Int = 2237
+ def foo2236(): Int = 2238
+ def foo2237(): Int = 2239
+ def foo2238(): Int = 2240
+ def foo2239(): Int = 2241
+ def foo2240(): Int = 2242
+ def foo2241(): Int = 2243
+ def foo2242(): Int = 2244
+ def foo2243(): Int = 2245
+ def foo2244(): Int = 2246
+ def foo2245(): Int = 2247
+ def foo2246(): Int = 2248
+ def foo2247(): Int = 2249
+ def foo2248(): Int = 2250
+ def foo2249(): Int = 2251
+ def foo2250(): Int = 2252
+ def foo2251(): Int = 2253
+ def foo2252(): Int = 2254
+ def foo2253(): Int = 2255
+ def foo2254(): Int = 2256
+ def foo2255(): Int = 2257
+ def foo2256(): Int = 2258
+ def foo2257(): Int = 2259
+ def foo2258(): Int = 2260
+ def foo2259(): Int = 2261
+ def foo2260(): Int = 2262
+ def foo2261(): Int = 2263
+ def foo2262(): Int = 2264
+ def foo2263(): Int = 2265
+ def foo2264(): Int = 2266
+ def foo2265(): Int = 2267
+ def foo2266(): Int = 2268
+ def foo2267(): Int = 2269
+ def foo2268(): Int = 2270
+ def foo2269(): Int = 2271
+ def foo2270(): Int = 2272
+ def foo2271(): Int = 2273
+ def foo2272(): Int = 2274
+ def foo2273(): Int = 2275
+ def foo2274(): Int = 2276
+ def foo2275(): Int = 2277
+ def foo2276(): Int = 2278
+ def foo2277(): Int = 2279
+ def foo2278(): Int = 2280
+ def foo2279(): Int = 2281
+ def foo2280(): Int = 2282
+ def foo2281(): Int = 2283
+ def foo2282(): Int = 2284
+ def foo2283(): Int = 2285
+ def foo2284(): Int = 2286
+ def foo2285(): Int = 2287
+ def foo2286(): Int = 2288
+ def foo2287(): Int = 2289
+ def foo2288(): Int = 2290
+ def foo2289(): Int = 2291
+ def foo2290(): Int = 2292
+ def foo2291(): Int = 2293
+ def foo2292(): Int = 2294
+ def foo2293(): Int = 2295
+ def foo2294(): Int = 2296
+ def foo2295(): Int = 2297
+ def foo2296(): Int = 2298
+ def foo2297(): Int = 2299
+ def foo2298(): Int = 2300
+ def foo2299(): Int = 2301
+ def foo2300(): Int = 2302
+ def foo2301(): Int = 2303
+ def foo2302(): Int = 2304
+ def foo2303(): Int = 2305
+ def foo2304(): Int = 2306
+ def foo2305(): Int = 2307
+ def foo2306(): Int = 2308
+ def foo2307(): Int = 2309
+ def foo2308(): Int = 2310
+ def foo2309(): Int = 2311
+ def foo2310(): Int = 2312
+ def foo2311(): Int = 2313
+ def foo2312(): Int = 2314
+ def foo2313(): Int = 2315
+ def foo2314(): Int = 2316
+ def foo2315(): Int = 2317
+ def foo2316(): Int = 2318
+ def foo2317(): Int = 2319
+ def foo2318(): Int = 2320
+ def foo2319(): Int = 2321
+ def foo2320(): Int = 2322
+ def foo2321(): Int = 2323
+ def foo2322(): Int = 2324
+ def foo2323(): Int = 2325
+ def foo2324(): Int = 2326
+ def foo2325(): Int = 2327
+ def foo2326(): Int = 2328
+ def foo2327(): Int = 2329
+ def foo2328(): Int = 2330
+ def foo2329(): Int = 2331
+ def foo2330(): Int = 2332
+ def foo2331(): Int = 2333
+ def foo2332(): Int = 2334
+ def foo2333(): Int = 2335
+ def foo2334(): Int = 2336
+ def foo2335(): Int = 2337
+ def foo2336(): Int = 2338
+ def foo2337(): Int = 2339
+ def foo2338(): Int = 2340
+ def foo2339(): Int = 2341
+ def foo2340(): Int = 2342
+ def foo2341(): Int = 2343
+ def foo2342(): Int = 2344
+ def foo2343(): Int = 2345
+ def foo2344(): Int = 2346
+ def foo2345(): Int = 2347
+ def foo2346(): Int = 2348
+ def foo2347(): Int = 2349
+ def foo2348(): Int = 2350
+ def foo2349(): Int = 2351
+ def foo2350(): Int = 2352
+ def foo2351(): Int = 2353
+ def foo2352(): Int = 2354
+ def foo2353(): Int = 2355
+ def foo2354(): Int = 2356
+ def foo2355(): Int = 2357
+ def foo2356(): Int = 2358
+ def foo2357(): Int = 2359
+ def foo2358(): Int = 2360
+ def foo2359(): Int = 2361
+ def foo2360(): Int = 2362
+ def foo2361(): Int = 2363
+ def foo2362(): Int = 2364
+ def foo2363(): Int = 2365
+ def foo2364(): Int = 2366
+ def foo2365(): Int = 2367
+ def foo2366(): Int = 2368
+ def foo2367(): Int = 2369
+ def foo2368(): Int = 2370
+ def foo2369(): Int = 2371
+ def foo2370(): Int = 2372
+ def foo2371(): Int = 2373
+ def foo2372(): Int = 2374
+ def foo2373(): Int = 2375
+ def foo2374(): Int = 2376
+ def foo2375(): Int = 2377
+ def foo2376(): Int = 2378
+ def foo2377(): Int = 2379
+ def foo2378(): Int = 2380
+ def foo2379(): Int = 2381
+ def foo2380(): Int = 2382
+ def foo2381(): Int = 2383
+ def foo2382(): Int = 2384
+ def foo2383(): Int = 2385
+ def foo2384(): Int = 2386
+ def foo2385(): Int = 2387
+ def foo2386(): Int = 2388
+ def foo2387(): Int = 2389
+ def foo2388(): Int = 2390
+ def foo2389(): Int = 2391
+ def foo2390(): Int = 2392
+ def foo2391(): Int = 2393
+ def foo2392(): Int = 2394
+ def foo2393(): Int = 2395
+ def foo2394(): Int = 2396
+ def foo2395(): Int = 2397
+ def foo2396(): Int = 2398
+ def foo2397(): Int = 2399
+ def foo2398(): Int = 2400
+ def foo2399(): Int = 2401
+ def foo2400(): Int = 2402
+ def foo2401(): Int = 2403
+ def foo2402(): Int = 2404
+ def foo2403(): Int = 2405
+ def foo2404(): Int = 2406
+ def foo2405(): Int = 2407
+ def foo2406(): Int = 2408
+ def foo2407(): Int = 2409
+ def foo2408(): Int = 2410
+ def foo2409(): Int = 2411
+ def foo2410(): Int = 2412
+ def foo2411(): Int = 2413
+ def foo2412(): Int = 2414
+ def foo2413(): Int = 2415
+ def foo2414(): Int = 2416
+ def foo2415(): Int = 2417
+ def foo2416(): Int = 2418
+ def foo2417(): Int = 2419
+ def foo2418(): Int = 2420
+ def foo2419(): Int = 2421
+ def foo2420(): Int = 2422
+ def foo2421(): Int = 2423
+ def foo2422(): Int = 2424
+ def foo2423(): Int = 2425
+ def foo2424(): Int = 2426
+ def foo2425(): Int = 2427
+ def foo2426(): Int = 2428
+ def foo2427(): Int = 2429
+ def foo2428(): Int = 2430
+ def foo2429(): Int = 2431
+ def foo2430(): Int = 2432
+ def foo2431(): Int = 2433
+ def foo2432(): Int = 2434
+ def foo2433(): Int = 2435
+ def foo2434(): Int = 2436
+ def foo2435(): Int = 2437
+ def foo2436(): Int = 2438
+ def foo2437(): Int = 2439
+ def foo2438(): Int = 2440
+ def foo2439(): Int = 2441
+ def foo2440(): Int = 2442
+ def foo2441(): Int = 2443
+ def foo2442(): Int = 2444
+ def foo2443(): Int = 2445
+ def foo2444(): Int = 2446
+ def foo2445(): Int = 2447
+ def foo2446(): Int = 2448
+ def foo2447(): Int = 2449
+ def foo2448(): Int = 2450
+ def foo2449(): Int = 2451
+ def foo2450(): Int = 2452
+ def foo2451(): Int = 2453
+ def foo2452(): Int = 2454
+ def foo2453(): Int = 2455
+ def foo2454(): Int = 2456
+ def foo2455(): Int = 2457
+ def foo2456(): Int = 2458
+ def foo2457(): Int = 2459
+ def foo2458(): Int = 2460
+ def foo2459(): Int = 2461
+ def foo2460(): Int = 2462
+ def foo2461(): Int = 2463
+ def foo2462(): Int = 2464
+ def foo2463(): Int = 2465
+ def foo2464(): Int = 2466
+ def foo2465(): Int = 2467
+ def foo2466(): Int = 2468
+ def foo2467(): Int = 2469
+ def foo2468(): Int = 2470
+ def foo2469(): Int = 2471
+ def foo2470(): Int = 2472
+ def foo2471(): Int = 2473
+ def foo2472(): Int = 2474
+ def foo2473(): Int = 2475
+ def foo2474(): Int = 2476
+ def foo2475(): Int = 2477
+ def foo2476(): Int = 2478
+ def foo2477(): Int = 2479
+ def foo2478(): Int = 2480
+ def foo2479(): Int = 2481
+ def foo2480(): Int = 2482
+ def foo2481(): Int = 2483
+ def foo2482(): Int = 2484
+ def foo2483(): Int = 2485
+ def foo2484(): Int = 2486
+ def foo2485(): Int = 2487
+ def foo2486(): Int = 2488
+ def foo2487(): Int = 2489
+ def foo2488(): Int = 2490
+ def foo2489(): Int = 2491
+ def foo2490(): Int = 2492
+ def foo2491(): Int = 2493
+ def foo2492(): Int = 2494
+ def foo2493(): Int = 2495
+ def foo2494(): Int = 2496
+ def foo2495(): Int = 2497
+ def foo2496(): Int = 2498
+ def foo2497(): Int = 2499
+ def foo2498(): Int = 2500
+ def foo2499(): Int = 2501
+ def foo2500(): Int = 2502
+ def foo2501(): Int = 2503
+ def foo2502(): Int = 2504
+ def foo2503(): Int = 2505
+ def foo2504(): Int = 2506
+ def foo2505(): Int = 2507
+ def foo2506(): Int = 2508
+ def foo2507(): Int = 2509
+ def foo2508(): Int = 2510
+ def foo2509(): Int = 2511
+ def foo2510(): Int = 2512
+ def foo2511(): Int = 2513
+ def foo2512(): Int = 2514
+ def foo2513(): Int = 2515
+ def foo2514(): Int = 2516
+ def foo2515(): Int = 2517
+ def foo2516(): Int = 2518
+ def foo2517(): Int = 2519
+ def foo2518(): Int = 2520
+ def foo2519(): Int = 2521
+ def foo2520(): Int = 2522
+ def foo2521(): Int = 2523
+ def foo2522(): Int = 2524
+ def foo2523(): Int = 2525
+ def foo2524(): Int = 2526
+ def foo2525(): Int = 2527
+ def foo2526(): Int = 2528
+ def foo2527(): Int = 2529
+ def foo2528(): Int = 2530
+ def foo2529(): Int = 2531
+ def foo2530(): Int = 2532
+ def foo2531(): Int = 2533
+ def foo2532(): Int = 2534
+ def foo2533(): Int = 2535
+ def foo2534(): Int = 2536
+ def foo2535(): Int = 2537
+ def foo2536(): Int = 2538
+ def foo2537(): Int = 2539
+ def foo2538(): Int = 2540
+ def foo2539(): Int = 2541
+ def foo2540(): Int = 2542
+ def foo2541(): Int = 2543
+ def foo2542(): Int = 2544
+ def foo2543(): Int = 2545
+ def foo2544(): Int = 2546
+ def foo2545(): Int = 2547
+ def foo2546(): Int = 2548
+ def foo2547(): Int = 2549
+ def foo2548(): Int = 2550
+ def foo2549(): Int = 2551
+ def foo2550(): Int = 2552
+ def foo2551(): Int = 2553
+ def foo2552(): Int = 2554
+ def foo2553(): Int = 2555
+ def foo2554(): Int = 2556
+ def foo2555(): Int = 2557
+ def foo2556(): Int = 2558
+ def foo2557(): Int = 2559
+ def foo2558(): Int = 2560
+ def foo2559(): Int = 2561
+ def foo2560(): Int = 2562
+ def foo2561(): Int = 2563
+ def foo2562(): Int = 2564
+ def foo2563(): Int = 2565
+ def foo2564(): Int = 2566
+ def foo2565(): Int = 2567
+ def foo2566(): Int = 2568
+ def foo2567(): Int = 2569
+ def foo2568(): Int = 2570
+ def foo2569(): Int = 2571
+ def foo2570(): Int = 2572
+ def foo2571(): Int = 2573
+ def foo2572(): Int = 2574
+ def foo2573(): Int = 2575
+ def foo2574(): Int = 2576
+ def foo2575(): Int = 2577
+ def foo2576(): Int = 2578
+ def foo2577(): Int = 2579
+ def foo2578(): Int = 2580
+ def foo2579(): Int = 2581
+ def foo2580(): Int = 2582
+ def foo2581(): Int = 2583
+ def foo2582(): Int = 2584
+ def foo2583(): Int = 2585
+ def foo2584(): Int = 2586
+ def foo2585(): Int = 2587
+ def foo2586(): Int = 2588
+ def foo2587(): Int = 2589
+ def foo2588(): Int = 2590
+ def foo2589(): Int = 2591
+ def foo2590(): Int = 2592
+ def foo2591(): Int = 2593
+ def foo2592(): Int = 2594
+ def foo2593(): Int = 2595
+ def foo2594(): Int = 2596
+ def foo2595(): Int = 2597
+ def foo2596(): Int = 2598
+ def foo2597(): Int = 2599
+ def foo2598(): Int = 2600
+ def foo2599(): Int = 2601
+ def foo2600(): Int = 2602
+ def foo2601(): Int = 2603
+ def foo2602(): Int = 2604
+ def foo2603(): Int = 2605
+ def foo2604(): Int = 2606
+ def foo2605(): Int = 2607
+ def foo2606(): Int = 2608
+ def foo2607(): Int = 2609
+ def foo2608(): Int = 2610
+ def foo2609(): Int = 2611
+ def foo2610(): Int = 2612
+ def foo2611(): Int = 2613
+ def foo2612(): Int = 2614
+ def foo2613(): Int = 2615
+ def foo2614(): Int = 2616
+ def foo2615(): Int = 2617
+ def foo2616(): Int = 2618
+ def foo2617(): Int = 2619
+ def foo2618(): Int = 2620
+ def foo2619(): Int = 2621
+ def foo2620(): Int = 2622
+ def foo2621(): Int = 2623
+ def foo2622(): Int = 2624
+ def foo2623(): Int = 2625
+ def foo2624(): Int = 2626
+ def foo2625(): Int = 2627
+ def foo2626(): Int = 2628
+ def foo2627(): Int = 2629
+ def foo2628(): Int = 2630
+ def foo2629(): Int = 2631
+ def foo2630(): Int = 2632
+ def foo2631(): Int = 2633
+ def foo2632(): Int = 2634
+ def foo2633(): Int = 2635
+ def foo2634(): Int = 2636
+ def foo2635(): Int = 2637
+ def foo2636(): Int = 2638
+ def foo2637(): Int = 2639
+ def foo2638(): Int = 2640
+ def foo2639(): Int = 2641
+ def foo2640(): Int = 2642
+ def foo2641(): Int = 2643
+ def foo2642(): Int = 2644
+ def foo2643(): Int = 2645
+ def foo2644(): Int = 2646
+ def foo2645(): Int = 2647
+ def foo2646(): Int = 2648
+ def foo2647(): Int = 2649
+ def foo2648(): Int = 2650
+ def foo2649(): Int = 2651
+ def foo2650(): Int = 2652
+ def foo2651(): Int = 2653
+ def foo2652(): Int = 2654
+ def foo2653(): Int = 2655
+ def foo2654(): Int = 2656
+ def foo2655(): Int = 2657
+ def foo2656(): Int = 2658
+ def foo2657(): Int = 2659
+ def foo2658(): Int = 2660
+ def foo2659(): Int = 2661
+ def foo2660(): Int = 2662
+ def foo2661(): Int = 2663
+ def foo2662(): Int = 2664
+ def foo2663(): Int = 2665
+ def foo2664(): Int = 2666
+ def foo2665(): Int = 2667
+ def foo2666(): Int = 2668
+ def foo2667(): Int = 2669
+ def foo2668(): Int = 2670
+ def foo2669(): Int = 2671
+ def foo2670(): Int = 2672
+ def foo2671(): Int = 2673
+ def foo2672(): Int = 2674
+ def foo2673(): Int = 2675
+ def foo2674(): Int = 2676
+ def foo2675(): Int = 2677
+ def foo2676(): Int = 2678
+ def foo2677(): Int = 2679
+ def foo2678(): Int = 2680
+ def foo2679(): Int = 2681
+ def foo2680(): Int = 2682
+ def foo2681(): Int = 2683
+ def foo2682(): Int = 2684
+ def foo2683(): Int = 2685
+ def foo2684(): Int = 2686
+ def foo2685(): Int = 2687
+ def foo2686(): Int = 2688
+ def foo2687(): Int = 2689
+ def foo2688(): Int = 2690
+ def foo2689(): Int = 2691
+ def foo2690(): Int = 2692
+ def foo2691(): Int = 2693
+ def foo2692(): Int = 2694
+ def foo2693(): Int = 2695
+ def foo2694(): Int = 2696
+ def foo2695(): Int = 2697
+ def foo2696(): Int = 2698
+ def foo2697(): Int = 2699
+ def foo2698(): Int = 2700
+ def foo2699(): Int = 2701
+ def foo2700(): Int = 2702
+ def foo2701(): Int = 2703
+ def foo2702(): Int = 2704
+ def foo2703(): Int = 2705
+ def foo2704(): Int = 2706
+ def foo2705(): Int = 2707
+ def foo2706(): Int = 2708
+ def foo2707(): Int = 2709
+ def foo2708(): Int = 2710
+ def foo2709(): Int = 2711
+ def foo2710(): Int = 2712
+ def foo2711(): Int = 2713
+ def foo2712(): Int = 2714
+ def foo2713(): Int = 2715
+ def foo2714(): Int = 2716
+ def foo2715(): Int = 2717
+ def foo2716(): Int = 2718
+ def foo2717(): Int = 2719
+ def foo2718(): Int = 2720
+ def foo2719(): Int = 2721
+ def foo2720(): Int = 2722
+ def foo2721(): Int = 2723
+ def foo2722(): Int = 2724
+ def foo2723(): Int = 2725
+ def foo2724(): Int = 2726
+ def foo2725(): Int = 2727
+ def foo2726(): Int = 2728
+ def foo2727(): Int = 2729
+ def foo2728(): Int = 2730
+ def foo2729(): Int = 2731
+ def foo2730(): Int = 2732
+ def foo2731(): Int = 2733
+ def foo2732(): Int = 2734
+ def foo2733(): Int = 2735
+ def foo2734(): Int = 2736
+ def foo2735(): Int = 2737
+ def foo2736(): Int = 2738
+ def foo2737(): Int = 2739
+ def foo2738(): Int = 2740
+ def foo2739(): Int = 2741
+ def foo2740(): Int = 2742
+ def foo2741(): Int = 2743
+ def foo2742(): Int = 2744
+ def foo2743(): Int = 2745
+ def foo2744(): Int = 2746
+ def foo2745(): Int = 2747
+ def foo2746(): Int = 2748
+ def foo2747(): Int = 2749
+ def foo2748(): Int = 2750
+ def foo2749(): Int = 2751
+ def foo2750(): Int = 2752
+ def foo2751(): Int = 2753
+ def foo2752(): Int = 2754
+ def foo2753(): Int = 2755
+ def foo2754(): Int = 2756
+ def foo2755(): Int = 2757
+ def foo2756(): Int = 2758
+ def foo2757(): Int = 2759
+ def foo2758(): Int = 2760
+ def foo2759(): Int = 2761
+ def foo2760(): Int = 2762
+ def foo2761(): Int = 2763
+ def foo2762(): Int = 2764
+ def foo2763(): Int = 2765
+ def foo2764(): Int = 2766
+ def foo2765(): Int = 2767
+ def foo2766(): Int = 2768
+ def foo2767(): Int = 2769
+ def foo2768(): Int = 2770
+ def foo2769(): Int = 2771
+ def foo2770(): Int = 2772
+ def foo2771(): Int = 2773
+ def foo2772(): Int = 2774
+ def foo2773(): Int = 2775
+ def foo2774(): Int = 2776
+ def foo2775(): Int = 2777
+ def foo2776(): Int = 2778
+ def foo2777(): Int = 2779
+ def foo2778(): Int = 2780
+ def foo2779(): Int = 2781
+ def foo2780(): Int = 2782
+ def foo2781(): Int = 2783
+ def foo2782(): Int = 2784
+ def foo2783(): Int = 2785
+ def foo2784(): Int = 2786
+ def foo2785(): Int = 2787
+ def foo2786(): Int = 2788
+ def foo2787(): Int = 2789
+ def foo2788(): Int = 2790
+ def foo2789(): Int = 2791
+ def foo2790(): Int = 2792
+ def foo2791(): Int = 2793
+ def foo2792(): Int = 2794
+ def foo2793(): Int = 2795
+ def foo2794(): Int = 2796
+ def foo2795(): Int = 2797
+ def foo2796(): Int = 2798
+ def foo2797(): Int = 2799
+ def foo2798(): Int = 2800
+ def foo2799(): Int = 2801
+ def foo2800(): Int = 2802
+ def foo2801(): Int = 2803
+ def foo2802(): Int = 2804
+ def foo2803(): Int = 2805
+ def foo2804(): Int = 2806
+ def foo2805(): Int = 2807
+ def foo2806(): Int = 2808
+ def foo2807(): Int = 2809
+ def foo2808(): Int = 2810
+ def foo2809(): Int = 2811
+ def foo2810(): Int = 2812
+ def foo2811(): Int = 2813
+ def foo2812(): Int = 2814
+ def foo2813(): Int = 2815
+ def foo2814(): Int = 2816
+ def foo2815(): Int = 2817
+ def foo2816(): Int = 2818
+ def foo2817(): Int = 2819
+ def foo2818(): Int = 2820
+ def foo2819(): Int = 2821
+ def foo2820(): Int = 2822
+ def foo2821(): Int = 2823
+ def foo2822(): Int = 2824
+ def foo2823(): Int = 2825
+ def foo2824(): Int = 2826
+ def foo2825(): Int = 2827
+ def foo2826(): Int = 2828
+ def foo2827(): Int = 2829
+ def foo2828(): Int = 2830
+ def foo2829(): Int = 2831
+ def foo2830(): Int = 2832
+ def foo2831(): Int = 2833
+ def foo2832(): Int = 2834
+ def foo2833(): Int = 2835
+ def foo2834(): Int = 2836
+ def foo2835(): Int = 2837
+ def foo2836(): Int = 2838
+ def foo2837(): Int = 2839
+ def foo2838(): Int = 2840
+ def foo2839(): Int = 2841
+ def foo2840(): Int = 2842
+ def foo2841(): Int = 2843
+ def foo2842(): Int = 2844
+ def foo2843(): Int = 2845
+ def foo2844(): Int = 2846
+ def foo2845(): Int = 2847
+ def foo2846(): Int = 2848
+ def foo2847(): Int = 2849
+ def foo2848(): Int = 2850
+ def foo2849(): Int = 2851
+ def foo2850(): Int = 2852
+ def foo2851(): Int = 2853
+ def foo2852(): Int = 2854
+ def foo2853(): Int = 2855
+ def foo2854(): Int = 2856
+ def foo2855(): Int = 2857
+ def foo2856(): Int = 2858
+ def foo2857(): Int = 2859
+ def foo2858(): Int = 2860
+ def foo2859(): Int = 2861
+ def foo2860(): Int = 2862
+ def foo2861(): Int = 2863
+ def foo2862(): Int = 2864
+ def foo2863(): Int = 2865
+ def foo2864(): Int = 2866
+ def foo2865(): Int = 2867
+ def foo2866(): Int = 2868
+ def foo2867(): Int = 2869
+ def foo2868(): Int = 2870
+ def foo2869(): Int = 2871
+ def foo2870(): Int = 2872
+ def foo2871(): Int = 2873
+ def foo2872(): Int = 2874
+ def foo2873(): Int = 2875
+ def foo2874(): Int = 2876
+ def foo2875(): Int = 2877
+ def foo2876(): Int = 2878
+ def foo2877(): Int = 2879
+ def foo2878(): Int = 2880
+ def foo2879(): Int = 2881
+ def foo2880(): Int = 2882
+ def foo2881(): Int = 2883
+ def foo2882(): Int = 2884
+ def foo2883(): Int = 2885
+ def foo2884(): Int = 2886
+ def foo2885(): Int = 2887
+ def foo2886(): Int = 2888
+ def foo2887(): Int = 2889
+ def foo2888(): Int = 2890
+ def foo2889(): Int = 2891
+ def foo2890(): Int = 2892
+ def foo2891(): Int = 2893
+ def foo2892(): Int = 2894
+ def foo2893(): Int = 2895
+ def foo2894(): Int = 2896
+ def foo2895(): Int = 2897
+ def foo2896(): Int = 2898
+ def foo2897(): Int = 2899
+ def foo2898(): Int = 2900
+ def foo2899(): Int = 2901
+ def foo2900(): Int = 2902
+ def foo2901(): Int = 2903
+ def foo2902(): Int = 2904
+ def foo2903(): Int = 2905
+ def foo2904(): Int = 2906
+ def foo2905(): Int = 2907
+ def foo2906(): Int = 2908
+ def foo2907(): Int = 2909
+ def foo2908(): Int = 2910
+ def foo2909(): Int = 2911
+ def foo2910(): Int = 2912
+ def foo2911(): Int = 2913
+ def foo2912(): Int = 2914
+ def foo2913(): Int = 2915
+ def foo2914(): Int = 2916
+ def foo2915(): Int = 2917
+ def foo2916(): Int = 2918
+ def foo2917(): Int = 2919
+ def foo2918(): Int = 2920
+ def foo2919(): Int = 2921
+ def foo2920(): Int = 2922
+ def foo2921(): Int = 2923
+ def foo2922(): Int = 2924
+ def foo2923(): Int = 2925
+ def foo2924(): Int = 2926
+ def foo2925(): Int = 2927
+ def foo2926(): Int = 2928
+ def foo2927(): Int = 2929
+ def foo2928(): Int = 2930
+ def foo2929(): Int = 2931
+ def foo2930(): Int = 2932
+ def foo2931(): Int = 2933
+ def foo2932(): Int = 2934
+ def foo2933(): Int = 2935
+ def foo2934(): Int = 2936
+ def foo2935(): Int = 2937
+ def foo2936(): Int = 2938
+ def foo2937(): Int = 2939
+ def foo2938(): Int = 2940
+ def foo2939(): Int = 2941
+ def foo2940(): Int = 2942
+ def foo2941(): Int = 2943
+ def foo2942(): Int = 2944
+ def foo2943(): Int = 2945
+ def foo2944(): Int = 2946
+ def foo2945(): Int = 2947
+ def foo2946(): Int = 2948
+ def foo2947(): Int = 2949
+ def foo2948(): Int = 2950
+ def foo2949(): Int = 2951
+ def foo2950(): Int = 2952
+ def foo2951(): Int = 2953
+ def foo2952(): Int = 2954
+ def foo2953(): Int = 2955
+ def foo2954(): Int = 2956
+ def foo2955(): Int = 2957
+ def foo2956(): Int = 2958
+ def foo2957(): Int = 2959
+ def foo2958(): Int = 2960
+ def foo2959(): Int = 2961
+ def foo2960(): Int = 2962
+ def foo2961(): Int = 2963
+ def foo2962(): Int = 2964
+ def foo2963(): Int = 2965
+ def foo2964(): Int = 2966
+ def foo2965(): Int = 2967
+ def foo2966(): Int = 2968
+ def foo2967(): Int = 2969
+ def foo2968(): Int = 2970
+ def foo2969(): Int = 2971
+ def foo2970(): Int = 2972
+ def foo2971(): Int = 2973
+ def foo2972(): Int = 2974
+ def foo2973(): Int = 2975
+ def foo2974(): Int = 2976
+ def foo2975(): Int = 2977
+ def foo2976(): Int = 2978
+ def foo2977(): Int = 2979
+ def foo2978(): Int = 2980
+ def foo2979(): Int = 2981
+ def foo2980(): Int = 2982
+ def foo2981(): Int = 2983
+ def foo2982(): Int = 2984
+ def foo2983(): Int = 2985
+ def foo2984(): Int = 2986
+ def foo2985(): Int = 2987
+ def foo2986(): Int = 2988
+ def foo2987(): Int = 2989
+ def foo2988(): Int = 2990
+ def foo2989(): Int = 2991
+ def foo2990(): Int = 2992
+ def foo2991(): Int = 2993
+ def foo2992(): Int = 2994
+ def foo2993(): Int = 2995
+ def foo2994(): Int = 2996
+ def foo2995(): Int = 2997
+ def foo2996(): Int = 2998
+ def foo2997(): Int = 2999
+ def foo2998(): Int = 3000
+ def foo2999(): Int = 3001
+ def foo3000(): Int = 3002
+ def foo3001(): Int = 3003
+ def foo3002(): Int = 3004
+ def foo3003(): Int = 3005
+ def foo3004(): Int = 3006
+ def foo3005(): Int = 3007
+ def foo3006(): Int = 3008
+ def foo3007(): Int = 3009
+ def foo3008(): Int = 3010
+ def foo3009(): Int = 3011
+ def foo3010(): Int = 3012
+ def foo3011(): Int = 3013
+ def foo3012(): Int = 3014
+ def foo3013(): Int = 3015
+ def foo3014(): Int = 3016
+ def foo3015(): Int = 3017
+ def foo3016(): Int = 3018
+ def foo3017(): Int = 3019
+ def foo3018(): Int = 3020
+ def foo3019(): Int = 3021
+ def foo3020(): Int = 3022
+ def foo3021(): Int = 3023
+ def foo3022(): Int = 3024
+ def foo3023(): Int = 3025
+ def foo3024(): Int = 3026
+ def foo3025(): Int = 3027
+ def foo3026(): Int = 3028
+ def foo3027(): Int = 3029
+ def foo3028(): Int = 3030
+ def foo3029(): Int = 3031
+ def foo3030(): Int = 3032
+ def foo3031(): Int = 3033
+ def foo3032(): Int = 3034
+ def foo3033(): Int = 3035
+ def foo3034(): Int = 3036
+ def foo3035(): Int = 3037
+ def foo3036(): Int = 3038
+ def foo3037(): Int = 3039
+ def foo3038(): Int = 3040
+ def foo3039(): Int = 3041
+ def foo3040(): Int = 3042
+ def foo3041(): Int = 3043
+ def foo3042(): Int = 3044
+ def foo3043(): Int = 3045
+ def foo3044(): Int = 3046
+ def foo3045(): Int = 3047
+ def foo3046(): Int = 3048
+ def foo3047(): Int = 3049
+ def foo3048(): Int = 3050
+ def foo3049(): Int = 3051
+ def foo3050(): Int = 3052
+ def foo3051(): Int = 3053
+ def foo3052(): Int = 3054
+ def foo3053(): Int = 3055
+ def foo3054(): Int = 3056
+ def foo3055(): Int = 3057
+ def foo3056(): Int = 3058
+ def foo3057(): Int = 3059
+ def foo3058(): Int = 3060
+ def foo3059(): Int = 3061
+ def foo3060(): Int = 3062
+ def foo3061(): Int = 3063
+ def foo3062(): Int = 3064
+ def foo3063(): Int = 3065
+ def foo3064(): Int = 3066
+ def foo3065(): Int = 3067
+ def foo3066(): Int = 3068
+ def foo3067(): Int = 3069
+ def foo3068(): Int = 3070
+ def foo3069(): Int = 3071
+ def foo3070(): Int = 3072
+ def foo3071(): Int = 3073
+ def foo3072(): Int = 3074
+ def foo3073(): Int = 3075
+ def foo3074(): Int = 3076
+ def foo3075(): Int = 3077
+ def foo3076(): Int = 3078
+ def foo3077(): Int = 3079
+ def foo3078(): Int = 3080
+ def foo3079(): Int = 3081
+ def foo3080(): Int = 3082
+ def foo3081(): Int = 3083
+ def foo3082(): Int = 3084
+ def foo3083(): Int = 3085
+ def foo3084(): Int = 3086
+ def foo3085(): Int = 3087
+ def foo3086(): Int = 3088
+ def foo3087(): Int = 3089
+ def foo3088(): Int = 3090
+ def foo3089(): Int = 3091
+ def foo3090(): Int = 3092
+ def foo3091(): Int = 3093
+ def foo3092(): Int = 3094
+ def foo3093(): Int = 3095
+ def foo3094(): Int = 3096
+ def foo3095(): Int = 3097
+ def foo3096(): Int = 3098
+ def foo3097(): Int = 3099
+ def foo3098(): Int = 3100
+ def foo3099(): Int = 3101
+ def foo3100(): Int = 3102
+ def foo3101(): Int = 3103
+ def foo3102(): Int = 3104
+ def foo3103(): Int = 3105
+ def foo3104(): Int = 3106
+ def foo3105(): Int = 3107
+ def foo3106(): Int = 3108
+ def foo3107(): Int = 3109
+ def foo3108(): Int = 3110
+ def foo3109(): Int = 3111
+ def foo3110(): Int = 3112
+ def foo3111(): Int = 3113
+ def foo3112(): Int = 3114
+ def foo3113(): Int = 3115
+ def foo3114(): Int = 3116
+ def foo3115(): Int = 3117
+ def foo3116(): Int = 3118
+ def foo3117(): Int = 3119
+ def foo3118(): Int = 3120
+ def foo3119(): Int = 3121
+ def foo3120(): Int = 3122
+ def foo3121(): Int = 3123
+ def foo3122(): Int = 3124
+ def foo3123(): Int = 3125
+ def foo3124(): Int = 3126
+ def foo3125(): Int = 3127
+ def foo3126(): Int = 3128
+ def foo3127(): Int = 3129
+ def foo3128(): Int = 3130
+ def foo3129(): Int = 3131
+ def foo3130(): Int = 3132
+ def foo3131(): Int = 3133
+ def foo3132(): Int = 3134
+ def foo3133(): Int = 3135
+ def foo3134(): Int = 3136
+ def foo3135(): Int = 3137
+ def foo3136(): Int = 3138
+ def foo3137(): Int = 3139
+ def foo3138(): Int = 3140
+ def foo3139(): Int = 3141
+ def foo3140(): Int = 3142
+ def foo3141(): Int = 3143
+ def foo3142(): Int = 3144
+ def foo3143(): Int = 3145
+ def foo3144(): Int = 3146
+ def foo3145(): Int = 3147
+ def foo3146(): Int = 3148
+ def foo3147(): Int = 3149
+ def foo3148(): Int = 3150
+ def foo3149(): Int = 3151
+ def foo3150(): Int = 3152
+ def foo3151(): Int = 3153
+ def foo3152(): Int = 3154
+ def foo3153(): Int = 3155
+ def foo3154(): Int = 3156
+ def foo3155(): Int = 3157
+ def foo3156(): Int = 3158
+ def foo3157(): Int = 3159
+ def foo3158(): Int = 3160
+ def foo3159(): Int = 3161
+ def foo3160(): Int = 3162
+ def foo3161(): Int = 3163
+ def foo3162(): Int = 3164
+ def foo3163(): Int = 3165
+ def foo3164(): Int = 3166
+ def foo3165(): Int = 3167
+ def foo3166(): Int = 3168
+ def foo3167(): Int = 3169
+ def foo3168(): Int = 3170
+ def foo3169(): Int = 3171
+ def foo3170(): Int = 3172
+ def foo3171(): Int = 3173
+ def foo3172(): Int = 3174
+ def foo3173(): Int = 3175
+ def foo3174(): Int = 3176
+ def foo3175(): Int = 3177
+ def foo3176(): Int = 3178
+ def foo3177(): Int = 3179
+ def foo3178(): Int = 3180
+ def foo3179(): Int = 3181
+ def foo3180(): Int = 3182
+ def foo3181(): Int = 3183
+ def foo3182(): Int = 3184
+ def foo3183(): Int = 3185
+ def foo3184(): Int = 3186
+ def foo3185(): Int = 3187
+ def foo3186(): Int = 3188
+ def foo3187(): Int = 3189
+ def foo3188(): Int = 3190
+ def foo3189(): Int = 3191
+ def foo3190(): Int = 3192
+ def foo3191(): Int = 3193
+ def foo3192(): Int = 3194
+ def foo3193(): Int = 3195
+ def foo3194(): Int = 3196
+ def foo3195(): Int = 3197
+ def foo3196(): Int = 3198
+ def foo3197(): Int = 3199
+ def foo3198(): Int = 3200
+ def foo3199(): Int = 3201
+ def foo3200(): Int = 3202
+ def foo3201(): Int = 3203
+ def foo3202(): Int = 3204
+ def foo3203(): Int = 3205
+ def foo3204(): Int = 3206
+ def foo3205(): Int = 3207
+ def foo3206(): Int = 3208
+ def foo3207(): Int = 3209
+ def foo3208(): Int = 3210
+ def foo3209(): Int = 3211
+ def foo3210(): Int = 3212
+ def foo3211(): Int = 3213
+ def foo3212(): Int = 3214
+ def foo3213(): Int = 3215
+ def foo3214(): Int = 3216
+ def foo3215(): Int = 3217
+ def foo3216(): Int = 3218
+ def foo3217(): Int = 3219
+ def foo3218(): Int = 3220
+ def foo3219(): Int = 3221
+ def foo3220(): Int = 3222
+ def foo3221(): Int = 3223
+ def foo3222(): Int = 3224
+ def foo3223(): Int = 3225
+ def foo3224(): Int = 3226
+ def foo3225(): Int = 3227
+ def foo3226(): Int = 3228
+ def foo3227(): Int = 3229
+ def foo3228(): Int = 3230
+ def foo3229(): Int = 3231
+ def foo3230(): Int = 3232
+ def foo3231(): Int = 3233
+ def foo3232(): Int = 3234
+ def foo3233(): Int = 3235
+ def foo3234(): Int = 3236
+ def foo3235(): Int = 3237
+ def foo3236(): Int = 3238
+ def foo3237(): Int = 3239
+ def foo3238(): Int = 3240
+ def foo3239(): Int = 3241
+ def foo3240(): Int = 3242
+ def foo3241(): Int = 3243
+ def foo3242(): Int = 3244
+ def foo3243(): Int = 3245
+ def foo3244(): Int = 3246
+ def foo3245(): Int = 3247
+ def foo3246(): Int = 3248
+ def foo3247(): Int = 3249
+ def foo3248(): Int = 3250
+ def foo3249(): Int = 3251
+ def foo3250(): Int = 3252
+ def foo3251(): Int = 3253
+ def foo3252(): Int = 3254
+ def foo3253(): Int = 3255
+ def foo3254(): Int = 3256
+ def foo3255(): Int = 3257
+ def foo3256(): Int = 3258
+ def foo3257(): Int = 3259
+ def foo3258(): Int = 3260
+ def foo3259(): Int = 3261
+ def foo3260(): Int = 3262
+ def foo3261(): Int = 3263
+ def foo3262(): Int = 3264
+ def foo3263(): Int = 3265
+ def foo3264(): Int = 3266
+ def foo3265(): Int = 3267
+ def foo3266(): Int = 3268
+ def foo3267(): Int = 3269
+ def foo3268(): Int = 3270
+ def foo3269(): Int = 3271
+ def foo3270(): Int = 3272
+ def foo3271(): Int = 3273
+ def foo3272(): Int = 3274
+ def foo3273(): Int = 3275
+ def foo3274(): Int = 3276
+ def foo3275(): Int = 3277
+ def foo3276(): Int = 3278
+ def foo3277(): Int = 3279
+ def foo3278(): Int = 3280
+ def foo3279(): Int = 3281
+ def foo3280(): Int = 3282
+ def foo3281(): Int = 3283
+ def foo3282(): Int = 3284
+ def foo3283(): Int = 3285
+ def foo3284(): Int = 3286
+ def foo3285(): Int = 3287
+ def foo3286(): Int = 3288
+ def foo3287(): Int = 3289
+ def foo3288(): Int = 3290
+ def foo3289(): Int = 3291
+ def foo3290(): Int = 3292
+ def foo3291(): Int = 3293
+ def foo3292(): Int = 3294
+ def foo3293(): Int = 3295
+ def foo3294(): Int = 3296
+ def foo3295(): Int = 3297
+ def foo3296(): Int = 3298
+ def foo3297(): Int = 3299
+ def foo3298(): Int = 3300
+ def foo3299(): Int = 3301
+ def foo3300(): Int = 3302
+ def foo3301(): Int = 3303
+ def foo3302(): Int = 3304
+ def foo3303(): Int = 3305
+ def foo3304(): Int = 3306
+ def foo3305(): Int = 3307
+ def foo3306(): Int = 3308
+ def foo3307(): Int = 3309
+ def foo3308(): Int = 3310
+ def foo3309(): Int = 3311
+ def foo3310(): Int = 3312
+ def foo3311(): Int = 3313
+ def foo3312(): Int = 3314
+ def foo3313(): Int = 3315
+ def foo3314(): Int = 3316
+ def foo3315(): Int = 3317
+ def foo3316(): Int = 3318
+ def foo3317(): Int = 3319
+ def foo3318(): Int = 3320
+ def foo3319(): Int = 3321
+ def foo3320(): Int = 3322
+ def foo3321(): Int = 3323
+ def foo3322(): Int = 3324
+ def foo3323(): Int = 3325
+ def foo3324(): Int = 3326
+ def foo3325(): Int = 3327
+ def foo3326(): Int = 3328
+ def foo3327(): Int = 3329
+ def foo3328(): Int = 3330
+ def foo3329(): Int = 3331
+ def foo3330(): Int = 3332
+ def foo3331(): Int = 3333
+ def foo3332(): Int = 3334
+ def foo3333(): Int = 3335
+ def foo3334(): Int = 3336
+ def foo3335(): Int = 3337
+ def foo3336(): Int = 3338
+ def foo3337(): Int = 3339
+ def foo3338(): Int = 3340
+ def foo3339(): Int = 3341
+ def foo3340(): Int = 3342
+ def foo3341(): Int = 3343
+ def foo3342(): Int = 3344
+ def foo3343(): Int = 3345
+ def foo3344(): Int = 3346
+ def foo3345(): Int = 3347
+ def foo3346(): Int = 3348
+ def foo3347(): Int = 3349
+ def foo3348(): Int = 3350
+ def foo3349(): Int = 3351
+ def foo3350(): Int = 3352
+ def foo3351(): Int = 3353
+ def foo3352(): Int = 3354
+ def foo3353(): Int = 3355
+ def foo3354(): Int = 3356
+ def foo3355(): Int = 3357
+ def foo3356(): Int = 3358
+ def foo3357(): Int = 3359
+ def foo3358(): Int = 3360
+ def foo3359(): Int = 3361
+ def foo3360(): Int = 3362
+ def foo3361(): Int = 3363
+ def foo3362(): Int = 3364
+ def foo3363(): Int = 3365
+ def foo3364(): Int = 3366
+ def foo3365(): Int = 3367
+ def foo3366(): Int = 3368
+ def foo3367(): Int = 3369
+ def foo3368(): Int = 3370
+ def foo3369(): Int = 3371
+ def foo3370(): Int = 3372
+ def foo3371(): Int = 3373
+ def foo3372(): Int = 3374
+ def foo3373(): Int = 3375
+ def foo3374(): Int = 3376
+ def foo3375(): Int = 3377
+ def foo3376(): Int = 3378
+ def foo3377(): Int = 3379
+ def foo3378(): Int = 3380
+ def foo3379(): Int = 3381
+ def foo3380(): Int = 3382
+ def foo3381(): Int = 3383
+ def foo3382(): Int = 3384
+ def foo3383(): Int = 3385
+ def foo3384(): Int = 3386
+ def foo3385(): Int = 3387
+ def foo3386(): Int = 3388
+ def foo3387(): Int = 3389
+ def foo3388(): Int = 3390
+ def foo3389(): Int = 3391
+ def foo3390(): Int = 3392
+ def foo3391(): Int = 3393
+ def foo3392(): Int = 3394
+ def foo3393(): Int = 3395
+ def foo3394(): Int = 3396
+ def foo3395(): Int = 3397
+ def foo3396(): Int = 3398
+ def foo3397(): Int = 3399
+ def foo3398(): Int = 3400
+ def foo3399(): Int = 3401
+ def foo3400(): Int = 3402
+ def foo3401(): Int = 3403
+ def foo3402(): Int = 3404
+ def foo3403(): Int = 3405
+ def foo3404(): Int = 3406
+ def foo3405(): Int = 3407
+ def foo3406(): Int = 3408
+ def foo3407(): Int = 3409
+ def foo3408(): Int = 3410
+ def foo3409(): Int = 3411
+ def foo3410(): Int = 3412
+ def foo3411(): Int = 3413
+ def foo3412(): Int = 3414
+ def foo3413(): Int = 3415
+ def foo3414(): Int = 3416
+ def foo3415(): Int = 3417
+ def foo3416(): Int = 3418
+ def foo3417(): Int = 3419
+ def foo3418(): Int = 3420
+ def foo3419(): Int = 3421
+ def foo3420(): Int = 3422
+ def foo3421(): Int = 3423
+ def foo3422(): Int = 3424
+ def foo3423(): Int = 3425
+ def foo3424(): Int = 3426
+ def foo3425(): Int = 3427
+ def foo3426(): Int = 3428
+ def foo3427(): Int = 3429
+ def foo3428(): Int = 3430
+ def foo3429(): Int = 3431
+ def foo3430(): Int = 3432
+ def foo3431(): Int = 3433
+ def foo3432(): Int = 3434
+ def foo3433(): Int = 3435
+ def foo3434(): Int = 3436
+ def foo3435(): Int = 3437
+ def foo3436(): Int = 3438
+ def foo3437(): Int = 3439
+ def foo3438(): Int = 3440
+ def foo3439(): Int = 3441
+ def foo3440(): Int = 3442
+ def foo3441(): Int = 3443
+ def foo3442(): Int = 3444
+ def foo3443(): Int = 3445
+ def foo3444(): Int = 3446
+ def foo3445(): Int = 3447
+ def foo3446(): Int = 3448
+ def foo3447(): Int = 3449
+ def foo3448(): Int = 3450
+ def foo3449(): Int = 3451
+ def foo3450(): Int = 3452
+ def foo3451(): Int = 3453
+ def foo3452(): Int = 3454
+ def foo3453(): Int = 3455
+ def foo3454(): Int = 3456
+ def foo3455(): Int = 3457
+ def foo3456(): Int = 3458
+ def foo3457(): Int = 3459
+ def foo3458(): Int = 3460
+ def foo3459(): Int = 3461
+ def foo3460(): Int = 3462
+ def foo3461(): Int = 3463
+ def foo3462(): Int = 3464
+ def foo3463(): Int = 3465
+ def foo3464(): Int = 3466
+ def foo3465(): Int = 3467
+ def foo3466(): Int = 3468
+ def foo3467(): Int = 3469
+ def foo3468(): Int = 3470
+ def foo3469(): Int = 3471
+ def foo3470(): Int = 3472
+ def foo3471(): Int = 3473
+ def foo3472(): Int = 3474
+ def foo3473(): Int = 3475
+ def foo3474(): Int = 3476
+ def foo3475(): Int = 3477
+ def foo3476(): Int = 3478
+ def foo3477(): Int = 3479
+ def foo3478(): Int = 3480
+ def foo3479(): Int = 3481
+ def foo3480(): Int = 3482
+ def foo3481(): Int = 3483
+ def foo3482(): Int = 3484
+ def foo3483(): Int = 3485
+ def foo3484(): Int = 3486
+ def foo3485(): Int = 3487
+ def foo3486(): Int = 3488
+ def foo3487(): Int = 3489
+ def foo3488(): Int = 3490
+ def foo3489(): Int = 3491
+ def foo3490(): Int = 3492
+ def foo3491(): Int = 3493
+ def foo3492(): Int = 3494
+ def foo3493(): Int = 3495
+ def foo3494(): Int = 3496
+ def foo3495(): Int = 3497
+ def foo3496(): Int = 3498
+ def foo3497(): Int = 3499
+ def foo3498(): Int = 3500
+ def foo3499(): Int = 3501
+ def foo3500(): Int = 3502
+}
diff --git a/tools/binary-repo-lib.sh b/tools/binary-repo-lib.sh
index 9c037a0efb..278804e30e 100755
--- a/tools/binary-repo-lib.sh
+++ b/tools/binary-repo-lib.sh
@@ -2,8 +2,8 @@
#
# Library to push and pull binary artifacts from a remote repository using CURL.
-remote_urlget="http://repo.typesafe.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
-remote_urlpush="http://dl.bintray.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
+remote_urlget="https://dl.bintray.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
+remote_urlpush="https://dl.bintray.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
libraryJar="$(pwd)/lib/scala-library.jar"
desired_ext=".desired.sha1"
push_jar="$(pwd)/tools/push.jar"
@@ -56,7 +56,7 @@ curlDownload() {
if [[ "$OSTYPE" == *Cygwin* || "$OSTYPE" == *cygwin* ]]; then
jar=$(cygpath -m $1)
fi
- http_code=$(curl --write-out '%{http_code}' --silent --fail --output "$jar" "$url")
+ http_code=$(curl --write-out '%{http_code}' --silent --fail -L --output "$jar" "$url")
if (( $? != 0 )); then
echo "Error downloading $jar: response code: $http_code"
echo "$url"
diff --git a/versions.properties b/versions.properties
index bf89804d5d..b970be3c8e 100644
--- a/versions.properties
+++ b/versions.properties
@@ -26,6 +26,7 @@ scala-xml.version.number=1.0.4
scala-parser-combinators.version.number=1.0.4
scala-swing.version.number=1.0.2
jline.version=2.12.1
+scala-asm.version=5.0.3-scala-3
# external modules, used internally (not shipped)
partest.version.number=1.0.7