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

Unified Diff: pkg/compiler/lib/src/ssa/builder_kernel.dart

Issue 2904493002: Use KernelToElementMap (more) directly in KernelSsaBuilder (Closed)
Patch Set: Created 3 years, 7 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/ssa/builder_kernel.dart
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 042e32f67466eab8d174e6e8f028ca35876cb16e..e21a5e0ee6a4489a2a9eb862d26193212bc9f614 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -8,6 +8,7 @@ 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
@@ -18,9 +19,11 @@ import '../constants/values.dart'
import '../elements/elements.dart';
import '../elements/entities.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/element_map.dart';
import '../native/native.dart' as native;
import '../resolution/tree_elements.dart';
import '../tree/nodes.dart' show Node;
@@ -80,7 +83,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
TreeElements get elements => astAdapter.elements;
SourceInformationBuilder sourceInformationBuilder;
- KernelAstAdapter astAdapter;
+ KernelToElementMap _elementMap;
LoopHandler<ir.Node> loopHandler;
TypeBuilder typeBuilder;
@@ -94,7 +97,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
KernelSsaBuilder(
this.targetElement,
this.compiler,
- this.astAdapter,
+ this._elementMap,
this.closedWorld,
this.registry,
// TODO(het): Should sourceInformationBuilder be in GraphBuilder?
@@ -114,6 +117,11 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
_targetStack.add(target);
}
+ @deprecated // Use [_elementMap] instead.
+ KernelAstAdapter get astAdapter => _elementMap;
+
+ CommonElements get _commonElements => _elementMap.commonElements;
+
HGraph build() {
// TODO(het): no reason to do this here...
HInstruction.idCounter = 0;
@@ -183,7 +191,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
enclosing.typeParameters.forEach((ir.TypeParameter typeParameter) {
var typeParamElement = astAdapter.getElement(typeParameter);
HInstruction param;
- needParameters ??= rtiNeed.classNeedsRti(astAdapter.getClass(enclosing));
+ needParameters ??= rtiNeed.classNeedsRti(_elementMap.getClass(enclosing));
if (needParameters) {
param = addParameter(typeParamElement, commonMasks.nonNullType);
} else {
@@ -192,9 +200,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
}
// This is a little bit wacky (and n^2) until we make the localsHandler
// take Kernel DartTypes instead of just the AST DartTypes.
- var typeVariableType = astAdapter
- .getClass(enclosing)
- .typeVariables
+ ClassElement cls = _elementMap.getClass(enclosing);
+ ResolutionTypeVariableType typeVariableType = cls.typeVariables
.firstWhere(
(ResolutionTypeVariableType i) => i.name == typeParameter.name);
localsHandler.directLocals[
@@ -248,7 +255,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
final constructorArguments = <HInstruction>[];
// Doing this instead of fieldValues.forEach because we haven't defined the
// order of the arguments here. We can define that with JElements.
- astAdapter.getClass(constructedClass).forEachInstanceField(
+ ClassElement cls = _elementMap.getClass(constructedClass);
+ cls.forEachInstanceField(
(ClassElement enclosingClass, FieldElement member) {
var value = fieldValues[astAdapter.getFieldFromElement(member)];
assert(value != null,
@@ -258,7 +266,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// Create the runtime type information, if needed.
bool hasRtiInput = backend.rtiNeed
- .classNeedsRtiField(astAdapter.getClass(constructedClass));
+ .classNeedsRtiField(_elementMap.getClass(constructedClass));
if (hasRtiInput) {
// Read the values of the type arguments and create a HTypeInfoExpression
// to set on the newly create object.
@@ -266,28 +274,28 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
for (ir.DartType typeParameter
in constructedClass.thisType.typeArguments) {
HInstruction argument = localsHandler.readLocal(localsHandler
- .getTypeVariableAsLocal(astAdapter.getDartType(typeParameter)
+ .getTypeVariableAsLocal(_elementMap.getDartType(typeParameter)
as ResolutionTypeVariableType));
typeArguments.add(argument);
}
+ ClassElement cls = _elementMap.getClass(constructedClass);
HInstruction typeInfo = new HTypeInfoExpression(
TypeInfoExpressionKind.INSTANCE,
- astAdapter.getClass(constructedClass).thisType,
+ cls.thisType,
typeArguments,
commonMasks.dynamicType);
add(typeInfo);
constructorArguments.add(typeInfo);
}
+ ClassElement constructedCls = _elementMap.getClass(constructedClass);
HInstruction newObject = new HCreate(
- astAdapter.getClass(constructedClass),
+ _elementMap.getClass(constructedClass),
constructorArguments,
new TypeMask.nonNullExact(
- astAdapter.getClass(constructedClass), closedWorld),
- instantiatedTypes: <ResolutionInterfaceType>[
- astAdapter.getClass(constructedClass).thisType
- ],
+ _elementMap.getClass(constructedClass), closedWorld),
+ instantiatedTypes: <ResolutionInterfaceType>[constructedCls.thisType],
hasRtiInput: hasRtiInput);
add(newObject);
@@ -327,10 +335,10 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// Pass type arguments.
ir.Class currentClass = body.enclosingClass;
- if (backend.rtiNeed.classNeedsRti(astAdapter.getClass(currentClass))) {
+ if (backend.rtiNeed.classNeedsRti(_elementMap.getClass(currentClass))) {
for (ir.DartType typeParameter in currentClass.thisType.typeArguments) {
HInstruction argument = localsHandler.readLocal(localsHandler
- .getTypeVariableAsLocal(astAdapter.getDartType(typeParameter)
+ .getTypeVariableAsLocal(_elementMap.getDartType(typeParameter)
as ResolutionTypeVariableType));
bodyCallInputs.add(argument);
}
@@ -360,7 +368,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
}
withCurrentIrNode(ir.Node node, f()) {
- astAdapter.reporter.withCurrentElement(astAdapter.getElement(node), f);
+ reporter.withCurrentElement(astAdapter.getElement(node), f);
}
/// Sets context for generating code that is the result of inlining
@@ -436,7 +444,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
if (!foundSuperOrRedirectCall) {
assert(
- constructor.enclosingClass == astAdapter.objectClass,
+ _elementMap.getClass(constructor.enclosingClass) ==
+ _elementMap.commonElements.objectClass,
'All constructors should have super- or redirecting- initializers,'
' except Object()');
}
@@ -613,7 +622,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
parent.kind == ir.ProcedureKind.Operator &&
parent.name.name == '==') {
if (!backend
- .operatorEqHandlesNullArgument(astAdapter.getMethod(parent))) {
+ .operatorEqHandlesNullArgument(_elementMap.getMethod(parent))) {
handleIf(
visitCondition: () {
HParameterValue parameter = parameters.values.first;
@@ -730,8 +739,10 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
var prefixElement = astAdapter.getElement(checkLoad.import);
HInstruction uriConstant = graph.addConstantString(
prefixElement.deferredImport.uri.toString(), closedWorld);
- _pushStaticInvocation(astAdapter.checkDeferredIsLoaded,
- [prefixConstant, uriConstant], astAdapter.checkDeferredIsLoadedType);
+ _pushStaticInvocation(
+ _commonElements.checkDeferredIsLoaded,
+ [prefixConstant, uriConstant],
+ astAdapter.getReturnTypeOf(_commonElements.checkDeferredIsLoaded));
}
@override
@@ -792,7 +803,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
/// either dynamic, Object, or Future.
///
/// We do not accept the internal Future implementation class.
- bool isValidAsyncReturnType(ir.DartType type) {
+ bool isValidAsyncReturnType(DartType type) {
// TODO(sigurdm): In an internal library a function could be declared:
//
// _FutureImpl foo async => 1;
@@ -800,9 +811,9 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// This should be valid (because the actual value returned from an async
// function is a `_FutureImpl`), but currently false is returned in this
// case.
- return type is ir.DynamicType ||
- type == astAdapter.objectClass.thisType ||
- (type is ir.InterfaceType && type == astAdapter.futureClass.thisType);
+ return type.isDynamic ||
+ type == _commonElements.objectType ||
+ (type is InterfaceType && type.element == _commonElements.futureClass);
}
@override
@@ -814,19 +825,19 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
assert(_targetFunction != null && _targetFunction is ir.FunctionNode);
returnStatement.expression.accept(this);
value = pop();
+ DartType returnType = astAdapter.getFunctionReturnType(_targetFunction);
if (_targetFunction.asyncMarker == ir.AsyncMarker.Async) {
if (options.enableTypeAssertions &&
- !isValidAsyncReturnType(_targetFunction.returnType)) {
+ !isValidAsyncReturnType(returnType)) {
generateTypeError(
returnStatement,
"Async function returned a Future,"
- " was declared to return a ${_targetFunction.returnType}.");
+ " was declared to return a ${returnType}.");
pop();
return;
}
} else {
- value = typeBuilder.potentiallyCheckOrTrustType(
- value, astAdapter.getFunctionReturnType(_targetFunction));
+ value = typeBuilder.potentiallyCheckOrTrustType(value, returnType);
}
}
// TODO(het): Add source information
@@ -922,9 +933,10 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
HInstruction length = buildGetLength();
push(new HIdentity(length, originalLength, null, commonMasks.boolType));
_pushStaticInvocation(
- astAdapter.checkConcurrentModificationError,
+ _commonElements.checkConcurrentModificationError,
[pop(), array],
- astAdapter.checkConcurrentModificationErrorReturnType);
+ astAdapter.getReturnTypeOf(
+ _commonElements.checkConcurrentModificationError));
pop();
}
@@ -1044,9 +1056,9 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
forInStatement.iterable.accept(this);
_pushStaticInvocation(
- astAdapter.streamIteratorConstructor,
+ _commonElements.streamIteratorConstructor,
[pop(), graph.addConstantNull(closedWorld)],
- astAdapter.streamIteratorConstructorType);
+ astAdapter.getReturnTypeOf(_commonElements.streamIteratorConstructor));
streamIterator = pop();
void buildInitializer() {}
@@ -1056,7 +1068,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
_pushDynamicInvocation(forInStatement, mask, [streamIterator],
selector: Selectors.moveNext);
HInstruction future = pop();
- push(new HAwait(future, astAdapter.makeSubtypeOfObject(closedWorld)));
+ push(new HAwait(future, closedWorld.commonMasks.dynamicType));
return popBoolified();
}
@@ -1080,7 +1092,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void finalizerFunction() {
_pushDynamicInvocation(forInStatement, null, [streamIterator],
selector: Selectors.cancel);
- add(new HAwait(pop(), astAdapter.makeSubtypeOfObject(closedWorld)));
+ add(new HAwait(pop(), closedWorld.commonMasks.dynamicType));
}
tryBuilder
@@ -1092,7 +1104,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
HInstruction callSetRuntimeTypeInfo(
HInstruction typeInfo, HInstruction newObject) {
// Set the runtime type information on the object.
- ir.Procedure typeInfoSetterFn = astAdapter.setRuntimeTypeInfo;
+ FunctionEntity typeInfoSetterFn = _commonElements.setRuntimeTypeInfo;
// TODO(efortuna): Insert source information in this static invocation.
_pushStaticInvocation(typeInfoSetterFn, <HInstruction>[newObject, typeInfo],
commonMasks.dynamicType);
@@ -1291,7 +1303,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
return;
}
- ResolutionDartType type = astAdapter.getDartType(asExpression.type);
+ ResolutionDartType type = _elementMap.getDartType(asExpression.type);
if (type.isMalformed) {
if (type is MalformedType) {
ErroneousElement element = type.element;
@@ -1312,16 +1324,16 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
}
}
- void generateError(
- ir.Node node, ir.Procedure procedure, String message, TypeMask typeMask) {
+ void generateError(ir.Node node, FunctionEntity function, String message,
+ TypeMask typeMask) {
HInstruction errorMessage = graph.addConstantString(message, closedWorld);
// TODO(sra): Associate source info from [node].
- _pushStaticInvocation(procedure, [errorMessage], typeMask);
+ _pushStaticInvocation(function, [errorMessage], typeMask);
}
void generateTypeError(ir.Node node, String message) {
- generateError(node, astAdapter.throwTypeError, message,
- astAdapter.throwTypeErrorType);
+ generateError(node, _commonElements.throwTypeError, message,
+ astAdapter.getReturnTypeOf(_commonElements.throwTypeError));
}
@override
@@ -1329,8 +1341,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
if (!options.enableUserAssertions) return;
if (assertStatement.message == null) {
assertStatement.condition.accept(this);
- _pushStaticInvocation(astAdapter.assertHelper, <HInstruction>[pop()],
- astAdapter.assertHelperReturnType);
+ _pushStaticInvocation(_commonElements.assertHelper, <HInstruction>[pop()],
+ astAdapter.getReturnTypeOf(_commonElements.assertHelper));
pop();
return;
}
@@ -1338,14 +1350,14 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// if (assertTest(condition)) assertThrow(message);
void buildCondition() {
assertStatement.condition.accept(this);
- _pushStaticInvocation(astAdapter.assertTest, <HInstruction>[pop()],
- astAdapter.assertTestReturnType);
+ _pushStaticInvocation(_commonElements.assertTest, <HInstruction>[pop()],
+ astAdapter.getReturnTypeOf(_commonElements.assertTest));
}
void fail() {
assertStatement.message.accept(this);
- _pushStaticInvocation(astAdapter.assertThrow, <HInstruction>[pop()],
- astAdapter.assertThrowReturnType);
+ _pushStaticInvocation(_commonElements.assertThrow, <HInstruction>[pop()],
+ astAdapter.getReturnTypeOf(_commonElements.assertThrow));
pop();
}
@@ -1879,26 +1891,27 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
}
// The constructor is a procedure because it's a factory.
- ir.Procedure constructor;
+ FunctionEntity constructor;
List<HInstruction> inputs = <HInstruction>[];
if (constructorArgs.isEmpty) {
- constructor = astAdapter.mapLiteralConstructorEmpty;
+ constructor = _commonElements.mapLiteralConstructorEmpty;
} else {
- constructor = astAdapter.mapLiteralConstructor;
+ constructor = _commonElements.mapLiteralConstructor;
HLiteralList argList =
new HLiteralList(constructorArgs, commonMasks.extendableArrayType);
add(argList);
inputs.add(argList);
}
- assert(constructor != null && constructor.kind == ir.ProcedureKind.Factory);
+ assert(
+ constructor is ConstructorEntity && constructor.isFactoryConstructor);
ResolutionInterfaceType type = localsHandler
.substInContext(astAdapter.getDartTypeOfMapLiteral(mapLiteral));
- ir.Class cls = constructor.enclosingClass;
+ ClassEntity cls = constructor.enclosingClass;
- if (rtiNeed.classNeedsRti(astAdapter.getClass(cls))) {
+ if (rtiNeed.classNeedsRti(cls)) {
List<HInstruction> typeInputs = <HInstruction>[];
type.typeArguments.forEach((ResolutionDartType argument) {
typeInputs
@@ -1909,9 +1922,9 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// in the output.
if (typeInputs.every((HInstruction input) => input.isNull())) {
if (constructorArgs.isEmpty) {
- constructor = astAdapter.mapLiteralUntypedEmptyMaker;
+ constructor = _commonElements.mapLiteralUntypedEmptyMaker;
} else {
- constructor = astAdapter.mapLiteralUntypedMaker;
+ constructor = _commonElements.mapLiteralUntypedMaker;
}
} else {
inputs.addAll(typeInputs);
@@ -1921,16 +1934,16 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// If runtime type information is needed and the map literal has no type
// parameters, 'constructor' is a static function that forwards the call to
// the factory constructor without type parameters.
- assert(constructor.kind == ir.ProcedureKind.Method ||
- constructor.kind == ir.ProcedureKind.Factory);
+ assert(constructor.isFunction ||
+ (constructor is ConstructorEntity && constructor.isFactoryConstructor));
// The instruction type will always be a subtype of the mapLiteralClass, but
// type inference might discover a more specific type, or find nothing (in
// dart2js unit tests).
TypeMask mapType = new TypeMask.nonNullSubtype(
- astAdapter.getClass(astAdapter.mapLiteralClass), closedWorld);
+ _commonElements.mapLiteralClass, closedWorld);
TypeMask returnTypeMask = TypeMaskFactory.inferredReturnTypeForElement(
- astAdapter.getElement(constructor), globalInferenceResults);
+ constructor, globalInferenceResults);
TypeMask instructionType =
mapType.intersection(returnTypeMask, closedWorld);
@@ -1960,14 +1973,16 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// to a RuntimeType.
// TODO(sra): Convert the type logic here to use ir.DartType.
- ResolutionDartType dartType = astAdapter.getDartType(type);
+ ResolutionDartType dartType = _elementMap.getDartType(type);
dartType = localsHandler.substInContext(dartType);
HInstruction value = typeBuilder
.analyzeTypeArgument(dartType, sourceElement, sourceInformation: null);
- _pushStaticInvocation(astAdapter.runtimeTypeToString, <HInstruction>[value],
- commonMasks.stringType);
- _pushStaticInvocation(astAdapter.createRuntimeType, <HInstruction>[pop()],
- astAdapter.createRuntimeTypeReturnType);
+ _pushStaticInvocation(_commonElements.runtimeTypeToString,
+ <HInstruction>[value], commonMasks.stringType);
+ _pushStaticInvocation(
+ _commonElements.createRuntimeType,
+ <HInstruction>[pop()],
+ astAdapter.getReturnTypeOf(_commonElements.createRuntimeType));
}
@override
@@ -1975,9 +1990,10 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
ir.Member staticTarget = staticGet.target;
if (staticTarget is ir.Procedure &&
staticTarget.kind == ir.ProcedureKind.Getter) {
+ FunctionEntity getter = _elementMap.getMember(staticTarget);
// Invoke the getter
- _pushStaticInvocation(staticTarget, const <HInstruction>[],
- astAdapter.returnTypeOf(staticTarget));
+ _pushStaticInvocation(
+ getter, const <HInstruction>[], astAdapter.getReturnTypeOf(getter));
} else if (staticTarget is ir.Field &&
(staticTarget.isConst ||
staticTarget.isFinal && !_isLazyStatic(staticTarget))) {
@@ -1985,11 +2001,11 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
astAdapter.getConstantFor(staticTarget.initializer), closedWorld));
} else {
if (_isLazyStatic(staticTarget)) {
- push(new HLazyStatic(astAdapter.getField(staticTarget),
- astAdapter.inferredTypeOf(staticTarget)));
+ FieldEntity field = _elementMap.getField(staticTarget);
+ push(new HLazyStatic(field, astAdapter.getInferredTypeOf(field)));
} else {
- push(new HStatic(astAdapter.getMember(staticTarget),
- astAdapter.inferredTypeOf(staticTarget)));
+ MemberEntity member = _elementMap.getMember(staticTarget);
+ push(new HStatic(member, astAdapter.getInferredTypeOf(member)));
}
}
}
@@ -2005,13 +2021,14 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
ir.Member staticTarget = staticSet.target;
if (staticTarget is ir.Procedure) {
+ FunctionEntity setter = _elementMap.getMember(staticTarget);
// Invoke the setter
- _pushStaticInvocation(staticTarget, <HInstruction>[value],
- astAdapter.returnTypeOf(staticTarget));
+ _pushStaticInvocation(
+ setter, <HInstruction>[value], astAdapter.getReturnTypeOf(setter));
pop();
} else {
add(new HStaticStore(
- astAdapter.getMember(staticTarget),
+ _elementMap.getMember(staticTarget),
typeBuilder.potentiallyCheckOrTrustType(
value, astAdapter.getDartTypeIfValid(staticTarget.setterType))));
}
@@ -2064,13 +2081,13 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
if (propertySet.interfaceTarget == null) {
_generateSuperNoSuchMethod(
propertySet,
- astAdapter.getSelector(propertySet).name + "=",
+ _elementMap.getSelector(propertySet).name + "=",
<HInstruction>[value]);
} else {
_buildInvokeSuper(
- astAdapter.getSelector(propertySet),
- _containingClass(propertySet),
- propertySet.interfaceTarget,
+ _elementMap.getSelector(propertySet),
+ _elementMap.getClass(_containingClass(propertySet)),
+ _elementMap.getMember(propertySet.interfaceTarget),
<HInstruction>[value]);
}
}
@@ -2203,7 +2220,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// need to translate type to
for (ir.DartType type in arguments.types) {
values.add(typeBuilder.analyzeTypeArgument(
- astAdapter.getDartType(type), sourceElement));
+ _elementMap.getDartType(type), sourceElement));
}
}
@@ -2220,11 +2237,12 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
@override
void visitStaticInvocation(ir.StaticInvocation invocation) {
ir.Procedure target = invocation.target;
- if (astAdapter.isInForeignLibrary(target)) {
+ if (astAdapter.isForeignLibrary(target.enclosingLibrary)) {
handleInvokeStaticForeign(invocation, target);
return;
}
- TypeMask typeMask = astAdapter.returnTypeOf(target);
+ FunctionEntity function = _elementMap.getMember(target);
+ TypeMask typeMask = astAdapter.getReturnTypeOf(function);
// TODO(sra): For JS interop external functions, use a different function to
// build arguments.
@@ -2233,14 +2251,13 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// Factory constructors take type parameters; other static methods ignore
// them.
- if (target.kind == ir.ProcedureKind.Factory) {
- if (backend.rtiNeed
- .classNeedsRti(astAdapter.getClass(target.enclosingClass))) {
+ if (function is ConstructorEntity && function.isFactoryConstructor) {
+ if (backend.rtiNeed.classNeedsRti(function.enclosingClass)) {
_addTypeArguments(arguments, invocation.arguments);
}
}
- _pushStaticInvocation(target, arguments, typeMask);
+ _pushStaticInvocation(function, arguments, typeMask);
}
void handleInvokeStaticForeign(
@@ -2371,7 +2388,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// Call a helper method from the isolate library. The isolate library uses
// its own isolate structure that encapsulates the isolate structure used
// for binding to methods.
- ir.Procedure target = astAdapter.currentIsolate;
+ FunctionEntity target = _commonElements.currentIsolate;
if (target == null) {
reporter.internalError(astAdapter.getNode(invocation),
'Isolate library and compiler mismatch.');
@@ -2396,7 +2413,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
<HInstruction>[inputs[1]], commonMasks.dynamicType));
} else {
// Call a helper method from the isolate library.
- ir.Procedure callInIsolate = astAdapter.callInIsolate;
+ FunctionEntity callInIsolate = _commonElements.callInIsolate;
if (callInIsolate == null) {
reporter.internalError(astAdapter.getNode(invocation),
'Isolate library and compiler mismatch.');
@@ -2433,11 +2450,11 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
function.namedParameters.isEmpty) {
push(new HForeignCode(
js.js.expressionTemplateYielding(emitter
- .staticFunctionAccess(astAdapter.getMethod(staticTarget))),
+ .staticFunctionAccess(_elementMap.getMethod(staticTarget))),
commonMasks.dynamicType,
<HInstruction>[],
nativeBehavior: native.NativeBehavior.PURE,
- foreignFunction: astAdapter.getMethod(staticTarget)));
+ foreignFunction: _elementMap.getMethod(staticTarget)));
return;
}
problem = 'does not handle a closure with optional parameters';
@@ -2677,15 +2694,14 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
}
void _pushStaticInvocation(
- ir.Member target, List<HInstruction> arguments, TypeMask typeMask) {
- HInvokeStatic instruction = new HInvokeStatic(
- astAdapter.getMember(target), arguments, typeMask,
- targetCanThrow: astAdapter.getCanThrow(target, closedWorld));
+ MemberEntity target, List<HInstruction> arguments, TypeMask typeMask) {
+ HInvokeStatic instruction = new HInvokeStatic(target, arguments, typeMask,
+ targetCanThrow: !closedWorld.getCannotThrow(target));
if (currentImplicitInstantiations.isNotEmpty) {
instruction.instantiatedTypes =
new List<ResolutionInterfaceType>.from(currentImplicitInstantiations);
}
- instruction.sideEffects = astAdapter.getSideEffects(target, closedWorld);
+ instruction.sideEffects = closedWorld.getSideEffectsOfElement(target);
push(instruction);
}
@@ -2696,7 +2712,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
HInstruction receiver = arguments.first;
List<HInstruction> inputs = <HInstruction>[];
- selector ??= astAdapter.getSelector(node);
+ selector ??= _elementMap.getSelector(node);
bool isIntercepted =
closedWorld.interceptorData.isInterceptedSelector(selector);
@@ -2765,7 +2781,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
if (_handleEqualsNull(invocation)) return;
invocation.receiver.accept(this);
HInstruction receiver = pop();
- Selector selector = astAdapter.getSelector(invocation);
+ Selector selector = _elementMap.getSelector(invocation);
_pushDynamicInvocation(
invocation,
astAdapter.typeOfInvocation(invocation, closedWorld),
@@ -2809,46 +2825,15 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
return null;
}
- /// Find the applicable NoSuchMethod method for an object of this particular
- /// class.
- ir.Procedure _findNoSuchMethodInClass(ir.Class cls) {
- // TODO(efortuna): If we find ourselves doing this sort of calculation
- // often, rewrite what is done with the original element class where we call
- // lookupSuperMember.
- ir.Procedure noSuchMethod = null;
- while (cls != null && cls != astAdapter.objectClass) {
- for (ir.Procedure procedure in cls.procedures) {
- // TODO(efortuna): Do we need to check mixin classes as well?
- if (procedure.name.name == Identifiers.noSuchMethod_ &&
- Selectors.noSuchMethod_
- .signatureApplies(astAdapter.getMethod(procedure))) {
- noSuchMethod = procedure;
- }
- }
- cls = cls.superclass;
- }
-
- if (noSuchMethod == null) {
- // There is no matching overloaded NoSuchMethod function in the containing
- // class. Look on the Object class itself.
- for (ir.Procedure procedure in astAdapter.objectClass.procedures) {
- if (procedure.name.name == Identifiers.noSuchMethod_) {
- noSuchMethod = procedure;
- }
- }
- }
- assert(noSuchMethod != null);
- return noSuchMethod;
- }
-
void _generateSuperNoSuchMethod(ir.Expression invocation, String publicName,
List<HInstruction> arguments) {
- Selector selector = astAdapter.getSelector(invocation);
- ir.Class cls = _containingClass(invocation).superclass;
- assert(cls != null);
- ir.Procedure noSuchMethod = _findNoSuchMethodInClass(cls);
+ Selector selector = _elementMap.getSelector(invocation);
+ ClassEntity containingClass =
+ _elementMap.getClass(_containingClass(invocation));
+ FunctionEntity noSuchMethod =
+ _elementMap.getSuperNoSuchMethod(containingClass);
if (backendUsage.isInvokeOnUsed &&
- _containingClass(noSuchMethod) != astAdapter.objectClass) {
+ noSuchMethod.enclosingClass != _commonElements.objectClass) {
// Register the call as dynamic if [noSuchMethod] on the super
// class is _not_ the default implementation from [Object] (it might be
// overridden in the super class, but it might have a different number of
@@ -2880,7 +2865,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
constantSystem.createInt(selector.invocationMirrorKind);
_pushStaticInvocation(
- astAdapter.createInvocationMirror,
+ _commonElements.createInvocationMirror,
[
graph.addConstant(nameConstant, closedWorld),
graph.addConstantStringFromName(internalName, closedWorld),
@@ -2890,12 +2875,12 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
],
commonMasks.dynamicType);
- _buildInvokeSuper(Selectors.noSuchMethod_, _containingClass(invocation),
- noSuchMethod, <HInstruction>[pop()]);
+ _buildInvokeSuper(Selectors.noSuchMethod_, containingClass, noSuchMethod,
+ <HInstruction>[pop()]);
}
- HInstruction _buildInvokeSuper(Selector selector, ir.Class containingClass,
- ir.Member interfaceTarget, List<HInstruction> arguments) {
+ HInstruction _buildInvokeSuper(Selector selector, ClassEntity containingClass,
+ MemberEntity target, List<HInstruction> arguments) {
// TODO(efortuna): Add source information.
HInstruction receiver = localsHandler.readThis();
@@ -2907,18 +2892,13 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
inputs.addAll(arguments);
TypeMask typeMask;
- if (interfaceTarget is ir.Procedure) {
- typeMask = astAdapter.returnTypeOf(interfaceTarget);
+ if (target is FunctionEntity) {
+ typeMask = astAdapter.getReturnTypeOf(target);
} else {
typeMask = closedWorld.commonMasks.dynamicType;
}
HInstruction instruction = new HInvokeSuper(
- astAdapter.getMember(interfaceTarget),
- astAdapter.getClass(containingClass),
- selector,
- inputs,
- typeMask,
- null,
+ target, containingClass, selector, inputs, typeMask, null,
isSetter: selector.isSetter || selector.isIndexSet);
instruction.sideEffects =
closedWorld.getSideEffectsOfSelector(selector, null);
@@ -2930,12 +2910,13 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void visitSuperPropertyGet(ir.SuperPropertyGet propertyGet) {
if (propertyGet.interfaceTarget == null) {
_generateSuperNoSuchMethod(propertyGet,
- astAdapter.getSelector(propertyGet).name, const <HInstruction>[]);
+ _elementMap.getSelector(propertyGet).name, const <HInstruction>[]);
} else {
_buildInvokeSuper(
- astAdapter.getSelector(propertyGet),
- _containingClass(propertyGet),
- propertyGet.interfaceTarget, const <HInstruction>[]);
+ _elementMap.getSelector(propertyGet),
+ _elementMap.getClass(_containingClass(propertyGet)),
+ _elementMap.getMember(propertyGet.interfaceTarget),
+ const <HInstruction>[]);
}
}
@@ -2943,8 +2924,11 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void visitSuperMethodInvocation(ir.SuperMethodInvocation invocation) {
List<HInstruction> arguments = _visitArgumentsForStaticTarget(
invocation.interfaceTarget.function, invocation.arguments);
- _buildInvokeSuper(astAdapter.getSelector(invocation),
- _containingClass(invocation), invocation.interfaceTarget, arguments);
+ _buildInvokeSuper(
+ _elementMap.getSelector(invocation),
+ _elementMap.getClass(_containingClass(invocation)),
+ _elementMap.getMethod(invocation.interfaceTarget),
+ arguments);
}
@override
@@ -2953,13 +2937,13 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// TODO(sra): For JS-interop targets, process arguments differently.
List<HInstruction> arguments =
_visitArgumentsForStaticTarget(target.function, invocation.arguments);
- if (backend.rtiNeed
- .classNeedsRti(astAdapter.getClass(target.enclosingClass))) {
+ ConstructorEntity constructor = _elementMap.getConstructor(target);
+ ClassEntity cls = constructor.enclosingClass;
+ if (backend.rtiNeed.classNeedsRti(cls)) {
_addTypeArguments(arguments, invocation.arguments);
}
- TypeMask typeMask = new TypeMask.nonNullExact(
- astAdapter.getClass(target.enclosingClass), closedWorld);
- _pushStaticInvocation(target, arguments, typeMask);
+ TypeMask typeMask = new TypeMask.nonNullExact(cls, closedWorld);
+ _pushStaticInvocation(constructor, arguments, typeMask);
}
@override
@@ -2988,7 +2972,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
}
ResolutionDartType typeValue =
- localsHandler.substInContext(astAdapter.getDartType(type));
+ localsHandler.substInContext(_elementMap.getDartType(type));
if (type is ir.FunctionType) {
HInstruction representation =
@@ -2998,7 +2982,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
representation,
];
_pushStaticInvocation(
- astAdapter.functionTypeTest, inputs, commonMasks.boolType);
+ _commonElements.functionTypeTest, inputs, commonMasks.boolType);
HInstruction call = pop();
push(new HIs.compound(typeValue, expression, call, commonMasks.boolType));
return;
@@ -3007,7 +2991,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
if (type is ir.TypeParameterType) {
HInstruction runtimeType =
typeBuilder.addTypeVariableReference(typeValue, sourceElement);
- _pushStaticInvocation(astAdapter.checkSubtypeOfRuntimeType,
+ _pushStaticInvocation(_commonElements.checkSubtypeOfRuntimeType,
<HInstruction>[expression, runtimeType], commonMasks.boolType);
push(
new HIs.variable(typeValue, expression, pop(), commonMasks.boolType));
@@ -3033,7 +3017,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
asFieldName
];
_pushStaticInvocation(
- astAdapter.checkSubtype, inputs, commonMasks.boolType);
+ _commonElements.checkSubtype, inputs, commonMasks.boolType);
push(
new HIs.compound(typeValue, expression, pop(), commonMasks.boolType));
return;
@@ -3093,7 +3077,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
await.operand.accept(this);
HInstruction awaited = pop();
// TODO(herhut): Improve this type.
- push(new HAwait(awaited, astAdapter.makeSubtypeOfObject(closedWorld)));
+ push(new HAwait(awaited, closedWorld.commonMasks.dynamicType));
}
@override
@@ -3307,9 +3291,10 @@ class TryCatchFinallyBuilder {
kernelBuilder.rethrowableException = exception;
kernelBuilder._pushStaticInvocation(
- kernelBuilder.astAdapter.exceptionUnwrapper,
+ kernelBuilder._commonElements.exceptionUnwrapper,
[exception],
- kernelBuilder.astAdapter.exceptionUnwrapperType);
+ kernelBuilder.astAdapter
+ .getReturnTypeOf(kernelBuilder._commonElements.exceptionUnwrapper));
HInvokeStatic unwrappedException = kernelBuilder.pop();
tryInstruction.exception = exception;
int catchesIndex = 0;
@@ -3331,9 +3316,10 @@ class TryCatchFinallyBuilder {
}
if (catchBlock.stackTrace != null) {
kernelBuilder._pushStaticInvocation(
- kernelBuilder.astAdapter.traceFromException,
+ kernelBuilder._commonElements.traceFromException,
[exception],
- kernelBuilder.astAdapter.traceFromExceptionType);
+ kernelBuilder.astAdapter.getReturnTypeOf(
+ kernelBuilder._commonElements.traceFromException));
HInstruction traceInstruction = kernelBuilder.pop();
LocalVariableElement traceVariable =
kernelBuilder.astAdapter.getElement(catchBlock.stackTrace);
« no previous file with comments | « pkg/compiler/lib/src/kernel/no_such_method_resolver.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