summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsources/scala/tools/nsc/Global.scala8
-rw-r--r--sources/scala/tools/nsc/backend/icode/BasicBlocks.scala2
-rw-r--r--sources/scala/tools/nsc/backend/icode/Checkers.scala6
-rw-r--r--sources/scala/tools/nsc/backend/icode/GenICode.scala15
-rw-r--r--sources/scala/tools/nsc/backend/icode/Linearizers.scala2
-rw-r--r--sources/scala/tools/nsc/backend/icode/Opcodes.scala8
6 files changed, 25 insertions, 16 deletions
diff --git a/sources/scala/tools/nsc/Global.scala b/sources/scala/tools/nsc/Global.scala
index 76eb0887db..37c90b3eca 100755
--- a/sources/scala/tools/nsc/Global.scala
+++ b/sources/scala/tools/nsc/Global.scala
@@ -20,6 +20,7 @@ import matching.TransMatcher;
import transform._;
import backend.icode.{ICodes, GenICode, Checkers};
import backend.ScalaPrimitives;
+import backend.jvm.BytecodeGenerators;
class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable
with Trees
@@ -240,6 +241,10 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable
val global: Global.this.type = Global.this;
}
+ object genJVM extends BytecodeGenerators {
+ val global: Global.this.type = Global.this;
+ }
+
def phaseDescriptors: List[SubComponent] = List(
analyzer.namerFactory,
analyzer.typerFactory,
@@ -256,6 +261,7 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable
constructors,
mixin,
genicode,
+ genJVM,
sampleTransform);
val parserPhase = syntaxAnalyzer.newPhase(NoPhase);
@@ -423,7 +429,7 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable
}
/** Returns the file with the given suffix for the given class. */
- private def getFile(clazz: Symbol, suffix: String) = {
+ def getFile(clazz: Symbol, suffix: String) = {
val outdirname = settings.outdir.value;
var outdir = new File(if (outdirname == "") "." else outdirname);
val filename = clazz.fullNameString('.');
diff --git a/sources/scala/tools/nsc/backend/icode/BasicBlocks.scala b/sources/scala/tools/nsc/backend/icode/BasicBlocks.scala
index f127ee0803..277b3de748 100644
--- a/sources/scala/tools/nsc/backend/icode/BasicBlocks.scala
+++ b/sources/scala/tools/nsc/backend/icode/BasicBlocks.scala
@@ -158,7 +158,7 @@ trait BasicBlocks: ICodes {
case CJUMP(success, failure, _, _) => failure::success::Nil;
case CZJUMP(success, failure, _, _) => failure::success::Nil;
case SWITCH(_,labels) => labels;
- case RETURN() => Nil;
+ case RETURN(_) => Nil;
case _ =>
global.abort("The last instruction is not a control flow instruction");
}
diff --git a/sources/scala/tools/nsc/backend/icode/Checkers.scala b/sources/scala/tools/nsc/backend/icode/Checkers.scala
index f99b062847..527cf64919 100644
--- a/sources/scala/tools/nsc/backend/icode/Checkers.scala
+++ b/sources/scala/tools/nsc/backend/icode/Checkers.scala
@@ -425,7 +425,11 @@ abstract class Checkers {
"Jump to non-existant block " + failure);
checkType(stack.pop, kind);
- case RETURN() => ();
+ case RETURN(kind) =>
+ kind match {
+ case UNIT => ();
+ case _ => checkStack(1); checkType(stack.pop, kind);
+ }
case THROW() =>
val thrown = stack.pop;
diff --git a/sources/scala/tools/nsc/backend/icode/GenICode.scala b/sources/scala/tools/nsc/backend/icode/GenICode.scala
index a7eb312fd7..c9f0566a8d 100644
--- a/sources/scala/tools/nsc/backend/icode/GenICode.scala
+++ b/sources/scala/tools/nsc/backend/icode/GenICode.scala
@@ -99,13 +99,12 @@ abstract class GenICode extends SubComponent {
ctx.clazz.addMethod(m);
var ctx1 = ctx.enterMethod(m, tree.asInstanceOf[DefDef]);
addMethodParams(ctx1, vparamss);
- ctx1 = genLoad(rhs,
- ctx1,
- if (tree.symbol.isConstructor)
- UNIT
- else
- toTypeKind(ctx1.method.symbol.info.resultType));
- ctx1.bb.emit(RETURN());
+ val resTpe = if (tree.symbol.isConstructor) UNIT
+ else toTypeKind(ctx1.method.symbol.info.resultType);
+
+ ctx1 = genLoad(rhs, ctx1, resTpe);
+
+ ctx1.bb.emit(RETURN(resTpe));
ctx1.bb.close;
ctx1;
@@ -379,7 +378,7 @@ abstract class GenICode extends SubComponent {
case Return(expr) =>
val ctx1 = genLoad(expr, ctx, expectedType);
- ctx1.bb.emit(RETURN());
+ ctx1.bb.emit(RETURN(expectedType));
// although strange, 'return' does not necessarily close a block
//ctx1.bb.close;
ctx1
diff --git a/sources/scala/tools/nsc/backend/icode/Linearizers.scala b/sources/scala/tools/nsc/backend/icode/Linearizers.scala
index be6e9548f2..8727f1b95b 100644
--- a/sources/scala/tools/nsc/backend/icode/Linearizers.scala
+++ b/sources/scala/tools/nsc/backend/icode/Linearizers.scala
@@ -50,7 +50,7 @@ trait Linearizers: ICodes {
add(failure);
case SWITCH(_, labels) =>
add(labels);
- case RETURN() =>
+ case RETURN(_) =>
()
}
diff --git a/sources/scala/tools/nsc/backend/icode/Opcodes.scala b/sources/scala/tools/nsc/backend/icode/Opcodes.scala
index 1efa4422cf..7013e1b965 100644
--- a/sources/scala/tools/nsc/backend/icode/Opcodes.scala
+++ b/sources/scala/tools/nsc/backend/icode/Opcodes.scala
@@ -30,9 +30,9 @@ import scala.tools.nsc.ast._;
case CHECK_CAST(tpe) =>
case SWITCH(tags, labels) =>
case JUMP(where) =>
- case CJUMP(success, failure, cond) =>
+ case CJUMP(success, failure, cond, kind) =>
case CZJUMP(success, failure, cond, kind) =>
- case RETURN() =>
+ case RETURN(kind) =>
case THROW() =>
case DROP(kind) =>
case DUP(kind) =>
@@ -346,9 +346,9 @@ abstract class Opcodes: ICodes {
* Stack: ...
* ->: ...
*/
- case class RETURN() extends Instruction {
+ case class RETURN(kind: TypeKind) extends Instruction {
/** Returns a string representation of this instruction */
- override def toString(): String ="RETURN";
+ override def toString(): String ="RETURN (" + kind + ")";
override def consumed = 0;
override def produced = 0;