OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dart2js.js_emitter.full_emitter; | 5 library dart2js.js_emitter.full_emitter; |
6 | 6 |
7 import 'dart:collection' show HashMap; | 7 import 'dart:collection' show HashMap; |
8 import 'dart:convert'; | 8 import 'dart:convert'; |
9 | 9 |
10 import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames; | 10 import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames; |
(...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 // 'prototype' will be undefined except if we are doing an update | 932 // 'prototype' will be undefined except if we are doing an update |
933 // during incremental compilation. In this case we put the lazy | 933 // during incremental compilation. In this case we put the lazy |
934 // field directly on the isolate instead of the isolateProperties. | 934 // field directly on the isolate instead of the isolateProperties. |
935 prototype = prototype || $isolatePropertiesName; | 935 prototype = prototype || $isolatePropertiesName; |
936 var sentinelUndefined = {}; | 936 var sentinelUndefined = {}; |
937 var sentinelInProgress = {}; | 937 var sentinelInProgress = {}; |
938 prototype[fieldName] = sentinelUndefined; | 938 prototype[fieldName] = sentinelUndefined; |
939 | 939 |
940 prototype[getterName] = function () { | 940 prototype[getterName] = function () { |
941 var result = this[fieldName]; | 941 var result = this[fieldName]; |
| 942 if (result == sentinelInProgress) { |
| 943 // In minified mode, static name is not provided, so fall back |
| 944 // to the minified fieldName. |
| 945 #cyclicThrow(staticName || fieldName); |
| 946 } |
942 try { | 947 try { |
943 if (result === sentinelUndefined) { | 948 if (result === sentinelUndefined) { |
944 this[fieldName] = sentinelInProgress; | 949 this[fieldName] = sentinelInProgress; |
945 | |
946 try { | 950 try { |
947 result = this[fieldName] = lazyValue(); | 951 result = this[fieldName] = lazyValue(); |
948 } finally { | 952 } finally { |
949 // Use try-finally, not try-catch/throw as it destroys the | 953 // Use try-finally, not try-catch/throw as it destroys the |
950 // stack trace. | 954 // stack trace. |
951 if (result === sentinelUndefined) | 955 if (result === sentinelUndefined) |
952 this[fieldName] = null; | 956 this[fieldName] = null; |
953 } | 957 } |
954 } else { | |
955 if (result === sentinelInProgress) | |
956 // In minified mode, static name is not provided, so fall | |
957 // back to the minified fieldName. | |
958 #cyclicThrow(staticName || fieldName); | |
959 } | 958 } |
960 | |
961 return result; | 959 return result; |
962 } finally { | 960 } finally { |
963 this[getterName] = function() { return this[fieldName]; }; | 961 this[getterName] = function() { return this[fieldName]; }; |
964 } | 962 } |
965 } | 963 } |
966 } | 964 } |
967 } | 965 } |
968 | 966 |
969 // We replace the old Isolate function with a new one that initializes | 967 // We replace the old Isolate function with a new one that initializes |
970 // all its fields with the initial (and often final) value of all | 968 // all its fields with the initial (and often final) value of all |
(...skipping 1209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2180 if (cachedElements.isEmpty) return; | 2178 if (cachedElements.isEmpty) return; |
2181 for (Element element in backend.codegenEnqueuer.newlyEnqueuedElements) { | 2179 for (Element element in backend.codegenEnqueuer.newlyEnqueuedElements) { |
2182 if (element.isInstanceMember) { | 2180 if (element.isInstanceMember) { |
2183 cachedClassBuilders.remove(element.enclosingClass); | 2181 cachedClassBuilders.remove(element.enclosingClass); |
2184 | 2182 |
2185 nativeEmitter.cachedBuilders.remove(element.enclosingClass); | 2183 nativeEmitter.cachedBuilders.remove(element.enclosingClass); |
2186 } | 2184 } |
2187 } | 2185 } |
2188 } | 2186 } |
2189 } | 2187 } |
OLD | NEW |