summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorschinz <schinz@epfl.ch>2005-05-12 11:46:11 +0000
committerschinz <schinz@epfl.ch>2005-05-12 11:46:11 +0000
commit57d313ef7e246b90e4b39e328da149cf3f9ff9f5 (patch)
treeac3e7a144d984ac42d8942ce0e95405286cd0f82 /sources/scalac
parentd1b4a12b05f0c5d1046c0b96d4259242cfc48853 (diff)
downloadscala-57d313ef7e246b90e4b39e328da149cf3f9ff9f5.tar.gz
scala-57d313ef7e246b90e4b39e328da149cf3f9ff9f5.tar.bz2
scala-57d313ef7e246b90e4b39e328da149cf3f9ff9f5.zip
- in instantiation methods, reuse array of type...
- in instantiation methods, reuse array of type parameters whenever possible to save some time and space
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/transformer/TypesAsValuesPhase.java43
1 files changed, 34 insertions, 9 deletions
diff --git a/sources/scalac/transformer/TypesAsValuesPhase.java b/sources/scalac/transformer/TypesAsValuesPhase.java
index 54a2f1c5f9..91378e6c2e 100644
--- a/sources/scalac/transformer/TypesAsValuesPhase.java
+++ b/sources/scalac/transformer/TypesAsValuesPhase.java
@@ -839,7 +839,7 @@ public class TypesAsValuesPhase extends Phase {
final Symbol tpArraySym,
final Symbol owner) {
final HashMap varMap = new HashMap();
- Symbol[] tparams = clsSym.typeParams();
+ final Symbol[] tparams = clsSym.typeParams();
for (int i = 0; i < tparams.length; ++i)
varMap.put(tparams[i], new Integer(i));
@@ -850,12 +850,25 @@ public class TypesAsValuesPhase extends Phase {
public boolean definesVar(Symbol sym) {
return varMap.containsKey(sym);
}
-
public Tree treeForVar(Symbol sym) {
int idx = ((Integer)varMap.get(sym)).intValue();
Tree array = gen.mkLocalRef(pos, tpArraySym);
return gen.mkArrayGet(pos, array, idx);
}
+ public boolean definesVarArray(Symbol[] syms) {
+ if (syms.length == tparams.length) {
+ for (int i = 0; i < syms.length; ++i) {
+ if (syms[i] != tparams[i])
+ return false;
+ }
+ return true;
+ } else
+ return false;
+ }
+ public Tree treeForVarArray(Symbol[] syms) {
+ assert definesVarArray(syms);
+ return gen.mkLocalRef(pos, tpArraySym);
+ }
};
Type[] parents = clsSym.parents();
@@ -1103,16 +1116,22 @@ public class TypesAsValuesPhase extends Phase {
? gen.Select(pos, gen.mkQualifier(pos, pre), insSym)
: gen.Ident(pos, insSym);
- Tree[] insArgs;
- Tree[] elems = new Tree[args.length];
+ Tree insArg;
int[] perm = typeParamsPermutation(sym.typeParams());
+ Symbol[] permArgs = new Symbol[args.length];
for (int i = 0; i < args.length; ++i)
- elems[i] = typeAsValue(pos, args[perm[i]], owner, env);
- insArgs = new Tree[] {
- gen.mkNewArray(pos, defs.TYPE_TYPE(), elems, owner)
- };
+ permArgs[i] = args[perm[i]].symbol();
+
+ if (env.definesVarArray(permArgs))
+ insArg = env.treeForVarArray(permArgs);
+ else {
+ Tree[] tps = new Tree[args.length];
+ for (int i = 0; i < args.length; ++i)
+ tps[i] = typeAsValue(pos, args[perm[i]], owner, env);
+ insArg = gen.mkNewArray(pos, defs.TYPE_TYPE(), tps, owner);
+ }
- return gen.mkApply_V(pos, preFun, insArgs);
+ return gen.mkApply_V(pos, preFun, new Tree[] { insArg });
default:
throw Debug.abort("unexpected type: ", tp);
@@ -1339,6 +1358,12 @@ public class TypesAsValuesPhase extends Phase {
public Tree treeForVar(Symbol sym) {
throw Debug.abort("no tree for variable " + sym);
}
+ public boolean definesVarArray(Symbol[] syms) {
+ return false;
+ }
+ public Tree treeForVarArray(Symbol[] syms) {
+ throw Debug.abort("no tree for variable array " + syms);
+ }
}
private static class Ancestor {