# HG changeset patch # User sundar # Date 1367241040 -19800 # Node ID ada2ca9aeac5935c11dfef0aa692b437084c0bf3 # Parent e8d7298f29a1df21bf53a56ca33ffe5f72492987 8013444: JSON.parse does not invoke "reviver" callback as per spec. Reviewed-by: jlaskey, hannesw diff -r e8d7298f29a1 -r ada2ca9aeac5 src/jdk/nashorn/internal/runtime/JSONFunctions.java --- a/src/jdk/nashorn/internal/runtime/JSONFunctions.java Mon Apr 29 13:21:17 2013 +0200 +++ b/src/jdk/nashorn/internal/runtime/JSONFunctions.java Mon Apr 29 18:40:40 2013 +0530 @@ -105,9 +105,7 @@ // This is the abstract "Walk" operation from the spec. private static Object walk(final ScriptObject holder, final Object name, final ScriptFunction reviver) { final Object val = holder.get(name); - if (val == ScriptRuntime.UNDEFINED) { - return val; - } else if (val instanceof ScriptObject) { + if (val instanceof ScriptObject) { final ScriptObject valueObj = (ScriptObject)val; final boolean strict = valueObj.isStrictContext(); final Iterator iter = valueObj.propertyIterator(); @@ -122,33 +120,15 @@ valueObj.set(key, newElement, strict); } } - - return valueObj; - } else if (isArray(val)) { - final ScriptObject valueArray = (ScriptObject)val; - final boolean strict = valueArray.isStrictContext(); - final Iterator iter = valueArray.propertyIterator(); - - while (iter.hasNext()) { - final String key = iter.next(); - final Object newElement = walk(valueArray, valueArray.get(key), reviver); + } - if (newElement == ScriptRuntime.UNDEFINED) { - valueArray.delete(key, strict); - } else { - valueArray.set(key, newElement, strict); - } - } - return valueArray; - } else { - try { - // Object.class, ScriptFunction.class, ScriptObject.class, String.class, Object.class); - return REVIVER_INVOKER.invokeExact(reviver, holder, JSType.toString(name), val); - } catch(Error|RuntimeException t) { - throw t; - } catch(final Throwable t) { - throw new RuntimeException(t); - } + try { + // Object.class, ScriptFunction.class, ScriptObject.class, String.class, Object.class); + return REVIVER_INVOKER.invokeExact(reviver, holder, JSType.toString(name), val); + } catch(Error|RuntimeException t) { + throw t; + } catch(final Throwable t) { + throw new RuntimeException(t); } } diff -r e8d7298f29a1 -r ada2ca9aeac5 test/script/basic/JDK-8013444.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8013444.js Mon Apr 29 18:40:40 2013 +0530 @@ -0,0 +1,49 @@ +/* + * 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-8013444: JSON.parse does not invoke "reviver" callback as per spec. + * + * @test + * @run + */ + + +var type = typeof JSON.parse('{}',function(){}) +print("type is " + type); + +var obj = JSON.parse('{"name": "nashorn"}', + function(k, v) { + if (k === "") return v; + return v.toUpperCase(); + }); +print(JSON.stringify(obj)) + +var array = + JSON.parse("[1, 3, 5, 7, 9, 11]", + function(k, v) { + if (k === "") return v; + return v*2; + } + ); +print(array) diff -r e8d7298f29a1 -r ada2ca9aeac5 test/script/basic/JDK-8013444.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8013444.js.EXPECTED Mon Apr 29 18:40:40 2013 +0530 @@ -0,0 +1,3 @@ +type is undefined +{"name":"NASHORN"} +2,6,10,14,18,22