Index: lib/runtime/dart_utils.js |
diff --git a/lib/runtime/dart_utils.js b/lib/runtime/dart_utils.js |
index 39d4828e8123d0615ec2a2cf01edadbb8eb2d331..70555c729187a9577eebf25ccaff6bb7a202332b 100644 |
--- a/lib/runtime/dart_utils.js |
+++ b/lib/runtime/dart_utils.js |
@@ -49,32 +49,32 @@ var dart_utils = |
* Defines a lazy property. |
* After initial get or set, it will replace itself with a value property. |
*/ |
- // TODO(jmesserly): is this the best implementation for JS engines? |
// TODO(jmesserly): reusing descriptor objects has been shown to improve |
// performance in other projects (e.g. webcomponents.js ShadowDOM polyfill). |
function defineLazyProperty(to, name, desc) { |
let init = desc.get; |
- let writable = !!desc.set; |
- function lazySetter(value) { |
- defineProperty(to, name, { value: value, writable: writable }); |
+ let value = null; |
+ |
+ function lazySetter(x) { |
+ init = null; |
+ value = x; |
+ } |
+ function circularInitError() { |
+ throwError('circular initialization for field ' + name); |
} |
function lazyGetter() { |
- // Clear the init function to detect circular initialization. |
- let f = init; |
- if (f === null) { |
- throwError('circular initialization for field ' + name); |
- } |
- init = null; |
+ if (init == null) return value; |
- // Compute and store the value. |
- let value = f(); |
- lazySetter(value); |
+ // Compute and store the value, guarding against reentry. |
+ let f = init; |
+ init = circularInitError; |
+ lazySetter(f()); |
return value; |
} |
desc.get = lazyGetter; |
desc.configurable = true; |
- if (writable) desc.set = lazySetter; |
- defineProperty(to, name, desc); |
+ if (desc.set) desc.set = lazySetter; |
+ return defineProperty(to, name, desc); |
} |
dart_utils.defineLazyProperty = defineLazyProperty; |
@@ -85,15 +85,8 @@ var dart_utils = |
} |
dart_utils.defineLazy = defineLazy; |
- function defineMemoizedGetter(obj, name, get) { |
- let cache = null; |
- function getter() { |
- if (cache != null) return cache; |
- cache = get(); |
- get = null; |
- return cache; |
- } |
- defineProperty(obj, name, {get: getter, configurable: true}); |
+ function defineMemoizedGetter(obj, name, getter) { |
+ return defineLazyProperty(obj, name, {get: getter}); |
} |
dart_utils.defineMemoizedGetter = defineMemoizedGetter; |
@@ -114,10 +107,17 @@ var dart_utils = |
} |
dart_utils.copyProperties = copyProperties; |
- |
- function instantiate(type, args) { |
- return new type(...args); |
+ /** Exports from one Dart module to another. */ |
+ function export_(to, from, show, hide) { |
+ if (show == void 0) { |
+ show = getOwnNamesAndSymbols(from); |
+ } |
+ if (hide != void 0) { |
+ var hideMap = new Map(hide); |
+ show = show.filter((k) => !hideMap.has(k)); |
+ } |
+ return copyTheseProperties(to, from, show); |
} |
- dart_utils.instantiate = instantiate; |
+ dart_utils.export = export_; |
})(dart_utils); |