summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2011-07-12 13:32:33 +0000
committerMartin Odersky <odersky@gmail.com>2011-07-12 13:32:33 +0000
commit66862fe9d88b7d6e4036077f584b2cabcdef3ab0 (patch)
treea15ea410d50d841f215e5fdcd95577e65da5f410
parenta10f699d7c443e83472e262ae77a3fe7d9cdc1ba (diff)
downloadscala-66862fe9d88b7d6e4036077f584b2cabcdef3ab0.tar.gz
scala-66862fe9d88b7d6e4036077f584b2cabcdef3ab0.tar.bz2
scala-66862fe9d88b7d6e4036077f584b2cabcdef3ab0.zip
More work done on implementing reflection.
-rw-r--r--src/compiler/scala/reflect/internal/ClassfileConstants.scala24
-rw-r--r--src/compiler/scala/reflect/internal/SymbolTable.scala2
-rw-r--r--src/compiler/scala/reflect/runtime/JavaConversions.scala163
-rw-r--r--src/compiler/scala/reflect/runtime/Universe.scala6
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileConstants.scala333
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala33
6 files changed, 171 insertions, 390 deletions
diff --git a/src/compiler/scala/reflect/internal/ClassfileConstants.scala b/src/compiler/scala/reflect/internal/ClassfileConstants.scala
index 0e1671bc1c..839bfe90b8 100644
--- a/src/compiler/scala/reflect/internal/ClassfileConstants.scala
+++ b/src/compiler/scala/reflect/internal/ClassfileConstants.scala
@@ -329,4 +329,28 @@ object ClassfileConstants {
final val breakpoint = 0xca
final val impdep1 = 0xfe
final val impdep2 = 0xff
+
+ def toScalaFlags(flags: Int, isClass: Boolean): Long = {
+ import Flags._
+ var res = 0l
+ if ((flags & JAVA_ACC_PRIVATE) != 0)
+ res = res | PRIVATE
+ else if ((flags & JAVA_ACC_PROTECTED) != 0)
+ res = res | PROTECTED
+ if ((flags & JAVA_ACC_ABSTRACT) != 0 && (flags & JAVA_ACC_ANNOTATION) == 0)
+ res = res | DEFERRED
+ if ((flags & JAVA_ACC_FINAL) != 0)
+ res = res | FINAL
+ if (((flags & JAVA_ACC_INTERFACE) != 0) &&
+ ((flags & JAVA_ACC_ANNOTATION) == 0))
+ res = res | TRAIT | INTERFACE | ABSTRACT
+ if ((flags & JAVA_ACC_SYNTHETIC) != 0)
+ res = res | SYNTHETIC
+ if ((flags & JAVA_ACC_STATIC) != 0)
+ res = res | STATIC
+ if (isClass && ((res & DEFERRED) != 0L))
+ res = res & ~DEFERRED | ABSTRACT
+
+ res | JAVA
+ }
}
diff --git a/src/compiler/scala/reflect/internal/SymbolTable.scala b/src/compiler/scala/reflect/internal/SymbolTable.scala
index 68bf0082d2..ca2b5867ce 100644
--- a/src/compiler/scala/reflect/internal/SymbolTable.scala
+++ b/src/compiler/scala/reflect/internal/SymbolTable.scala
@@ -50,7 +50,7 @@ abstract class SymbolTable extends api.Universe
final val NoRunId = 0
private var ph: Phase = NoPhase
- private var per = NoPeriod
+ protected var per = NoPeriod
final def phase: Phase = ph
diff --git a/src/compiler/scala/reflect/runtime/JavaConversions.scala b/src/compiler/scala/reflect/runtime/JavaConversions.scala
index a382ec3dfa..8860c18845 100644
--- a/src/compiler/scala/reflect/runtime/JavaConversions.scala
+++ b/src/compiler/scala/reflect/runtime/JavaConversions.scala
@@ -1,42 +1,153 @@
-package scala.reflect.runtime
+package scala.reflect
+package runtime
-import java.lang.reflect.GenericDeclaration
+import java.lang.{Class => jClass, Package => jPackage}
+import java.lang.reflect.{
+ Method => jMethod, Constructor => jConstructor, Modifier => jModifier, Field => jField,
+ Member => jMember, Type => jType, GenericDeclaration}
+import internal.ByteCodecs
+import internal.ClassfileConstants._
+import internal.pickling.UnPickler
+import collection.mutable.HashMap
trait JavaConversions { self: Universe =>
- def jOwnerChain(jclazz: java.lang.Class[_]): List[GenericDeclaration] = {
- {
- val owner = jclazz.getEnclosingConstructor
- if (owner != null) return owner :: jOwnerChain(owner)
- };{
- val owner = jclazz.getEnclosingMethod
- if (owner != null) return owner :: jOwnerChain(owner)
- };{
- val owner = jclazz.getEnclosingClass
- if (owner != null) owner :: jOwnerChain(owner) else List()
+ private object unpickler extends UnPickler {
+ val global: JavaConversions.this.type = self
+ }
+
+ class TwoWayCache[J, S] {
+ val toScalaMap = new HashMap[J, S]
+ val toJavaMap = new HashMap[S, J]
+
+ def toScala(key: J)(body: => S) = toScalaMap.getOrElseUpdate(key, body)
+ def toJava(key: S)(body: => J) = toJavaMap.getOrElseUpdate(key, body)
+ }
+
+ private val classCache = new TwoWayCache[jClass[_], Symbol]
+ private val packageCache = new TwoWayCache[jPackage, Symbol]
+ private val methodCache = new TwoWayCache[jMethod, Symbol]
+ private val constructorCache = new TwoWayCache[jConstructor[_], Symbol]
+ private val fieldCache = new TwoWayCache[jField, Symbol]
+
+ private def createClassModule(owner: Symbol, name: TypeName) = {
+ val clazz = owner.newClass(NoPosition, name)
+ val module = owner.newModule(NoPosition, name)
+ if (owner.isClass) {
+ owner.info.decls enter clazz
+ owner.info.decls enter module
}
+ (clazz, module)
+ }
+
+ private def unpickleClass(jclazz: jClass[_], bytes: Array[Byte], len: Int): ClassSymbol = {
+ val (clazz, module) = createClassModule(sOwner(jclazz), newTypeName(jclazz.getSimpleName))
+ unpickler.unpickle(bytes, 0, clazz, module, jclazz.getName)
+ println("found: "+len+" bytes from "+bytes.deep)
+ clazz
}
- def jOwnerChain(jconstr: java.lang.reflect.Method): List[GenericDeclaration] = {
- val owner = jconstr.getDeclaringClass
- owner :: jOwnerChain(owner)
+ def followStatic(clazz: Symbol, mods: Int) =
+ if (jModifier.isStatic(mods)) clazz.companionModule.moduleClass else clazz
+
+ def sOwner(jclazz: jClass[_]): Symbol = {
+ if (jclazz.isMemberClass)
+ followStatic(classToScala(jclazz.getEnclosingClass), jclazz.getModifiers)
+ else if (jclazz.isLocalClass)
+ methodToScala(jclazz.getEnclosingMethod) orElse constrToScala(jclazz.getEnclosingConstructor)
+ else
+ packageToScala(jclazz.getPackage)
}
- def jOwnerChain(jconstr: java.lang.reflect.Constructor[_]): List[GenericDeclaration] = {
- val owner = jconstr.getDeclaringClass
- owner :: jOwnerChain(owner)
+ def sOwner(jmember: jMember): Symbol = {
+ followStatic(classToScala(jmember.getDeclaringClass), jmember.getModifiers)
}
- def toplevelScalaClass(jclazz: java.lang.Class[_]): ClassSymbol = {
- println(jclazz.getAnnotations().toList map (_.annotationType))
- null
+ def lookup(clazz: Symbol, jname: String): Symbol =
+ clazz.info.decl(newTermName(jname)) orElse {
+ (clazz.info.decls.iterator filter (_.name.toString startsWith jname)).toList match {
+ case List() => NoSymbol
+ case List(sym) => sym
+ case alts => clazz.newOverloaded(alts.head.tpe.prefix, alts)
+ }
}
- def navigate(root: Symbol, path: List[GenericDeclaration]): Symbol = NoSymbol
+ def erasesTo(meth: Symbol, jmeth: jMethod): Boolean = true
+ def erasesTo(meth: Symbol, jconstr: jConstructor[_]): Boolean = true
+
+ def methodToScala(jmeth: jMethod): Symbol = methodCache.toScala(jmeth) {
+ val owner = followStatic(classToScala(jmeth.getDeclaringClass), jmeth.getModifiers)
+ lookup(owner, jmeth.getName) suchThat (erasesTo(_, jmeth)) orElse jmethodAsScala(jmeth)
+ }
+
+ def constrToScala(jconstr: jConstructor[_]): Symbol = constructorCache.toScala(jconstr) {
+ val owner = followStatic(classToScala(jconstr.getDeclaringClass), jconstr.getModifiers)
+ lookup(owner, "<init>") suchThat (erasesTo(_, jconstr)) orElse jconstrAsScala(jconstr)
+ }
- def scalaClass(jclazz: java.lang.Class[_]): Symbol = {
- val path = (jclazz :: jOwnerChain(jclazz)).reverse
- val topClass = toplevelScalaClass(path.head.asInstanceOf[java.lang.Class[_]])
- navigate(topClass, path)
+ def packageToScala(jpkg: jPackage): Symbol = packageCache.toScala(jpkg) {
+ makeScalaPackage(jpkg.getName)
}
+
+ def packageNameToScala(fullname: String): Symbol = {
+ val jpkg = jPackage.getPackage(fullname)
+ if (jpkg != null) packageToScala(jpkg) else makeScalaPackage(fullname)
+ }
+
+ private def makeScalaPackage(fullname: String): Symbol = {
+ val split = fullname lastIndexOf '.'
+ val owner = if (split > 0) packageNameToScala(fullname take split) else definitions.RootClass
+ val name = fullname drop (split + 1)
+ val pkg = owner.newPackage(NoPosition, newTermName(name))
+ pkg.moduleClass setInfo new ClassInfoType(List(), new Scope, pkg)
+ pkg setInfo pkg.moduleClass.tpe
+ pkg.moduleClass
+ }
+
+ def classToScala(jclazz: jClass[_]): Symbol = classCache.toScala(jclazz) {
+ if (jclazz.isMemberClass) {
+ sOwner(jclazz).info.decl(newTypeName(jclazz.getSimpleName)).asInstanceOf[ClassSymbol]
+ } else if (jclazz.isLocalClass) { // local classes not preserved by unpickling - treat as Java
+ jclassAsScala(jclazz)
+ } else { // jclazz is top-level - get signature
+ val ssig = jclazz.getAnnotation(classOf[scala.reflect.ScalaSignature])
+ if (ssig != null) {
+ val bytes = ssig.bytes.getBytes
+ val len = ByteCodecs.decode(bytes)
+ unpickleClass(jclazz, bytes, len)
+ } else {
+ val slsig = jclazz.getAnnotation(classOf[scala.reflect.ScalaLongSignature])
+ if (slsig != null) {
+ val byteSegments = slsig.bytes map (_.getBytes)
+ val lens = byteSegments map ByteCodecs.decode
+ val bytes = Array.ofDim[Byte](lens.sum)
+ var len = 0
+ for ((bs, l) <- byteSegments zip lens) {
+ bs.copyToArray(bytes, len, l)
+ len += l
+ }
+ unpickleClass(jclazz, bytes, len)
+ } else { // class does not have a Scala signature; it's a Java class
+ jclassAsScala(jclazz)
+ }
+ }
+ }
+ }
+
+ def typeToScala(tpe: jType): Type = NoType
+
+ def jclassAsScala(jclazz: jClass[_]): Symbol = {
+ val (clazz, module) = createClassModule(sOwner(jclazz), newTypeName(jclazz.getSimpleName))
+ // fill in clazz, module from jclazz
+ clazz
+ }
+
+ def jfieldAsScala(jfield: jField): Symbol = fieldCache.toScala(jfield) {
+ sOwner(jfield).newValue(NoPosition, newTermName(jfield.getName))
+ .setFlag(toScalaFlags(jfield.getModifiers, isClass = false))
+ .setInfo(typeToScala(jfield.getGenericType))
+ }
+
+ def jmethodAsScala(jmeth: jMethod): Symbol = NoSymbol
+ def jconstrAsScala(jconstr: jConstructor[_]): Symbol = NoSymbol
} \ No newline at end of file
diff --git a/src/compiler/scala/reflect/runtime/Universe.scala b/src/compiler/scala/reflect/runtime/Universe.scala
index acb22a7840..9157cd9001 100644
--- a/src/compiler/scala/reflect/runtime/Universe.scala
+++ b/src/compiler/scala/reflect/runtime/Universe.scala
@@ -17,8 +17,10 @@ class Universe extends internal.SymbolTable with JavaConversions {
val phaseWithId: Array[internal.Phase] = Array()
val currentRunId = 0
+ per = 1 << 8 + 1 // fake a period so that it is different from NoPeriod
+
def log(msg: => AnyRef): Unit = println(" [] "+msg)
- val rootLoader = new LazyType {
+ override val rootLoader = new LazyType {
override def complete(sym: Symbol) = sym setInfo packageType(definitions.RootClass)
}
@@ -39,5 +41,5 @@ class Universe extends internal.SymbolTable with JavaConversions {
}
object Universe extends Universe with App {
- toplevelScalaClass(classOf[scala.collection.Iterable[_]])
+ classToScala(classOf[scala.collection.Iterable[_]])
} \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileConstants.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileConstants.scala
deleted file mode 100644
index 6a622589bb..0000000000
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileConstants.scala
+++ /dev/null
@@ -1,333 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2011 LAMP/EPFL
- * @author Martin Odersky
- */
-
-package scala.tools.nsc
-package symtab
-package classfile
-
-object ClassfileConstants {
-
- final val JAVA_MAGIC = 0xCAFEBABE
- final val JAVA_MAJOR_VERSION = 45
- final val JAVA_MINOR_VERSION = 3
-
- /** <p>
- * (see http://java.sun.com/docs/books/jvms/second_edition/jvms-clarify.html)
- * </p>
- * <p>
- * If the <code>ACC_INTERFACE</code> flag is set, the <code>ACC_ABSTRACT</code>
- * flag must also be set (ch. 2.13.1).
- * </p>
- * <p>
- * A class file cannot have both its <code>ACC_FINAL</code> and
- * <code>ACC_ABSTRACT</code> flags set (ch. 2.8.2).
- * </p>
- * <p>
- * A field may have at most one of its <code>ACC_PRIVATE</code>,
- * <code>ACC_PROTECTED</code>, <code>ACC_PUBLIC</code> flags set (ch. 2.7.4).
- * </p>
- * <p>
- * A field may not have both its <code>ACC_FINAL</code> and
- * <code>ACC_VOLATILE</code> flags set (ch. 2.9.1).
- * </p>
- * <p>
- * If a method has its <code>ACC_ABSTRACT</code> flag set it must not
- * have any of its <code>ACC_FINAL</code>, <code>ACC_NATIVE</code>,
- * <code>ACC_PRIVATE</code>, <code>ACC_STATIC</code>, <code>ACC_STRICT</code>,
- * or <code>ACC_SYNCHRONIZED</code> flags set (ch. 2.13.3.2).
- * </p>
- * <p>
- * All interface methods must have their <code>ACC_ABSTRACT</code> and
- * <code>ACC_PUBLIC</code> flags set.
- * </p>
- */ // Class Field Method
- final val JAVA_ACC_PUBLIC = 0x0001 // X X X
- final val JAVA_ACC_PRIVATE = 0x0002 // X X
- final val JAVA_ACC_PROTECTED = 0x0004 // X X
- final val JAVA_ACC_STATIC = 0x0008 // X X
- final val JAVA_ACC_FINAL = 0x0010 // X X X
- final val JAVA_ACC_SUPER = 0x0020 // X
- final val JAVA_ACC_SYNCHRONIZED = 0x0020 // X
- final val JAVA_ACC_VOLATILE = 0x0040 // X
- final val JAVA_ACC_BRIDGE = 0x0040 // X
- final val JAVA_ACC_TRANSIENT = 0x0080 // X
- final val JAVA_ACC_VARARGS = 0x0080 // X
- final val JAVA_ACC_NATIVE = 0x0100 // X
- final val JAVA_ACC_INTERFACE = 0x0200 // X
- final val JAVA_ACC_ABSTRACT = 0x0400 // X X
- final val JAVA_ACC_STRICT = 0x0800 // X
- final val JAVA_ACC_SYNTHETIC = 0x1000 // X X X
- final val JAVA_ACC_ANNOTATION = 0x2000 // X
- final val JAVA_ACC_ENUM = 0x4000 // X X
-
- // tags describing the type of a literal in the constant pool
- final val CONSTANT_UTF8 = 1
- final val CONSTANT_UNICODE = 2
- final val CONSTANT_INTEGER = 3
- final val CONSTANT_FLOAT = 4
- final val CONSTANT_LONG = 5
- final val CONSTANT_DOUBLE = 6
- final val CONSTANT_CLASS = 7
- final val CONSTANT_STRING = 8
- final val CONSTANT_FIELDREF = 9
- final val CONSTANT_METHODREF = 10
- final val CONSTANT_INTFMETHODREF = 11
- final val CONSTANT_NAMEANDTYPE = 12
-
- // tags describing the type of a literal in attribute values
- final val BYTE_TAG = 'B'
- final val CHAR_TAG = 'C'
- final val DOUBLE_TAG = 'D'
- final val FLOAT_TAG = 'F'
- final val INT_TAG = 'I'
- final val LONG_TAG = 'J'
- final val SHORT_TAG = 'S'
- final val BOOL_TAG = 'Z'
- final val STRING_TAG = 's'
- final val ENUM_TAG = 'e'
- final val CLASS_TAG = 'c'
- final val ARRAY_TAG = '['
- final val VOID_TAG = 'V'
- final val TVAR_TAG = 'T'
- final val ANNOTATION_TAG = '@'
- final val SCALA_NOTHING = "scala.runtime.Nothing$"
- final val SCALA_NULL = "scala.runtime.Null$"
-
-
- // tags describing the type of newarray
- final val T_BOOLEAN = 4
- final val T_CHAR = 5
- final val T_FLOAT = 6
- final val T_DOUBLE = 7
- final val T_BYTE = 8
- final val T_SHORT = 9
- final val T_INT = 10
- final val T_LONG = 11
-
- // JVM mnemonics
- final val nop = 0x00
- final val aconst_null = 0x01
- final val iconst_m1 = 0x02
-
- final val iconst_0 = 0x03
- final val iconst_1 = 0x04
- final val iconst_2 = 0x05
- final val iconst_3 = 0x06
- final val iconst_4 = 0x07
- final val iconst_5 = 0x08
-
- final val lconst_0 = 0x09
- final val lconst_1 = 0x0a
- final val fconst_0 = 0x0b
- final val fconst_1 = 0x0c
- final val fconst_2 = 0x0d
- final val dconst_0 = 0x0e
- final val dconst_1 = 0x0f
-
- final val bipush = 0x10
- final val sipush = 0x11
- final val ldc = 0x12
- final val ldc_w = 0x13
- final val ldc2_w = 0x14
-
- final val iload = 0x15
- final val lload = 0x16
- final val fload = 0x17
- final val dload = 0x18
- final val aload = 0x19
-
- final val iload_0 = 0x1a
- final val iload_1 = 0x1b
- final val iload_2 = 0x1c
- final val iload_3 = 0x1d
- final val lload_0 = 0x1e
- final val lload_1 = 0x1f
- final val lload_2 = 0x20
- final val lload_3 = 0x21
- final val fload_0 = 0x22
- final val fload_1 = 0x23
- final val fload_2 = 0x24
- final val fload_3 = 0x25
- final val dload_0 = 0x26
- final val dload_1 = 0x27
- final val dload_2 = 0x28
- final val dload_3 = 0x29
- final val aload_0 = 0x2a
- final val aload_1 = 0x2b
- final val aload_2 = 0x2c
- final val aload_3 = 0x2d
- final val iaload = 0x2e
- final val laload = 0x2f
- final val faload = 0x30
- final val daload = 0x31
- final val aaload = 0x32
- final val baload = 0x33
- final val caload = 0x34
- final val saload = 0x35
-
- final val istore = 0x36
- final val lstore = 0x37
- final val fstore = 0x38
- final val dstore = 0x39
- final val astore = 0x3a
- final val istore_0 = 0x3b
- final val istore_1 = 0x3c
- final val istore_2 = 0x3d
- final val istore_3 = 0x3e
- final val lstore_0 = 0x3f
- final val lstore_1 = 0x40
- final val lstore_2 = 0x41
- final val lstore_3 = 0x42
- final val fstore_0 = 0x43
- final val fstore_1 = 0x44
- final val fstore_2 = 0x45
- final val fstore_3 = 0x46
- final val dstore_0 = 0x47
- final val dstore_1 = 0x48
- final val dstore_2 = 0x49
- final val dstore_3 = 0x4a
- final val astore_0 = 0x4b
- final val astore_1 = 0x4c
- final val astore_2 = 0x4d
- final val astore_3 = 0x4e
- final val iastore = 0x4f
- final val lastore = 0x50
- final val fastore = 0x51
- final val dastore = 0x52
- final val aastore = 0x53
- final val bastore = 0x54
- final val castore = 0x55
- final val sastore = 0x56
-
- final val pop = 0x57
- final val pop2 = 0x58
- final val dup = 0x59
- final val dup_x1 = 0x5a
- final val dup_x2 = 0x5b
- final val dup2 = 0x5c
- final val dup2_x1 = 0x5d
- final val dup2_x2 = 0x5e
- final val swap = 0x5f
-
- final val iadd = 0x60
- final val ladd = 0x61
- final val fadd = 0x62
- final val dadd = 0x63
- final val isub = 0x64
- final val lsub = 0x65
- final val fsub = 0x66
- final val dsub = 0x67
- final val imul = 0x68
- final val lmul = 0x69
- final val fmul = 0x6a
- final val dmul = 0x6b
- final val idiv = 0x6c
- final val ldiv = 0x6d
- final val fdiv = 0x6e
- final val ddiv = 0x6f
- final val irem = 0x70
- final val lrem = 0x71
- final val frem = 0x72
- final val drem = 0x73
-
- final val ineg = 0x74
- final val lneg = 0x75
- final val fneg = 0x76
- final val dneg = 0x77
-
- final val ishl = 0x78
- final val lshl = 0x79
- final val ishr = 0x7a
- final val lshr = 0x7b
- final val iushr = 0x7c
- final val lushr = 0x7d
- final val iand = 0x7e
- final val land = 0x7f
- final val ior = 0x80
- final val lor = 0x81
- final val ixor = 0x82
- final val lxor = 0x83
- final val iinc = 0x84
-
- final val i2l = 0x85
- final val i2f = 0x86
- final val i2d = 0x87
- final val l2i = 0x88
- final val l2f = 0x89
- final val l2d = 0x8a
- final val f2i = 0x8b
- final val f2l = 0x8c
- final val f2d = 0x8d
- final val d2i = 0x8e
- final val d2l = 0x8f
- final val d2f = 0x90
- final val i2b = 0x91
- final val i2c = 0x92
- final val i2s = 0x93
-
- final val lcmp = 0x94
- final val fcmpl = 0x95
- final val fcmpg = 0x96
- final val dcmpl = 0x97
- final val dcmpg = 0x98
-
- final val ifeq = 0x99
- final val ifne = 0x9a
- final val iflt = 0x9b
- final val ifge = 0x9c
- final val ifgt = 0x9d
- final val ifle = 0x9e
- final val if_icmpeq = 0x9f
- final val if_icmpne = 0xa0
- final val if_icmplt = 0xa1
- final val if_icmpge = 0xa2
- final val if_icmpgt = 0xa3
- final val if_icmple = 0xa4
- final val if_acmpeq = 0xa5
- final val if_acmpne = 0xa6
- final val goto = 0xa7
- final val jsr = 0xa8
- final val ret = 0xa9
- final val tableswitch = 0xaa
- final val lookupswitch = 0xab
- final val ireturn = 0xac
- final val lreturn = 0xad
- final val freturn = 0xae
- final val dreturn = 0xaf
- final val areturn = 0xb0
- final val return_ = 0xb1
-
- final val getstatic = 0xb2
- final val putstatic = 0xb3
- final val getfield = 0xb4
- final val putfield = 0xb5
-
- final val invokevirtual = 0xb6
- final val invokespecial = 0xb7
- final val invokestatic = 0xb8
- final val invokeinterface = 0xb9
- final val xxxunusedxxxx = 0xba
-
- final val new_ = 0xbb
- final val newarray = 0xbc
- final val anewarray = 0xbd
- final val arraylength = 0xbe
- final val athrow = 0xbf
- final val checkcast = 0xc0
- final val instanceof = 0xc1
- final val monitorenter = 0xc2
- final val monitorexit = 0xc3
- final val wide = 0xc4
- final val multianewarray = 0xc5
- final val ifnull = 0xc6
- final val ifnonnull = 0xc7
- final val goto_w = 0xc8
- final val jsr_w = 0xc9
-
- // reserved opcodes
- final val breakpoint = 0xca
- final val impdep1 = 0xfe
- final val impdep2 = 0xff
-}
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index a0654395d2..7963cc09f3 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -496,7 +496,7 @@ abstract class ClassfileParser {
def parseClass() {
val jflags = in.nextChar
val isAnnotation = hasAnnotation(jflags)
- var sflags = transFlags(jflags, true)
+ var sflags = toScalaFlags(jflags, true)
var nameIdx = in.nextChar
externalName = pool.getClassName(nameIdx)
val c = if (externalName.toString.indexOf('$') < 0) pool.getClassSymbol(nameIdx) else clazz
@@ -604,7 +604,7 @@ abstract class ClassfileParser {
def parseField() {
val jflags = in.nextChar
- var sflags = transFlags(jflags, false)
+ var sflags = toScalaFlags(jflags, false)
if ((sflags & FINAL) == 0L) sflags = sflags | MUTABLE
if ((sflags & PRIVATE) != 0L && !global.settings.XO.value) {
in.skip(4); skipAttributes()
@@ -636,7 +636,7 @@ abstract class ClassfileParser {
def parseMethod() {
val jflags = in.nextChar.toInt
- var sflags = transFlags(jflags, false)
+ var sflags = toScalaFlags(jflags, false)
if (isPrivate(jflags) && !global.settings.XO.value) {
val name = pool.getName(in.nextChar)
if (name == nme.CONSTRUCTOR)
@@ -1102,7 +1102,7 @@ abstract class ClassfileParser {
def enterClassAndModule(entry: InnerClassEntry, completer: global.loaders.SymbolLoader, jflags: Int) {
val name = entry.originalName
- var sflags = transFlags(jflags, true)
+ var sflags = toScalaFlags(jflags, true)
val innerClass = getOwner(jflags).newClass(NoPosition, name.toTypeName).setInfo(completer).setFlag(sflags)
val innerModule = getOwner(jflags).newModule(NoPosition, name.toTermName).setInfo(completer).setFlag(sflags)
@@ -1291,30 +1291,7 @@ abstract class ClassfileParser {
protected def getScope(flags: Int): Scope =
if (isStatic(flags)) staticDefs else instanceDefs
- protected def transFlags(flags: Int, isClass: Boolean): Long = {
- var res = 0l
- if ((flags & JAVA_ACC_PRIVATE) != 0)
- res = res | PRIVATE
- else if ((flags & JAVA_ACC_PROTECTED) != 0)
- res = res | PROTECTED
- if ((flags & JAVA_ACC_ABSTRACT) != 0 && (flags & JAVA_ACC_ANNOTATION) == 0)
- res = res | DEFERRED
- if ((flags & JAVA_ACC_FINAL) != 0)
- res = res | FINAL
- if (((flags & JAVA_ACC_INTERFACE) != 0) &&
- ((flags & JAVA_ACC_ANNOTATION) == 0))
- res = res | TRAIT | INTERFACE | ABSTRACT
- if ((flags & JAVA_ACC_SYNTHETIC) != 0)
- res = res | SYNTHETIC
- if ((flags & JAVA_ACC_STATIC) != 0)
- res = res | STATIC
- if (isClass && ((res & DEFERRED) != 0L))
- res = res & ~DEFERRED | ABSTRACT
-
- res | JAVA
- }
-
- private def setPrivateWithin(sym: Symbol, jflags: Int) {
+ private def setPrivateWithin(sym: Symbol, jflags: Int) {
if ((jflags & (JAVA_ACC_PRIVATE | JAVA_ACC_PROTECTED | JAVA_ACC_PUBLIC)) == 0)
// See ticket #1687 for an example of when topLevelClass is NoSymbol: it
// apparently occurs when processing v45.3 bytecode.