src/jdk/nashorn/internal/runtime/JSONFunctions.java

Print this page




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