Chromium Code Reviews| Index: lib/runtime/dart_runtime.js |
| diff --git a/lib/runtime/dart_runtime.js b/lib/runtime/dart_runtime.js |
| index 200d187f7e01a6436d27ab56f7eb53e6aa172304..6683bc9768f592cd7a23fdb418d30fcae633d72c 100644 |
| --- a/lib/runtime/dart_runtime.js |
| +++ b/lib/runtime/dart_runtime.js |
| @@ -50,6 +50,11 @@ var dart, _js_helper, _js_primitives; |
| } |
| dart.dput = dput; |
| + function throwRuntimeError(message) { |
| + console.error(message); |
|
Jennifer Messerly
2015/06/05 16:22:27
what's the benefit of logging and throwing? Don't
vsm
2015/06/05 17:01:04
removed
|
| + throw new _js_helper.RuntimeError(message); |
|
Jennifer Messerly
2015/06/05 16:22:27
what happens if this isn't loaded? don't we have b
vsm
2015/06/05 17:01:04
Done.
|
| + } |
| + |
| // TODO(jmesserly): this should call noSuchMethod, not throw. |
| function throwNoSuchMethod(obj, name, args, opt_func) { |
| if (obj === void 0) obj = opt_func; |
| @@ -431,15 +436,15 @@ var dart, _js_helper, _js_primitives; |
| /** Checks that `x` is not null or undefined. */ |
| function notNull(x) { |
| - if (x == null) throw 'expected not-null value'; |
| + if (x == null) throwRuntimeError('expected not-null value'); |
| return x; |
| } |
| dart.notNull = notNull; |
| function _typeName(type) { |
| - if (type === void 0) throw "Undefined type"; |
| + if (type === void 0) throwRuntimeError('Undefined type'); |
| var name = type.name; |
| - if (!name) throw 'Unexpected type: ' + type; |
| + if (!name) throwRuntimeError('Unexpected type: ' + type); |
| return name; |
| } |
| @@ -727,7 +732,7 @@ var dart, _js_helper, _js_primitives; |
| function lazyGetter() { |
| // Clear the init function to detect circular initialization. |
| let f = init; |
| - if (f === null) throw 'circular initialization for field ' + name; |
| + if (f === null) throwRuntimeError('circular initialization for field ' + name); |
| init = null; |
| // Compute and store the value. |
| @@ -906,8 +911,7 @@ var dart, _js_helper, _js_primitives; |
| dart.map = map; |
| function assert(condition) { |
| - // TODO(jmesserly): throw assertion error. |
| - if (!condition) throw 'assertion failed'; |
| + if (!condition) throw new core.AssertionError(); |
| } |
| dart.assert = assert; |
| @@ -941,12 +945,12 @@ var dart, _js_helper, _js_primitives; |
| /** Memoize a generic type constructor function. */ |
| function generic(typeConstructor) { |
| let length = typeConstructor.length; |
| - if (length < 1) throw Error('must have at least one generic type argument'); |
| + if (length < 1) throwRuntimeError('must have at least one generic type argument'); |
| let resultMap = new Map(); |
| function makeGenericType(/*...arguments*/) { |
| if (arguments.length != length && arguments.length != 0) { |
| - throw Error('requires ' + length + ' or 0 type arguments'); |
| + throwRuntimeError('requires ' + length + ' or 0 type arguments'); |
| } |
| let args = Array.prototype.slice.call(arguments); |
| // TODO(leafp): This should really be core.Object for |
| @@ -959,7 +963,7 @@ var dart, _js_helper, _js_primitives; |
| for (let i = 0; i < length; i++) { |
| let arg = args[i]; |
| if (arg == null) { |
| - throw Error('type arguments should not be null: ' + typeConstructor); |
| + throwRuntimeError('type arguments should not be null: ' + typeConstructor); |
| } |
| let map = value; |
| value = map.get(arg); |
| @@ -1230,24 +1234,51 @@ var dart, _js_helper, _js_primitives; |
| dart.global = window || global; |
| dart.JsSymbol = Symbol; |
| - function import_(value) { |
| + var loadedLibraries = {}; |
|
Jennifer Messerly
2015/06/05 16:22:27
How will this work with JS interop? It seems we ar
vsm
2015/06/05 17:01:04
Not really assuming a closed world. For JS code,
|
| + |
| + function import_(name) { |
| + let value = loadedLibraries[name]; |
| // TODO(vsm): Change this to a hard throw. |
| // For now, we're missing some libraries. E.g., dart:js: |
| // https://github.com/dart-lang/dev_compiler/issues/168 |
| if (!value) { |
| - console.log('missing required module'); |
| + console.warn('Missing required module: ' + name); |
| + } else if (value != dart.global[name]) { |
| + throwRuntimeError('Library name mismatch: ' + name) |
| } |
| return value; |
| } |
| dart.import = import_; |
| + |
| + function initializeLibraryStub(name) { |
| + // Create the library object if necessary. |
| + if (!dart.global[name]) { |
| + dart.global[name] = {}; |
| + } |
| + return dart.global[name]; |
| + } |
| - function lazyImport(value) { |
| - return defineLibrary(value, {}); |
| + function lazyImport(name) { |
| + return initializeLibraryStub(name); |
| } |
| dart.lazyImport = lazyImport; |
| - function defineLibrary(value, defaultValue) { |
| - return value ? value : defaultValue; |
| + function defineLibrary(name, defaultValue) { |
| + if (loadedLibraries[name]) { |
| + throwRuntimeError('Library is already defined: ' + name); |
| + } |
| + var value; |
| + if (defaultValue) { |
| + var oldValue = dart.global[name]; |
| + if (oldValue && oldValue != defaultValue) { |
| + throwRuntimeError('Library ' + name + ' cannot be redefined to ' + defaultValue); |
|
Jennifer Messerly
2015/06/05 16:22:27
long line.
also could use interpolation:
`Library
vsm
2015/06/05 17:01:04
Done.
|
| + } |
| + dart.global[name] = value = defaultValue; |
| + } else { |
| + value = initializeLibraryStub(name); |
| + } |
| + loadedLibraries[name] = value; |
| + return value; |
| } |
| dart.defineLibrary = defineLibrary; |