mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-28 19:20:33 +00:00
8013444: JSON.parse does not invoke "reviver" callback as per spec
Reviewed-by: jlaskey, hannesw
This commit is contained in:
parent
a659fce8ff
commit
56129142b0
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
49
nashorn/test/script/basic/JDK-8013444.js
Normal file
49
nashorn/test/script/basic/JDK-8013444.js
Normal 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)
|
||||
3
nashorn/test/script/basic/JDK-8013444.js.EXPECTED
Normal file
3
nashorn/test/script/basic/JDK-8013444.js.EXPECTED
Normal file
@ -0,0 +1,3 @@
|
||||
type is undefined
|
||||
{"name":"NASHORN"}
|
||||
2,6,10,14,18,22
|
||||
Loading…
x
Reference in New Issue
Block a user