summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoffrey Washburn <geoffrey.washburn@epfl.ch>2008-10-19 11:55:44 +0000
committerGeoffrey Washburn <geoffrey.washburn@epfl.ch>2008-10-19 11:55:44 +0000
commit839e6193481b1928b4de7c45ebc70cc881c8f06c (patch)
tree73c1b5190700c8c6940bdf1a2609b277ff991100
parent93b1d16d90265ba862b3fc2c43102115a18098c7 (diff)
downloadscala-839e6193481b1928b4de7c45ebc70cc881c8f06c.tar.gz
scala-839e6193481b1928b4de7c45ebc70cc881c8f06c.tar.bz2
scala-839e6193481b1928b4de7c45ebc70cc881c8f06c.zip
Ported the r16292 to the 2.7.2 branch.
-rw-r--r--src/compiler/scala/tools/nsc/Interpreter.scala9
-rw-r--r--src/library/scala/runtime/BoxedArray.scala2
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala19
-rw-r--r--test/files/run/deeps.check28
-rw-r--r--test/files/run/interpreter.check9
-rw-r--r--test/files/run/interpreter.scala6
-rw-r--r--test/files/run/multi-array.check4
-rw-r--r--test/files/run/t0017.check2
8 files changed, 55 insertions, 24 deletions
diff --git a/src/compiler/scala/tools/nsc/Interpreter.scala b/src/compiler/scala/tools/nsc/Interpreter.scala
index 99606e856f..635f01fa7a 100644
--- a/src/compiler/scala/tools/nsc/Interpreter.scala
+++ b/src/compiler/scala/tools/nsc/Interpreter.scala
@@ -622,13 +622,10 @@ class Interpreter(val settings: Settings, out: PrintWriter) {
code.print(" + \"" + prettyName + ": " +
string2code(req.typeOf(vname)) +
" = \" + " +
- " (if(" +
+ " { val tmp = scala.runtime.ScalaRunTime.stringOf(" +
req.fullPath(vname) +
- ".asInstanceOf[AnyRef] != null) " +
- " { val tmp = " +
- req.fullPath(vname) +
- ".toString(); " +
- " (if(tmp.contains('\\n')) \"\\n\" else \"\") + tmp + \"\\n\"} else \"null\\n\") ")
+ "); " +
+ " (if(tmp.contains('\\n')) \"\\n\" else \"\") + tmp + \"\\n\"} ")
}
}
}
diff --git a/src/library/scala/runtime/BoxedArray.scala b/src/library/scala/runtime/BoxedArray.scala
index 4d1ae68d65..5f5f64a4dc 100644
--- a/src/library/scala/runtime/BoxedArray.scala
+++ b/src/library/scala/runtime/BoxedArray.scala
@@ -124,7 +124,7 @@ abstract class BoxedArray extends Array.Array0[Any] {
/** Returns an array that contains all indices of this array */
def indices: Array[Int] = Array.range(0, length)
- final def deepToString() = deepMkString(stringPrefix + "(", ",", ")")
+ final def deepToString() = deepMkString(stringPrefix + "(", ", ", ")")
final def deepMkString(start: String, sep: String, end: String): String = {
def _deepToString(x: Any) = x match {
diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala
index a44046985d..579123c179 100644
--- a/src/library/scala/runtime/ScalaRunTime.scala
+++ b/src/library/scala/runtime/ScalaRunTime.scala
@@ -144,4 +144,23 @@ object ScalaRunTime {
case x: Array[AnyRef] => new BoxedObjectArray(x)
case x: BoxedArray => x
}
+
+ /** Given any Scala value, convert it to a String.
+ *
+ * The primary motivation for this method is to provide a means for
+ * correctly obtaining a String representation of a value, while
+ * avoiding the pitfalls of naïvely calling toString on said value.
+ * In particular, it addresses the fact that (a) toString cannot be
+ * called on null and (b) depending on the apparent type of an
+ * array, toString may or may not print it in a human-readable form.
+ *
+ * @param arg the value to stringify
+ * @return a string representation of <code>arg</code>
+ *
+ */
+ def stringOf(arg : Any): String = arg match {
+ case null => "null"
+ case (arg : AnyRef) if isArray(arg) => boxArray(arg).deepToString
+ case arg => arg.toString
+ }
}
diff --git a/test/files/run/deeps.check b/test/files/run/deeps.check
index 55ae698241..f1925fcbc1 100644
--- a/test/files/run/deeps.check
+++ b/test/files/run/deeps.check
@@ -12,14 +12,14 @@ false
false
true
-x=Array(Array(1),Array(1))
-y=Array(Array(1),Array(1))
+x=Array(Array(1), Array(1))
+y=Array(Array(1), Array(1))
false
false
true
-x=Array(Array(Array(1),Array(1)),Array(Array(1),Array(1)))
-y=Array(Array(Array(1),Array(1)),Array(Array(1),Array(1)))
+x=Array(Array(Array(1), Array(1)), Array(Array(1), Array(1)))
+y=Array(Array(Array(1), Array(1)), Array(Array(1), Array(1)))
false
false
true
@@ -31,47 +31,47 @@ false
false
true
Array(true, false)
-Array(true,false)
+Array(true, false)
[true;false]
true;false
Array([Z@0000000, [Z@0000000)
-Array(Array(true,false),Array(true,false))
+Array(Array(true, false), Array(true, false))
[[true;false];[true;false]]
true;false;true;false
Array([[Z@0000000, [[Z@0000000)
-Array(Array(Array(true,false),Array(true,false)),Array(Array(true,false),Array(true,false)))
+Array(Array(Array(true, false), Array(true, false)), Array(Array(true, false), Array(true, false)))
[[[true;false];[true;false]];[[true;false];[true;false]]]
true;false;true;false;true;false;true;false
Array(1.0, 0.0)
-Array(1.0,0.0)
+Array(1.0, 0.0)
[1.0;0.0]
1.0;0.0
Array([D@0000000, [D@0000000)
-Array(Array(1.0,0.0),Array(1.0,0.0))
+Array(Array(1.0, 0.0), Array(1.0, 0.0))
[[1.0;0.0];[1.0;0.0]]
1.0;0.0;1.0;0.0
Array([[D@0000000, [[D@0000000)
-Array(Array(Array(1.0,0.0),Array(1.0,0.0)),Array(Array(1.0,0.0),Array(1.0,0.0)))
+Array(Array(Array(1.0, 0.0), Array(1.0, 0.0)), Array(Array(1.0, 0.0), Array(1.0, 0.0)))
[[[1.0;0.0];[1.0;0.0]];[[1.0;0.0];[1.0;0.0]]]
1.0;0.0;1.0;0.0;1.0;0.0;1.0;0.0
Array(a, b)
-Array(a,b)
+Array(a, b)
[a;b]
a;b
Array([Ljava.lang.String;@0000000, [Ljava.lang.String;@0000000)
-Array(Array(a,b),Array(a,b))
+Array(Array(a, b), Array(a, b))
[[a;b];[a;b]]
a;b;a;b
Array([[Ljava.lang.String;@0000000, [[Ljava.lang.String;@0000000)
-Array(Array(Array(a,b),Array(a,b)),Array(Array(a,b),Array(a,b)))
+Array(Array(Array(a, b), Array(a, b)), Array(Array(a, b), Array(a, b)))
[[[a;b];[a;b]];[[a;b];[a;b]]]
a;b;a;b;a;b;a;b
@@ -79,5 +79,5 @@ a;b;a;b;a;b;a;b
[[1; 2]; [3]]
[[1; 2]; [3]]
-Array(boo,and,foo)
+Array(boo, and, foo)
Array(a)
diff --git a/test/files/run/interpreter.check b/test/files/run/interpreter.check
index 64eeca14ba..722a8d1fd1 100644
--- a/test/files/run/interpreter.check
+++ b/test/files/run/interpreter.check
@@ -42,6 +42,15 @@ scala> defined class S
scala> fish: S = fish
scala>
+scala> arr: Array[java.lang.String] = Array(What's, up, doc?)
+
+scala>
+scala> arrInt: Any = Array(1, 2, 3)
+
+scala>
+scala> arrArrInt: Any = Array(Array(1, 2), Array(3, 4))
+
+scala>
scala>
scala> defined class Foo
diff --git a/test/files/run/interpreter.scala b/test/files/run/interpreter.scala
index 1ebe72ed2a..d68b6f6632 100644
--- a/test/files/run/interpreter.scala
+++ b/test/files/run/interpreter.scala
@@ -27,6 +27,12 @@ val atom = new scala.xml.Atom()
// overriding toString problem from #1404
class S(override val toString : String)
val fish = new S("fish")
+// Test that arrays pretty print nicely.
+val arr = Array("What's", "up", "doc?")
+// Test that arrays pretty print nicely, even when we give them type Any
+val arrInt : Any = Array(1,2,3)
+// Test that nested arrays are pretty-printed correctly
+val arrArrInt : Any = Array(Array(1, 2), Array(3, 4))
// implicit conversions
case class Foo(n: Int)
diff --git a/test/files/run/multi-array.check b/test/files/run/multi-array.check
index c43d9c6172..2f236b99cf 100644
--- a/test/files/run/multi-array.check
+++ b/test/files/run/multi-array.check
@@ -1,3 +1,3 @@
-Array(1,2,3)
+Array(1, 2, 3)
null
-Array(Array(0,1,2),Array(1,2,3),Array(2,3,4))
+Array(Array(0, 1, 2), Array(1, 2, 3), Array(2, 3, 4))
diff --git a/test/files/run/t0017.check b/test/files/run/t0017.check
index dd7ea0aae7..ab580f848e 100644
--- a/test/files/run/t0017.check
+++ b/test/files/run/t0017.check
@@ -1 +1 @@
-Array(Array(1,3),Array(2,4))
+Array(Array(1, 3), Array(2, 4))