Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1006)

Unified Diff: pkg/compiler/lib/src/kernel/closure.dart

Issue 2938203003: Compute KernelClosureRepresentationInfo.variableIsUsedInTryOrSync (Closed)
Patch Set: Remove test line Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/kernel/closure.dart
diff --git a/pkg/compiler/lib/src/kernel/closure.dart b/pkg/compiler/lib/src/kernel/closure.dart
new file mode 100644
index 0000000000000000000000000000000000000000..2eee7f5785270f7d97ea14780559cf3199b4f187
--- /dev/null
+++ b/pkg/compiler/lib/src/kernel/closure.dart
@@ -0,0 +1,133 @@
+// Copyright (c) 2016, 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.
+
+import 'package:kernel/ast.dart' as ir;
+
+import '../closure.dart';
+import '../common.dart';
+import '../common/codegen.dart' show CodegenRegistry;
+import '../common/names.dart';
+import '../common_elements.dart';
+import '../compiler.dart';
+import '../constants/values.dart'
+ show
+ ConstantValue,
+ InterceptorConstantValue,
+ StringConstantValue,
+ TypeConstantValue;
+import '../elements/elements.dart';
+import '../elements/entities.dart';
+import '../elements/jumps.dart';
+import '../elements/resolution_types.dart';
+import '../elements/types.dart';
+import '../io/source_information.dart';
+import '../js/js.dart' as js;
+import '../js_backend/backend.dart' show JavaScriptBackend;
+import '../kernel/closure.dart';
+import '../native/native.dart' as native;
+import '../resolution/tree_elements.dart';
+import '../tree/nodes.dart' show Node;
+import '../types/masks.dart';
+import '../universe/selector.dart';
+import '../universe/side_effects.dart' show SideEffects;
+import '../universe/use.dart' show DynamicUse;
+import '../universe/world_builder.dart' show CodegenWorldBuilder;
+import '../world.dart';
+import 'element_map.dart';
+import 'element_map_impl.dart';
+
+class KernelClosureDataBuilder extends ir.Visitor {
+ final KernelToLocalsMap _localsMap;
+ final KernelClosureRepresentationInfo info;
+
+ bool _inTry = false;
+
+ KernelClosureDataBuilder(this._localsMap, ThisLocal thisLocal)
+ : info = new KernelClosureRepresentationInfo(thisLocal);
+
+ @override
+ defaultNode(ir.Node node) {
+ node.visitChildren(this);
+ }
+
+ @override
+ visitTryCatch(ir.TryCatch node) {
+ bool oldInTry = _inTry;
+ _inTry = true;
+ node.visitChildren(this);
+ _inTry = oldInTry;
+ }
+
+ @override
+ visitTryFinally(ir.TryFinally node) {
+ bool oldInTry = _inTry;
+ _inTry = true;
+ node.visitChildren(this);
+ _inTry = oldInTry;
+ }
+
Emily Fortuna 2017/06/15 22:54:28 add @override?
Johnni Winther 2017/06/16 13:40:07 Done.
+ visitVariableGet(ir.VariableGet node) {
+ if (_inTry) {
+ info.registerUsedInTryOrSync(_localsMap.getLocal(node.variable));
+ }
+ }
+}
+
+class KernelClosureDataLookup implements ClosureDataLookup<ir.Node> {
+ final KernelToElementMapImpl _elementMap;
+ final KernelToLocalsMap _localsMap;
+ Map<Entity, ClosureRepresentationInfo> _infoMap =
+ <Entity, ClosureRepresentationInfo>{};
+
+ KernelClosureDataLookup(this._elementMap, this._localsMap);
+
+ /// TODO(johnniwinther,efortuna): Implement this.
+ @override
+ ClosureAnalysisInfo getClosureAnalysisInfo(ir.Node node) {
+ return const ClosureAnalysisInfo();
+ }
+
+ /// TODO(johnniwinther,efortuna): Implement this.
+ @override
+ LoopClosureRepresentationInfo getClosureRepresentationInfoForLoop(
+ ir.Node loopNode) {
+ return const LoopClosureRepresentationInfo();
+ }
+
+ @override
+ ClosureRepresentationInfo getClosureRepresentationInfo(Entity entity) {
+ return _infoMap.putIfAbsent(entity, () {
+ if (entity is MemberEntity) {
+ ir.Member node = _elementMap.getMemberNode(entity);
+ ThisLocal thisLocal;
+ if (entity.isInstanceMember) {
+ thisLocal = new ThisLocal(entity);
+ }
+ KernelClosureDataBuilder builder =
+ new KernelClosureDataBuilder(_localsMap, thisLocal);
+ node.accept(builder);
+ return builder.info;
+ }
+
+ /// TODO(johnniwinther,efortuna): Implement this.
+ return const ClosureRepresentationInfo();
+ });
+ }
+}
+
+// TODO(johnniwinther): Add unittest for the computed
+// [ClosureRepresentationInfo].
+class KernelClosureRepresentationInfo extends ClosureRepresentationInfo {
+ final ThisLocal thisLocal;
+ final Set<Local> _localsUsedInTryOrSync = new Set<Local>();
+
+ KernelClosureRepresentationInfo(this.thisLocal);
+
+ void registerUsedInTryOrSync(Local local) {
+ _localsUsedInTryOrSync.add(local);
+ }
+
+ bool variableIsUsedInTryOrSync(Local variable) =>
+ _localsUsedInTryOrSync.contains(variable);
+}
« no previous file with comments | « no previous file | pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart » ('j') | pkg/compiler/lib/src/ssa/builder.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698