84 Node node;
85
86 try {
87 node = parser.parse();
88 } catch (final ParserException e) {
89 throw ECMAErrors.syntaxError(e, "invalid.json", e.getMessage());
90 }
91
92 final Global global = Context.getGlobal();
93 Object unfiltered = convertNode(global, node);
94 return applyReviver(global, unfiltered, reviver);
95 }
96
97 // -- Internals only below this point
98
99 // parse helpers
100
101 // apply 'reviver' function if available
102 private static Object applyReviver(final Global global, final Object unfiltered, final Object reviver) {
103 if (reviver instanceof ScriptFunction) {
104 assert global instanceof Global;
105 final ScriptObject root = global.newObject();
106 root.addOwnProperty("", Property.WRITABLE_ENUMERABLE_CONFIGURABLE, unfiltered);
107 return walk(root, "", (ScriptFunction)reviver);
108 }
109 return unfiltered;
110 }
111
112 // This is the abstract "Walk" operation from the spec.
113 private static Object walk(final ScriptObject holder, final Object name, final ScriptFunction reviver) {
114 final Object val = holder.get(name);
115 if (val instanceof ScriptObject) {
116 final ScriptObject valueObj = (ScriptObject)val;
117 final Iterator<String> iter = valueObj.propertyIterator();
118
119 while (iter.hasNext()) {
120 final String key = iter.next();
121 final Object newElement = walk(valueObj, key, reviver);
122
123 if (newElement == ScriptRuntime.UNDEFINED) {
124 valueObj.delete(key, false);
|
84 Node node;
85
86 try {
87 node = parser.parse();
88 } catch (final ParserException e) {
89 throw ECMAErrors.syntaxError(e, "invalid.json", e.getMessage());
90 }
91
92 final Global global = Context.getGlobal();
93 Object unfiltered = convertNode(global, node);
94 return applyReviver(global, unfiltered, reviver);
95 }
96
97 // -- Internals only below this point
98
99 // parse helpers
100
101 // apply 'reviver' function if available
102 private static Object applyReviver(final Global global, final Object unfiltered, final Object reviver) {
103 if (reviver instanceof ScriptFunction) {
104 final ScriptObject root = global.newObject();
105 root.addOwnProperty("", Property.WRITABLE_ENUMERABLE_CONFIGURABLE, unfiltered);
106 return walk(root, "", (ScriptFunction)reviver);
107 }
108 return unfiltered;
109 }
110
111 // This is the abstract "Walk" operation from the spec.
112 private static Object walk(final ScriptObject holder, final Object name, final ScriptFunction reviver) {
113 final Object val = holder.get(name);
114 if (val instanceof ScriptObject) {
115 final ScriptObject valueObj = (ScriptObject)val;
116 final Iterator<String> iter = valueObj.propertyIterator();
117
118 while (iter.hasNext()) {
119 final String key = iter.next();
120 final Object newElement = walk(valueObj, key, reviver);
121
122 if (newElement == ScriptRuntime.UNDEFINED) {
123 valueObj.delete(key, false);
|