8013444: JSON.parse does not invoke "reviver" callback as per spec

Reviewed-by: jlaskey, hannesw
This commit is contained in:
Athijegannathan Sundararajan 2013-04-29 18:40:40 +05:30
parent a659fce8ff
commit 56129142b0
3 changed files with 61 additions and 29 deletions

View File

@ -105,9 +105,7 @@ public final class JSONFunctions {
// 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<String> iter = valueObj.propertyIterator();
@ -122,33 +120,15 @@ public final class JSONFunctions {
valueObj.set(key, newElement, strict);
}
}
}
return valueObj;
} else if (isArray(val)) {
final ScriptObject valueArray = (ScriptObject)val;
final boolean strict = valueArray.isStrictContext();
final Iterator<String> 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);
}
}

View File

@ -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)

View File

@ -0,0 +1,3 @@
type is undefined
{"name":"NASHORN"}
2,6,10,14,18,22