summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoffrey Washburn <geoffrey.washburn@epfl.ch>2008-10-18 21:32:45 +0000
committerGeoffrey Washburn <geoffrey.washburn@epfl.ch>2008-10-18 21:32:45 +0000
commit08a8c00be622e1ec685a2c406a23bb25f4e2bd88 (patch)
tree4a08fa05367f46d92de55c24dbb4d7cf182ab8f0
parentb2e8634221054e1f0bc989c8c165aafa30e0528b (diff)
downloadscala-08a8c00be622e1ec685a2c406a23bb25f4e2bd88.tar.gz
scala-08a8c00be622e1ec685a2c406a23bb25f4e2bd88.tar.bz2
scala-08a8c00be622e1ec685a2c406a23bb25f4e2bd88.zip
Added stringOf to ScalaRunTime.
Fixed deepToString to put spaces after commas (like regular Array toString, and List, etc.). Fixed all the test cases depending on this. Fixed the interpreter to keep my mind from wandering.
-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.check11
-rw-r--r--test/files/run/interpreter.scala9
-rw-r--r--test/files/run/multi-array.check4
-rw-r--r--test/files/run/t0017.check2
8 files changed, 55 insertions, 29 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 313a817968..722a8d1fd1 100644
--- a/test/files/run/interpreter.check
+++ b/test/files/run/interpreter.check
@@ -37,11 +37,18 @@ scala>
scala> atom: scala.xml.Atom[Unit] = ()
scala>
+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>
-scala> arr: Array[java.lang.String] = Array(What's, up, doc?)
+scala> arrArrInt: Any = Array(Array(1, 2), Array(3, 4))
scala>
scala>
diff --git a/test/files/run/interpreter.scala b/test/files/run/interpreter.scala
index dbfffd70d3..d68b6f6632 100644
--- a/test/files/run/interpreter.scala
+++ b/test/files/run/interpreter.scala
@@ -25,11 +25,14 @@ println("hello")
// ambiguous toString problem from #547
val atom = new scala.xml.Atom()
// overriding toString problem from #1404
-// commented out because the fix had to be reverted for arrays
-//class S(override val toString : String)
-//val fish = new S("fish")
+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))