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

Unified Diff: sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart

Issue 694353007: Move dart2js from sdk/lib/_internal/compiler to pkg/compiler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month 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: sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
deleted file mode 100644
index 60bf70fdc6c404500e619b743467f09c5efed378..0000000000000000000000000000000000000000
--- a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright (c) 2013, 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.
-
-part of js_backend;
-
-/**
- * Handles construction of TypeVariable constants needed at runtime.
- */
-class TypeVariableHandler {
- JavaScriptBackend backend;
- FunctionElement typeVariableConstructor;
- CompileTimeConstantEvaluator evaluator;
-
- /**
- * Contains all instantiated classes that have type variables and are needed
- * for reflection.
- */
- List<ClassElement> typeVariableClasses = new List<ClassElement>();
-
- /**
- * Maps a class element to a list with indices that point to type variables
- * constants for each of the class' type variables.
- */
- Map<ClassElement, List<int>> typeVariables =
- new Map<ClassElement, List<int>>();
-
- /**
- * Maps a TypeVariableType to the index pointing to the constant representing
- * the corresponding type variable at runtime.
- */
- Map<TypeVariableElement, int> typeVariableConstants =
- new Map<TypeVariableElement, int>();
-
- TypeVariableHandler(this.backend);
-
- ClassElement get typeVariableClass => backend.typeVariableClass;
- CodeEmitterTask get task => backend.emitter;
- MetadataEmitter get emitter => task.oldEmitter.metadataEmitter;
- Compiler get compiler => backend.compiler;
-
- void registerClassWithTypeVariables(ClassElement cls) {
- if (typeVariableClasses != null) {
- typeVariableClasses.add(cls);
- }
- }
-
- void processTypeVariablesOf(ClassElement cls) {
- //TODO(zarah): Running through all the members is suboptimal. Change this
- // as part of marking elements for reflection.
- bool hasMemberNeededForReflection(ClassElement cls) {
- bool result = false;
- cls.implementation.forEachMember((ClassElement cls, Element member) {
- result = result || backend.referencedFromMirrorSystem(member);
- });
- return result;
- }
-
- if (!backend.referencedFromMirrorSystem(cls) &&
- !hasMemberNeededForReflection(cls)) {
- return;
- }
-
- InterfaceType typeVariableType = typeVariableClass.thisType;
- List<int> constants = <int>[];
-
- for (TypeVariableType currentTypeVariable in cls.typeVariables) {
- TypeVariableElement typeVariableElement = currentTypeVariable.element;
-
- AstConstant wrapConstant(ConstantExpression constant) {
- return new AstConstant(typeVariableElement,
- typeVariableElement.node,
- constant);
- }
-
- ConstantExpression name = new PrimitiveConstantExpression(
- backend.constantSystem.createString(
- new DartString.literal(currentTypeVariable.name)));
- ConstantExpression bound = new PrimitiveConstantExpression(
- backend.constantSystem.createInt(
- emitter.reifyType(typeVariableElement.bound)));
- ConstantExpression type = backend.constants.createTypeConstant(cls);
- List<AstConstant> arguments =
- [wrapConstant(type), wrapConstant(name), wrapConstant(bound)];
-
- // TODO(johnniwinther): Support a less front-end specific creation of
- // constructed constants.
- AstConstant constant =
- CompileTimeConstantEvaluator.makeConstructedConstant(
- compiler,
- backend.constants,
- typeVariableElement,
- typeVariableElement.node,
- typeVariableType,
- typeVariableConstructor,
- new Selector.callConstructor('', null, 3),
- arguments,
- arguments);
- ConstantValue value = constant.value;
- backend.registerCompileTimeConstant(value, compiler.globalDependencies);
- backend.constants.addCompileTimeConstantForEmission(value);
- constants.add(
- reifyTypeVariableConstant(value, currentTypeVariable.element));
- }
- typeVariables[cls] = constants;
- }
-
- void onTreeShakingDisabled(Enqueuer enqueuer) {
- if (enqueuer.isResolutionQueue) {
- backend.enqueueClass(
- enqueuer, typeVariableClass, compiler.globalDependencies);
- typeVariableClass.ensureResolved(compiler);
- Link constructors = typeVariableClass.constructors;
- if (constructors.isEmpty && constructors.tail.isEmpty) {
- compiler.internalError(typeVariableClass,
- "Class '$typeVariableClass' should only have one constructor");
- }
- typeVariableConstructor = typeVariableClass.constructors.head;
- backend.enqueueInResolution(typeVariableConstructor,
- compiler.globalDependencies);
- enqueuer.registerInstantiatedType(typeVariableClass.rawType,
- compiler.globalDependencies);
- enqueuer.registerStaticUse(backend.getCreateRuntimeType());
- } else if (typeVariableClasses != null) {
- List<ClassElement> worklist = typeVariableClasses;
- typeVariableClasses = null;
- worklist.forEach((cls) => processTypeVariablesOf(cls));
- }
- }
-
- /**
- * Adds [c] to [emitter.globalMetadata] and returns the index pointing to
- * the entry.
- *
- * If the corresponding type variable has already been encountered an
- * entry in the list has already been reserved and the constant is added
- * there, otherwise a new entry for [c] is created.
- */
- int reifyTypeVariableConstant(ConstantValue c, TypeVariableElement variable) {
- String name = jsAst.prettyPrint(task.constantReference(c),
- compiler).getText();
- int index;
- if (typeVariableConstants.containsKey(variable)) {
- index = typeVariableConstants[variable];
- emitter.globalMetadata[index] = name;
- } else {
- index = emitter.addGlobalMetadata(name);
- typeVariableConstants[variable] = index;
- }
- return index;
- }
-
- /**
- * Returns the index pointing to the constant in [emitter.globalMetadata]
- * representing this type variable.
- *
- * If the constant has not yet been constructed, an entry is allocated in
- * the global metadata list and the index pointing to this entry is returned.
- * When the corresponding constant is constructed later,
- * [reifyTypeVariableConstant] will be called and the constant will be added
- * on the allocated entry.
- */
- int reifyTypeVariable(TypeVariableElement variable) {
- if (typeVariableConstants.containsKey(variable)) {
- return typeVariableConstants[variable];
- }
-
- // TODO(15613): Remove quotes.
- emitter.globalMetadata.add('"Placeholder for ${variable}"');
- return typeVariableConstants[variable] = emitter.globalMetadata.length - 1;
- }
-
- List<int> typeVariablesOf(ClassElement classElement) {
- List<int> result = typeVariables[classElement];
- if (result == null) {
- result = const <int>[];
- }
- return result;
- }
-}

Powered by Google App Engine
This is Rietveld 408576698