diff options
author | Martin Odersky <odersky@gmail.com> | 2011-07-12 13:32:33 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2011-07-12 13:32:33 +0000 |
commit | 66862fe9d88b7d6e4036077f584b2cabcdef3ab0 (patch) | |
tree | a15ea410d50d841f215e5fdcd95577e65da5f410 | |
parent | a10f699d7c443e83472e262ae77a3fe7d9cdc1ba (diff) | |
download | scala-66862fe9d88b7d6e4036077f584b2cabcdef3ab0.tar.gz scala-66862fe9d88b7d6e4036077f584b2cabcdef3ab0.tar.bz2 scala-66862fe9d88b7d6e4036077f584b2cabcdef3ab0.zip |
More work done on implementing reflection.
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. |