diff options
author | paltherr <paltherr@epfl.ch> | 2003-11-19 09:22:12 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-11-19 09:22:12 +0000 |
commit | 862f5badaa0d8e5761ad1de94366941f498239dd (patch) | |
tree | df635ce3e8885482bca851d37c1b0ae227dca7f9 | |
parent | cf31deaa19e8aa39fea15bfedaf7d8870aa96aa6 (diff) | |
download | scala-862f5badaa0d8e5761ad1de94366941f498239dd.tar.gz scala-862f5badaa0d8e5761ad1de94366941f498239dd.tar.bz2 scala-862f5badaa0d8e5761ad1de94366941f498239dd.zip |
- Removed inner classes from RunTime
- Added some metadata to RunTime
- Adapted Primitives and ErasurePhase to the new metadata
-rw-r--r-- | sources/scala/Array.java | 2 | ||||
-rw-r--r-- | sources/scala/runtime/RunTime.java | 620 | ||||
-rw-r--r-- | sources/scalac/backend/Primitives.java | 11 | ||||
-rw-r--r-- | sources/scalac/transformer/ErasurePhase.java | 28 |
4 files changed, 322 insertions, 339 deletions
diff --git a/sources/scala/Array.java b/sources/scala/Array.java index bfd652f572..4cd1deee97 100644 --- a/sources/scala/Array.java +++ b/sources/scala/Array.java @@ -19,7 +19,7 @@ public abstract class Array /** @meta constr (scala.Int); */ - public Array(int n) { + public Array() { } public boolean[] asBooleanArray() { diff --git a/sources/scala/runtime/RunTime.java b/sources/scala/runtime/RunTime.java index a67b442482..d3b7e71dfd 100644 --- a/sources/scala/runtime/RunTime.java +++ b/sources/scala/runtime/RunTime.java @@ -21,50 +21,48 @@ import scala.Long; import scala.Float; import scala.Double; import scala.Array; -import java.lang.Object; -/** @meta class extends java.lang.Object; - * Run-time support functions for Scala. - */ public abstract class RunTime { - /** @meta method () scala.Unit; - */ - public void test() {} - - public static final Unit UNIT_VAL = new Unit() {}; - - private static ClassLoader loader = ClassLoader.getSystemClassLoader(); + //######################################################################## + // Private Constants private static final int BITS = 8; private static final int ARRAY_SIZE = 2 << BITS; private static final int INDEX_MASK = ARRAY_SIZE - 1; private static final int CHECK_MASK = ~(ARRAY_SIZE / 2 - 1); - private static final Boolean falseVal = - new Boolean() { public boolean asBoolean() { return false; } }; - private static final Boolean trueVal = - new Boolean() { public boolean asBoolean() { return true ; } }; - - private static final Byte [] bval = new Byte [256]; - private static final Short[] sval = new Short[ARRAY_SIZE]; - private static final Char [] cval = new Char [ARRAY_SIZE / 2]; - private static final Int [] ival = new Int [ARRAY_SIZE]; - private static final Long [] lval = new Long [ARRAY_SIZE]; + private static final UValue uvalue = new UValue(); + private static final ZValue zvalue_f = new ZValue(false); + private static final ZValue zvalue_t = new ZValue(true); + private static final BValue bvalue[] = new BValue[256]; + private static final SValue svalue[] = new SValue[ARRAY_SIZE]; + private static final CValue cvalue[] = new CValue[ARRAY_SIZE / 2]; + private static final IValue ivalue[] = new IValue[ARRAY_SIZE]; + private static final LValue lvalue[] = new LValue[ARRAY_SIZE]; static { - for (int i = 0; i < bval.length; i++) bval[i] = box0((byte)i); + for (int i = 0; i < bvalue.length; i++) + bvalue[i] = new BValue((byte)i); for (int i = 0; i < ARRAY_SIZE / 2; i++) { - sval[i] = box0((short)i); - cval[i] = box0((char )i); - ival[i] = box0((int )i); - lval[i] = box0((long )i); - sval[i + ARRAY_SIZE / 2] = box0((short)(CHECK_MASK | i)); - ival[i + ARRAY_SIZE / 2] = box0((int )(CHECK_MASK | i)); - lval[i + ARRAY_SIZE / 2] = box0((long )(CHECK_MASK | i)); + svalue[i] = new SValue((short)i); + cvalue[i] = new CValue((char )i); + ivalue[i] = new IValue((int )i); + lvalue[i] = new LValue((long )i); + svalue[i + ARRAY_SIZE / 2] = new SValue((short)(CHECK_MASK | i)); + ivalue[i + ARRAY_SIZE / 2] = new IValue((int )(CHECK_MASK | i)); + lvalue[i + ARRAY_SIZE / 2] = new LValue((long )(CHECK_MASK | i)); } } + //######################################################################## + // Private Variables + + private static ClassLoader loader = ClassLoader.getSystemClassLoader(); + + //######################################################################## + // Public Functions - Getting & setting class loader + public static ClassLoader getClassLoader() { return loader; } @@ -73,222 +71,99 @@ public abstract class RunTime { RunTime.loader = loader; } - public static Unit box() { - return UNIT_VAL; - } + //######################################################################## + // Public Functions - Boxing primitives - public static Boolean box(final boolean x) { - return x ? trueVal : falseVal; + public static Unit box() { + return uvalue; } - public static Byte box(final byte x) { - return bval[x & 0x000000FF]; + public static Boolean box(boolean x) { + return x ? zvalue_t : zvalue_f; } - private static Byte box0(final byte x) { - return new Byte() { - public double asDouble() { return (double)x; } - public float asFloat() { return (float)x; } - public long asLong() { return (long)x; } - public int asInt() { return (int)x; } - public char asChar() { return (char)x; } - public short asShort() { return (short)x; } - public byte asByte() { return (byte)x; } - - }; + public static Byte box(byte x) { + return bvalue[x & 0x000000FF]; } - public static Short box(final short x) { + public static Short box(short x) { int c = x & CHECK_MASK; - return c == 0 || c == CHECK_MASK ? sval[x & INDEX_MASK] : box0(x); + if (c == 0 || c == CHECK_MASK) return svalue[x & INDEX_MASK]; + return new SValue(x); } - private static Short box0(final short x) { - return new Short() { - public double asDouble() { return (double)x; } - public float asFloat() { return (float)x; } - public long asLong() { return (long)x; } - public int asInt() { return (int)x; } - public char asChar() { return (char)x; } - public short asShort() { return (short)x; } - public byte asByte() { return (byte)x; } - }; - } - - public static Char box(final char x) { + public static Char box(char x) { int c = (int)x & CHECK_MASK; - return c == 0 ? cval[(int)x & INDEX_MASK] : box0(x); - } - - private static Char box0(final char x) { - return new Char() { - public double asDouble() { return (double)x; } - public float asFloat() { return (float)x; } - public long asLong() { return (long)x; } - public int asInt() { return (int)x; } - public char asChar() { return (char)x; } - public short asShort() { return (short)x; } - public byte asByte() { return (byte)x; } - }; + if (c == 0) return cvalue[(int)x & INDEX_MASK]; + return new CValue(x); } - public static Int box(final int x) { + public static Int box(int x) { int c = x & CHECK_MASK; - return c == 0 || c == CHECK_MASK ? ival[x & INDEX_MASK] : box0(x); + if (c == 0 || c == CHECK_MASK) return ivalue[x & INDEX_MASK]; + return new IValue(x); } - private static Int box0(final int x) { - return new Int() { - public double asDouble() { return (double)x; } - public float asFloat() { return (float)x; } - public long asLong() { return (long)x; } - public int asInt() { return (int)x; } - public char asChar() { return (char)x; } - public short asShort() { return (short)x; } - public byte asByte() { return (byte)x; } - }; - } - - public static Long box(final long x) { + public static Long box(long x) { long c = x & CHECK_MASK; - return c == 0 || c == CHECK_MASK ? lval[(int)x & INDEX_MASK] : box0(x); + if (c == 0 || c == CHECK_MASK) return lvalue[(int)x & INDEX_MASK]; + return new LValue(x); } - private static Long box0(final long x) { - return new Long() { - public double asDouble() { return (double)x; } - public float asFloat() { return (float)x; } - public long asLong() { return (long)x; } - public int asInt() { return (int)x; } - public char asChar() { return (char)x; } - public short asShort() { return (short)x; } - public byte asByte() { return (byte)x; } - }; + public static Float box(float x) { + return new FValue(x); } - public static Float box(final float x) { - return new Float() { - public double asDouble() { return (double)x; } - public float asFloat() { return (float)x; } - public long asLong() { return (long)x; } - public int asInt() { return (int)x; } - public char asChar() { return (char)x; } - public short asShort() { return (short)x; } - public byte asByte() { return (byte)x; } - }; - } - - public static Double box(final double x) { - return new Double() { - public double asDouble() { return (double)x; } - public float asFloat() { return (float)x; } - public long asLong() { return (long)x; } - public int asInt() { return (int)x; } - public char asChar() { return (char)x; } - public short asShort() { return (short)x; } - public byte asByte() { return (byte)x; } - }; + public static Double box(double x) { + return new DValue(x); } + /** @meta method (scala.Array[scala.Boolean]) scala.Array[scala.Boolean];*/ public static Array box(final boolean[] xs) { - return new Array(0) { - public boolean[] asBooleanArray() { return xs; } - public Object asArray() { return xs; } - public Object apply(int i) { return box(xs[i]); } - public void update(int i, Object x) { xs[i] = ((Boolean)x).asBoolean(); } - public int length() { return xs.length; } - public String toString() { return String.valueOf(xs); } - }; + return new ZArray(xs); } + /** @meta method (scala.Array[scala.Byte]) scala.Array[scala.Byte]; */ public static Array box(final byte[] xs) { - return new Array(0) { - public byte[] asByteArray() { return xs; } - public Object asArray() { return xs; } - public Object apply(int i) { return box(xs[i]); } - public void update(int i, Object x) { xs[i] = ((Byte)x).asByte(); } - public int length() { return xs.length; } - public String toString() { return String.valueOf(xs); } - }; + return new BArray(xs); } + /** @meta method (scala.Array[scala.Short]) scala.Array[scala.Short]; */ public static Array box(final short[] xs) { - return new Array(0) { - public short[] asShortArray() { return xs; } - public Object asArray() { return xs; } - public Object apply(int i) { return box(xs[i]); } - public void update(int i, Object x) { xs[i] = ((Short)x).asShort(); } - public int length() { return xs.length; } - public String toString() { return String.valueOf(xs); } - }; + return new SArray(xs); } - public static Array box(final char[] xs) { - return new Array(0) { - public char[] asCharArray() { return xs; } - public Object asArray() { return xs; } - public Object apply(int i) { return box(xs[i]); } - public void update(int i, Object x) { xs[i] = ((Char)x).asChar(); } - public int length() { return xs.length; } - public String toString() { return String.valueOf((Object)xs); } - }; + /** @meta method (scala.Array[scala.Char]) scala.Array[scala.Char]; */ + public static Array box(char[] xs) { + return new CArray(xs); } - public static Array box(final int[] xs) { - return new Array(0) { - public int[] asIntArray() { return xs; } - public Object asArray() { return xs; } - public Object apply(int i) { return box(xs[i]); } - public void update(int i, Object x) { xs[i] = ((Int)x).asInt(); } - public int length() { return xs.length; } - public String toString() { return String.valueOf(xs); } - }; + /** @meta method (scala.Array[scala.Int]) scala.Array[scala.Int]; */ + public static Array box(int[] xs) { + return new IArray(xs); } - public static Array box(final long[] xs) { - return new Array(0) { - public long[] asLongArray() { return xs; } - public Object asArray() { return xs; } - public Object apply(int i) { return box(xs[i]); } - public void update(int i, Object x) { xs[i] = ((Long)x).asLong(); } - public int length() { return xs.length; } - public String toString() { return String.valueOf(xs); } - }; + /** @meta method (scala.Array[scala.Long]) scala.Array[scala.Long]; */ + public static Array box(long[] xs) { + return new LArray(xs); } - public static Array box(final float[] xs) { - return new Array(0) { - public float[] asFloatArray() { return xs; } - public Object asArray() { return xs; } - public Object apply(int i) { return box(xs[i]); } - public void update(int i, Object x) { xs[i] = ((Float)x).asFloat(); } - public int length() { return xs.length; } - public String toString() { return String.valueOf(xs); } - }; + /** @meta method (scala.Array[scala.Float]) scala.Array[scala.Float]; */ + public static Array box(float[] xs) { + return new FArray(xs); } - public static Array box(final double[] xs) { - return new Array(0) { - public double[] asDoubleArray() { return xs; } - public Object asArray() { return xs; } - public Object apply(int i) { return box(xs[i]); } - public void update(int i, Object x) { xs[i] = ((Double)x).asDouble(); } - public int length() { return xs.length; } - public String toString() { return String.valueOf(xs); } - }; + /** @meta method (scala.Array[scala.Double]) scala.Array[scala.Double]; */ + public static Array box(double[] xs) { + return new DArray(xs); } - public static Array box(final Object[] xs) { - return new Array(0) { - public Object[] asObjectArray() { return xs; } - public Object asArray() { return xs; } - public Object apply(int i) { return xs[i]; } - public void update(int i, Object x) { xs[i] = x; } - public int length() { return xs.length; } - public String toString() { return String.valueOf(xs); } - }; + /** @meta method [?T < scala.AnyRef](scala.Array[?T]) scala.Array[?T]; */ + public static Array box(Object[] xs) { + return new OArray(xs); } + /** @meta method [?T](scala.Array[?T]) scala.Array[?T]; */ public static Array box(Object xs) { if (xs == null) return box((Object[])xs); if (xs instanceof Object[]) return box((Object[])xs); @@ -303,39 +178,18 @@ public abstract class RunTime { throw new ClassCastException(xs.getClass() + " is not an array class"); } - public static boolean[] zarray(int length) { - return new boolean[length]; - } + //######################################################################## + // Public Functions - Array primitives - public static byte[] barray(int length) { - return new byte[length]; - } - - public static short[] sarray(int length) { - return new short[length]; - } - - public static char[] carray(int length) { - return new char[length]; - } - - public static int[] iarray(int length) { - return new int[length]; - } - - public static long[] larray(int length) { - return new long[length]; - } - - public static float[] farray(int length) { - return new float[length]; - } - - public static double[] darray(int length) { - return new double[length]; - } - - public static Object oarray(int length, String classname) { + public static boolean[] zarray(int length) { return new boolean[length]; } + public static byte [] barray(int length) { return new byte [length]; } + public static short [] sarray(int length) { return new short [length]; } + public static char [] carray(int length) { return new char [length]; } + public static int [] iarray(int length) { return new int [length]; } + public static long [] larray(int length) { return new long [length]; } + public static float [] farray(int length) { return new float [length]; } + public static double [] darray(int length) { return new double [length]; } + public static Object oarray(int length, String classname) { try { Class clasz = Class.forName(classname, false, loader); return java.lang.reflect.Array.newInstance(clasz, length); @@ -344,115 +198,231 @@ public abstract class RunTime { } } - public static int zarray_length(boolean[] array) { - return array.length; - } - - public static int barray_length(byte[] array) { - return array.length; - } - - public static int sarray_length(short[] array) { - return array.length; - } - - public static int carray_length(char[] array) { - return array.length; - } - - public static int iarray_length(int[] array) { - return array.length; - } - - public static int larray_length(long[] array) { - return array.length; - } - - public static int farray_length(float[] array) { - return array.length; - } - - public static int darray_length(double[] array) { - return array.length; - } - - public static int oarray_length(Object[] array) { - return array.length; - } - - public static boolean zarray_get(boolean[] array, int index) { - return array[index]; - } - - public static byte barray_get(byte[] array, int index) { - return array[index]; - } - - public static short sarray_get(short[] array, int index) { - return array[index]; - } + public static int zarray_length(boolean[] xs) { return xs.length; } + public static int barray_length(byte [] xs) { return xs.length; } + public static int sarray_length(short [] xs) { return xs.length; } + public static int carray_length(char [] xs) { return xs.length; } + public static int iarray_length(int [] xs) { return xs.length; } + public static int larray_length(long [] xs) { return xs.length; } + public static int farray_length(float [] xs) { return xs.length; } + public static int darray_length(double [] xs) { return xs.length; } + public static int oarray_length(Object [] xs) { return xs.length; } + + public static boolean zarray_get(boolean[] xs, int i) { return xs[i]; } + public static byte barray_get(byte [] xs, int i) { return xs[i]; } + public static short sarray_get(short [] xs, int i) { return xs[i]; } + public static char carray_get(char [] xs, int i) { return xs[i]; } + public static int iarray_get(int [] xs, int i) { return xs[i]; } + public static long larray_get(long [] xs, int i) { return xs[i]; } + public static float farray_get(float [] xs, int i) { return xs[i]; } + public static double darray_get(double [] xs, int i) { return xs[i]; } + public static Object oarray_get(Object [] xs, int i) { return xs[i]; } + + public static void zarray_set(boolean[] xs, int i, boolean x) { xs[i] = x;} + public static void barray_set(byte [] xs, int i, byte x) { xs[i] = x;} + public static void sarray_set(short [] xs, int i, short x) { xs[i] = x;} + public static void carray_set(char [] xs, int i, char x) { xs[i] = x;} + public static void iarray_set(int [] xs, int i, int x) { xs[i] = x;} + public static void larray_set(long [] xs, int i, long x) { xs[i] = x;} + public static void farray_set(float [] xs, int i, float x) { xs[i] = x;} + public static void darray_set(double [] xs, int i, double x) { xs[i] = x;} + public static void oarray_set(Object [] xs, int i, Object x) { xs[i] = x;} + + //######################################################################## +} - public static char carray_get(char[] array, int index) { - return array[index]; - } +// These classes may not be defined in class RunTime because inner +// classes confuse pico which then attributes the metadata to the +// wrong members. - public static int iarray_get(int[] array, int index) { - return array[index]; - } +class UValue extends Unit { +} - public static long larray_get(long[] array, int index) { - return array[index]; - } +class ZValue extends Boolean { + private final boolean x; + public ZValue(boolean x) { this.x = x; } + public boolean asBoolean() { return x; } +} - public static float farray_get(float[] array, int index) { - return array[index]; - } +class BValue extends Byte { + private final byte x; + public BValue(byte x) { this.x = x; } + public double asDouble() { return (double)x; } + public float asFloat() { return (float)x; } + public long asLong() { return (long)x; } + public int asInt() { return (int)x; } + public char asChar() { return (char)x; } + public short asShort() { return (short)x; } + public byte asByte() { return (byte)x; } +} - public static double darray_get(double[] array, int index) { - return array[index]; - } +class SValue extends Short { + private final short x; + public SValue(short x) { this.x = x; } + public double asDouble() { return (double)x; } + public float asFloat() { return (float)x; } + public long asLong() { return (long)x; } + public int asInt() { return (int)x; } + public char asChar() { return (char)x; } + public short asShort() { return (short)x; } + public byte asByte() { return (byte)x; } +} - public static Object oarray_get(Object[] array, int index) { - return array[index]; - } +class CValue extends Char { + private final char x; + public CValue(char x) { this.x = x; } + public double asDouble() { return (double)x; } + public float asFloat() { return (float)x; } + public long asLong() { return (long)x; } + public int asInt() { return (int)x; } + public char asChar() { return (char)x; } + public short asShort() { return (short)x; } + public byte asByte() { return (byte)x; } +} - public static void zarray_set(boolean[] array, int index, boolean value) { - array[index] = value; - } +class IValue extends Int { + private final int x; + public IValue(int x) { this.x = x; } + public double asDouble() { return (double)x; } + public float asFloat() { return (float)x; } + public long asLong() { return (long)x; } + public int asInt() { return (int)x; } + public char asChar() { return (char)x; } + public short asShort() { return (short)x; } + public byte asByte() { return (byte)x; } +} - public static void barray_set(byte[] array, int index, byte value) { - array[index] = value; - } +class LValue extends Long { + private final long x; + public LValue(long x) { this.x = x; } + public double asDouble() { return (double)x; } + public float asFloat() { return (float)x; } + public long asLong() { return (long)x; } + public int asInt() { return (int)x; } + public char asChar() { return (char)x; } + public short asShort() { return (short)x; } + public byte asByte() { return (byte)x; } +} - public static void sarray_set(short[] array, int index, short value) { - array[index] = value; - } +class FValue extends Float { + private final float x; + public FValue(float x) { this.x = x; } + public double asDouble() { return (double)x; } + public float asFloat() { return (float)x; } + public long asLong() { return (long)x; } + public int asInt() { return (int)x; } + public char asChar() { return (char)x; } + public short asShort() { return (short)x; } + public byte asByte() { return (byte)x; } +} - public static void carray_set(char[] array, int index, char value) { - array[index] = value; - } +class DValue extends Double { + private final double x; + public DValue(double x) { this.x = x; } + public double asDouble() { return (double)x; } + public float asFloat() { return (float)x; } + public long asLong() { return (long)x; } + public int asInt() { return (int)x; } + public char asChar() { return (char)x; } + public short asShort() { return (short)x; } + public byte asByte() { return (byte)x; } +} - public static void iarray_set(int[] array, int index, int value) { - array[index] = value; - } +class ZArray extends Array { + private final boolean[] xs; + public ZArray(boolean[] xs) { this.xs = xs; } + public boolean[] asBooleanArray() { return xs; } + public Object asArray() { return xs; } + public Object apply(int i) { return RunTime.box(xs[i]); } + public void update(int i, Object x) { xs[i] = ((Boolean)x).asBoolean(); } + public int length() { return xs.length; } + public String toString() { return String.valueOf(xs); } +} - public static void larray_set(long[] array, int index, long value) { - array[index] = value; - } +class BArray extends Array { + private final byte[] xs; + public BArray(byte[] xs) { this.xs = xs; } + public byte[] asByteArray() { return xs; } + public Object asArray() { return xs; } + public Object apply(int i) { return RunTime.box(xs[i]); } + public void update(int i, Object x) { xs[i] = ((Byte)x).asByte(); } + public int length() { return xs.length; } + public String toString() { return String.valueOf(xs); } +} - public static void farray_set(float[] array, int index, float value) { - array[index] = value; - } +class SArray extends Array { + private final short[] xs; + public SArray(short[] xs) { this.xs = xs; } + public short[] asShortArray() { return xs; } + public Object asArray() { return xs; } + public Object apply(int i) { return RunTime.box(xs[i]); } + public void update(int i, Object x) { xs[i] = ((Short)x).asShort(); } + public int length() { return xs.length; } + public String toString() { return String.valueOf(xs); } +} - public static void darray_set(double[] array, int index, double value) { - array[index] = value; - } +class CArray extends Array { + private final char[] xs; + public CArray(char[] xs) { this.xs = xs; } + public char[] asCharArray() { return xs; } + public Object asArray() { return xs; } + public Object apply(int i) { return RunTime.box(xs[i]); } + public void update(int i, Object x) { xs[i] = ((Char)x).asChar(); } + public int length() { return xs.length; } + public String toString() { return String.valueOf((Object)xs); } +} - public static void oarray_set(Object[] array, int index, Object value) { - array[index] = value; - } +class IArray extends Array { + private final int[] xs; + public IArray(int[] xs) { this.xs = xs; } + public int[] asIntArray() { return xs; } + public Object asArray() { return xs; } + public Object apply(int i) { return RunTime.box(xs[i]); } + public void update(int i, Object x) { xs[i] = ((Int)x).asInt(); } + public int length() { return xs.length; } + public String toString() { return String.valueOf(xs); } } +class LArray extends Array { + private final long[] xs; + public LArray(long[] xs) { this.xs = xs; } + public long[] asLongArray() { return xs; } + public Object asArray() { return xs; } + public Object apply(int i) { return RunTime.box(xs[i]); } + public void update(int i, Object x) { xs[i] = ((Long)x).asLong(); } + public int length() { return xs.length; } + public String toString() { return String.valueOf(xs); } +} +class FArray extends Array { + private final float[] xs; + public FArray(float[] xs) { this.xs = xs; } + public float[] asFloatArray() { return xs; } + public Object asArray() { return xs; } + public Object apply(int i) { return RunTime.box(xs[i]); } + public void update(int i, Object x) { xs[i] = ((Float)x).asFloat(); } + public int length() { return xs.length; } + public String toString() { return String.valueOf(xs); } +} +class DArray extends Array { + private final double[] xs; + public DArray(double[] xs) { this.xs = xs; } + public double[] asDoubleArray() { return xs; } + public Object asArray() { return xs; } + public Object apply(int i) { return RunTime.box(xs[i]); } + public void update(int i, Object x) { xs[i] = ((Double)x).asDouble(); } + public int length() { return xs.length; } + public String toString() { return String.valueOf(xs); } +} +class OArray extends Array { + private final Object[] xs; + public OArray(Object[] xs) { this.xs = xs; } + public Object[] asObjectArray() { return xs; } + public Object asArray() { return xs; } + public Object apply(int i) { return xs[i]; } + public void update(int i, Object x) { xs[i] = x; } + public int length() { return xs.length; } + public String toString() { return String.valueOf(xs); } +} diff --git a/sources/scalac/backend/Primitives.java b/sources/scalac/backend/Primitives.java index bf1b3de15b..33d420e90b 100644 --- a/sources/scalac/backend/Primitives.java +++ b/sources/scalac/backend/Primitives.java @@ -268,7 +268,7 @@ public class Primitives { this.BOX_FARRAY = getBoxArray(boxes, definitions.FLOAT_TYPE()); this.BOX_DARRAY = getBoxArray(boxes, definitions.DOUBLE_TYPE()); this.BOX_OARRAY = getBoxArray(boxes, definitions.JAVA_OBJECT_TYPE()); - this.BOX__ARRAY = getBoxValue(boxes, definitions.ANY_TYPE()); + this.BOX__ARRAY = getBoxArray(boxes, definitions.ANY_TYPE()); this.AS_UVALUE = getUniqueTerm(definitions.UNIT_CLASS, AS_UVALUE_N); this.AS_ZVALUE = getUniqueTerm(definitions.BOOLEAN_CLASS, AS_ZVALUE_N); this.AS_BVALUE = getUniqueTerm(definitions.DOUBLE_CLASS, AS_BVALUE_N); @@ -314,13 +314,14 @@ public class Primitives { private Symbol getBoxValue(Symbol[] alts, Type type) { for (int i = 0; i < alts.length; i++) { + Type result = alts[i].type().resultType(); switch (alts[i].type()) { - case MethodType(Symbol[] vparams, _): - if (vparams.length == 1 && vparams[0].type().equals(type)) - return alts[i]; + case PolyType(Symbol[] tparams, _): + result = result.subst(tparams, Symbol.info(tparams)); } + if (result.equals(type)) return alts[i]; } - throw Debug.abort("not found:" + BOX_N + "(" + Debug.show(type) + ")"); + throw Debug.abort("not found: def " +BOX_N+ "(" +type+ "): " +type); } private Symbol getBoxArray(Symbol[] alts, Type type) { diff --git a/sources/scalac/transformer/ErasurePhase.java b/sources/scalac/transformer/ErasurePhase.java index 87fddbf37e..37f4abc58e 100644 --- a/sources/scalac/transformer/ErasurePhase.java +++ b/sources/scalac/transformer/ErasurePhase.java @@ -75,12 +75,24 @@ public class ErasurePhase extends Phase { throw Debug.abort("illegal case", tp); } } + if (sym.isTerm() && sym.isParameter()) { + if (primitives.getPrimitive(sym.owner()) == Primitive.BOX) { + switch (tp) { + case TypeRef(Type prefix, Symbol clasz, Type[] args): + if (args.length > 0 && args[0].symbol().isAbstractType()) + return definitions.ANYREF_CLASS.nextType(); + break; + default: + throw Debug.abort("illegal case", tp); + } + } + } if (sym.isType()) return tp; // if (sym == definitions.NULL) return tp.resultType().erasure(); switch (primitives.getPrimitive(sym)) { case Primitive.IS : return Type.PolyType(tp.typeParams(), Type.MethodType(tp.valueParams(), tp.resultType().erasure())); case Primitive.AS : return tp; - case Primitive.BOX: return eraseParams(tp); + case Primitive.BOX: return eraseBoxMethodType(tp); case Primitive.AS__ARRAY: return Type.MethodType(Symbol.EMPTY_ARRAY, definitions.ANY_CLASS.nextType()); default : return tp.erasure(); @@ -99,16 +111,16 @@ public class ErasurePhase extends Phase { //######################################################################## // Private Methods - private Type eraseParams(Type tp) { - switch (tp) { + private Type eraseBoxMethodType(Type type) { + switch (type) { case PolyType(_, Type result): - return eraseParams(result); + return eraseBoxMethodType(result); case MethodType(Symbol[] params, Type result): - Symbol[] params1 = Type.erasureMap.map(params); - if (params1 == params) return tp; - else return Type.MethodType(params1, result); + return Type.MethodType(params, eraseBoxMethodType(result)); + case TypeRef(Type prefix, Symbol clasz, Type[] args): + return Type.TypeRef(prefix, clasz, Type.EMPTY_ARRAY); default: - return tp; + throw Debug.abort("illegal case", type); } } |