langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java
changeset 43587 6103af590758
parent 43132 6a5c69926e60
child 43770 a321bed02000
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java	Mon Feb 06 09:00:02 2017 -0800
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java	Mon Feb 06 09:25:31 2017 -0800
@@ -28,6 +28,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.stream.IntStream;
 import jdk.jshell.spi.ExecutionControl;
 import jdk.jshell.spi.SPIResolutionException;
 
@@ -41,6 +42,23 @@
  */
 public class DirectExecutionControl implements ExecutionControl {
 
+    private static final String[] charRep;
+
+    static {
+        charRep = new String[256];
+        for (int i = 0; i < charRep.length; ++i) {
+            charRep[i] = Character.isISOControl(i)
+                    ? String.format("\\%03o", i)
+                    : "" + (char) i;
+        }
+        charRep['\b'] = "\\b";
+        charRep['\t'] = "\\t";
+        charRep['\n'] = "\\n";
+        charRep['\f'] = "\\f";
+        charRep['\r'] = "\\r";
+        charRep['\\'] = "\\\\";
+    }
+
     private final LoaderDelegate loaderDelegate;
 
     /**
@@ -192,9 +210,26 @@
         if (value == null) {
             return "null";
         } else if (value instanceof String) {
-            return "\"" + (String) value + "\"";
+            return "\"" + ((String) value).codePoints()
+                    .flatMap(cp ->
+                        (cp == '"')
+                            ? "\\\"".codePoints()
+                            : (cp < 256)
+                                ? charRep[cp].codePoints()
+                                : IntStream.of(cp))
+                    .collect(
+                            StringBuilder::new,
+                            StringBuilder::appendCodePoint,
+                            StringBuilder::append)
+                    .toString() + "\"";
         } else if (value instanceof Character) {
-            return "'" + value + "'";
+            char cp = (char) (Character) value;
+            return "'" + (
+                (cp == '\'')
+                    ? "\\\'"
+                    : (cp < 256)
+                            ? charRep[cp]
+                            : String.valueOf(cp)) + "'";
         } else if (value.getClass().isArray()) {
             int dims = 0;
             Class<?> t = value.getClass();