diff --git a/runtime/lib/json_patch.dart b/runtime/lib/json_patch.dart deleted file mode 100644 index 0b637a15f40..00000000000 --- a/runtime/lib/json_patch.dart +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// JSON parsing and serialization. - -patch parse(String json, [reviver(var key, var value)]) { - return _parse(json, reviver); -} diff --git a/runtime/lib/json_sources.gypi b/runtime/lib/json_sources.gypi deleted file mode 100644 index 1622f7bf6d7..00000000000 --- a/runtime/lib/json_sources.gypi +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -# for details. All rights reserved. Use of this source code is governed by a -# BSD-style license that can be found in the LICENSE file. - -{ - 'sources': [ - 'json_patch.dart', - ], -} diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc index fa20bdd6871..1b1d8d0da6f 100644 --- a/runtime/vm/bootstrap.cc +++ b/runtime/vm/bootstrap.cc @@ -72,7 +72,7 @@ RawScript* Bootstrap::LoadIsolateScript(bool patch) { RawScript* Bootstrap::LoadJsonScript(bool patch) { const char* url = patch ? "dart:json-patch" : "dart:json"; - const char* source = patch ? json_patch_ : json_source_; + const char* source = patch ? json_source_ : json_source_; return LoadScript(url, source, patch); } diff --git a/runtime/vm/bootstrap.h b/runtime/vm/bootstrap.h index b850cebc537..275c27db3d7 100644 --- a/runtime/vm/bootstrap.h +++ b/runtime/vm/bootstrap.h @@ -45,7 +45,6 @@ class Bootstrap : public AllStatic { static const char isolate_source_[]; static const char isolate_patch_[]; static const char json_source_[]; - static const char json_patch_[]; static const char math_source_[]; static const char math_patch_[]; static const char mirrors_source_[]; diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc index 62f82e8f1ad..b2dba5a4c7f 100644 --- a/runtime/vm/object.cc +++ b/runtime/vm/object.cc @@ -1101,11 +1101,6 @@ RawError* Object::Init(Isolate* isolate) { INIT_LIBRARY(Json, Bootstrap::LoadJsonScript(false), Library::JsonLibrary()); - patch_script = Bootstrap::LoadJsonScript(true); - error = lib.Patch(patch_script); - if (!error.IsNull()) { - return error.raw(); - } INIT_LIBRARY(Utf, Bootstrap::LoadUtfScript(false), Library::UtfLibrary()); diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi index 1c1b10fb3a0..ca69ca59e8f 100644 --- a/runtime/vm/vm.gypi +++ b/runtime/vm/vm.gypi @@ -19,7 +19,6 @@ 'isolate_cc_file': '<(SHARED_INTERMEDIATE_DIR)/isolate_gen.cc', 'isolate_patch_cc_file': '<(SHARED_INTERMEDIATE_DIR)/isolate_patch_gen.cc', 'json_cc_file': '<(SHARED_INTERMEDIATE_DIR)/json_gen.cc', - 'json_patch_cc_file': '<(SHARED_INTERMEDIATE_DIR)/json_patch_gen.cc', 'scalarlist_cc_file': '<(SHARED_INTERMEDIATE_DIR)/scalarlist_gen.cc', 'scalarlist_patch_cc_file': '<(SHARED_INTERMEDIATE_DIR)/scalarlist_patch_gen.cc', 'uri_cc_file': '<(SHARED_INTERMEDIATE_DIR)/uri_gen.cc', @@ -102,7 +101,6 @@ 'generate_isolate_cc_file', 'generate_isolate_patch_cc_file', 'generate_json_cc_file', - 'generate_json_patch_cc_file', 'generate_mirrors_cc_file', 'generate_mirrors_patch_cc_file', 'generate_scalarlist_cc_file', @@ -133,7 +131,6 @@ '<(isolate_cc_file)', '<(isolate_patch_cc_file)', '<(json_cc_file)', - '<(json_patch_cc_file)', '<(mirrors_cc_file)', '<(mirrors_patch_cc_file)', '<(scalarlist_cc_file)', @@ -850,44 +847,6 @@ }, ] }, - { - 'target_name': 'generate_json_patch_cc_file', - 'type': 'none', - 'includes': [ - # Load the shared json library sources. - '../lib/json_sources.gypi', - ], - 'sources/': [ - # Exclude all .[cc|h] files. - # This is only here for reference. Excludes happen after - # variable expansion, so the script has to do its own - # exclude processing of the sources being passed. - ['exclude', '\\.cc|h$'], - ], - 'actions': [ - { - 'action_name': 'generate_json_patch_cc', - 'inputs': [ - '../tools/create_string_literal.py', - '<(builtin_in_cc_file)', - '<@(_sources)', - ], - 'outputs': [ - '<(json_patch_cc_file)', - ], - 'action': [ - 'python', - 'tools/create_string_literal.py', - '--output', '<(json_patch_cc_file)', - '--input_cc', '<(builtin_in_cc_file)', - '--include', 'vm/bootstrap.h', - '--var_name', 'dart::Bootstrap::json_patch_', - '<@(_sources)', - ], - 'message': 'Generating ''<(json_patch_cc_file)'' file.' - }, - ] - }, { 'target_name': 'generate_scalarlist_cc_file', 'type': 'none', diff --git a/sdk/lib/_internal/compiler/implementation/lib/json_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/json_patch.dart deleted file mode 100644 index 01cce1a0acf..00000000000 --- a/sdk/lib/_internal/compiler/implementation/lib/json_patch.dart +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// Patch file for dart:json library. - -import 'dart:_foreign_helper' show JS; - -/** - * Parses [json] and builds the corresponding parsed JSON value. - * - * Parsed JSON values are of the types [num], [String], [bool], [Null], - * [List]s of parsed JSON values or [Map]s from [String] to parsed - * JSON values. - * - * The optional [reviver] function, if provided, is called once for each object - * or list property parsed. The arguments are the property name ([String]) or - * list index ([int]), and the value is the parsed value. The return value of - * the reviver will be used as the value of that property instead of the parsed - * value. The top level value is passed to the reviver with the empty string as - * a key. - * - * Throws [FormatException] if the input is not valid JSON text. - */ -patch parse(String json, [reviver(var key, var value)]) { - if (json is! String) throw new ArgumentError(json); - - var parsed; - try { - parsed = JS('=Object|=List|Null|bool|num|String', 'JSON.parse(#)', json); - } catch (e) { - throw new FormatException(JS('String', 'String(#)', e)); - } - - return _convertJsonToDart(parsed, reviver); -} - -/** - * Walks the raw JavaScript value [json], replacing JavaScript Objects with - * Maps. [json] is expected to be freshly allocated so elements can be replaced - * in-place. - */ -_convertJsonToDart(json, reviver(key, value)) { - - var revive = reviver == null ? (key, value) => value : reviver; - - walk(e) { - // JavaScript null, string, number, bool are in the correct representation. - if (JS('bool', '# == null', e) || JS('bool', 'typeof # != "object"', e)) { - return e; - } - - // This test is needed to avoid identifing '{"__proto__":[]}' as an Array. - // TODO(sra): Replace this test with cheaper '#.constructor === Array' when - // bug 621 below is fixed. - if (JS('bool', 'Object.getPrototypeOf(#) === Array.prototype', e)) { - var list = JS('=List', '#', e); // Teach compiler the type is known. - // In-place update of the elements since JS Array is a Dart List. - for (int i = 0; i < list.length; i++) { - // Use JS indexing to avoid range checks. We know this is the only - // reference to the list, but the compiler will likely never be able to - // tell that this instance of the list cannot have its length changed by - // the reviver even though it later will be passed to the reviver at the - // outer level. - var item = JS('', '#[#]', list, i); - JS('', '#[#]=#', list, i, revive(i, walk(item))); - } - return list; - } - - // Otherwise it is a plain Object, so copy to a Map. - var keys = JS('=List', 'Object.keys(#)', e); - Map map = {}; - for (int i = 0; i < keys.length; i++) { - String key = keys[i]; - map[key] = revive(key, walk(JS('', '#[#]', e, key))); - } - // V8 has a bug with properties named "__proto__" - // https://code.google.com/p/v8/issues/detail?id=621 - var proto = JS('', '#.__proto__', e); - // __proto__ can be undefined on IE9. - if (JS('bool', - 'typeof # !== "undefined" && # !== Object.prototype', - proto, proto)) { - map['__proto__'] = revive('__proto__', walk(proto)); - } - return map; - } - - return revive('', walk(json)); -} diff --git a/sdk/lib/_internal/libraries.dart b/sdk/lib/_internal/libraries.dart index b8146bbfdd0..8ab2e7f5a77 100644 --- a/sdk/lib/_internal/libraries.dart +++ b/sdk/lib/_internal/libraries.dart @@ -66,8 +66,7 @@ const Map LIBRARIES = const { dart2jsPatchPath: "_internal/compiler/implementation/lib/isolate_patch.dart"), "json": const LibraryInfo( - "json/json.dart", - dart2jsPatchPath: "_internal/compiler/implementation/lib/json_patch.dart"), + "json/json.dart"), "math": const LibraryInfo( "math/math.dart", diff --git a/sdk/lib/json/json_base.dart b/sdk/lib/json/json_base.dart index bf1b01e6fd6..9f74d6585b2 100644 --- a/sdk/lib/json/json_base.dart +++ b/sdk/lib/json/json_base.dart @@ -47,9 +47,7 @@ class JsonUnsupportedObjectError implements Error { * * Throws [FormatException] if the input is not valid JSON text. */ -external parse(String json, [reviver(var key, var value)]); - -_parse(String json, reviver(var key, var value)) { +parse(String json, [reviver(var key, var value)]) { BuildJsonListener listener; if (reviver == null) { listener = new BuildJsonListener(); diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status index 0023d2289b9..8672c1cd838 100644 --- a/tests/corelib/corelib.status +++ b/tests/corelib/corelib.status @@ -51,7 +51,6 @@ core_runtime_types_test: Fail [ $compiler == dart2js && $runtime == ie9 ] date_time7_test: Fail # BUG(3304): Maybe this doesn't time out? -json_leading_zeros_test: Fail # IE parses slightly harmless no-standard JSON. string_base_vm_test: Fail # BUG(3304): Maybe this doesn't time out? [ $compiler == dart2dart ] diff --git a/tests/corelib/json_leading_zeros_test.dart b/tests/corelib/json_leading_zeros_test.dart deleted file mode 100644 index 9ab9b351063..00000000000 --- a/tests/corelib/json_leading_zeros_test.dart +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// This is a trimmed-down version of json_test to isolate a difference between -// IE and other runtimes. - -library json_test; - -import "dart:json"; - -bool badFormat(e) => e is FormatException; - -void testThrows(json) { - Expect.throws(() => parse(json), badFormat); -} - -testNumbers() { - // Positive tests for number formats. - var integerList = ["0","9","9999"]; - var signList = ["", "-"]; - var fractionList = ["", ".0", ".1", ".99999"]; - var exponentList = [""]; - for (var exphead in ["e", "E", "e-", "E-", "e+", "E+"]) { - for (var expval in ["0", "1", "200"]) { - exponentList.add("$exphead$expval"); - } - } - - // Negative tests (syntax error). - // testError thoroughly tests the given parts with a lot of valid - // values for the other parts. - testError({signs, integers, fractions, exponents}) { - def(value, defaultValue) { - if (value == null) return defaultValue; - if (value is List) return value; - return [value]; - } - signs = def(signs, signList); - integers = def(integers, integerList); - fractions = def(fractions, fractionList); - exponents = def(exponents, exponentList); - for (var integer in integers) { - for (var sign in signs) { - for (var fraction in fractions) { - for (var exponent in exponents) { - var literal = "$sign$integer$fraction$exponent"; - testThrows(literal); - } - } - } - } - } - // Initial zero only allowed for zero integer part. - testError(integers: ["00", "01"]); -} - -main() { - testNumbers(); -} diff --git a/tests/corelib/json_test.dart b/tests/corelib/json_test.dart index a5f769f7f6b..75d22a3bd89 100644 --- a/tests/corelib/json_test.dart +++ b/tests/corelib/json_test.dart @@ -97,11 +97,8 @@ testNumbers() { // Integer part cannot be omitted: testError(integers: ""); - - // Test for "Initial zero only allowed for zero integer part" moved to - // json_leading_zeros_test.dart because IE's JSON.parse accepts additional - // initial zeros. - + // Initial zero only allowed for zero integer part. + testError(integers: ["00", "01"]); // Only minus allowed as sign. testError(signs: "+"); // Requires digits after decimal point.