summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-09-27 19:51:27 +0000
committerPaul Phillips <paulp@improving.org>2010-09-27 19:51:27 +0000
commita56c33b6a470939a1396015972f09e19dc493245 (patch)
tree4c38946754440c8860180ccda2b1bb83eb938a3a /src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala
parentb40f4ba3221f1091f4821423f18c157907e9a3c7 (diff)
downloadscala-a56c33b6a470939a1396015972f09e19dc493245.tar.gz
scala-a56c33b6a470939a1396015972f09e19dc493245.tar.bz2
scala-a56c33b6a470939a1396015972f09e19dc493245.zip
Bringing the tree and icode checkers back to life.
build/pack/bin/scalac -d /tmp -Ycheck-debug -Ycheck:all \ src/compiler/scala/tools/nsc/Global.scala That blows up in constructors as most files do, so also try it with -Ycheck:icode to see the pretty icode output (for a little while anyway, after which it will again blow up.) Our work has only just begun! See test/checker-tests/fail*.scala for 11 examples of places where the checker cries foul. Many of them are telling us about real issues and we should listen, but I will need help to figure out which are legitimate and which should be eliminated by altering the checkers. This patch also hacks on some territory the checkers drew me into, especially TypeKinds, where I figured anything which had been commented out since 2005 was fair game. (Optional) review by dragos. (The one place I know I could use a look is in Checkers.scala, because I had to relax some checks and add at least one newer opcode.)
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala')
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala83
1 files changed, 27 insertions, 56 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala b/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala
index 7f2dd7684a..6c3ec7fc19 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala
@@ -112,7 +112,7 @@ trait Opcodes { self: ICodes =>
*/
case class THIS(clasz: Symbol) extends Instruction {
/** Returns a string representation of this constant */
- override def toString(): String = "THIS"
+ override def toString = "THIS(" + clasz.name + ")"
override def consumed = 0
override def produced = 1
@@ -125,9 +125,6 @@ trait Opcodes { self: ICodes =>
* ->: ...:constant
*/
case class CONSTANT(constant: Constant) extends Instruction {
- /** Returns a string representation of this constant */
- override def toString(): String = "CONSTANT ("+constant.toString()+")"
-
override def consumed = 0
override def produced = 1
@@ -140,9 +137,6 @@ trait Opcodes { self: ICodes =>
* ->: ...:element(a)
*/
case class LOAD_ARRAY_ITEM(kind: TypeKind) extends Instruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "LOAD_ARRAY_ITEM (" + kind + ")"
-
override def consumed = 2
override def produced = 1
@@ -155,9 +149,6 @@ trait Opcodes { self: ICodes =>
* ->: ...:value
*/
case class LOAD_LOCAL(local: Local) extends Instruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "LOAD_LOCAL "+local.toString() //+isArgument?" (argument)":"";
-
override def consumed = 0
override def produced = 1
@@ -182,11 +173,9 @@ trait Opcodes { self: ICodes =>
}
case class LOAD_MODULE(module: Symbol) extends Instruction {
- assert(module != NoSymbol,
- "Invalid module symbol");
+ assert(module != NoSymbol, "Invalid module symbol")
/** Returns a string representation of this instruction */
- override def toString(): String =
- "LOAD_MODULE " + module.toString()
+ override def toString(): String = "LOAD_MODULE " + module
override def consumed = 0
override def produced = 1
@@ -199,9 +188,6 @@ trait Opcodes { self: ICodes =>
* ->: ...
*/
case class STORE_ARRAY_ITEM(kind: TypeKind) extends Instruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "STORE_ARRAY_ITEM (" + kind + ")"
-
override def consumed = 3
override def produced = 0
@@ -213,9 +199,6 @@ trait Opcodes { self: ICodes =>
* ->: ...
*/
case class STORE_LOCAL(local: Local) extends Instruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "STORE_LOCAL "+local.toString(); //+isArgument?" (argument)":"";
-
override def consumed = 1
override def produced = 0
@@ -229,7 +212,7 @@ trait Opcodes { self: ICodes =>
case class STORE_FIELD(field: Symbol, isStatic: Boolean) extends Instruction {
/** Returns a string representation of this instruction */
override def toString(): String =
- "STORE_FIELD "+field.toString() + (if (isStatic) " (static)" else " (dynamic)");
+ "STORE_FIELD "+field + (if (isStatic) " (static)" else " (dynamic)");
override def consumed = if(isStatic) 1 else 2;
override def produced = 0;
@@ -246,7 +229,6 @@ trait Opcodes { self: ICodes =>
* ->: ...
*/
case class STORE_THIS(kind: TypeKind) extends Instruction {
- override def toString() = "STORE_THIS(" + kind + ")"
override def consumed = 1
override def produced = 0
override def consumedTypes = List(kind)
@@ -257,9 +239,6 @@ trait Opcodes { self: ICodes =>
* ->: ...:result
*/
case class CALL_PRIMITIVE(primitive: Primitive) extends Instruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="CALL_PRIMITIVE "+primitive.toString()
-
override def consumed = primitive match {
case Negation(_) => 1
case Test(_,_, true) => 1
@@ -322,7 +301,7 @@ trait Opcodes { self: ICodes =>
case class CALL_METHOD(method: Symbol, style: InvokeStyle) extends Instruction with ReferenceEquality {
/** Returns a string representation of this instruction */
override def toString(): String =
- "CALL_METHOD " + hostClass.fullName + method.fullName +" ("+style.toString()+")";
+ "CALL_METHOD " + method.fullName +" ("+style+")"
var hostClass: Symbol = method.owner
def setHostClass(cls: Symbol): this.type = { hostClass = cls; this }
@@ -342,7 +321,7 @@ trait Opcodes { self: ICodes =>
override def consumed = params.length + consumesInstance
override def consumedTypes = {
val args = params map toTypeKind
- if (consumesInstance > 0) AnyRefReference :: args
+ if (consumesInstance > 0) ObjectReference :: args
else args
}
@@ -371,7 +350,7 @@ trait Opcodes { self: ICodes =>
case class UNBOX(boxType: TypeKind) extends Instruction {
override def toString(): String = "UNBOX " + boxType
override def consumed = 1
- override def consumedTypes = AnyRefReference :: Nil
+ override def consumedTypes = ObjectReference :: Nil
override def produced = 1
}
@@ -397,7 +376,7 @@ trait Opcodes { self: ICodes =>
*/
case class CREATE_ARRAY(elem: TypeKind, dims: Int) extends Instruction {
/** Returns a string representation of this instruction */
- override def toString(): String ="CREATE_ARRAY "+elem.toString() + " x " + dims;
+ override def toString(): String ="CREATE_ARRAY "+elem + " x " + dims;
override def consumed = dims;
override def consumedTypes = List.fill(dims)(INT)
@@ -410,10 +389,10 @@ trait Opcodes { self: ICodes =>
*/
case class IS_INSTANCE(typ: TypeKind) extends Instruction {
/** Returns a string representation of this instruction */
- override def toString(): String ="IS_INSTANCE "+typ.toString()
+ override def toString(): String ="IS_INSTANCE "+typ
override def consumed = 1
- override def consumedTypes = AnyRefReference :: Nil
+ override def consumedTypes = ObjectReference :: Nil
override def produced = 1
}
@@ -423,11 +402,11 @@ trait Opcodes { self: ICodes =>
*/
case class CHECK_CAST(typ: TypeKind) extends Instruction {
/** Returns a string representation of this instruction */
- override def toString(): String ="CHECK_CAST "+typ.toString()
+ override def toString(): String ="CHECK_CAST "+typ
override def consumed = 1
override def produced = 1
- override val consumedTypes = List(AnyRefReference)
+ override val consumedTypes = List(ObjectReference)
override def producedTypes = List(typ)
}
@@ -473,7 +452,7 @@ trait Opcodes { self: ICodes =>
/** Returns a string representation of this instruction */
override def toString(): String = (
"CJUMP (" + kind + ")" +
- cond.toString()+" ? "+successBlock.label+" : "+failureBlock.label
+ cond + " ? "+successBlock.label+" : "+failureBlock.label
);
override def consumed = 2
@@ -492,7 +471,7 @@ trait Opcodes { self: ICodes =>
/** Returns a string representation of this instruction */
override def toString(): String = (
"CZJUMP (" + kind + ")" +
- cond.toString()+" ? "+successBlock.label+" : "+failureBlock.label
+ cond + " ? "+successBlock.label+" : "+failureBlock.label
);
override def consumed = 1
@@ -505,9 +484,6 @@ trait Opcodes { self: ICodes =>
* ->: ...
*/
case class RETURN(kind: TypeKind) extends Instruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="RETURN (" + kind + ")"
-
override def consumed = if (kind == UNIT) 0 else 1
override def produced = 0
}
@@ -530,7 +506,7 @@ trait Opcodes { self: ICodes =>
*/
case class DROP (typ: TypeKind) extends Instruction {
/** Returns a string representation of this instruction */
- override def toString(): String ="DROP "+typ.toString()
+ override def toString(): String ="DROP "+typ
override def consumed = 1
override def produced = 0
@@ -541,9 +517,6 @@ trait Opcodes { self: ICodes =>
* ->: ...:something:something
*/
case class DUP (typ: TypeKind) extends Instruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="DUP"
-
override def consumed = 1
override def produced = 2
}
@@ -553,7 +526,6 @@ trait Opcodes { self: ICodes =>
* ->: ...:
*/
case class MONITOR_ENTER() extends Instruction {
-
/** Returns a string representation of this instruction */
override def toString(): String ="MONITOR_ENTER"
@@ -566,7 +538,6 @@ trait Opcodes { self: ICodes =>
* ->: ...:
*/
case class MONITOR_EXIT() extends Instruction {
-
/** Returns a string representation of this instruction */
override def toString(): String ="MONITOR_EXIT";
@@ -603,7 +574,7 @@ trait Opcodes { self: ICodes =>
override def toString(): String = "LOAD_EXCEPTION"
override def consumed = error("LOAD_EXCEPTION does clean the whole stack, no idea how many things it consumes!")
override def produced = 1
- override def producedTypes = AnyRefReference :: Nil
+ override def producedTypes = ThrowableReference :: Nil
}
/** This class represents a method invocation style. */
@@ -627,18 +598,18 @@ trait Opcodes { self: ICodes =>
/** Is this an instance method call? */
def hasInstance: Boolean = this match {
- case Dynamic => true
+ case Dynamic => true
case Static(onInstance) => onInstance
- case SuperCall(_) => true
- case _ => false
+ case SuperCall(_) => true
+ case _ => false
}
/** Returns a string representation of this style. */
override def toString(): String = this match {
- case Dynamic => "dynamic"
- case InvokeDynamic => "invoke-dynamic"
- case Static(false) => "static-class"
- case Static(true) => "static-instance"
+ case Dynamic => "dynamic"
+ case InvokeDynamic => "invoke-dynamic"
+ case Static(false) => "static-class"
+ case Static(true) => "static-instance"
case SuperCall(mix) => "super(" + mix + ")"
}
}
@@ -663,7 +634,7 @@ trait Opcodes { self: ICodes =>
case class CIL_LOAD_LOCAL_ADDRESS(local: Local) extends Instruction {
/** Returns a string representation of this instruction */
- override def toString(): String = "CIL_LOAD_LOCAL_ADDRESS "+local.toString() //+isArgument?" (argument)":"";
+ override def toString(): String = "CIL_LOAD_LOCAL_ADDRESS "+local //+isArgument?" (argument)":"";
override def consumed = 0
override def produced = 1
@@ -674,7 +645,7 @@ trait Opcodes { self: ICodes =>
case class CIL_LOAD_FIELD_ADDRESS(field: Symbol, isStatic: Boolean) extends Instruction {
/** Returns a string representation of this instruction */
override def toString(): String =
- "CIL_LOAD_FIELD_ADDRESS " + (if (isStatic) field.fullName else field.toString());
+ "CIL_LOAD_FIELD_ADDRESS " + (if (isStatic) field.fullName else field.toString)
override def consumed = if (isStatic) 0 else 1
override def produced = 1
@@ -697,7 +668,7 @@ trait Opcodes { self: ICodes =>
case class CIL_UNBOX(valueType: TypeKind) extends Instruction {
override def toString(): String = "CIL_UNBOX " + valueType
override def consumed = 1
- override def consumedTypes = AnyRefReference :: Nil // actually consumes a 'boxed valueType'
+ override def consumedTypes = ObjectReference :: Nil // actually consumes a 'boxed valueType'
override def produced = 1
override def producedTypes = List(msil_mgdptr(valueType))
}
@@ -705,7 +676,7 @@ trait Opcodes { self: ICodes =>
case class CIL_INITOBJ(valueType: TypeKind) extends Instruction {
override def toString(): String = "CIL_INITOBJ " + valueType
override def consumed = 1
- override def consumedTypes = AnyRefReference :: Nil // actually consumes a managed pointer
+ override def consumedTypes = ObjectReference :: Nil // actually consumes a managed pointer
override def produced = 0
}