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

Unified Diff: pkg/compiler/lib/src/js_backend/backend_impact.dart

Issue 1397043002: Introduce BackendImpact to separate enqueueing from data. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 2 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/js_backend/backend_impact.dart
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
new file mode 100644
index 0000000000000000000000000000000000000000..90dba81a60a36c13749ea139a811677cca40f1d9
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -0,0 +1,289 @@
+// Copyright (c) 2015, 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.
+
+library dart2js.js_helpers.impact;
+
+import '../common/names.dart' show
+ Identifiers;
+import '../compiler.dart' show
+ Compiler;
+import '../dart_types.dart' show
+ InterfaceType;
+import '../elements/elements.dart' show
+ ClassElement,
+ Element;
+
+import 'backend_helpers.dart';
+import 'constant_system_javascript.dart';
+import 'js_backend.dart';
+
+/// A set of JavaScript backend dependencies.
+class BackendImpact {
+ final List<Element> staticUses;
+ final List<InterfaceType> instantiatedTypes;
+ final List<ClassElement> instantiatedClasses;
+ final List<BackendImpact> otherImpacts;
+
+ BackendImpact({this.staticUses: const <Element>[],
+ this.instantiatedTypes: const <InterfaceType>[],
+ this.instantiatedClasses: const <ClassElement>[],
+ this.otherImpacts: const <BackendImpact>[]});
+}
+
+/// The JavaScript backend dependencies for various features.
+class BackendImpacts {
+ final Compiler compiler;
+
+ BackendImpacts(this.compiler);
+
+ JavaScriptBackend get backend => compiler.backend;
+
+ BackendHelpers get helpers => backend.helpers;
+
+ BackendImpact get getRuntimeTypeArgument => new BackendImpact(
+ staticUses: [
+ helpers.getRuntimeTypeArgument,
+ helpers.getTypeArgumentByIndex,
+ helpers.copyTypeArguments]);
+
+ BackendImpact get computeSignature => new BackendImpact(
+ staticUses: [
+ helpers.setRuntimeTypeInfo,
+ helpers.getRuntimeTypeInfo,
+ helpers.computeSignature,
+ helpers.getRuntimeTypeArguments],
+ instantiatedClasses: [
+ compiler.listClass]);
+
+ BackendImpact get asyncBody => new BackendImpact(
+ staticUses: [
+ helpers.asyncHelper,
+ helpers.syncCompleterConstructor,
+ helpers.streamIteratorConstructor,
+ helpers.wrapBody]);
+
+ BackendImpact get syncStarBody => new BackendImpact(
+ staticUses: [
+ helpers.syncStarIterableConstructor,
+ helpers.endOfIteration,
+ helpers.yieldStar,
+ helpers.syncStarUncaughtError],
+ instantiatedClasses: [
+ helpers.syncStarIterable]);
+
+ BackendImpact get asyncStarBody => new BackendImpact(
+ staticUses: [
+ helpers.asyncStarHelper,
+ helpers.streamOfController,
+ helpers.yieldSingle,
+ helpers.yieldStar,
+ helpers.asyncStarControllerConstructor,
+ helpers.streamIteratorConstructor,
+ helpers.wrapBody],
+ instantiatedClasses: [
+ helpers.asyncStarController]);
+
+ BackendImpact get typeVariableBoundCheck => new BackendImpact(
+ staticUses: [
+ helpers.throwTypeError,
+ helpers.assertIsSubtype]);
+
+ BackendImpact get abstractClassInstantiation => new BackendImpact(
+ staticUses: [
+ helpers.throwAbstractClassInstantiationError],
+ otherImpacts: [
+ needsString('Needed to encode the message.')]);
+
+ BackendImpact get fallThroughError => new BackendImpact(
+ staticUses: [
+ helpers.fallThroughError]);
+
+ BackendImpact get asCheck => new BackendImpact(
+ staticUses: [
+ helpers.throwRuntimeError]);
+
+ BackendImpact get throwNoSuchMethod => new BackendImpact(
+ staticUses: [
+ helpers.throwNoSuchMethod],
+ otherImpacts: [
+ // Also register the types of the arguments passed to this method.
+ needsList(
+ 'Needed to encode the arguments for throw NoSuchMethodError.'),
+ needsString(
+ 'Needed to encode the name for throw NoSuchMethodError.')]);
+
+ BackendImpact get throwRuntimeError => new BackendImpact(
+ staticUses: [
+ helpers.throwRuntimeError],
+ // Also register the types of the arguments passed to this method.
+ instantiatedClasses: [
+ helpers.compiler.stringClass]);
+
+ BackendImpact get superNoSuchMethod => new BackendImpact(
+ staticUses: [
+ helpers.createInvocationMirror,
+ helpers.compiler.objectClass.lookupLocalMember(
+ Identifiers.noSuchMethod_)],
+ otherImpacts: [
+ needsInt(
+ 'Needed to encode the invocation kind of super.noSuchMethod.'),
+ needsList(
+ 'Needed to encode the arguments of super.noSuchMethod.'),
+ needsString(
+ 'Needed to encode the name of super.noSuchMethod.')]);
+
+ BackendImpact get constantMapLiteral {
+
+ ClassElement find(String name) {
+ return helpers.find(backend.jsHelperLibrary, name);
+ }
+
+ return new BackendImpact(
+ instantiatedClasses: [
+ find(JavaScriptMapConstant.DART_CLASS),
+ find(JavaScriptMapConstant.DART_PROTO_CLASS),
+ find(JavaScriptMapConstant.DART_STRING_CLASS),
+ find(JavaScriptMapConstant.DART_GENERAL_CLASS)]);
+ }
+
+ BackendImpact get symbolConstructor => new BackendImpact(
+ staticUses: [
+ helpers.compiler.symbolValidatedConstructor]);
+
+
+ BackendImpact get incDecOperation =>
+ needsInt('Needed for the `+ 1` or `- 1` operation of ++/--.');
+
+ /// Helper for registering that `int` is needed.
+ BackendImpact needsInt(String reason) {
+ // TODO(johnniwinther): Register [reason] for use in dump-info.
+ return new BackendImpact(
+ instantiatedClasses: [helpers.compiler.intClass]);
+ }
+
+ /// Helper for registering that `List` is needed.
+ BackendImpact needsList(String reason) {
+ // TODO(johnniwinther): Register [reason] for use in dump-info.
+ return new BackendImpact(
+ instantiatedClasses: [helpers.compiler.listClass]);
+ }
+
+ /// Helper for registering that `String` is needed.
+ BackendImpact needsString(String reason) {
+ // TODO(johnniwinther): Register [reason] for use in dump-info.
+ return new BackendImpact(
+ instantiatedClasses: [
+ helpers.compiler.stringClass]);
+ }
+
+ BackendImpact get assertWithoutMessage => new BackendImpact(
+ staticUses: [
+ helpers.assertHelper]);
+
+ BackendImpact get assertWithMessage => new BackendImpact(
+ staticUses: [
+ helpers.assertTest,
+ helpers.assertThrow]);
+
+ BackendImpact get asyncForIn => new BackendImpact(
+ staticUses: [
+ helpers.streamIteratorConstructor]);
+
+ BackendImpact get stringInterpolation => new BackendImpact(
+ staticUses: [
+ helpers.stringInterpolationHelper]);
+
+ BackendImpact get catchStatement => new BackendImpact(
+ staticUses: [
+ helpers.exceptionUnwrapper],
+ instantiatedClasses: [
+ backend.jsPlainJavaScriptObjectClass,
+ backend.jsUnknownJavaScriptObjectClass]);
+
+ BackendImpact get throwExpression => new BackendImpact(
+ // We don't know ahead of time whether we will need the throw in a
+ // statement context or an expression context, so we register both
+ // here, even though we may not need the throwExpression helper.
+ staticUses: [
+ helpers.wrapExceptionHelper,
+ helpers.throwExpressionHelper]);
+
+ BackendImpact get lazyField => new BackendImpact(
+ staticUses: [
+ helpers.cyclicThrowHelper]);
+
+ BackendImpact get typeLiteral => new BackendImpact(
+ instantiatedClasses: [
+ backend.typeImplementation],
+ staticUses: [
+ helpers.createRuntimeType]);
+
+ BackendImpact get stackTraceInCatch => new BackendImpact(
+ staticUses: [
+ helpers.traceFromException]);
+
+ BackendImpact get syncForIn => new BackendImpact(
+ // The SSA builder recognizes certain for-in loops and can generate calls
+ // to throwConcurrentModificationError.
+ staticUses: [
+ helpers.checkConcurrentModificationError]);
+
+ BackendImpact get typeVariableExpression => new BackendImpact(
+ staticUses: [
+ helpers.setRuntimeTypeInfo,
+ helpers.getRuntimeTypeInfo,
+ helpers.runtimeTypeToString,
+ helpers.createRuntimeType],
+ instantiatedClasses: [
+ helpers.compiler.listClass],
+ otherImpacts: [
+ getRuntimeTypeArgument,
+ needsInt('Needed for accessing a type variable literal on this.')]);
+
+ BackendImpact get typeCheck => new BackendImpact(
+ instantiatedClasses: [
+ helpers.compiler.boolClass]);
+
+ BackendImpact get checkedModeTypeCheck => new BackendImpact(
+ staticUses: [
+ helpers.throwRuntimeError]);
+
+ BackendImpact get malformedTypeCheck => new BackendImpact(
+ staticUses: [
+ helpers.throwTypeError]);
+
+ BackendImpact get genericTypeCheck => new BackendImpact(
+ staticUses: [
+ helpers.checkSubtype,
+ // TODO(johnniwinther): Investigate why this is needed.
+ helpers.setRuntimeTypeInfo,
+ helpers.getRuntimeTypeInfo],
+ instantiatedClasses: [
+ helpers.compiler.listClass],
+ otherImpacts: [
+ getRuntimeTypeArgument]);
+
+ BackendImpact get genericCheckedModeTypeCheck => new BackendImpact(
+ staticUses: [
+ helpers.assertSubtype]);
+
+ BackendImpact get typeVariableTypeCheck => new BackendImpact(
+ staticUses: [
+ helpers.checkSubtypeOfRuntimeType]);
+
+ BackendImpact get typeVariableCheckedModeTypeCheck => new BackendImpact(
+ staticUses: [
+ helpers.assertSubtypeOfRuntimeType]);
+
+ BackendImpact get functionTypeCheck => new BackendImpact(
+ staticUses: [
+ helpers.functionTypeTestMetaHelper]);
+
+ BackendImpact get nativeTypeCheck => new BackendImpact(
+ staticUses: [
+ // We will neeed to add the "$is" and "$as" properties on the
+ // JavaScript object prototype, so we make sure
+ // [:defineProperty:] is compiled.
+ helpers.defineProperty]);
+}
« no previous file with comments | « pkg/compiler/lib/src/js_backend/backend_helpers.dart ('k') | pkg/compiler/lib/src/js_backend/codegen/glue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698