diff options
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scala/tools/scalap/Entity.scala | 35 | ||||
-rw-r--r-- | sources/scala/tools/scalap/EntityTable.scala | 32 | ||||
-rw-r--r-- | sources/scala/tools/scalap/ScalaAttribute.scala | 33 | ||||
-rw-r--r-- | sources/scala/tools/scalap/ScalaWriter.scala | 9 |
4 files changed, 96 insertions, 13 deletions
diff --git a/sources/scala/tools/scalap/Entity.scala b/sources/scala/tools/scalap/Entity.scala index ad4960e9d0..ad0f381090 100644 --- a/sources/scala/tools/scalap/Entity.scala +++ b/sources/scala/tools/scalap/Entity.scala @@ -29,11 +29,38 @@ case class Text(str: String) extends Entity { override def toString(): String = str; } -/** Value refers to a constant integer. +/** Value refers to a constant. */ -case class Value(value: Long) extends Entity { +class Value extends Entity { override def isValue: Boolean = true; - override def toString(): String = value.toString(); +} + +case class SimpleValue(tag: Value.Value) extends Value { + import Value._; + override def toString(): String = tag match { + case UNIT => "()" + case NULL => "null" + case ZERO => "0" + } +} + +case class NumberValue(tag: Value.Value, value: Long) extends Value { + import Value._; + override def toString(): String = tag match { + case BOOLEAN => if (value == 0) "false" else "true" + case BYTE | SHORT | CHAR | INT | LONG => value.toString() + case FLOAT => java.lang.Float.intBitsToFloat(value.asInstanceOf[Int]).toString() + case DOUBLE => java.lang.Double.longBitsToDouble(value).toString() + } +} + +case class StringValue(str: String) extends Value { + override def toString(): String = "\"" + str + "\""; +} + +object Value extends Enumeration { + val UNIT, BOOLEAN, BYTE, SHORT, CHAR, INT, LONG, FLOAT, DOUBLE, + NULL, ZERO = Value; } /** Types @@ -64,7 +91,7 @@ case class PolyType(tpe: Type, tvars: List[Symbol]) extends Type; case class OverloadedType(members: List[Symbol], tpes: List[Type]) extends Type; -case class ConstantType(base: Type, value: Long) extends Type; +case class ConstantType(base: Type, value: Entity) extends Type; case class TypeFlag(tpe: Type, flags: Int) extends Type; diff --git a/sources/scala/tools/scalap/EntityTable.scala b/sources/scala/tools/scalap/EntityTable.scala index 8e3b194c00..79364c1e7a 100644 --- a/sources/scala/tools/scalap/EntityTable.scala +++ b/sources/scala/tools/scalap/EntityTable.scala @@ -24,7 +24,7 @@ class EntityTable(attrib: ScalaAttribute) { table(i) = attrib.table(i) match { case TermName(str) => Text(Names.decode(str)); case TypeName(str) => Text(Names.decode(str)); - case Number(x) => Value(x); + case Number(x) => NumberValue(Value.LONG, x); case _ => null; } i = i + 1; @@ -51,6 +51,30 @@ class EntityTable(attrib: ScalaAttribute) { case ExtRef(mod, nameId, _) => fixupIds = i :: fixupIds; new ExternalSymbol(getText(nameId), mod) + case Literal(UNIT_LIT, _) => + SimpleValue(Value.UNIT) + case Literal(NULL_LIT, _) => + SimpleValue(Value.NULL) + case Literal(ZERO_LIT, _) => + SimpleValue(Value.ZERO) + case Literal(BOOL_LIT, data) => + NumberValue(Value.BOOLEAN, data) + case Literal(BYTE_LIT, data) => + NumberValue(Value.BYTE, data) + case Literal(SHORT_LIT, data) => + NumberValue(Value.SHORT, data) + case Literal(CHAR_LIT, data) => + NumberValue(Value.CHAR, data) + case Literal(INT_LIT, data) => + NumberValue(Value.INT, data) + case Literal(LONG_LIT, data) => + NumberValue(Value.LONG, data) + case Literal(FLOAT_LIT, data) => + NumberValue(Value.FLOAT, data) + case Literal(DOUBLE_LIT, data) => + NumberValue(Value.DOUBLE, data) + case Literal(STRING_LIT, data) => + StringValue(getText(data.asInstanceOf[Int])) case _ => table(i) } @@ -94,10 +118,6 @@ class EntityTable(attrib: ScalaAttribute) { case Text(str) => str; } - def getValue(i: Int): Long = table(i) match { - case Value(x) => x; - } - def getSymbol(i: Int): Symbol = if (i < 0) NoSymbol else table(i).asInstanceOf[Symbol]; @@ -133,7 +153,7 @@ class EntityTable(attrib: ScalaAttribute) { } OverloadedType(getSymbols(symIds), getTypes(typeIds)) case ConstantTypeRef(baseId, valId) => - ConstantType(getType(baseId), getValue(valId)) + ConstantType(getType(baseId), table(valId)) case FlaggedType(flags, typeId) => TypeFlag(getType(typeId), flags) } diff --git a/sources/scala/tools/scalap/ScalaAttribute.scala b/sources/scala/tools/scalap/ScalaAttribute.scala index ebf19316fa..65deb4d4ba 100644 --- a/sources/scala/tools/scalap/ScalaAttribute.scala +++ b/sources/scala/tools/scalap/ScalaAttribute.scala @@ -36,6 +36,18 @@ class ScalaAttribute(in: ByteArrayReader) { final val UNBOXEDARRAY_TYPE = 21; final val FLAGGED_TYPE = 22; final val ERROR_TYPE = 23; + final val UNIT_LIT = 24; + final val BOOL_LIT = 25; + final val BYTE_LIT = 26; + final val SHORT_LIT = 27; + final val CHAR_LIT = 28; + final val INT_LIT = 29; + final val LONG_LIT = 30; + final val FLOAT_LIT = 31; + final val DOUBLE_LIT = 32; + final val STRING_LIT = 33; + final val NULL_LIT = 34; + final val ZERO_LIT = 35; val table = readTable; @@ -51,8 +63,8 @@ class ScalaAttribute(in: ByteArrayReader) { def readTableEntry: AttribEntry = { val tag = in.nextByte; + Console.println("tag = " + tag); val len = in.nextNat; - //Console.println("" + tag + ": " + len); val end = in.bp + len; tag match { case TERM_NAME => @@ -95,6 +107,24 @@ class ScalaAttribute(in: ByteArrayReader) { OverloadedTypeRef(readRefs(end)) case FLAGGED_TYPE => FlaggedType(in.nextNat, in.nextNat) + case UNIT_LIT | + NULL_LIT | + ZERO_LIT => + Literal(tag, 0) + case BOOL_LIT => + Literal(tag, in.nextByte) + case STRING_LIT => + Literal(tag, in.nextNat) + case BYTE_LIT | + CHAR_LIT | + SHORT_LIT | + INT_LIT | + LONG_LIT | + FLOAT_LIT | + DOUBLE_LIT => + Literal(tag, in.nextLong) + case _ => + error("unknown meta data tag: " + tag); } } @@ -128,6 +158,7 @@ class ScalaAttribute(in: ByteArrayReader) { case class OverloadedTypeRef(symandtpe: List[Int]) extends AttribEntry; case class ConstantTypeRef(baseref: Int, numref: Int) extends AttribEntry; case class FlaggedType(flags: Int, tpe: Int) extends AttribEntry; + case class Literal(tag: Int, data: Long) extends AttribEntry; case class SymbolInfo(name: Int, owner: Int, flags: Int, info: Int); } diff --git a/sources/scala/tools/scalap/ScalaWriter.scala b/sources/scala/tools/scalap/ScalaWriter.scala index 35ba1bffb8..32e08878f7 100644 --- a/sources/scala/tools/scalap/ScalaWriter.scala +++ b/sources/scala/tools/scalap/ScalaWriter.scala @@ -205,7 +205,12 @@ class ScalaWriter(args: Arguments, writer: Writer) extends CodeWriter(writer) { def printTVar(tvar: Symbol): Unit = tvar match { case sym: TypeSymbol => - print(sym.name); + if (Flags.is(Flags.COVAR, sym.flags)) + print("+" + sym.name) + else if (Flags.is(Flags.CONTRAVAR, sym.flags)) + print("-" + sym.name); + else + print(sym.name); if (!isExternalType(sym.tpe, "Any")) { print(" <: ")*; printType(sym.tpe); @@ -220,7 +225,7 @@ class ScalaWriter(args: Arguments, writer: Writer) extends CodeWriter(writer) { def isExternalType(tpe: Type, name: String): Boolean = tpe match { case TypeRef(SingletonType(ThisType(root), pck), sym, Nil) => - (root.name.length() == 0) && + root.name.equals("<root>") && pck.name.equals("scala") && sym.name.equals(name) case _ => false |