Mercurial > hg > openjdk > jigsaw > nashorn
changeset 166:b4191da366be
8011365: Array.prototype.join and Array.prototype.toString do not throw TypeError on null, undefined
Reviewed-by: attila, hannesw, lagergren
author | sundar |
---|---|
date | Wed, 03 Apr 2013 15:27:28 +0530 |
parents | 51da1afbab26 |
children | 4f7d7576e8c4 |
files | src/jdk/nashorn/internal/objects/NativeArray.java test/script/basic/JDK-8011362.js.EXPECTED test/script/basic/JDK-8011365.js |
diffstat | 3 files changed, 77 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk/nashorn/internal/objects/NativeArray.java Wed Apr 03 11:13:08 2013 +0200 +++ b/src/jdk/nashorn/internal/objects/NativeArray.java Wed Apr 03 15:27:28 2013 +0530 @@ -337,8 +337,9 @@ */ @Function(attributes = Attribute.NOT_ENUMERABLE) public static Object toString(final Object self) { - if (self instanceof ScriptObject) { - final ScriptObject sobj = (ScriptObject) self; + final Object obj = Global.toObject(self); + if (obj instanceof ScriptObject) { + final ScriptObject sobj = (ScriptObject)obj; try { final Object join = JOIN.getGetter().invokeExact(sobj); if (join instanceof ScriptFunction) { @@ -573,9 +574,9 @@ */ @Function(attributes = Attribute.NOT_ENUMERABLE) public static Object join(final Object self, final Object separator) { - final String sep = separator == ScriptRuntime.UNDEFINED ? "," : JSType.toString(separator); final StringBuilder sb = new StringBuilder(); final Iterator<Object> iter = arrayLikeIterator(self, true); + final String sep = separator == ScriptRuntime.UNDEFINED ? "," : JSType.toString(separator); while (iter.hasNext()) { final Object obj = iter.next();
--- a/test/script/basic/JDK-8011362.js.EXPECTED Wed Apr 03 11:13:08 2013 +0200 +++ b/test/script/basic/JDK-8011362.js.EXPECTED Wed Apr 03 15:27:28 2013 +0530 @@ -1,2 +1,2 @@ +overloaded(String, String) overloaded(Double, Double) -overloaded(String, String)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8011365.js Wed Apr 03 15:27:28 2013 +0530 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2010, 2013, 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. + * + * 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. + */ + +/** + * JDK-8011365: Array.prototype.join and Array.prototype.toString do not throw TypeError on null, undefined + * + * @test + * @run + */ + +try { + Array.prototype.join.call(null, { toString:function() { throw 2 } }); + fail("should have thrown TypeError"); +} catch (e) { + if (! (e instanceof TypeError)) { + fail("TypeError expected, got " + e); + } +} + +// check all Array.prototype functions to be sure +var names = Object.getOwnPropertyNames(Array.prototype); + +for (var n in names) { + var funcName = names[n]; + // ignore constructor + if (funcName == "constructor") { + continue; + } + + var prop = Array.prototype[funcName]; + if (prop instanceof Function) { + // try 'null' this + try { + prop.call(null); + fail(funcName + " does not throw TypeError on 'null' this"); + } catch (e) { + if (! (e instanceof TypeError)) { + fail("TypeError expected from " + funcName + ", got " + e); + } + } + + // try 'undefined' this + try { + prop.call(undefined); + fail(funcName + " does not throw TypeError on 'undefined' this"); + } catch (e) { + if (! (e instanceof TypeError)) { + fail("TypeError expected from " + funcName + ", got " + e); + } + } + } +}