diff options
author | paltherr <paltherr@epfl.ch> | 2004-02-04 20:45:02 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2004-02-04 20:45:02 +0000 |
commit | 49b2a7e6b9ccc148fe38fc4c553f7423b40e0597 (patch) | |
tree | d9411b208294345a2064cfd58e76c66c2bb64d3e | |
parent | 7c34b692599e036b847c871a9573066c1a87733a (diff) | |
download | scala-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.java | 28 | ||||
-rw-r--r-- | sources/scalac/transformer/ErasurePhase.java | 10 |
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; |