summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschinz <schinz@epfl.ch>2005-02-17 14:13:05 +0000
committerschinz <schinz@epfl.ch>2005-02-17 14:13:05 +0000
commit7f8e2cec8f26aaf18a4516737a3c48a717989a8c (patch)
tree0afec1c1bb55037e1e8112523ef162ab55856f20
parent491b4c50a87f785537edd11e6953d96b21b0ca25 (diff)
downloadscala-7f8e2cec8f26aaf18a4516737a3c48a717989a8c.tar.gz
scala-7f8e2cec8f26aaf18a4516737a3c48a717989a8c.tar.bz2
scala-7f8e2cec8f26aaf18a4516737a3c48a717989a8c.zip
- renamed isSameAs to isSameType, to be consistent
- use the new parameter to the constructor of ScalaClassType, to avoid a further call to setParents in some cases
-rw-r--r--sources/scalac/transformer/TypesAsValuesPhase.java60
1 files changed, 28 insertions, 32 deletions
diff --git a/sources/scalac/transformer/TypesAsValuesPhase.java b/sources/scalac/transformer/TypesAsValuesPhase.java
index 6c48e353d5..89240a6bf3 100644
--- a/sources/scalac/transformer/TypesAsValuesPhase.java
+++ b/sources/scalac/transformer/TypesAsValuesPhase.java
@@ -340,15 +340,6 @@ public class TypesAsValuesPhase extends Phase {
}
public Tree transform(Tree tree) {
- try {
- return transform0(tree);
- } catch (Error e) {
- System.out.println("tree: " + tree);
- throw e;
- }
- }
-
- public Tree transform0(Tree tree) {
switch (tree) {
case ClassDef(int mods, //:
Name name,
@@ -358,9 +349,6 @@ public class TypesAsValuesPhase extends Phase {
Tree.Template impl):
Symbol sym = tree.symbol();
-// if (impl.symbol().isNone())
-// throw new Error("no symbol for " + tree);
-
TreeList newBody = new TreeList();
// Add members (accessors and instantiators)
NewMember[] toAdd = membersToAdd(sym);
@@ -658,13 +646,6 @@ public class TypesAsValuesPhase extends Phase {
new Tree[] { gen.mkNullLit(pos) });
Tree thenP = gen.mkLocalRef(pos, instVal);
- Tree instFun =
- gen.Select(pos,
- gen.mkLocalRef(pos, getTConstructorSym(clsSym)),
- defs.TYPECONSTRUCTOR_INSTANTIATE());
- Tree[] instArgs = new Tree[] { gen.mkLocalRef(pos, vparams[0]) };
- Tree instCall = gen.mkApply_V(pos, instFun, instArgs);
-
final HashMap varMap = new HashMap();
Symbol[] tparams = clsSym.typeParams();
for (int i = 0; i < tparams.length; ++i)
@@ -689,22 +670,36 @@ public class TypesAsValuesPhase extends Phase {
TreeList parentTypes = new TreeList();
for (int i = 0; i < parents.length; ++i) {
Type parent = parents[i];
- if (!parent.symbol().isJava()) {
- Tree parentType =
- typeAsValue(pos, parent, insSym, tEnv);
- parentTypes.append(parentType);
- }
+ if (!parent.symbol().isJava())
+ parentTypes.append(typeAsValue(pos, parent, insSym, tEnv));
}
- Tree parentsArray = gen.mkNewArray(pos,
- defs.SCALACLASSTYPE_TYPE(),
- parentTypes.toArray(),
- insSym);
+ boolean emptyParents = (parentTypes.length() == 0);
+ Tree parentsArray = emptyParents
+ ? gen.mkGlobalRef(pos, defs.SCALACLASSTYPE_EMPTYARRAY())
+ : gen.mkNewArray(pos,
+ defs.SCALACLASSTYPE_TYPE(),
+ parentTypes.toArray(),
+ insSym);
+ Tree instFun =
+ gen.Select(pos,
+ gen.mkLocalRef(pos, getTConstructorSym(clsSym)),
+ defs.TYPECONSTRUCTOR_INSTANTIATE());
+ Tree[] instArgs = new Tree[] {
+ gen.mkLocalRef(pos, vparams[0]),
+ emptyParents ? parentsArray : gen.mkNullLit(pos)
+ };
+ Tree instCall = gen.mkApply_V(pos, instFun, instArgs);
- Tree setParentsFun =
- gen.Select(pos, instCall, defs.SCALACLASSTYPE_SETPARENTS());
+ Tree elseP;
+ if (!emptyParents) {
+ Tree setParentsFun =
+ gen.Select(pos, instCall, defs.SCALACLASSTYPE_SETPARENTS());
- Tree elseP =
- gen.mkApply_V(pos, setParentsFun, new Tree[] { parentsArray });
+ elseP = gen.mkApply_V(pos,
+ setParentsFun,
+ new Tree[] { parentsArray });
+ } else
+ elseP = instCall;
Tree ifExpr =
gen.If(pos, cond, thenP, elseP, defs.SCALACLASSTYPE_TYPE());
@@ -756,6 +751,7 @@ public class TypesAsValuesPhase extends Phase {
return sym == defs.ARRAY_CLASS;
}
+ /** Return true iff type tp refers to class symbol classSym. */
/**
* Transform a type into a tree representing it.
*/