summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2004-02-04 20:45:02 +0000
committerpaltherr <paltherr@epfl.ch>2004-02-04 20:45:02 +0000
commit49b2a7e6b9ccc148fe38fc4c553f7423b40e0597 (patch)
treed9411b208294345a2064cfd58e76c66c2bb64d3e
parent7c34b692599e036b847c871a9573066c1a87733a (diff)
downloadscala-49b2a7e6b9ccc148fe38fc4c553f7423b40e0597.tar.gz
scala-49b2a7e6b9ccc148fe38fc4c553f7423b40e0597.tar.bz2
scala-49b2a7e6b9ccc148fe38fc4c553f7423b40e0597.zip
- Changed transformation of array creations for...
- Changed transformation of array creations for interpreter
-rw-r--r--sources/scalac/transformer/Erasure.java28
-rw-r--r--sources/scalac/transformer/ErasurePhase.java10
2 files changed, 17 insertions, 21 deletions
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java
index 0de4624d01..be6e96ff68 100644
--- a/sources/scalac/transformer/Erasure.java
+++ b/sources/scalac/transformer/Erasure.java
@@ -416,30 +416,16 @@ public class Erasure extends GenTransformer implements Modifiers {
* of given type.
*/
private Tree genNewUnboxedArray(int pos, Type element, Tree size) {
+ if (global.target == global.TARGET_INT) {
+ Tree[] targs = {gen.mkType(pos, element)};
+ Tree[] vargs = {coerce(size, UNBOXED_INT)};
+ Tree fun = gen.mkGlobalRef(pos, primitives.NEW_OARRAY);
+ Tree array = gen.mkApplyTV(fun, targs, vargs);
+ return gen.mkAsInstanceOf(array, Type.UnboxedArrayType(element));
+ }
switch (element) {
case UnboxedType(int kind): return genNewUnboxedArray(pos, kind, size);
}
- if (global.target == global.TARGET_INT) {
- int levels = 0;
- while (isUnboxedArrayType(element)) {
- element = getArrayElementType(element);
- levels++;
- }
- global.nextPhase();
- while (true) {
- Symbol clasz = element.symbol();
- if (clasz.isJava()) break;
- if (clasz == definitions.ANY_CLASS) break;
- if (isUnboxedSimpleType(element)) break;
- assert element.parents().length > 0: element;
- element = element.parents()[0];
- }
- global.prevPhase();
- while (levels > 0) {
- element = Type.UnboxedArrayType(element);
- levels--;
- }
- }
String name = primitives.getNameForClassForName(element);
Tree[] args = { coerce(size, UNBOXED_INT), gen.mkStringLit(pos,name) };
Tree array =
diff --git a/sources/scalac/transformer/ErasurePhase.java b/sources/scalac/transformer/ErasurePhase.java
index 5fbd76f504..6e3dd972ca 100644
--- a/sources/scalac/transformer/ErasurePhase.java
+++ b/sources/scalac/transformer/ErasurePhase.java
@@ -20,10 +20,13 @@ import scalac.checkers.CheckOwners;
import scalac.checkers.CheckSymbols;
import scalac.checkers.CheckTypes;
import scalac.checkers.CheckNames;
+import scalac.symtab.AbsTypeSymbol;
import scalac.symtab.Definitions;
+import scalac.symtab.Modifiers;
import scalac.symtab.Scope;
import scalac.symtab.Symbol;
import scalac.symtab.Type;
+import scalac.util.Name;
import scalac.util.Debug;
public class ErasurePhase extends Phase {
@@ -84,6 +87,13 @@ public class ErasurePhase extends Phase {
if (sym.isType()) return tp;
if (sym.isThisSym()) return sym.owner().nextType();
// if (sym == definitions.NULL) return tp.resultType().erasure();
+ if (global.target == global.TARGET_INT && sym ==primitives.NEW_OARRAY){
+ // !!! hack for interpreter
+ Name name = Name.fromString("element").toTypeName();
+ Symbol tparam = new AbsTypeSymbol(0, name, sym, Modifiers.PARAM);
+ tparam.setType(definitions.ANY_TYPE());
+ return Type.PolyType(new Symbol[]{tparam}, tp);
+ }
switch (primitives.getPrimitive(sym)) {
case Primitive.IS : return Type.PolyType(tp.typeParams(), Type.MethodType(tp.valueParams(), tp.resultType().erasure()));
case Primitive.AS : return tp;