summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
Diffstat (limited to 'sources')
-rw-r--r--sources/scala/tools/scalap/Entity.scala35
-rw-r--r--sources/scala/tools/scalap/EntityTable.scala32
-rw-r--r--sources/scala/tools/scalap/ScalaAttribute.scala33
-rw-r--r--sources/scala/tools/scalap/ScalaWriter.scala9
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