--- old/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java 2013-01-16 17:40:44.000000000 +0530 +++ new/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java 2013-01-16 17:40:44.000000000 +0530 @@ -38,6 +38,7 @@ import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.ScriptFunction; import jdk.nashorn.internal.runtime.ScriptObject; +import jdk.nashorn.internal.runtime.ScriptRuntime; import netscape.javascript.JSObject; /** @@ -67,6 +68,16 @@ return sobj.hashCode(); } + @Override + public String toString() { + return inGlobal(new Callable() { + @Override + public String call() { + return ScriptRuntime.safeToString(sobj); + } + }); + } + private V inGlobal(final Callable callable) { final ScriptObject oldGlobal = Context.getGlobal(); final boolean globalChanged = (oldGlobal != global); --- old/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java 2013-01-16 17:40:45.000000000 +0530 +++ new/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java 2013-01-16 17:40:44.000000000 +0530 @@ -46,6 +46,7 @@ import javax.script.ScriptException; import jdk.nashorn.internal.runtime.Version; import netscape.javascript.JSObject; +import org.testng.Assert; import org.testng.TestNG; import org.testng.annotations.Test; @@ -859,4 +860,25 @@ fail(t.getMessage()); } } + + @Test + public void scriptObjectMirrorToStringTest() { + final ScriptEngineManager m = new ScriptEngineManager(); + final ScriptEngine e = m.getEngineByName("nashorn"); + try { + Object obj = e.eval("new TypeError('wrong type')"); + Assert.assertEquals(obj.toString(), "TypeError: wrong type", "toString returns wrong value"); + } catch (final Throwable t) { + t.printStackTrace(); + fail(t.getMessage()); + } + + try { + Object obj = e.eval("function func() { print('hello'); }"); + Assert.assertEquals(obj.toString(), "function func() { print('hello'); }", "toString returns wrong value"); + } catch (final Throwable t) { + t.printStackTrace(); + fail(t.getMessage()); + } + } }