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

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

Issue 2679913006: Add KernelNativeBehaviorComputer (Closed)
Patch Set: Rebased Created 3 years, 10 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/compiler/lib/src/kernel/elements.dart ('k') | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/kernel/world_builder.dart
diff --git a/pkg/compiler/lib/src/kernel/world_builder.dart b/pkg/compiler/lib/src/kernel/world_builder.dart
index b0629580963b52e7640e9159d8ffc3fa81955288..7f1f2ab749a0cbd2f6e60651ba394cb750fe0130 100644
--- a/pkg/compiler/lib/src/kernel/world_builder.dart
+++ b/pkg/compiler/lib/src/kernel/world_builder.dart
@@ -5,11 +5,20 @@
import 'package:kernel/ast.dart' as ir;
import '../common.dart';
+import '../common/backend_api.dart';
import '../common/names.dart';
+import '../compile_time_constants.dart';
+import '../constants/constant_system.dart';
+import '../constants/constructors.dart';
+import '../constants/evaluation.dart';
+import '../constants/expressions.dart';
+import '../constants/values.dart';
import '../core_types.dart';
import '../elements/elements.dart';
import '../elements/entities.dart';
import '../elements/types.dart';
+import '../js_backend/backend_helpers.dart';
+import '../js_backend/constant_system_javascript.dart';
import '../native/native.dart' as native;
import 'element_adapter.dart';
import 'elements.dart';
@@ -19,8 +28,9 @@ import 'elements.dart';
// TODO(johnniwinther): Implement [ResolutionWorldBuilder].
class KernelWorldBuilder extends KernelElementAdapterMixin {
CommonElements _commonElements;
+ native.BehaviorBuilder _nativeBehaviorBuilder;
final DiagnosticReporter reporter;
-
+ ElementEnvironment _elementEnvironment;
DartTypeConverter _typeConverter;
/// Library environment. Used for fast lookup.
@@ -38,7 +48,14 @@ class KernelWorldBuilder extends KernelElementAdapterMixin {
Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{};
Map<ir.TypeParameter, KTypeVariable> _typeVariableMap =
<ir.TypeParameter, KTypeVariable>{};
+
Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{};
+ // TODO(johnniwinther): Change this to a list of 'KConstructorData' class
+ // holding the [ConstantConstructor] if we need more data for constructors.
+ List<ir.Member> _constructorList = <ir.Member>[];
+ Map<KConstructor, ConstantConstructor> _constructorConstantMap =
+ <KConstructor, ConstantConstructor>{};
+
Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{};
Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{};
Map<ir.TreeNode, KLocalFunction> _localFunctionMap =
@@ -46,13 +63,22 @@ class KernelWorldBuilder extends KernelElementAdapterMixin {
KernelWorldBuilder(this.reporter, ir.Program program)
: _env = new KEnv(program) {
- _commonElements =
- new KernelCommonElements(new KernelElementEnvironment(this));
+ _elementEnvironment = new KernelElementEnvironment(this);
+ _commonElements = new KernelCommonElements(_elementEnvironment);
+ BackendHelpers helpers =
+ new BackendHelpers(_elementEnvironment, null, _commonElements);
+ ConstantEnvironment constants = new KernelConstantEnvironment(this);
+ _nativeBehaviorBuilder =
+ new KernelBehaviorBuilder(_commonElements, helpers, constants);
_typeConverter = new DartTypeConverter(this);
}
CommonElements get commonElements => _commonElements;
+ ElementEnvironment get elementEnvironment => _elementEnvironment;
+
+ native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder;
+
LibraryEntity lookupLibrary(Uri uri) {
KLibraryEnv libraryEnv = _env.lookupLibrary(uri);
return _getLibrary(libraryEnv.library, libraryEnv);
@@ -139,13 +165,17 @@ class KernelWorldBuilder extends KernelElementAdapterMixin {
KConstructor _getConstructor(ir.Member node) {
return _constructorMap.putIfAbsent(node, () {
+ int constructorIndex = _constructorList.length;
+ KConstructor constructor;
if (node is ir.Constructor) {
- return new KGenerativeConstructor(
+ constructor = new KGenerativeConstructor(constructorIndex,
_getClass(node.enclosingClass), getName(node.name));
} else {
- return new KFactoryConstructor(
+ constructor = new KFactoryConstructor(constructorIndex,
_getClass(node.enclosingClass), getName(node.name));
}
+ _constructorList.add(node);
+ return constructor;
});
}
@@ -232,13 +262,21 @@ class KernelWorldBuilder extends KernelElementAdapterMixin {
return list;
}
- @override
- InterfaceType getThisType(ClassEntity cls) {
- throw new UnimplementedError('KernelWorldBuilder.getThisType');
+ InterfaceType _getThisType(KClass cls) {
+ KClassEnv env = _classEnvs[cls.classIndex];
+ ir.Class node = env.cls;
+ // TODO(johnniwinther): Add the type argument to the list literal when we
+ // no longer use resolution types.
+ return new InterfaceType(
+ cls,
+ new List/*<DartType>*/ .generate(node.typeParameters.length,
+ (int index) {
+ return new TypeVariableType(
+ _getTypeVariable(node.typeParameters[index]));
+ }));
}
- @override
- InterfaceType getRawType(KClass cls) {
+ InterfaceType _getRawType(KClass cls) {
KClassEnv env = _classEnvs[cls.classIndex];
ir.Class node = env.cls;
// TODO(johnniwinther): Add the type argument to the list literal when we
@@ -250,21 +288,27 @@ class KernelWorldBuilder extends KernelElementAdapterMixin {
}
@override
- native.NativeBehavior getNativeBehaviorForMethod(ir.Procedure procedure) {
- throw new UnimplementedError(
- 'KernelWorldBuilder.getNativeBehaviorForMethod');
- }
-
- @override
- native.NativeBehavior getNativeBehaviorForFieldStore(ir.Field field) {
- throw new UnimplementedError(
- 'KernelWorldBuilder.getNativeBehaviorForFieldStore');
- }
-
- @override
- native.NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field) {
- throw new UnimplementedError(
- 'KernelWorldBuilder.getNativeBehaviorForFieldLoad');
+ FunctionType getFunctionType(ir.FunctionNode node) {
+ DartType returnType = getDartType(node.returnType);
+ List<DartType> parameterTypes = /*<DartType>*/ [];
+ List<DartType> optionalParameterTypes = /*<DartType>*/ [];
+ for (ir.VariableDeclaration variable in node.positionalParameters) {
+ if (parameterTypes.length == node.requiredParameterCount) {
+ optionalParameterTypes.add(getDartType(variable.type));
+ } else {
+ parameterTypes.add(getDartType(variable.type));
+ }
+ }
+ List<String> namedParameters = <String>[];
+ List<DartType> namedParameterTypes = /*<DartType>*/ [];
+ List<ir.VariableDeclaration> sortedNamedParameters =
+ node.namedParameters.toList()..sort((a, b) => a.name.compareTo(b.name));
+ for (ir.VariableDeclaration variable in sortedNamedParameters) {
+ namedParameters.add(variable.name);
+ namedParameterTypes.add(getDartType(variable.type));
+ }
+ return new FunctionType(returnType, parameterTypes, optionalParameterTypes,
+ namedParameters, namedParameterTypes);
}
LibraryEntity getLibrary(ir.Library node) => _getLibrary(node);
@@ -302,6 +346,17 @@ class KernelWorldBuilder extends KernelElementAdapterMixin {
@override
FunctionEntity getConstructor(ir.Member node) => _getConstructor(node);
+
+ ConstantConstructor _getConstructorConstant(KConstructor constructor) {
+ return _constructorConstantMap.putIfAbsent(constructor, () {
+ ir.Member node = _constructorList[constructor.constructorIndex];
+ if (node is ir.Constructor && node.isConst) {
+ return new Constantifier(this).computeConstantConstructor(node);
+ }
+ throw new SpannableAssertionFailure(constructor,
+ "Unexpected constructor $constructor in KernelWorldBuilder._getConstructorConstant");
+ });
+ }
}
/// Environment for fast lookup of program libraries.
@@ -388,11 +443,13 @@ class KClassEnv {
/// Return the [ir.Member] for the member [name] in [library].
ir.Member lookupMember(String name, {bool setter: false}) {
+ _ensureMaps();
return _memberMap[name];
}
/// Return the [ir.Member] for the member [name] in [library].
ir.Member lookupConstructor(String name, {bool setter: false}) {
+ _ensureMaps();
return _constructorMap[name];
}
}
@@ -404,12 +461,12 @@ class KernelElementEnvironment implements ElementEnvironment {
@override
InterfaceType getThisType(ClassEntity cls) {
- return worldBuilder.getThisType(cls);
+ return worldBuilder._getThisType(cls);
}
@override
InterfaceType getRawType(ClassEntity cls) {
- return worldBuilder.getRawType(cls);
+ return worldBuilder._getRawType(cls);
}
@override
@@ -585,6 +642,109 @@ class DartTypeConverter extends ir.DartTypeVisitor<DartType> {
}
}
+/// [native.BehaviorBuilder] for kernel based elements.
+class KernelBehaviorBuilder extends native.BehaviorBuilder {
+ final CommonElements commonElements;
+ final BackendHelpers helpers;
+ final ConstantEnvironment constants;
+
+ KernelBehaviorBuilder(this.commonElements, this.helpers, this.constants);
+
+ @override
+ bool get trustJSInteropTypeAnnotations {
+ throw new UnimplementedError(
+ "KernelNativeBehaviorComputer.trustJSInteropTypeAnnotations");
+ }
+
+ @override
+ DiagnosticReporter get reporter {
+ throw new UnimplementedError("KernelNativeBehaviorComputer.reporter");
+ }
+
+ @override
+ BackendClasses get backendClasses {
+ throw new UnimplementedError("KernelNativeBehaviorComputer.backendClasses");
+ }
+}
+
+/// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using
+/// [_EvaluationEnvironment] for the evaluation.
+class KernelConstantEnvironment implements ConstantEnvironment {
+ KernelWorldBuilder _worldBuilder;
+ Map<ConstantExpression, ConstantValue> _valueMap =
+ <ConstantExpression, ConstantValue>{};
+
+ KernelConstantEnvironment(this._worldBuilder);
+
+ @override
+ ConstantSystem get constantSystem => const JavaScriptConstantSystem();
+
+ @override
+ ConstantValue getConstantValueForVariable(VariableElement element) {
+ throw new UnimplementedError(
+ "KernelConstantEnvironment.getConstantValueForVariable");
+ }
+
+ @override
+ ConstantValue getConstantValue(ConstantExpression expression) {
+ return _valueMap.putIfAbsent(expression, () {
+ return expression.evaluate(
+ new _EvaluationEnvironment(_worldBuilder), constantSystem);
+ });
+ }
+
+ @override
+ bool hasConstantValue(ConstantExpression expression) {
+ throw new UnimplementedError("KernelConstantEnvironment.hasConstantValue");
+ }
+}
+
+/// Evaluation environment used for computing [ConstantValue]s for
+/// kernel based [ConstantExpression]s.
+class _EvaluationEnvironment implements Environment {
+ final KernelWorldBuilder _worldBuilder;
+
+ _EvaluationEnvironment(this._worldBuilder);
+
+ @override
+ CommonElements get commonElements {
+ throw new UnimplementedError("_EvaluationEnvironment.commonElements");
+ }
+
+ @override
+ BackendClasses get backendClasses {
+ throw new UnimplementedError("_EvaluationEnvironment.backendClasses");
+ }
+
+ @override
+ InterfaceType substByContext(InterfaceType base, InterfaceType target) {
+ if (base.typeArguments.isNotEmpty) {
+ throw new UnimplementedError("_EvaluationEnvironment.substByContext");
+ }
+ return base;
+ }
+
+ @override
+ ConstantConstructor getConstructorConstant(ConstructorEntity constructor) {
+ return _worldBuilder._getConstructorConstant(constructor);
+ }
+
+ @override
+ ConstantExpression getFieldConstant(FieldEntity field) {
+ throw new UnimplementedError("_EvaluationEnvironment.getFieldConstant");
+ }
+
+ @override
+ ConstantExpression getLocalConstant(Local local) {
+ throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant");
+ }
+
+ @override
+ String readFromEnvironment(String name) {
+ throw new UnimplementedError("_EvaluationEnvironment.readFromEnvironment");
+ }
+}
+
// Interface for testing equivalence of Kernel-based entities.
class WorldDeconstructionForTesting {
final KernelWorldBuilder builder;
« no previous file with comments | « pkg/compiler/lib/src/kernel/elements.dart ('k') | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698