changeset 22232:526de3af756d

Merge with 0480c4873a4a8a71250c9570b702cea98ab1c7bc
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Mon, 21 Sep 2015 12:15:38 -0700
parents 59e022cee529 (current diff) 0480c4873a4a (diff)
children 1f19e3cada3d
files truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ArrayTest.java truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ImplicitCastTest.java truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ShortCircuitTest.java truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/instrument/SLInstrumentTestRunner.java truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLLanguage.java
diffstat 17 files changed, 214 insertions(+), 81 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ArrayTest.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ArrayTest.java	Mon Sep 21 12:15:38 2015 -0700
@@ -22,6 +22,9 @@
  */
 package com.oracle.truffle.api.dsl.test;
 
+import org.junit.Assert;
+import org.junit.Test;
+
 import com.oracle.truffle.api.CallTarget;
 import com.oracle.truffle.api.Truffle;
 import com.oracle.truffle.api.dsl.ImplicitCast;
@@ -36,8 +39,6 @@
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.api.nodes.RootNode;
 import com.oracle.truffle.api.nodes.UnexpectedResultException;
-import org.junit.Assert;
-import org.junit.Test;
 
 public class ArrayTest {
 
--- a/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ImplicitCastTest.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ImplicitCastTest.java	Mon Sep 21 12:15:38 2015 -0700
@@ -22,6 +22,9 @@
  */
 package com.oracle.truffle.api.dsl.test;
 
+import org.junit.Assert;
+import org.junit.Test;
+
 import com.oracle.truffle.api.dsl.ImplicitCast;
 import com.oracle.truffle.api.dsl.NodeChild;
 import com.oracle.truffle.api.dsl.NodeChildren;
@@ -34,8 +37,6 @@
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
 import com.oracle.truffle.api.frame.VirtualFrame;
-import org.junit.Assert;
-import org.junit.Test;
 
 public class ImplicitCastTest {
 
--- a/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ShortCircuitTest.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ShortCircuitTest.java	Mon Sep 21 12:15:38 2015 -0700
@@ -22,6 +22,10 @@
  */
 package com.oracle.truffle.api.dsl.test;
 
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
 import com.oracle.truffle.api.CallTarget;
 import com.oracle.truffle.api.dsl.ImplicitCast;
 import com.oracle.truffle.api.dsl.NodeChild;
@@ -36,8 +40,6 @@
 import com.oracle.truffle.api.dsl.test.ShortCircuitTestFactory.VarArgsNodeFactory;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ArgumentNode;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
-import static org.junit.Assert.assertEquals;
-import org.junit.Test;
 
 public class ShortCircuitTest {
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/InvokeMemberNode.java	Mon Sep 21 12:15:38 2015 -0700
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.api.interop.java;
+
+import com.oracle.truffle.api.frame.VirtualFrame;
+import com.oracle.truffle.api.interop.ForeignAccess;
+import com.oracle.truffle.api.nodes.RootNode;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.List;
+
+final class InvokeMemberNode extends RootNode {
+    InvokeMemberNode() {
+        super(JavaInteropLanguage.class, null, null);
+    }
+
+    @Override
+    public Object execute(VirtualFrame frame) {
+        JavaInterop.JavaObject receiver = (JavaInterop.JavaObject) ForeignAccess.getReceiver(frame);
+        final List<Object> args = ForeignAccess.getArguments(frame);
+        final Object nameOrIndex = args.get(0);
+        final int argsLength = args.size() - 1;
+        if (nameOrIndex instanceof Integer) {
+            throw new IllegalStateException();
+        } else {
+            String name = (String) nameOrIndex;
+            for (Method m : receiver.clazz.getMethods()) {
+                final boolean isStatic = (m.getModifiers() & Modifier.STATIC) != 0;
+                if (isStatic) {
+                    continue;
+                }
+                if (m.getName().equals(name) && m.getParameterCount() == argsLength) {
+                    Object[] arr = args.subList(1, args.size()).toArray();
+                    return JavaFunctionNode.execute(m, receiver.obj, arr);
+                }
+            }
+            throw new IllegalArgumentException(name);
+        }
+    }
+
+}
--- a/truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/JavaFunctionNode.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/JavaFunctionNode.java	Mon Sep 21 12:15:38 2015 -0700
@@ -28,6 +28,7 @@
 import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.nodes.RootNode;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.List;
 
 final class JavaFunctionNode extends RootNode {
@@ -42,15 +43,19 @@
         return execute(receiver, args.toArray());
     }
 
+    static Object execute(JavaInterop.JavaFunctionObject receiver, Object[] args) {
+        return execute(receiver.method, receiver.obj, args);
+    }
+
     @SuppressWarnings("paramAssign")
-    static Object execute(JavaInterop.JavaFunctionObject receiver, Object[] args) {
+    static Object execute(Method method, Object obj, Object[] args) {
         for (int i = 0; i < args.length; i++) {
             if (args[i] instanceof JavaInterop.JavaObject) {
                 args[i] = ((JavaInterop.JavaObject) args[i]).obj;
             }
         }
         try {
-            Object ret = receiver.method.invoke(receiver.obj, args);
+            Object ret = method.invoke(obj, args);
             if (JavaInterop.isPrimitive(ret)) {
                 return ret;
             }
--- a/truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/JavaInterop.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/JavaInterop.java	Mon Sep 21 12:15:38 2015 -0700
@@ -335,21 +335,29 @@
             }
 
             if (message == null) {
-                val = message(Message.READ, obj, name);
-                if (isPrimitive(val)) {
-                    return val;
+                Object ret;
+                try {
+                    List<Object> callArgs = new ArrayList<>(args.length);
+                    callArgs.add(name);
+                    callArgs.addAll(Arrays.asList(args));
+                    ret = message(Message.createInvoke(callArgs.size()), obj, callArgs.toArray());
+                } catch (IllegalArgumentException ex) {
+                    val = message(Message.READ, obj, name);
+                    if (isPrimitive(val)) {
+                        return val;
+                    }
+                    TruffleObject attr = (TruffleObject) val;
+                    if (Boolean.FALSE.equals(message(Message.IS_EXECUTABLE, attr))) {
+                        if (args.length == 0) {
+                            return toJava(attr, method);
+                        }
+                        throw new IllegalStateException(attr + " cannot be invoked with " + args.length + " parameters");
+                    }
+                    List<Object> callArgs = new ArrayList<>(args.length + 1);
+                    // callArgs.add(attr);
+                    callArgs.addAll(Arrays.asList(args));
+                    ret = message(Message.createExecute(callArgs.size()), attr, callArgs.toArray());
                 }
-                TruffleObject attr = (TruffleObject) val;
-                if (Boolean.FALSE.equals(message(Message.IS_EXECUTABLE, attr))) {
-                    if (args.length == 0) {
-                        return toJava(attr, method);
-                    }
-                    throw new IllegalStateException(attr + " cannot be invoked with " + args.length + " parameters");
-                }
-                List<Object> callArgs = new ArrayList<>(args.length + 1);
-                // callArgs.add(attr);
-                callArgs.addAll(Arrays.asList(args));
-                Object ret = message(Message.createExecute(callArgs.size()), attr, callArgs.toArray());
                 return toJava(ret, method);
             }
             throw new IllegalStateException("Unknown message: " + message);
--- a/truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/JavaObjectForeignAccess.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api.interop.java/src/com/oracle/truffle/api/interop/java/JavaObjectForeignAccess.java	Mon Sep 21 12:15:38 2015 -0700
@@ -78,7 +78,7 @@
 
     @Override
     public CallTarget accessInvoke(int argumentsLength) {
-        return Truffle.getRuntime().createCallTarget(new JavaObjectMethodNode());
+        return Truffle.getRuntime().createCallTarget(new InvokeMemberNode());
     }
 
     @Override
--- a/truffle/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object/Layout.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object/Layout.java	Mon Sep 21 12:15:38 2015 -0700
@@ -52,7 +52,7 @@
     }
 
     /**
-     * Create a new {@link LayoutBuilder}.
+     * Creates a new {@link Builder}.
      */
     public static Builder newLayout() {
         return new Builder();
--- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java	Mon Sep 21 12:15:38 2015 -0700
@@ -27,9 +27,9 @@
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStreamReader;
+import java.io.InputStream;
 import java.io.InterruptedIOException;
-import java.io.OutputStreamWriter;
+import java.io.OutputStream;
 import java.io.Reader;
 import java.io.Writer;
 import java.lang.reflect.InvocationHandler;
@@ -107,9 +107,9 @@
     private final Thread initThread;
     private final Executor executor;
     private final Map<String, Language> langs;
-    private final Reader in;
-    private final Writer err;
-    private final Writer out;
+    private final InputStream in;
+    private final OutputStream err;
+    private final OutputStream out;
     private final EventConsumer<?>[] handlers;
     private final Map<String, Object> globals;
     private final Instrumenter instrumenter;
@@ -133,7 +133,7 @@
     /**
      * Real constructor used from the builder.
      */
-    private TruffleVM(Executor executor, Map<String, Object> globals, Writer out, Writer err, Reader in, EventConsumer<?>[] handlers) {
+    private TruffleVM(Executor executor, Map<String, Object> globals, OutputStream out, OutputStream err, InputStream in, EventConsumer<?>[] handlers) {
         this.executor = executor;
         this.out = out;
         this.err = err;
@@ -155,9 +155,9 @@
      *
      * <pre>
      * {@link TruffleVM} vm = {@link TruffleVM}.{@link TruffleVM#newVM() newVM()}
-     *     .{@link Builder#stdOut(java.io.Writer) stdOut}({@link Writer yourWriter})
-     *     .{@link Builder#stdErr(java.io.Writer) stdErr}({@link Writer yourWriter})
-     *     .{@link Builder#stdIn(java.io.Reader) stdIn}({@link Reader yourReader})
+     *     .{@link Builder#setOut(java.io.OutputStream) setOut}({@link OutputStream yourOutput})
+     *     .{@link Builder#setErr(java.io.OutputStream) setrr}({@link OutputStream yourOutput})
+     *     .{@link Builder#setIn(java.io.InputStream) setIn}({@link InputStream yourInput})
      *     .{@link Builder#build() build()};
      * </pre>
      *
@@ -181,16 +181,16 @@
      *
      * <pre>
      * {@link TruffleVM} vm = {@link TruffleVM}.{@link TruffleVM#newVM() newVM()}
-     *     .{@link Builder#stdOut(java.io.Writer) stdOut}({@link Writer yourWriter})
-     *     .{@link Builder#stdErr(java.io.Writer) stdErr}({@link Writer yourWriter})
-     *     .{@link Builder#stdIn(java.io.Reader) stdIn}({@link Reader yourReader})
+     *     .{@link Builder#setOut(java.io.OutputStream) setOut}({@link OutputStream yourOutput})
+     *     .{@link Builder#setErr(java.io.OutputStream) setrr}({@link OutputStream yourOutput})
+     *     .{@link Builder#setIn(java.io.InputStream) setIn}({@link InputStream yourInput})
      *     .{@link Builder#build() build()};
      * </pre>
      */
     public final class Builder {
-        private Writer out;
-        private Writer err;
-        private Reader in;
+        private OutputStream out;
+        private OutputStream err;
+        private InputStream in;
         private final List<EventConsumer<?>> handlers = new ArrayList<>();
         private final Map<String, Object> globals = new HashMap<>();
         private Executor executor;
@@ -202,11 +202,20 @@
          * Changes the default output for languages running in <em>to be created</em>
          * {@link TruffleVM virtual machine}. The default is to use {@link System#out}.
          *
-         * @param w the writer to use as output
+         * @param os the stream to use as output
          * @return instance of this builder
          */
+        public Builder setOut(OutputStream os) {
+            out = os;
+            return this;
+        }
+
+        /**
+         * @deprecated does nothing
+         */
+        @Deprecated
+        @SuppressWarnings("unused")
         public Builder stdOut(Writer w) {
-            out = w;
             return this;
         }
 
@@ -214,23 +223,41 @@
          * Changes the error output for languages running in <em>to be created</em>
          * {@link TruffleVM virtual machine}. The default is to use {@link System#err}.
          *
-         * @param w the writer to use as output
+         * @param os the stream to use as output
          * @return instance of this builder
          */
+        public Builder setErr(OutputStream os) {
+            err = os;
+            return this;
+        }
+
+        /**
+         * @deprecated does nothing
+         */
+        @Deprecated
+        @SuppressWarnings("unused")
         public Builder stdErr(Writer w) {
-            err = w;
             return this;
         }
 
         /**
          * Changes the default input for languages running in <em>to be created</em>
-         * {@link TruffleVM virtual machine}. The default is to use {@link System#out}.
+         * {@link TruffleVM virtual machine}. The default is to use {@link System#in}.
          *
-         * @param r the reader to use as input
+         * @param is the stream to use as input
          * @return instance of this builder
          */
+        public Builder setIn(InputStream is) {
+            in = is;
+            return this;
+        }
+
+        /**
+         * @deprecated does nothing
+         */
+        @Deprecated
+        @SuppressWarnings("unused")
         public Builder stdIn(Reader r) {
-            in = r;
             return this;
         }
 
@@ -294,13 +321,13 @@
          */
         public TruffleVM build() {
             if (out == null) {
-                out = new OutputStreamWriter(System.out);
+                out = System.out;
             }
             if (err == null) {
-                err = new OutputStreamWriter(System.err);
+                err = System.err;
             }
             if (in == null) {
-                in = new InputStreamReader(System.in);
+                in = System.in;
             }
             Executor nonNullExecutor = executor != null ? executor : new Executor() {
                 @Override
@@ -862,7 +889,7 @@
         }
 
         @Override
-        public Env attachEnv(Object obj, TruffleLanguage<?> language, Writer stdOut, Writer stdErr, Reader stdIn) {
+        protected Env attachEnv(Object obj, TruffleLanguage<?> language, OutputStream stdOut, OutputStream stdErr, InputStream stdIn) {
             TruffleVM vm = (TruffleVM) obj;
             return super.attachEnv(vm, language, stdOut, stdErr, stdIn);
         }
--- a/truffle/com.oracle.truffle.api/.checkstyle_checks.xml	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api/.checkstyle_checks.xml	Mon Sep 21 12:15:38 2015 -0700
@@ -11,6 +11,10 @@
 <module name="Checker">
   <property name="severity" value="error"/>
   <module name="TreeWalker">
+    <module name="AvoidStarImport">
+      <property name="allowClassImports" value="false"/>
+      <property name="allowStaticMemberImports" value="false"/>
+    </module>
     <property name="tabWidth" value="4"/>
     <module name="FileContentsHolder"/>
     <module name="JavadocStyle">
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java	Mon Sep 21 12:15:38 2015 -0700
@@ -25,6 +25,10 @@
 package com.oracle.truffle.api;
 
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
 import java.io.Reader;
 import java.io.Writer;
 import java.lang.annotation.ElementType;
@@ -325,11 +329,11 @@
         private final Object vm;
         private final TruffleLanguage<?> lang;
         private final LangCtx<?> langCtx;
-        private final Reader in;
-        private final Writer err;
-        private final Writer out;
+        private final InputStream in;
+        private final OutputStream err;
+        private final OutputStream out;
 
-        Env(Object vm, TruffleLanguage<?> lang, Writer out, Writer err, Reader in) {
+        Env(Object vm, TruffleLanguage<?> lang, OutputStream out, OutputStream err, InputStream in) {
             this.vm = vm;
             this.in = in;
             this.err = err;
@@ -357,8 +361,13 @@
          *
          * @return reader, never <code>null</code>
          */
+        public InputStream in() {
+            return in;
+        }
+
+        @Deprecated
         public Reader stdIn() {
-            return in;
+            return new InputStreamReader(in);
         }
 
         /**
@@ -367,8 +376,13 @@
          *
          * @return writer, never <code>null</code>
          */
+        public OutputStream out() {
+            return out;
+        }
+
+        @Deprecated
         public Writer stdOut() {
-            return out;
+            return new OutputStreamWriter(out);
         }
 
         /**
@@ -377,8 +391,13 @@
          *
          * @return writer, never <code>null</code>
          */
+        public OutputStream err() {
+            return err;
+        }
+
+        @Deprecated
         public Writer stdErr() {
-            return err;
+            return new OutputStreamWriter(err);
         }
     }
 
@@ -387,7 +406,7 @@
     @SuppressWarnings("rawtypes")
     private static final class AccessAPI extends Accessor {
         @Override
-        protected Env attachEnv(Object vm, TruffleLanguage<?> language, Writer stdOut, Writer stdErr, Reader stdIn) {
+        protected Env attachEnv(Object vm, TruffleLanguage<?> language, OutputStream stdOut, OutputStream stdErr, InputStream stdIn) {
             Env env = new Env(vm, language, stdOut, stdErr, stdIn);
             return env;
         }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Mon Sep 21 12:15:38 2015 -0700
@@ -26,8 +26,8 @@
 
 import java.io.Closeable;
 import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.lang.ref.Reference;
 import java.lang.ref.WeakReference;
 
@@ -44,9 +44,9 @@
 import com.oracle.truffle.api.instrument.AdvancedInstrumentRootFactory;
 import com.oracle.truffle.api.instrument.Instrumenter;
 import com.oracle.truffle.api.instrument.Probe;
-import com.oracle.truffle.api.instrument.WrapperNode;
 import com.oracle.truffle.api.instrument.ToolSupportProvider;
 import com.oracle.truffle.api.instrument.Visualizer;
+import com.oracle.truffle.api.instrument.WrapperNode;
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.api.nodes.RootNode;
 import com.oracle.truffle.api.source.Source;
@@ -185,7 +185,7 @@
         }
     }
 
-    protected Env attachEnv(Object vm, TruffleLanguage<?> language, Writer stdOut, Writer stdErr, Reader stdIn) {
+    protected Env attachEnv(Object vm, TruffleLanguage<?> language, OutputStream stdOut, OutputStream stdErr, InputStream stdIn) {
         return API.attachEnv(vm, language, stdOut, stdErr, stdIn);
     }
 
--- a/truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/SLTestRunner.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/SLTestRunner.java	Mon Sep 21 12:15:38 2015 -0700
@@ -45,13 +45,12 @@
 import com.oracle.truffle.sl.SLLanguage;
 import com.oracle.truffle.sl.builtins.SLBuiltinNode;
 import com.oracle.truffle.sl.test.SLTestRunner.TestCase;
-import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.io.StringReader;
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.nio.file.FileSystems;
@@ -229,14 +228,15 @@
         notifier.fireTestStarted(testCase.name);
 
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        PrintWriter printer = new PrintWriter(out);
         try {
-            TruffleVM vm = TruffleVM.newVM().stdIn(new BufferedReader(new StringReader(repeat(testCase.testInput, repeats)))).stdOut(printer).build();
+            TruffleVM vm = TruffleVM.newVM().setIn(new ByteArrayInputStream(repeat(testCase.testInput, repeats).getBytes("UTF-8"))).setOut(out).build();
 
             String script = readAllLines(testCase.path);
-            SLLanguage.run(vm, testCase.path, null, printer, repeats, builtins);
 
+            PrintWriter printer = new PrintWriter(out);
+            SLLanguage.run(vm, testCase.path, null, printer, repeats, builtins);
             printer.flush();
+
             String actualOutput = new String(out.toByteArray());
             Assert.assertEquals(script, repeat(testCase.expectedOutput, repeats), actualOutput);
         } catch (Throwable ex) {
--- a/truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/instrument/SLInstrumentTestRunner.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.sl.test/src/com/oracle/truffle/sl/test/instrument/SLInstrumentTestRunner.java	Mon Sep 21 12:15:38 2015 -0700
@@ -40,12 +40,11 @@
  */
 package com.oracle.truffle.sl.test.instrument;
 
-import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringReader;
+import java.io.PrintStream;
 import java.lang.reflect.Field;
 import java.nio.charset.Charset;
 import java.nio.file.FileSystems;
@@ -234,14 +233,14 @@
         notifier.fireTestStarted(testCase.name);
 
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        PrintWriter printer = new PrintWriter(out);
+        PrintStream ps = new PrintStream(out);
         final ASTProber prober = new SLStandardASTProber();
 
         try {
             // We use the name of the file to determine what visitor to attach to it.
             if (testCase.baseName.endsWith(ASSIGNMENT_VALUE_SUFFIX)) {
                 // Set up the execution context for Simple and register our two listeners
-                TruffleVM vm = TruffleVM.newVM().stdIn(new BufferedReader(new StringReader(testCase.testInput))).stdOut(printer).build();
+                TruffleVM vm = TruffleVM.newVM().setIn(new ByteArrayInputStream(testCase.testInput.getBytes("UTF-8"))).setOut(out).build();
 
                 final Field field = TruffleVM.class.getDeclaredField("instrumenter");
                 field.setAccessible(true);
@@ -253,7 +252,7 @@
 
                 // Attach an instrument to every probe tagged as an assignment
                 for (Probe probe : instrumenter.findProbesTaggedAs(StandardSyntaxTag.ASSIGNMENT)) {
-                    SLPrintAssigmentValueListener slPrintAssigmentValueListener = new SLPrintAssigmentValueListener(printer);
+                    SLPrintAssigmentValueListener slPrintAssigmentValueListener = new SLPrintAssigmentValueListener(ps);
                     instrumenter.attach(probe, slPrintAssigmentValueListener, "SL print assignment value");
                 }
 
@@ -262,8 +261,7 @@
             } else {
                 notifier.fireTestFailure(new Failure(testCase.name, new UnsupportedOperationException("No instrumentation found.")));
             }
-
-            printer.flush();
+            ps.flush();
             String actualOutput = new String(out.toByteArray());
             Assert.assertEquals(testCase.expectedOutput, actualOutput);
         } catch (Throwable ex) {
@@ -307,15 +305,14 @@
 
     /**
      * This sample listener provides prints the value of an assignment (after the assignment is
-     * complete) to the {@link PrintWriter} specified in the constructor. This listener can only be
+     * complete) to the {@link PrintStream} specified in the constructor. This listener can only be
      * attached at {@link SLWriteLocalVariableNode}, but provides no guards to protect it from being
      * attached elsewhere.
      */
     public final class SLPrintAssigmentValueListener extends DefaultSimpleInstrumentListener {
+        private final PrintStream output;
 
-        private PrintWriter output;
-
-        public SLPrintAssigmentValueListener(PrintWriter output) {
+        public SLPrintAssigmentValueListener(PrintStream output) {
             this.output = output;
         }
 
--- a/truffle/com.oracle.truffle.sl/.checkstyle_checks.xml	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.sl/.checkstyle_checks.xml	Mon Sep 21 12:15:38 2015 -0700
@@ -11,6 +11,10 @@
 <module name="Checker">
   <property name="severity" value="error"/>
   <module name="TreeWalker">
+    <module name="AvoidStarImport">
+      <property name="allowClassImports" value="false"/>
+      <property name="allowStaticMemberImports" value="false"/>
+    </module>
     <property name="tabWidth" value="4"/>
     <module name="FileContentsHolder"/>
     <module name="JavadocStyle">
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLLanguage.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLLanguage.java	Mon Sep 21 12:15:38 2015 -0700
@@ -211,7 +211,9 @@
 
     @Override
     protected SLContext createContext(Env env) {
-        SLContext context = new SLContext(this, new BufferedReader(env.stdIn()), new PrintWriter(env.stdOut(), true));
+        final BufferedReader in = new BufferedReader(new InputStreamReader(env.in()));
+        final PrintWriter out = new PrintWriter(env.out(), true);
+        SLContext context = new SLContext(this, in, out);
         for (NodeFactory<? extends SLBuiltinNode> builtin : builtins) {
             context.installBuiltin(builtin, true);
         }
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLObjectType.java	Sun Sep 20 17:19:59 2015 -0700
+++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLObjectType.java	Mon Sep 21 12:15:38 2015 -0700
@@ -111,7 +111,7 @@
 
     @Override
     public CallTarget accessInvoke(int argumentsLength) {
-        throw new UnsupportedOperationException();
+        return null;
     }
 
     @Override