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

Unified Diff: pkg/fletchc/lib/src/closure_environment.dart

Issue 1659163007: Rename fletch -> dartino (Closed) Base URL: https://github.com/dartino/sdk.git@master
Patch Set: address comments Created 4 years, 11 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
« no previous file with comments | « pkg/fletchc/lib/src/class_debug_info.dart ('k') | pkg/fletchc/lib/src/codegen_visitor.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/fletchc/lib/src/closure_environment.dart
diff --git a/pkg/fletchc/lib/src/closure_environment.dart b/pkg/fletchc/lib/src/closure_environment.dart
deleted file mode 100644
index d52c605f21c0bc226c50889fd4af70670e94c623..0000000000000000000000000000000000000000
--- a/pkg/fletchc/lib/src/closure_environment.dart
+++ /dev/null
@@ -1,771 +0,0 @@
-// Copyright (c) 2015, the Dartino 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.md file.
-
-library fletchc.closure_environment;
-
-import 'package:compiler/src/resolution/semantic_visitor.dart';
-
-import 'package:compiler/src/resolution/operators.dart' show
- AssignmentOperator,
- BinaryOperator,
- IncDecOperator,
- UnaryOperator;
-
-import 'package:compiler/src/elements/elements.dart';
-import 'package:compiler/src/resolution/tree_elements.dart';
-import 'package:compiler/src/resolution/send_resolver.dart';
-import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/universe/selector.dart';
-import 'package:compiler/src/universe/call_structure.dart';
-import 'package:compiler/src/diagnostics/spannable.dart' show
- Spannable,
- SpannableAssertionFailure;
-import 'package:compiler/src/dart_types.dart';
-
-enum CaptureMode {
- /**
- * If a local is marked [ByValue], the local is read in closures.
- */
- ByValue,
-
- /**
- * If a local is marked [ByReference], a write to the local can be observed
- * from a closure.
- *
- * In this case, the local must be boxed.
- */
- ByReference,
-}
-
-/**
- * The computed infomation about a closures usage of locals and 'this'.
- */
-class ClosureInfo {
- bool isThisFree = false;
- Set<LocalElement> free = new Set<LocalElement>();
-
- void markUsed(LocalElement element) {
- free.add(element);
- }
-}
-
-class ClosureEnvironment {
- /**
- * A map of locals that are captured, and how.
- */
- final Map<LocalElement, CaptureMode> captured = <LocalElement, CaptureMode>{};
-
- /**
- * A map of all nested closures of [function], and what locals they capture.
- */
- final Map<FunctionElement, ClosureInfo> closures =
- <FunctionElement, ClosureInfo>{};
-
- bool shouldBeBoxed(element) => captured[element] == CaptureMode.ByReference;
-}
-
-class ClosureVisitor
- extends SemanticVisitor
- with TraversalSendMixin,
- SemanticSendResolvedMixin,
- BaseImplementationOfLocalsMixin,
- VariableBulkMixin,
- ParameterBulkMixin,
- FunctionBulkMixin,
- ConstructorBulkMixin,
- InitializerBulkMixin
- implements SemanticSendVisitor, SemanticDeclarationVisitor {
- final ClosureEnvironment closureEnvironment = new ClosureEnvironment();
-
- /**
- * A set of all locals that are assigned in [function] excluding nested
- * closures. This is the inverse of implicit final locals.
- */
- final Set<LocalElement> locallyAssigned = new Set<LocalElement>();
-
- final MemberElement element;
-
- ExecutableElement currentElement;
-
- bool inInitializers = false;
-
- ClosureVisitor(this.element, TreeElements elements)
- : super(elements);
-
- SemanticSendVisitor get sendVisitor => this;
- SemanticDeclarationVisitor get declVisitor => this;
-
- ClosureEnvironment compute() {
- assert(element.memberContext == element);
- assert(currentElement == null);
- currentElement = element;
- if (element.node != null) element.resolvedAst.node.accept(this);
- assert(currentElement == element);
- return closureEnvironment;
- }
-
- void visitNode(Node node) {
- node.visitChildren(this);
- }
-
- void visitVariableDefinitions(VariableDefinitions node) {
- for (Node definition in node.definitions) {
- VariableElement element = elements[definition];
- Expression initializer = element.initializer;
- if (initializer != null) initializer.accept(this);
- }
- }
-
- void visitFunctionExpression(FunctionExpression node) {
- ExecutableElement oldElement = currentElement;
- currentElement = elements.getFunctionDefinition(node);
- if (currentElement != element) {
- ClosureInfo info = new ClosureInfo();
- closureEnvironment.closures[currentElement] = info;
- }
- if (currentElement.isConstructor) {
- inInitializers = true;
- visitInitializers(node, null);
- inInitializers = false;
- }
- node.body.accept(this);
- currentElement = oldElement;
- }
-
- void visitFieldInitializer(
- SendSet node,
- FieldElement field,
- Node initializer,
- _) {
- initializer.accept(this);
- }
-
- void visitSuperConstructorInvoke(
- Send node,
- ConstructorElement superConstructor,
- InterfaceType type,
- NodeList arguments,
- CallStructure callStructure,
- _) {
- arguments.accept(this);
- }
-
- void visitThisConstructorInvoke(
- Send node,
- ConstructorElement thisConstructor,
- NodeList arguments,
- CallStructure callStructure,
- _) {
- arguments.accept(this);
- }
-
- void markUsed(LocalElement element, CaptureMode use) {
- if (currentElement == element.executableContext) {
- // If a local is assigned in the declaring context, and it is captured
- // at this point, mark it as used by reference (we assign to the value
- // after it's captured).
- if (use == CaptureMode.ByReference) {
- if (closureEnvironment.captured.containsKey(element)) {
- closureEnvironment.captured[element] = use;
- } else {
- locallyAssigned.add(element);
- }
- }
- } else {
- if (locallyAssigned.contains(element)) use = CaptureMode.ByReference;
- // If the element is used by reference, upgrade it unconditionally.
- if (use == CaptureMode.ByReference) {
- closureEnvironment.captured[element] = use;
- } else {
- // If it's used by value, only add it to `captured` if it's not
- // there already - if it's in there it can be by reference.
- closureEnvironment.captured.putIfAbsent(element, () => use);
- }
- ExecutableElement current = currentElement;
- // Mark all closures from the current to the one where `element` is
- // defined, as used in that closure. That makes sure we capture it in
- // all intermidiate closures, thus making it available in the current.
- while (current != element.executableContext) {
- ClosureInfo info = closureEnvironment.closures[current];
- info.markUsed(element);
- current = (current as Local).executableContext;
- }
- }
- }
-
- void markThisUsed() {
- assert(!inInitializers);
- ExecutableElement current = currentElement;
- while (current != element) {
- ClosureInfo info = closureEnvironment.closures[current];
- info.isThisFree = true;
- current = (current as Local).executableContext;
- }
- }
-
- void handleLocalGet(Send node, LocalElement element, _) {
- markUsed(element, CaptureMode.ByValue);
- }
-
- void handleLocalSet(
- SendSet node,
- LocalElement element,
- Node rhs,
- _) {
- markUsed(element, CaptureMode.ByReference);
- rhs.accept(this);
- }
-
- void handleLocalInvoke(
- Send node,
- LocalElement element,
- NodeList arguments,
- CallStructure callStructure,
- _) {
- markUsed(element, CaptureMode.ByValue);
- arguments.accept(this);
- }
-
- void visitThisPropertySet(Send node, Name name, Node rhs, _) {
- markThisUsed();
- super.visitThisPropertySet(node, name, rhs, null);
- }
-
- void visitLocalVariablePrefix(
- SendSet node,
- LocalVariableElement element,
- IncDecOperator operator,
- _) {
- markUsed(element, CaptureMode.ByReference);
- }
-
- void visitLocalVariablePostfix(
- SendSet node,
- LocalVariableElement element,
- IncDecOperator operator,
- _) {
- markUsed(element, CaptureMode.ByReference);
- }
-
- void visitThisPropertyInvoke(
- Send node,
- NodeList arguments,
- Selector selector,
- _) {
- markThisUsed();
- arguments.accept(this);
- }
-
- void visitThisPropertyGet(
- Send node,
- Name name,
- _) {
- markThisUsed();
- }
-
- void visitThisGet(Node node, _) {
- markThisUsed();
- }
-
- void visitIs(Send node, Node expression, DartType type, _) {
- // TODO(ajohnsen): Type is used ByValue.
- expression.accept(this);
- }
-
- void visitIsNot(Send node, Node expression, DartType type, _) {
- // TODO(ajohnsen): Type is used ByValue.
- expression.accept(this);
- }
-
- void visitAs(Send node, Node expression, DartType type, _) {
- // TODO(ajohnsen): Type is used ByValue.
- expression.accept(this);
- }
-
- void visitAssert(Assert node) {
- // TODO(ajohnsen): Only visit in checked mode.
- node.condition.accept(this);
- node.message?.accept(this);
- }
-
- void visitLocalVariableCompound(
- Send node,
- LocalVariableElement variable,
- AssignmentOperator operator,
- Node rhs,
- _) {
- markUsed(variable, CaptureMode.ByReference);
- super.visitLocalVariableCompound(node, variable, operator, rhs, null);
- }
-
- void internalError(Spannable spannable, String message) {
- throw new SpannableAssertionFailure(spannable, message);
- }
-
- void apply(Node node, [_]) {
- node.accept(this);
- }
-
- void visitThisInvoke(
- Send node,
- NodeList arguments,
- CallStructure callStructure,
- _) {
- markThisUsed();
- super.visitThisInvoke(node, arguments, callStructure, null);
- }
-
- void visitSuperFieldGet(
- Send node,
- FieldElement field,
- _) {
- markThisUsed();
- super.visitSuperFieldGet(node, field, null);
- }
-
- void visitSuperFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- _) {
- markThisUsed();
- super.visitSuperFieldSet(node, field, rhs, null);
- }
-
- void visitSuperFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- _) {
- markThisUsed();
- super.visitSuperFieldInvoke(node, field, arguments, callStructure, null);
- }
-
- void visitSuperMethodGet(
- Send node,
- MethodElement method,
- _) {
- markThisUsed();
- super.visitSuperMethodGet(node, method, null);
- }
-
- void visitSuperGetterGet(
- Send node,
- FunctionElement getter,
- _) {
- markThisUsed();
- super.visitSuperGetterGet(node, getter, null);
- }
-
- void visitSuperSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- _) {
- markThisUsed();
- super.visitSuperSetterSet(node, setter, rhs, null);
- }
-
- void visitSuperGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- _) {
- markThisUsed();
- super.visitSuperGetterInvoke(node, getter, arguments, callStructure, null);
- }
-
- void visitTypeVariableTypeLiteralGet(
- Send node,
- TypeVariableElement element,
- _) {
- // TODO(ajohnsen): Visit 'this' for type literal support, except for
- // closures in initializers.
- super.visitTypeVariableTypeLiteralGet(node, element, null);
- }
-
- void visitTypeVariableTypeLiteralInvoke(
- Send node,
- TypeVariableElement element,
- NodeList arguments,
- CallStructure callStructure,
- _) {
- // TODO(ajohnsen): Visit 'this' for type literal support, except for
- // closures in initializers.
- super.visitTypeVariableTypeLiteralInvoke(
- node, element, arguments, callStructure, null);
- }
-
- void visitSuperBinary(
- Send node,
- FunctionElement function,
- BinaryOperator operator,
- Node argument,
- _) {
- markThisUsed();
- super.visitSuperBinary(node, function, operator, argument, null);
- }
-
- void visitSuperIndex(
- Send node,
- FunctionElement function,
- Node index,
- _) {
- markThisUsed();
- super.visitSuperIndex(node, function, index, null);
- }
-
- void visitSuperIndexPostfix(
- SendSet node,
- FunctionElement getter,
- FunctionElement setter,
- Node index,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperIndexPostfix(node, getter, setter, index, operator, null);
- }
-
- void visitSuperNotEquals(
- Send node,
- FunctionElement function,
- Node argument,
- _) {
- markThisUsed();
- super.visitSuperNotEquals(node, function, argument, null);
- }
-
- void visitSuperEquals(
- Send node,
- FunctionElement function,
- Node argument,
- _) {
- markThisUsed();
- super.visitSuperEquals(node, function, argument, null);
- }
-
- void visitSuperUnary(
- Send node,
- UnaryOperator operator,
- FunctionElement function,
- _) {
- markThisUsed();
- super.visitSuperUnary(node, operator, function, null);
- }
-
- void visitSuperIndexSet(
- Send node,
- FunctionElement function,
- Node index,
- Node rhs,
- _) {
- markThisUsed();
- super.visitSuperIndexSet(node, function, index, rhs, null);
- }
-
- void visitThisPropertyCompound(
- Send node,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- _) {
- markThisUsed();
- super.visitThisPropertyCompound(
- node, name, operator, rhs, null);
- }
-
- void visitParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- _) {
- markUsed(parameter, CaptureMode.ByReference);
- super.visitParameterCompound(node, parameter, operator, rhs, null);
- }
-
- void visitSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- _) {
- markThisUsed();
- super.visitSuperFieldCompound(node, field, operator, rhs, null);
- }
-
- void visitSuperGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- _) {
- markThisUsed();
- super.visitSuperGetterSetterCompound(
- node, getter, setter, operator, rhs, null);
- }
-
- void visitSuperMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- _) {
- markThisUsed();
- super.visitSuperMethodSetterCompound(
- node, method, setter, operator, rhs, null);
- }
-
- void visitSuperFieldSetterCompound(
- Send node,
- FieldElement field,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- _) {
- markThisUsed();
- super.visitSuperFieldSetterCompound(
- node, field, setter, operator, rhs, null);
- }
-
- void visitSuperGetterFieldCompound(
- Send node,
- FunctionElement getter,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- _) {
- markThisUsed();
- super.visitSuperGetterFieldCompound(
- node, getter, field, operator, rhs, null);
- }
-
- void visitSuperCompoundIndexSet(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- _) {
- markThisUsed();
- super.visitSuperCompoundIndexSet(
- node, getter, setter, index, operator, rhs, null);
- }
-
- void visitParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- _) {
- markUsed(parameter, CaptureMode.ByReference);
- super.visitParameterPrefix(node, parameter, operator, null);
- }
-
- void visitThisPropertyPrefix(
- Send node,
- Name name,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitThisPropertyPrefix(
- node, name, operator, null);
- }
-
- void visitSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperFieldPrefix(node, field, operator, null);
- }
-
- void visitSuperFieldFieldPrefix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperFieldFieldPrefix(
- node, readField, writtenField, operator, null);
- }
-
- void visitSuperFieldSetterPrefix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperFieldSetterPrefix(node, field, setter, operator, null);
- }
-
- void visitSuperGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperGetterSetterPrefix(node, getter, setter, operator, null);
- }
-
- void visitSuperGetterFieldPrefix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperGetterFieldPrefix(node, getter, field, operator, null);
- }
-
- void visitSuperMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperMethodSetterPrefix(node, method, setter, operator, null);
- }
-
- void visitTypeVariableTypeLiteralPrefix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitTypeVariableTypeLiteralPrefix(node, element, operator, null);
- }
-
- void visitParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- _) {
- markUsed(parameter, CaptureMode.ByReference);
- super.visitParameterPostfix(node, parameter, operator, null);
- }
-
- void visitThisPropertyPostfix(
- Send node,
- Name name,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitThisPropertyPostfix(
- node, name, operator, null);
- }
-
- void visitSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperFieldPostfix(node, field, operator, null);
- }
-
- void visitSuperFieldFieldPostfix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperFieldFieldPostfix(
- node, readField, writtenField, operator, null);
- }
-
- void visitSuperFieldSetterPostfix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperFieldSetterPostfix(node, field, setter, operator, null);
- }
-
- void visitSuperGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperGetterSetterPostfix(node, getter, setter, operator, null);
- }
-
- void visitSuperGetterFieldPostfix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperGetterFieldPostfix(node, getter, field, operator, null);
- }
-
- void visitSuperMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperMethodSetterPostfix(node, method, setter, operator, null);
- }
-
- void visitTypeVariableTypeLiteralPostfix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitTypeVariableTypeLiteralPostfix(node, element, operator, null);
- }
-
- void visitSuperIndexPrefix(
- Send node,
- FunctionElement indexFunction,
- FunctionElement indexSetFunction,
- Node index,
- IncDecOperator operator,
- _) {
- markThisUsed();
- super.visitSuperIndexPrefix(
- node, indexFunction, indexSetFunction, index, operator, null);
- }
-
- @override
- void visitTypeAnnotation(TypeAnnotation node) {
- // This is to avoid the inherited implementation that visits children and
- // throws when encountering anything unresolved.
- }
-
- void handleImmutableLocalSet(
- SendSet node,
- LocalElement element,
- Node rhs,
- _) {
- apply(rhs);
- }
-
- void bulkHandleNode(Node node, String message, _) {
- }
-
- void applyInitializers(FunctionExpression initializers, _) {
- }
-
- void applyParameters(NodeList parameters, _) {
- }
-}
« no previous file with comments | « pkg/fletchc/lib/src/class_debug_info.dart ('k') | pkg/fletchc/lib/src/codegen_visitor.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698