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

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

Issue 1859343004: dartfmt pkg/compiler (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 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/source_file_provider.dart ('k') | pkg/compiler/lib/src/ssa/codegen.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/builder.dart
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index ad5905ddec5d361ca15ca2d70bd0a062bf236dea..ba809faf01b0508593a5bca2abe17c42b722ec8d 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -8,59 +8,36 @@ import 'package:js_runtime/shared/embedded_names.dart';
import '../closure.dart';
import '../common.dart';
-import '../common/codegen.dart' show
- CodegenRegistry,
- CodegenWorkItem;
-import '../common/names.dart' show
- Identifiers,
- Selectors;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
+import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
+import '../common/names.dart' show Identifiers, Selectors;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
import '../constants/constant_system.dart';
import '../constants/expressions.dart';
import '../constants/values.dart';
-import '../core_types.dart' show
- CoreClasses;
+import '../core_types.dart' show CoreClasses;
import '../dart_types.dart';
-import '../diagnostics/messages.dart' show
- Message,
- MessageTemplate;
+import '../diagnostics/messages.dart' show Message, MessageTemplate;
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- ConstructorBodyElementX,
- ElementX,
- VariableElementX;
+import '../elements/modelx.dart'
+ show ConstructorBodyElementX, ElementX, VariableElementX;
import '../io/source_information.dart';
import '../js/js.dart' as js;
-import '../js_backend/backend_helpers.dart' show
- BackendHelpers;
+import '../js_backend/backend_helpers.dart' show BackendHelpers;
import '../js_backend/js_backend.dart';
-import '../js_emitter/js_emitter.dart' show
- CodeEmitterTask,
- NativeEmitter;
+import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter;
import '../native/native.dart' as native;
import '../resolution/operators.dart';
import '../resolution/semantic_visitor.dart';
-import '../resolution/tree_elements.dart' show
- TreeElements;
+import '../resolution/tree_elements.dart' show TreeElements;
import '../tree/tree.dart' as ast;
import '../types/types.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
-import '../universe/side_effects.dart' show
- SideEffects;
-import '../universe/use.dart' show
- DynamicUse,
- StaticUse,
- TypeUse;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
+import '../universe/side_effects.dart' show SideEffects;
+import '../universe/use.dart' show DynamicUse, StaticUse, TypeUse;
import '../util/util.dart';
-import '../world.dart' show
- ClassWorld,
- World;
+import '../world.dart' show ClassWorld, World;
import '../dump_info.dart' show InfoReporter;
import 'nodes.dart';
@@ -75,7 +52,7 @@ class SsaFunctionCompiler implements FunctionCompiler {
final JavaScriptBackend backend;
SsaFunctionCompiler(JavaScriptBackend backend,
- SourceInformationStrategy sourceInformationFactory)
+ SourceInformationStrategy sourceInformationFactory)
: generator = new SsaCodeGeneratorTask(backend, sourceInformationFactory),
builder = new SsaBuilderTask(backend, sourceInformationFactory),
optimizer = new SsaOptimizerTask(backend),
@@ -120,9 +97,9 @@ class SsaBuilderTask extends CompilerTask {
String get name => 'SSA builder';
SsaBuilderTask(JavaScriptBackend backend, this.sourceInformationFactory)
- : emitter = backend.emitter,
- backend = backend,
- super(backend.compiler);
+ : emitter = backend.emitter,
+ backend = backend,
+ super(backend.compiler);
DiagnosticReporter get reporter => compiler.reporter;
@@ -130,11 +107,14 @@ class SsaBuilderTask extends CompilerTask {
return measure(() {
Element element = work.element.implementation;
return reporter.withCurrentElement(element, () {
- SsaBuilder builder =
- new SsaBuilder(work.element.implementation,
- work.resolutionTree, work.compilationContext, work.registry,
- backend, emitter.nativeEmitter,
- sourceInformationFactory);
+ SsaBuilder builder = new SsaBuilder(
+ work.element.implementation,
+ work.resolutionTree,
+ work.compilationContext,
+ work.registry,
+ backend,
+ emitter.nativeEmitter,
+ sourceInformationFactory);
HGraph graph = builder.build();
// Default arguments are handled elsewhere, but we must ensure
@@ -161,15 +141,13 @@ class SsaBuilderTask extends CompilerTask {
} else {
name = "${element.name}";
}
- compiler.tracer.traceCompilation(
- name, work.compilationContext);
+ compiler.tracer.traceCompilation(name, work.compilationContext);
compiler.tracer.traceGraph('builder', graph);
}
return graph;
});
});
}
-
}
/**
@@ -187,8 +165,7 @@ class LocalsHandler {
* e.g. Element hash codes. I'd prefer to use a SortedMap but some elements
* don't have source locations for [Elements.compareByPosition].
*/
- Map<Local, HInstruction> directLocals =
- new Map<Local, HInstruction>();
+ Map<Local, HInstruction> directLocals = new Map<Local, HInstruction>();
Map<Local, CapturedVariable> redirectionMapping =
new Map<Local, CapturedVariable>();
SsaBuilder builder;
@@ -223,11 +200,10 @@ class LocalsHandler {
return builder.sourceInformationBuilder;
}
- LocalsHandler(this.builder, this.executableContext,
- InterfaceType instanceType)
- : this.instanceType =
- instanceType == null || instanceType.containsTypeVariables
- ? null : instanceType;
+ LocalsHandler(
+ this.builder, this.executableContext, InterfaceType instanceType)
+ : this.instanceType = instanceType == null ||
+ instanceType.containsTypeVariables ? null : instanceType;
/// Substituted type variables occurring in [type] into the context of
/// [contextClass].
@@ -235,8 +211,7 @@ class LocalsHandler {
if (contextClass != null) {
ClassElement typeContext = Types.getClassContext(type);
if (typeContext != null) {
- type = type.substByContext(
- contextClass.asInstanceOf(typeContext));
+ type = type.substByContext(contextClass.asInstanceOf(typeContext));
}
}
if (instanceType != null) {
@@ -275,9 +250,7 @@ class LocalsHandler {
// just creating an empty object literal?
JavaScriptBackend backend = builder.backend;
HInstruction box = new HForeignCode(
- js.js.parseForeignJS('{}'),
- backend.nonNullType,
- <HInstruction>[],
+ js.js.parseForeignJS('{}'), backend.nonNullType, <HInstruction>[],
nativeBehavior: native.NativeBehavior.PURE_ALLOCATION);
builder.add(box);
return box;
@@ -331,8 +304,8 @@ class LocalsHandler {
* Replaces the current box with a new box and copies over the given list
* of elements from the old box into the new box.
*/
- void updateCaptureBox(BoxLocal boxElement,
- List<LocalVariableElement> toBeCopiedElements) {
+ void updateCaptureBox(
+ BoxLocal boxElement, List<LocalVariableElement> toBeCopiedElements) {
// Create a new box and copy over the values from the old box into the
// new one.
HInstruction oldBox = readLocal(boxElement);
@@ -356,8 +329,8 @@ class LocalsHandler {
void startFunction(Element element, ast.Node node) {
assert(invariant(element, element.isImplementation));
Compiler compiler = builder.compiler;
- closureData = compiler.closureToClassMapper.computeClosureToClassMapping(
- element, node, builder.elements);
+ closureData = compiler.closureToClassMapper
+ .computeClosureToClassMapping(element, node, builder.elements);
if (element is FunctionElement) {
FunctionElement functionElement = element;
@@ -372,8 +345,7 @@ class LocalsHandler {
return;
}
}
- HInstruction parameter = builder.addParameter(
- parameterElement,
+ HInstruction parameter = builder.addParameter(parameterElement,
TypeMaskFactory.inferredTypeForElement(parameterElement, compiler));
builder.parameters[parameterElement] = parameter;
directLocals[parameterElement] = parameter;
@@ -391,8 +363,8 @@ class LocalsHandler {
JavaScriptBackend backend = compiler.backend;
if (closureData.isClosure) {
// Inside closure redirect references to itself to [:this:].
- HThis thisInstruction = new HThis(closureData.thisLocal,
- backend.nonNullType);
+ HThis thisInstruction =
+ new HThis(closureData.thisLocal, backend.nonNullType);
builder.graph.thisInstruction = thisInstruction;
builder.graph.entry.addAtEntry(thisInstruction);
updateLocal(closureData.closureElement, thisInstruction);
@@ -400,8 +372,8 @@ class LocalsHandler {
// Once closures have been mapped to classes their instance members might
// not have any thisElement if the closure was created inside a static
// context.
- HThis thisInstruction = new HThis(
- closureData.thisLocal, builder.getTypeOfThis());
+ HThis thisInstruction =
+ new HThis(closureData.thisLocal, builder.getTypeOfThis());
builder.graph.thisInstruction = thisInstruction;
builder.graph.entry.addAtEntry(thisInstruction);
directLocals[closureData.thisLocal] = thisInstruction;
@@ -416,8 +388,8 @@ class LocalsHandler {
// and passed to the generative constructor factory function as a parameter.
// Instead of allocating and initializing the object, the constructor
// 'upgrades' the native subclass object by initializing the Dart fields.
- bool isNativeUpgradeFactory = element.isGenerativeConstructor
- && backend.isNativeOrExtendsNative(cls);
+ bool isNativeUpgradeFactory =
+ element.isGenerativeConstructor && backend.isNativeOrExtendsNative(cls);
if (backend.isInterceptedMethod(element)) {
bool isInterceptorClass = backend.isInterceptorClass(cls.declaration);
String name = isInterceptorClass ? 'receiver' : '_';
@@ -453,8 +425,8 @@ class LocalsHandler {
*/
bool isAccessedDirectly(Local local) {
assert(local != null);
- return !redirectionMapping.containsKey(local)
- && !closureData.variablesUsedInTryOrGenerator.contains(local);
+ return !redirectionMapping.containsKey(local) &&
+ !closureData.variablesUsedInTryOrGenerator.contains(local);
}
bool isStoredInClosureField(Local local) {
@@ -480,16 +452,14 @@ class LocalsHandler {
* boxed or stored in a closure then the method generates code to retrieve
* the value.
*/
- HInstruction readLocal(Local local,
- {SourceInformation sourceInformation}) {
+ HInstruction readLocal(Local local, {SourceInformation sourceInformation}) {
if (isAccessedDirectly(local)) {
if (directLocals[local] == null) {
if (local is TypeVariableElement) {
builder.reporter.internalError(builder.compiler.currentElement,
"Runtime type information not available for $local.");
} else {
- builder.reporter.internalError(local,
- "Cannot find value $local.");
+ builder.reporter.internalError(local, "Cannot find value $local.");
}
}
HInstruction value = directLocals[local];
@@ -537,8 +507,7 @@ class LocalsHandler {
return res;
}
- HLocalValue getLocal(Local local,
- {SourceInformation sourceInformation}) {
+ HLocalValue getLocal(Local local, {SourceInformation sourceInformation}) {
// If the element is a parameter, we already have a
// HParameterValue for it. We cannot create another one because
// it could then have another name than the real parameter. And
@@ -549,7 +518,7 @@ class LocalsHandler {
return builder.activationVariables.putIfAbsent(local, () {
JavaScriptBackend backend = builder.backend;
HLocalValue localValue = new HLocalValue(local, backend.nonNullType)
- ..sourceInformation = sourceInformation;
+ ..sourceInformation = sourceInformation;
builder.graph.entry.addAtExit(localValue);
return localValue;
});
@@ -566,7 +535,7 @@ class LocalsHandler {
* closure then the method generates code to set the value.
*/
void updateLocal(Local local, HInstruction value,
- {SourceInformation sourceInformation}) {
+ {SourceInformation sourceInformation}) {
if (value is HRef) {
HRef ref = value;
value = ref.value;
@@ -582,12 +551,12 @@ class LocalsHandler {
// be accessed directly.
HInstruction box = readLocal(redirect.box);
builder.add(new HFieldSet(redirect, box, value)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
} else {
assert(isUsedInTryOrGenerator(local));
HLocalValue localValue = getLocal(local);
builder.add(new HLocalSet(local, localValue, value)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
}
}
@@ -660,13 +629,12 @@ class LocalsHandler {
JavaScriptBackend backend = builder.backend;
// Create phis for all elements in the definitions environment.
- savedDirectLocals.forEach((Local local,
- HInstruction instruction) {
+ savedDirectLocals.forEach((Local local, HInstruction instruction) {
if (isAccessedDirectly(local)) {
// We know 'this' cannot be modified.
if (local != closureData.thisLocal) {
- HPhi phi = new HPhi.singleInput(
- local, instruction, backend.dynamicType);
+ HPhi phi =
+ new HPhi.singleInput(local, instruction, backend.dynamicType);
loopEntry.addPhi(phi);
directLocals[local] = phi;
} else {
@@ -726,11 +694,9 @@ class LocalsHandler {
// block. Since variable declarations are scoped the declared
// variable cannot be alive outside the block. Note: this is only
// true for nodes where we do joins.
- Map<Local, HInstruction> joinedLocals =
- new Map<Local, HInstruction>();
+ Map<Local, HInstruction> joinedLocals = new Map<Local, HInstruction>();
JavaScriptBackend backend = builder.backend;
- otherLocals.directLocals.forEach((Local local,
- HInstruction instruction) {
+ otherLocals.directLocals.forEach((Local local, HInstruction instruction) {
// We know 'this' cannot be modified.
if (local == closureData.thisLocal) {
assert(directLocals[local] == instruction);
@@ -758,12 +724,11 @@ class LocalsHandler {
* used for its values, only for its declared variables. This is a way to
* exclude local values from the result when they are no longer in scope.
*/
- LocalsHandler mergeMultiple(List<LocalsHandler> localsHandlers,
- HBasicBlock joinBlock) {
+ LocalsHandler mergeMultiple(
+ List<LocalsHandler> localsHandlers, HBasicBlock joinBlock) {
assert(localsHandlers.length > 0);
if (localsHandlers.length == 1) return localsHandlers[0];
- Map<Local, HInstruction> joinedLocals =
- new Map<Local, HInstruction>();
+ Map<Local, HInstruction> joinedLocals = new Map<Local, HInstruction>();
HInstruction thisValue = null;
JavaScriptBackend backend = builder.backend;
directLocals.forEach((Local local, HInstruction instruction) {
@@ -779,8 +744,7 @@ class LocalsHandler {
}
});
for (LocalsHandler handler in localsHandlers) {
- handler.directLocals.forEach((Local local,
- HInstruction instruction) {
+ handler.directLocals.forEach((Local local, HInstruction instruction) {
HPhi phi = joinedLocals[local];
if (phi != null) {
phi.addInput(instruction);
@@ -794,10 +758,9 @@ class LocalsHandler {
// Remove locals that are not in all handlers.
directLocals = new Map<Local, HInstruction>();
- joinedLocals.forEach((Local local,
- HInstruction instruction) {
- if (local != closureData.thisLocal
- && instruction.inputs.length != localsHandlers.length) {
+ joinedLocals.forEach((Local local, HInstruction instruction) {
+ if (local != closureData.thisLocal &&
+ instruction.inputs.length != localsHandlers.length) {
joinBlock.removePhi(instruction);
} else {
directLocals[local] = instruction;
@@ -807,7 +770,6 @@ class LocalsHandler {
}
}
-
// Represents a single break/continue instruction.
class JumpHandlerEntry {
final HJump jumpInstruction;
@@ -817,7 +779,6 @@ class JumpHandlerEntry {
JumpHandlerEntry(this.jumpInstruction, this.locals);
}
-
abstract class JumpHandler {
factory JumpHandler(SsaBuilder builder, JumpTarget target) {
return new TargetJumpHandler(builder, target);
@@ -825,8 +786,8 @@ abstract class JumpHandler {
void generateBreak([LabelDefinition label]);
void generateContinue([LabelDefinition label]);
void forEachBreak(void action(HBreak instruction, LocalsHandler locals));
- void forEachContinue(void action(HContinue instruction,
- LocalsHandler locals));
+ void forEachContinue(
+ void action(HContinue instruction, LocalsHandler locals));
bool hasAnyContinue();
bool hasAnyBreak();
void close();
@@ -852,9 +813,9 @@ class NullJumpHandler implements JumpHandler {
'NullJumpHandler.generateContinue should not be called.');
}
- void forEachBreak(Function ignored) { }
- void forEachContinue(Function ignored) { }
- void close() { }
+ void forEachBreak(Function ignored) {}
+ void forEachContinue(Function ignored) {}
+ void close() {}
bool hasAnyContinue() => false;
bool hasAnyBreak() => false;
@@ -953,9 +914,8 @@ class SwitchCaseJumpHandler extends TargetJumpHandler {
/// switch case loop.
final Map<JumpTarget, int> targetIndexMap = new Map<JumpTarget, int>();
- SwitchCaseJumpHandler(SsaBuilder builder,
- JumpTarget target,
- ast.SwitchStatement node)
+ SwitchCaseJumpHandler(
+ SsaBuilder builder, JumpTarget target, ast.SwitchStatement node)
: super(builder, target) {
// The switch case indices must match those computed in
// [SsaFromAstMixin.buildSwitchCaseConstants].
@@ -1007,9 +967,8 @@ class SwitchCaseJumpHandler extends TargetJumpHandler {
// [SsaFromAstMixin.buildComplexSwitchStatement] for detail.
assert(label != null);
- HInstruction value = builder.graph.addConstantInt(
- targetIndexMap[label.target],
- builder.compiler);
+ HInstruction value = builder.graph
+ .addConstantInt(targetIndexMap[label.target], builder.compiler);
builder.localsHandler.updateLocal(target, value);
assert(label.target.labels.contains(label));
@@ -1035,14 +994,14 @@ class SwitchCaseJumpHandler extends TargetJumpHandler {
* This class builds SSA nodes for functions represented in AST.
*/
class SsaBuilder extends ast.Visitor
- with BaseImplementationOfCompoundsMixin,
- BaseImplementationOfSetIfNullsMixin,
- BaseImplementationOfSuperIndexSetIfNullMixin,
- SemanticSendResolvedMixin,
- NewBulkMixin,
- ErrorBulkMixin
+ with
+ BaseImplementationOfCompoundsMixin,
+ BaseImplementationOfSetIfNullsMixin,
+ BaseImplementationOfSuperIndexSetIfNullMixin,
+ SemanticSendResolvedMixin,
+ NewBulkMixin,
+ ErrorBulkMixin
implements SemanticSendVisitor {
-
/// The element for which this SSA builder is being used.
final Element target;
@@ -1146,8 +1105,7 @@ class SsaBuilder extends ast.Visitor
* being updated in try/catch blocks, and should be
* accessed indirectly through [HLocalGet] and [HLocalSet].
*/
- Map<Local, HLocalValue> activationVariables =
- <Local, HLocalValue>{};
+ Map<Local, HLocalValue> activationVariables = <Local, HLocalValue>{};
// We build the Ssa graph by simulating a stack machine.
List<HInstruction> stack = <HInstruction>[];
@@ -1156,24 +1114,29 @@ class SsaBuilder extends ast.Visitor
bool get isBuildingAsyncFunction {
Element element = sourceElement;
return (element is FunctionElement &&
- element.asyncMarker == AsyncMarker.ASYNC);
+ element.asyncMarker == AsyncMarker.ASYNC);
}
// TODO(sigmund): make most args optional
- SsaBuilder(this.target, this.elements, this.context, this.registry,
- JavaScriptBackend backend, this.nativeEmitter,
+ SsaBuilder(
+ this.target,
+ this.elements,
+ this.context,
+ this.registry,
+ JavaScriptBackend backend,
+ this.nativeEmitter,
SourceInformationStrategy sourceInformationFactory)
- : this.compiler = backend.compiler,
- this.infoReporter = backend.compiler.dumpInfoTask,
- this.backend = backend,
- this.constantSystem = backend.constantSystem,
- this.rti = backend.rti {
+ : this.compiler = backend.compiler,
+ this.infoReporter = backend.compiler.dumpInfoTask,
+ this.backend = backend,
+ this.constantSystem = backend.constantSystem,
+ this.rti = backend.rti {
assert(target.isImplementation);
graph.element = target;
localsHandler = new LocalsHandler(this, target, null);
sourceElementStack.add(target);
- sourceInformationBuilder = sourceInformationFactory.createBuilderForContext(
- target);
+ sourceInformationBuilder =
+ sourceInformationFactory.createBuilderForContext(target);
graph.sourceInformation =
sourceInformationBuilder.buildVariableDeclaration();
}
@@ -1206,7 +1169,8 @@ class SsaBuilder extends ast.Visitor
// implementation/declaration distinction.
Element get sourceElement => sourceElementStack.last;
- bool get _checkOrTrustTypes => compiler.options.enableTypeAssertions ||
+ bool get _checkOrTrustTypes =>
+ compiler.options.enableTypeAssertions ||
compiler.options.trustTypeAnnotations;
/// Build the graph for [target].
@@ -1219,10 +1183,10 @@ class SsaBuilder extends ast.Visitor
if (target.isGenerativeConstructor) {
result = buildFactory(target);
} else if (target.isGenerativeConstructorBody ||
- target.isFactoryConstructor ||
- target.isFunction ||
- target.isGetter ||
- target.isSetter) {
+ target.isFactoryConstructor ||
+ target.isFunction ||
+ target.isGetter ||
+ target.isSetter) {
result = buildMethod(target);
} else if (target.isField) {
if (target.isInstanceMember) {
@@ -1238,7 +1202,6 @@ class SsaBuilder extends ast.Visitor
return result;
}
-
HBasicBlock addNewBlock() {
HBasicBlock block = graph.addNewBlock();
// If adding a new block during building of an expression, it is due to
@@ -1309,11 +1272,12 @@ class SsaBuilder extends ast.Visitor
bool isInstanceMember = function.isInstanceMember;
// For static calls, [providedArguments] is complete, default arguments
// have been included if necessary, see [makeStaticArgumentList].
- if (!isInstanceMember
- || currentNode == null // In erroneous code, currentNode can be null.
- || providedArgumentsKnownToBeComplete(currentNode)
- || function.isGenerativeConstructorBody
- || selector.isGetter) {
+ if (!isInstanceMember ||
+ currentNode == null // In erroneous code, currentNode can be null.
+ ||
+ providedArgumentsKnownToBeComplete(currentNode) ||
+ function.isGenerativeConstructorBody ||
+ selector.isGetter) {
// For these cases, the provided argument list is known to be complete.
return providedArguments;
} else {
@@ -1336,10 +1300,8 @@ class SsaBuilder extends ast.Visitor
* the provided named arguments (the named arguments that are defined in the
* [selector]) in a specific order (see [addDynamicSendArgumentsToList]).
*/
- List<HInstruction> completeDynamicSendArgumentsList(
- Selector selector,
- FunctionElement function,
- List<HInstruction> providedArguments) {
+ List<HInstruction> completeDynamicSendArgumentsList(Selector selector,
+ FunctionElement function, List<HInstruction> providedArguments) {
assert(selector.applies(function, compiler.world));
FunctionSignature signature = function.functionSignature;
List<HInstruction> compiledArguments = new List<HInstruction>(
@@ -1396,12 +1358,9 @@ class SsaBuilder extends ast.Visitor
* Try to inline [element] within the currect context of the builder. The
* insertion point is the state of the builder.
*/
- bool tryInlineMethod(Element element,
- Selector selector,
- TypeMask mask,
- List<HInstruction> providedArguments,
- ast.Node currentNode,
- {InterfaceType instanceType}) {
+ bool tryInlineMethod(Element element, Selector selector, TypeMask mask,
+ List<HInstruction> providedArguments, ast.Node currentNode,
+ {InterfaceType instanceType}) {
// TODO(johnniwinther): Register this on the [registry]. Currently the
// [CodegenRegistry] calls the enqueuer, but [element] should _not_ be
// enqueued.
@@ -1432,8 +1391,8 @@ class SsaBuilder extends ast.Visitor
assert(invariant(
currentNode != null ? currentNode : element,
selector != null ||
- Elements.isStaticOrTopLevel(element) ||
- element.isGenerativeConstructorBody,
+ Elements.isStaticOrTopLevel(element) ||
+ element.isGenerativeConstructorBody,
message: "Missing selector for inlining of $element."));
if (selector != null) {
if (!selector.applies(function, compiler.world)) return false;
@@ -1446,16 +1405,16 @@ class SsaBuilder extends ast.Visitor
// Don't inline operator== methods if the parameter can be null.
if (element.name == '==') {
- if (element.enclosingClass != coreClasses.objectClass
- && providedArguments[1].canBeNull()) {
+ if (element.enclosingClass != coreClasses.objectClass &&
+ providedArguments[1].canBeNull()) {
return false;
}
}
// Generative constructors of native classes should not be called directly
// and have an extra argument that causes problems with inlining.
- if (element.isGenerativeConstructor
- && backend.isNativeOrExtendsNative(element.enclosingClass)) {
+ if (element.isGenerativeConstructor &&
+ backend.isNativeOrExtendsNative(element.enclosingClass)) {
return false;
}
@@ -1524,8 +1483,8 @@ class SsaBuilder extends ast.Visitor
// We may have forced the inlining of some methods. Therefore check
// if we can inline this method regardless of size.
assert(InlineWeeder.canBeInlined(function, -1, false,
- allowLoops: true,
- enableUserAssertions: compiler.options.enableUserAssertions));
+ allowLoops: true,
+ enableUserAssertions: compiler.options.enableUserAssertions));
return true;
}
@@ -1567,13 +1526,13 @@ class SsaBuilder extends ast.Visitor
(mask == null || mask.isNullable)) {
addWithPosition(
new HFieldGet(null, providedArguments[0], backend.dynamicType,
- isAssignable: false),
+ isAssignable: false),
currentNode);
}
List<HInstruction> compiledArguments = completeSendArgumentsList(
function, selector, providedArguments, currentNode);
- enterInlinedMethod(
- function, currentNode, compiledArguments, instanceType: instanceType);
+ enterInlinedMethod(function, currentNode, compiledArguments,
+ instanceType: instanceType);
inlinedFrom(function, () {
if (!isReachable) {
emitReturn(graph.addConstantNull(compiler), null);
@@ -1728,8 +1687,8 @@ class SsaBuilder extends ast.Visitor
push(invokeJsInteropFunction(functionElement, parameters.values.toList(),
sourceInformationBuilder.buildGeneric(function)));
var value = pop();
- closeAndGotoExit(new HReturn(value,
- sourceInformationBuilder.buildReturn(functionElement.node)));
+ closeAndGotoExit(new HReturn(
+ value, sourceInformationBuilder.buildReturn(functionElement.node)));
return closeFunction();
}
assert(invariant(functionElement, !function.modifiers.isExternal));
@@ -1739,27 +1698,21 @@ class SsaBuilder extends ast.Visitor
// null check.
if (name == '==') {
if (!backend.operatorEqHandlesNullArgument(functionElement)) {
- handleIf(
- function,
- visitCondition: () {
- HParameterValue parameter = parameters.values.first;
- push(new HIdentity(
- parameter, graph.addConstantNull(compiler), null,
- backend.boolType));
- },
- visitThen: () {
- closeAndGotoExit(new HReturn(
- graph.addConstantBool(false, compiler),
- sourceInformationBuilder
- .buildImplicitReturn(functionElement)));
- },
+ handleIf(function, visitCondition: () {
+ HParameterValue parameter = parameters.values.first;
+ push(new HIdentity(parameter, graph.addConstantNull(compiler), null,
+ backend.boolType));
+ }, visitThen: () {
+ closeAndGotoExit(new HReturn(graph.addConstantBool(false, compiler),
+ sourceInformationBuilder.buildImplicitReturn(functionElement)));
+ },
visitElse: null,
sourceInformation: sourceInformationBuilder.buildIf(function.body));
}
}
if (const bool.fromEnvironment('unreachable-throw') == true) {
- var emptyParameters = parameters.values
- .where((p) => p.instructionType.isEmpty);
+ var emptyParameters =
+ parameters.values.where((p) => p.instructionType.isEmpty);
if (emptyParameters.length > 0) {
addComment('${emptyParameters} inferred as [empty]');
pushInvokeStatic(function.body, helpers.assertUnreachableMethod, []);
@@ -1777,10 +1730,8 @@ class SsaBuilder extends ast.Visitor
/// having side effects which will inhibit code motion.
// TODO(sra): Figure out how to keep comment anchored without effects.
void addComment(String text) {
- add(new HForeignCode(
- js.js.statementTemplateYielding(new js.Comment(text)),
- backend.dynamicType,
- <HInstruction>[],
+ add(new HForeignCode(js.js.statementTemplateYielding(new js.Comment(text)),
+ backend.dynamicType, <HInstruction>[],
isStatement: true));
}
@@ -1878,16 +1829,14 @@ class SsaBuilder extends ast.Visitor
* updated in the [localsHandler]. This function creates such an element and
* stores it in the [returnLocal] field.
*/
- void setupStateForInlining(FunctionElement function,
- List<HInstruction> compiledArguments,
- {InterfaceType instanceType}) {
+ void setupStateForInlining(
+ FunctionElement function, List<HInstruction> compiledArguments,
+ {InterfaceType instanceType}) {
localsHandler = new LocalsHandler(this, function, instanceType);
- localsHandler.closureData =
- compiler.closureToClassMapper.computeClosureToClassMapping(
- function, function.node, elements);
+ localsHandler.closureData = compiler.closureToClassMapper
+ .computeClosureToClassMapping(function, function.node, elements);
returnLocal = new SyntheticLocal("result", function);
- localsHandler.updateLocal(returnLocal,
- graph.addConstantNull(compiler));
+ localsHandler.updateLocal(returnLocal, graph.addConstantNull(compiler));
inTryStatement = false; // TODO(lry): why? Document.
@@ -1904,8 +1853,8 @@ class SsaBuilder extends ast.Visitor
});
ClassElement enclosing = function.enclosingClass;
- if ((function.isConstructor || function.isGenerativeConstructorBody)
- && backend.classNeedsRti(enclosing)) {
+ if ((function.isConstructor || function.isGenerativeConstructorBody) &&
+ backend.classNeedsRti(enclosing)) {
enclosing.typeVariables.forEach((TypeVariableType typeVariable) {
HInstruction argument = compiledArguments[argumentIndex++];
localsHandler.updateLocal(
@@ -1947,7 +1896,6 @@ class SsaBuilder extends ast.Visitor
}
}
-
addInlinedInstantiation(DartType type) {
if (type != null) {
currentInlinedInstantiations.add(type);
@@ -1989,11 +1937,12 @@ class SsaBuilder extends ast.Visitor
*
* Invariant: [constructors] must contain only implementation elements.
*/
- void inlineSuperOrRedirect(ConstructorElement callee,
- List<HInstruction> compiledArguments,
- List<FunctionElement> constructors,
- Map<Element, HInstruction> fieldValues,
- FunctionElement caller) {
+ void inlineSuperOrRedirect(
+ ConstructorElement callee,
+ List<HInstruction> compiledArguments,
+ List<FunctionElement> constructors,
+ Map<Element, HInstruction> fieldValues,
+ FunctionElement caller) {
callee = callee.implementation;
reporter.withCurrentElement(callee, () {
constructors.add(callee);
@@ -2035,8 +1984,8 @@ class SsaBuilder extends ast.Visitor
// by the effective target.
if (!callee.isRedirectingGenerative) {
inlinedFrom(callee, () {
- buildFieldInitializers(callee.enclosingClass.implementation,
- fieldValues);
+ buildFieldInitializers(
+ callee.enclosingClass.implementation, fieldValues);
});
}
@@ -2063,9 +2012,8 @@ class SsaBuilder extends ast.Visitor
elements = resolvedAst.elements;
ClosureClassMap oldClosureData = localsHandler.closureData;
ast.Node node = resolvedAst.node;
- ClosureClassMap newClosureData =
- compiler.closureToClassMapper.computeClosureToClassMapping(
- callee, node, elements);
+ ClosureClassMap newClosureData = compiler.closureToClassMapper
+ .computeClosureToClassMapping(callee, node, elements);
localsHandler.closureData = newClosureData;
localsHandler.enterScope(node, callee);
buildInitializers(callee, constructors, fieldValues);
@@ -2084,9 +2032,10 @@ class SsaBuilder extends ast.Visitor
* Invariant: The [constructor] and elements in [constructors] must all be
* implementation elements.
*/
- void buildInitializers(ConstructorElement constructor,
- List<FunctionElement> constructors,
- Map<Element, HInstruction> fieldValues) {
+ void buildInitializers(
+ ConstructorElement constructor,
+ List<FunctionElement> constructors,
+ Map<Element, HInstruction> fieldValues) {
assert(invariant(constructor, constructor.isImplementation));
if (constructor.isSynthesized) {
List<HInstruction> arguments = <HInstruction>[];
@@ -2110,15 +2059,11 @@ class SsaBuilder extends ast.Visitor
// forwarding constructor in a mixin application did not match the
// constructor (which, for example, may happen when the libraries are
// not compatible for private names, see issue 20394).
- reporter.internalError(constructor,
- 'forwarding constructor call does not match');
+ reporter.internalError(
+ constructor, 'forwarding constructor call does not match');
}
inlineSuperOrRedirect(
- target,
- arguments,
- constructors,
- fieldValues,
- constructor);
+ target, arguments, constructors, fieldValues, constructor);
return;
}
ast.FunctionExpression functionNode = constructor.node;
@@ -2126,14 +2071,16 @@ class SsaBuilder extends ast.Visitor
bool foundSuperOrRedirect = false;
if (functionNode.initializers != null) {
Link<ast.Node> initializers = functionNode.initializers.nodes;
- for (Link<ast.Node> link = initializers; !link.isEmpty; link = link.tail) {
+ for (Link<ast.Node> link = initializers;
+ !link.isEmpty;
+ link = link.tail) {
assert(link.head is ast.Send);
- if (link.head is !ast.SendSet) {
+ if (link.head is! ast.SendSet) {
// A super initializer or constructor redirection.
foundSuperOrRedirect = true;
ast.Send call = link.head;
assert(ast.Initializers.isSuperConstructorCall(call) ||
- ast.Initializers.isConstructorRedirect(call));
+ ast.Initializers.isConstructorRedirect(call));
FunctionElement target = elements[call].implementation;
CallStructure callStructure =
elements.getSelector(call).callStructure;
@@ -2143,11 +2090,8 @@ class SsaBuilder extends ast.Visitor
compiledArguments =
makeStaticArgumentList(callStructure, arguments, target);
});
- inlineSuperOrRedirect(target,
- compiledArguments,
- constructors,
- fieldValues,
- constructor);
+ inlineSuperOrRedirect(target, compiledArguments, constructors,
+ fieldValues, constructor);
} else {
// A field initializer.
ast.SendSet init = link.head;
@@ -2172,20 +2116,16 @@ class SsaBuilder extends ast.Visitor
// TODO(johnniwinther): Should we find injected constructors as well?
FunctionElement target = superClass.lookupDefaultConstructor();
if (target == null) {
- reporter.internalError(superClass,
- "No default constructor available.");
+ reporter.internalError(
+ superClass, "No default constructor available.");
}
- List<HInstruction> arguments =
- CallStructure.NO_ARGS.makeArgumentsList(
- const Link<ast.Node>(),
- target.implementation,
- null,
- handleConstantForOptionalParameter);
- inlineSuperOrRedirect(target,
- arguments,
- constructors,
- fieldValues,
- constructor);
+ List<HInstruction> arguments = CallStructure.NO_ARGS.makeArgumentsList(
+ const Link<ast.Node>(),
+ target.implementation,
+ null,
+ handleConstantForOptionalParameter);
+ inlineSuperOrRedirect(
+ target, arguments, constructors, fieldValues, constructor);
}
}
}
@@ -2196,36 +2136,36 @@ class SsaBuilder extends ast.Visitor
*
* Invariant: [classElement] must be an implementation element.
*/
- void buildFieldInitializers(ClassElement classElement,
- Map<Element, HInstruction> fieldValues) {
+ void buildFieldInitializers(
+ ClassElement classElement, Map<Element, HInstruction> fieldValues) {
assert(invariant(classElement, classElement.isImplementation));
classElement.forEachInstanceField(
(ClassElement enclosingClass, VariableElement member) {
- if (compiler.elementHasCompileTimeError(member)) return;
- reporter.withCurrentElement(member, () {
- TreeElements definitions = member.treeElements;
- ast.Node node = member.node;
- ast.Expression initializer = member.initializer;
- if (initializer == null) {
- // Unassigned fields of native classes are not initialized to
- // prevent overwriting pre-initialized native properties.
- if (!backend.isNativeOrExtendsNative(classElement)) {
- fieldValues[member] = graph.addConstantNull(compiler);
- }
- } else {
- ast.Node right = initializer;
- TreeElements savedElements = elements;
- elements = definitions;
- // In case the field initializer uses closures, run the
- // closure to class mapper.
- compiler.closureToClassMapper.computeClosureToClassMapping(
- member, node, elements);
- inlinedFrom(member, () => right.accept(this));
- elements = savedElements;
- fieldValues[member] = pop();
- }
- });
- });
+ if (compiler.elementHasCompileTimeError(member)) return;
+ reporter.withCurrentElement(member, () {
+ TreeElements definitions = member.treeElements;
+ ast.Node node = member.node;
+ ast.Expression initializer = member.initializer;
+ if (initializer == null) {
+ // Unassigned fields of native classes are not initialized to
+ // prevent overwriting pre-initialized native properties.
+ if (!backend.isNativeOrExtendsNative(classElement)) {
+ fieldValues[member] = graph.addConstantNull(compiler);
+ }
+ } else {
+ ast.Node right = initializer;
+ TreeElements savedElements = elements;
+ elements = definitions;
+ // In case the field initializer uses closures, run the
+ // closure to class mapper.
+ compiler.closureToClassMapper
+ .computeClosureToClassMapping(member, node, elements);
+ inlinedFrom(member, () => right.accept(this));
+ elements = savedElements;
+ fieldValues[member] = pop();
+ }
+ });
+ });
}
/**
@@ -2239,11 +2179,10 @@ class SsaBuilder extends ast.Visitor
*/
HGraph buildFactory(ConstructorElement functionElement) {
functionElement = functionElement.implementation;
- ClassElement classElement =
- functionElement.enclosingClass.implementation;
+ ClassElement classElement = functionElement.enclosingClass.implementation;
bool isNativeUpgradeFactory =
- backend.isNativeOrExtendsNative(classElement)
- && !backend.isJsInterop(classElement);
+ backend.isNativeOrExtendsNative(classElement) &&
+ !backend.isJsInterop(classElement);
ast.FunctionExpression function = functionElement.node;
// Note that constructors (like any other static function) do not need
// to deal with optional arguments. It is the callers job to provide all
@@ -2270,8 +2209,7 @@ class SsaBuilder extends ast.Visitor
// If the [element] is a field-parameter then
// initialize the field element with its value.
InitializingFormalElement fieldParameter = parameter;
- HInstruction parameterValue =
- localsHandler.readLocal(fieldParameter);
+ HInstruction parameterValue = localsHandler.readLocal(fieldParameter);
fieldValues[fieldParameter.fieldElement] = parameterValue;
}
});
@@ -2287,19 +2225,18 @@ class SsaBuilder extends ast.Visitor
classElement.forEachInstanceField(
(ClassElement enclosingClass, VariableElement member) {
- HInstruction value = fieldValues[member];
- if (value == null) {
- // Uninitialized native fields are pre-initialized by the native
- // implementation.
- assert(invariant(
- member, isNativeUpgradeFactory || compiler.compilationFailed));
- } else {
- fields.add(member);
- DartType type = localsHandler.substInContext(member.type);
- constructorArguments.add(potentiallyCheckOrTrustType(value, type));
- }
- },
- includeSuperAndInjectedMembers: true);
+ HInstruction value = fieldValues[member];
+ if (value == null) {
+ // Uninitialized native fields are pre-initialized by the native
+ // implementation.
+ assert(invariant(
+ member, isNativeUpgradeFactory || compiler.compilationFailed));
+ } else {
+ fields.add(member);
+ DartType type = localsHandler.substInContext(member.type);
+ constructorArguments.add(potentiallyCheckOrTrustType(value, type));
+ }
+ }, includeSuperAndInjectedMembers: true);
InterfaceType type = classElement.thisType;
TypeMask ssaType =
@@ -2312,10 +2249,8 @@ class SsaBuilder extends ast.Visitor
HInstruction newObject;
if (!isNativeUpgradeFactory) {
- newObject = new HForeignNew(classElement,
- ssaType,
- constructorArguments,
- instantiatedTypes);
+ newObject = new HForeignNew(
+ classElement, ssaType, constructorArguments, instantiatedTypes);
if (function != null) {
// TODO(johnniwinther): Provide source information for creation
// through synthetic constructors.
@@ -2329,8 +2264,8 @@ class SsaBuilder extends ast.Visitor
// Null guard ensures an error if we are being called from an explicit
// 'new' of the constructor instead of via an upgrade. It is optimized out
// if there are field initializers.
- add(new HFieldGet(
- null, newObject, backend.dynamicType, isAssignable: false));
+ add(new HFieldGet(null, newObject, backend.dynamicType,
+ isAssignable: false));
for (int i = 0; i < fields.length; i++) {
add(new HFieldSet(fields[i], newObject, constructorArguments[i]));
}
@@ -2346,12 +2281,12 @@ class SsaBuilder extends ast.Visitor
// we can simply copy the list from this.
// These locals are modified by [isIndexedTypeArgumentGet].
- HThis source; // The source of the type arguments.
+ HThis source; // The source of the type arguments.
bool allIndexed = true;
int expectedIndex = 0;
- ClassElement contextClass; // The class of `this`.
- int remainingTypeVariables; // The number of 'remaining type variables'
- // of `this`.
+ ClassElement contextClass; // The class of `this`.
+ int remainingTypeVariables; // The number of 'remaining type variables'
+ // of `this`.
/// Helper to identify instructions that read a type variable without
/// substitution (that is, directly use the index). These instructions
@@ -2393,8 +2328,8 @@ class SsaBuilder extends ast.Visitor
List<HInstruction> typeArguments = <HInstruction>[];
classElement.typeVariables.forEach((TypeVariableType typeVariable) {
- HInstruction argument = localsHandler.readLocal(
- localsHandler.getTypeVariableAsLocal(typeVariable));
+ HInstruction argument = localsHandler
+ .readLocal(localsHandler.getTypeVariableAsLocal(typeVariable));
if (allIndexed && !isIndexedTypeArgumentGet(argument)) {
allIndexed = false;
}
@@ -2458,8 +2393,8 @@ class SsaBuilder extends ast.Visitor
currentClass.typeVariables.forEach((TypeVariableType argument) {
// TODO(johnniwinther): Substitute [argument] with
// `localsHandler.substInContext(argument)`.
- bodyCallInputs.add(localsHandler.readLocal(
- localsHandler.getTypeVariableAsLocal(argument)));
+ bodyCallInputs.add(localsHandler
+ .readLocal(localsHandler.getTypeVariableAsLocal(argument)));
});
}
@@ -2503,11 +2438,11 @@ class SsaBuilder extends ast.Visitor
// must be done before adding the normal parameters, because their types
// may contain references to type variables.
var enclosing = element.enclosingElement;
- if ((element.isConstructor || element.isGenerativeConstructorBody)
- && backend.classNeedsRti(enclosing)) {
+ if ((element.isConstructor || element.isGenerativeConstructorBody) &&
+ backend.classNeedsRti(enclosing)) {
enclosing.typeVariables.forEach((TypeVariableType typeVariable) {
- HParameterValue param = addParameter(
- typeVariable.element, backend.nonNullType);
+ HParameterValue param =
+ addParameter(typeVariable.element, backend.nonNullType);
localsHandler.directLocals[
localsHandler.getTypeVariableAsLocal(typeVariable)] = param;
});
@@ -2521,8 +2456,7 @@ class SsaBuilder extends ast.Visitor
// because that is where the type guards will also be inserted.
// This way we ensure that a type guard will dominate the type
// check.
- ClosureScope scopeData =
- localsHandler.closureData.capturingScopes[node];
+ ClosureScope scopeData = localsHandler.closureData.capturingScopes[node];
signature.orderedForEachParameter((ParameterElement parameterElement) {
if (element.isGenerativeConstructorBody) {
if (scopeData != null &&
@@ -2569,11 +2503,10 @@ class SsaBuilder extends ast.Visitor
if (element == backend.traceHelper) return;
n(e) => e == null ? '' : e.name;
String name = "${n(element.library)}:${n(element.enclosingClass)}."
- "${n(element)}";
+ "${n(element)}";
HConstant nameConstant = addConstantString(name);
- add(new HInvokeStatic(backend.traceHelper,
- <HInstruction>[nameConstant],
- backend.dynamicType));
+ add(new HInvokeStatic(backend.traceHelper, <HInstruction>[nameConstant],
+ backend.dynamicType));
}
}
@@ -2584,8 +2517,7 @@ class SsaBuilder extends ast.Visitor
HConstant idConstant = graph.addConstantInt(element.hashCode, compiler);
HConstant nameConstant = addConstantString(element.name);
add(new HInvokeStatic(backend.traceHelper,
- <HInstruction>[idConstant, nameConstant],
- backend.dynamicType));
+ <HInstruction>[idConstant, nameConstant], backend.dynamicType));
}
}
@@ -2594,21 +2526,19 @@ class SsaBuilder extends ast.Visitor
bool assertTypeInContext(DartType type, [Spannable spannable]) {
return invariant(spannable == null ? CURRENT_ELEMENT_SPANNABLE : spannable,
() {
- ClassElement contextClass = Types.getClassContext(type);
- return contextClass == null ||
- contextClass == localsHandler.contextClass;
- },
+ ClassElement contextClass = Types.getClassContext(type);
+ return contextClass == null || contextClass == localsHandler.contextClass;
+ },
message: "Type '$type' is not valid context of "
- "${localsHandler.contextClass}.");
+ "${localsHandler.contextClass}.");
}
/// Build a [HTypeConversion] for convertion [original] to type [type].
///
/// Invariant: [type] must be valid in the context.
/// See [LocalsHandler.substInContext].
- HInstruction buildTypeConversion(HInstruction original,
- DartType type,
- int kind) {
+ HInstruction buildTypeConversion(
+ HInstruction original, DartType type, int kind) {
if (type == null) return original;
type = type.unaliased;
assert(assertTypeInContext(type, original));
@@ -2616,19 +2546,21 @@ class SsaBuilder extends ast.Visitor
TypeMask subtype = new TypeMask.subtype(type.element, compiler.world);
HInstruction representations = buildTypeArgumentRepresentations(type);
add(representations);
- return new HTypeConversion.withTypeRepresentation(type, kind, subtype,
- original, representations);
+ return new HTypeConversion.withTypeRepresentation(
+ type, kind, subtype, original, representations);
} else if (type.isTypeVariable) {
TypeMask subtype = original.instructionType;
HInstruction typeVariable = addTypeVariableReference(type);
- return new HTypeConversion.withTypeRepresentation(type, kind, subtype,
- original, typeVariable);
+ return new HTypeConversion.withTypeRepresentation(
+ type, kind, subtype, original, typeVariable);
} else if (type.isFunctionType) {
- String name = kind == HTypeConversion.CAST_TYPE_CHECK
- ? '_asCheck' : '_assertCheck';
+ String name =
+ kind == HTypeConversion.CAST_TYPE_CHECK ? '_asCheck' : '_assertCheck';
- List<HInstruction> arguments =
- <HInstruction>[buildFunctionType(type), original];
+ List<HInstruction> arguments = <HInstruction>[
+ buildFunctionType(type),
+ original
+ ];
pushInvokeDynamic(
null,
new Selector.call(
@@ -2666,7 +2598,7 @@ class SsaBuilder extends ast.Visitor
}
HInstruction potentiallyCheckOrTrustType(HInstruction original, DartType type,
- { int kind: HTypeConversion.CHECKED_MODE_CHECK }) {
+ {int kind: HTypeConversion.CHECKED_MODE_CHECK}) {
if (type == null) return original;
HInstruction checkedOrTrusted = original;
if (compiler.options.trustTypeAnnotations) {
@@ -2679,8 +2611,8 @@ class SsaBuilder extends ast.Visitor
return checkedOrTrusted;
}
- void assertIsSubtype(ast.Node node, DartType subtype, DartType supertype,
- String message) {
+ void assertIsSubtype(
+ ast.Node node, DartType subtype, DartType supertype, String message) {
HInstruction subtypeInstruction =
analyzeTypeArgument(localsHandler.substInContext(subtype));
HInstruction supertypeInstruction =
@@ -2688,10 +2620,13 @@ class SsaBuilder extends ast.Visitor
HInstruction messageInstruction =
graph.addConstantString(new ast.DartString.literal(message), compiler);
Element element = helpers.assertIsSubtype;
- var inputs = <HInstruction>[subtypeInstruction, supertypeInstruction,
- messageInstruction];
- HInstruction assertIsSubtype = new HInvokeStatic(
- element, inputs, subtypeInstruction.instructionType);
+ var inputs = <HInstruction>[
+ subtypeInstruction,
+ supertypeInstruction,
+ messageInstruction
+ ];
+ HInstruction assertIsSubtype =
+ new HInvokeStatic(element, inputs, subtypeInstruction.instructionType);
registry?.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
add(assertIsSubtype);
}
@@ -2723,9 +2658,7 @@ class SsaBuilder extends ast.Visitor
HInstruction popBoolified() {
HInstruction value = pop();
if (_checkOrTrustTypes) {
- return potentiallyCheckOrTrustType(
- value,
- compiler.coreTypes.boolType,
+ return potentiallyCheckOrTrustType(value, compiler.coreTypes.boolType,
kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK);
}
HInstruction result = new HBoolify(value, backend.boolType);
@@ -2776,17 +2709,15 @@ class SsaBuilder extends ast.Visitor
pushInvokeStatic(node, helpers.assertThrow, [pop()]);
pop();
}
- handleIf(node,
- visitCondition: buildCondition,
- visitThen: fail);
+ handleIf(node, visitCondition: buildCondition, visitThen: fail);
}
visitBlock(ast.Block node) {
assert(!isAborted());
- if (!isReachable) return; // This can only happen when inlining.
+ if (!isReachable) return; // This can only happen when inlining.
for (Link<ast.Node> link = node.statements.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
visit(link.head);
if (!isReachable) {
// The block has been aborted by a return or a throw.
@@ -2803,8 +2734,8 @@ class SsaBuilder extends ast.Visitor
}
visitClassNode(ast.ClassNode node) {
- reporter.internalError(node,
- 'SsaBuilder.visitClassNode should not be called.');
+ reporter.internalError(
+ node, 'SsaBuilder.visitClassNode should not be called.');
}
visitThrowExpression(ast.Expression expression) {
@@ -2841,9 +2772,8 @@ class SsaBuilder extends ast.Visitor
HBasicBlock previousBlock = close(new HGoto());
JumpHandler jumpHandler = createJumpHandler(node, isLoopJump: true);
- HBasicBlock loopEntry = graph.addNewLoopHeaderBlock(
- jumpHandler.target,
- jumpHandler.labels());
+ HBasicBlock loopEntry =
+ graph.addNewLoopHeaderBlock(jumpHandler.target, jumpHandler.labels());
previousBlock.addSuccessor(loopEntry);
open(loopEntry);
@@ -2864,10 +2794,8 @@ class SsaBuilder extends ast.Visitor
* no back edge because they abort (throw/return/break in the body and have
* no continues).
*/
- void endLoop(HBasicBlock loopEntry,
- HBasicBlock branchExitBlock,
- JumpHandler jumpHandler,
- LocalsHandler savedLocals) {
+ void endLoop(HBasicBlock loopEntry, HBasicBlock branchExitBlock,
+ JumpHandler jumpHandler, LocalsHandler savedLocals) {
HBasicBlock loopExitBlock = addNewBlock();
List<LocalsHandler> breakHandlers = <LocalsHandler>[];
@@ -2917,11 +2845,8 @@ class SsaBuilder extends ast.Visitor
// For while loops, initializer and update are null.
// The condition function must return a boolean result.
// None of the functions must leave anything on the stack.
- void handleLoop(ast.Node loop,
- void initialize(),
- HInstruction condition(),
- void update(),
- void body()) {
+ void handleLoop(ast.Node loop, void initialize(), HInstruction condition(),
+ void update(), void body()) {
// Generate:
// <initializer>
// loop-entry:
@@ -2941,8 +2866,7 @@ class SsaBuilder extends ast.Visitor
startBlock = initializerBlock;
initialize();
assert(!isAborted());
- initializerGraph =
- new SubExpression(initializerBlock, current);
+ initializerGraph = new SubExpression(initializerBlock, current);
}
loopNesting++;
@@ -2985,13 +2909,12 @@ class SsaBuilder extends ast.Visitor
HBasicBlock updateBlock = addNewBlock();
List<LocalsHandler> continueHandlers = <LocalsHandler>[];
- jumpHandler.forEachContinue((HContinue instruction,
- LocalsHandler locals) {
+ jumpHandler
+ .forEachContinue((HContinue instruction, LocalsHandler locals) {
instruction.block.addSuccessor(updateBlock);
continueHandlers.add(locals);
});
-
if (bodyBlock != null) {
continueHandlers.add(localsHandler);
bodyBlock.addSuccessor(updateBlock);
@@ -3006,15 +2929,13 @@ class SsaBuilder extends ast.Visitor
if (!labels.isEmpty) {
beginBodyBlock.setBlockFlow(
new HLabeledBlockInformation(
- new HSubGraphBlockInformation(bodyGraph),
- jumpHandler.labels(),
+ new HSubGraphBlockInformation(bodyGraph), jumpHandler.labels(),
isContinue: true),
updateBlock);
} else if (target != null && target.isContinueTarget) {
beginBodyBlock.setBlockFlow(
new HLabeledBlockInformation.implicit(
- new HSubGraphBlockInformation(bodyGraph),
- target,
+ new HSubGraphBlockInformation(bodyGraph), target,
isContinue: true),
updateBlock);
}
@@ -3037,16 +2958,15 @@ class SsaBuilder extends ast.Visitor
endLoop(conditionBlock, conditionExitBlock, jumpHandler, savedLocals);
conditionBlock.postProcessLoopHeader();
- HLoopBlockInformation info =
- new HLoopBlockInformation(
- _loopKind(loop),
- wrapExpressionGraph(initializerGraph),
- wrapExpressionGraph(conditionExpression),
- wrapStatementGraph(bodyGraph),
- wrapExpressionGraph(updateGraph),
- conditionBlock.loopInformation.target,
- conditionBlock.loopInformation.labels,
- sourceInformationBuilder.buildLoop(loop));
+ HLoopBlockInformation info = new HLoopBlockInformation(
+ _loopKind(loop),
+ wrapExpressionGraph(initializerGraph),
+ wrapExpressionGraph(conditionExpression),
+ wrapStatementGraph(bodyGraph),
+ wrapExpressionGraph(updateGraph),
+ conditionBlock.loopInformation.target,
+ conditionBlock.loopInformation.labels,
+ sourceInformationBuilder.buildLoop(loop));
startBlock.setBlockFlow(info, current);
loopInfo.loopBlockInformation = info;
@@ -3078,11 +2998,10 @@ class SsaBuilder extends ast.Visitor
conditionEndBlock.addAtExit(new HIf(condition));
conditionEndBlock.addSuccessor(elseBlock);
conditionEndBlock.remove(conditionEndBlock.last);
- HIfBlockInformation info =
- new HIfBlockInformation(
- wrapExpressionGraph(conditionExpression),
- wrapStatementGraph(bodyGraph),
- wrapStatementGraph(elseGraph));
+ HIfBlockInformation info = new HIfBlockInformation(
+ wrapExpressionGraph(conditionExpression),
+ wrapStatementGraph(bodyGraph),
+ wrapStatementGraph(elseGraph));
conditionEndBlock.setBlockFlow(info, current);
HIf ifBlock = conditionEndBlock.last;
@@ -3096,8 +3015,8 @@ class SsaBuilder extends ast.Visitor
label.setBreakTarget();
SubGraph labelGraph = new SubGraph(conditionBlock, current);
HLabeledBlockInformation labelInfo = new HLabeledBlockInformation(
- new HSubGraphBlockInformation(labelGraph),
- <LabelDefinition>[label]);
+ new HSubGraphBlockInformation(labelGraph),
+ <LabelDefinition>[label]);
conditionBlock.setBlockFlow(labelInfo, current);
@@ -3151,11 +3070,9 @@ class SsaBuilder extends ast.Visitor
visit(node.condition);
return popBoolified();
}
- handleLoop(node,
- () {},
- buildCondition,
- () {},
- () { visit(node.body); });
+ handleLoop(node, () {}, buildCondition, () {}, () {
+ visit(node.body);
+ });
}
visitDoWhile(ast.DoWhile node) {
@@ -3199,8 +3116,8 @@ class SsaBuilder extends ast.Visitor
HBasicBlock conditionBlock = addNewBlock();
List<LocalsHandler> continueHandlers = <LocalsHandler>[];
- jumpHandler.forEachContinue((HContinue instruction,
- LocalsHandler locals) {
+ jumpHandler
+ .forEachContinue((HContinue instruction, LocalsHandler locals) {
instruction.block.addSuccessor(conditionBlock);
continueHandlers.add(locals);
});
@@ -3219,11 +3136,11 @@ class SsaBuilder extends ast.Visitor
new HSubGraphBlockInformation(bodyGraph);
HLabeledBlockInformation info;
if (!labels.isEmpty) {
- info = new HLabeledBlockInformation(bodyInfo, labels,
- isContinue: true);
+ info =
+ new HLabeledBlockInformation(bodyInfo, labels, isContinue: true);
} else {
info = new HLabeledBlockInformation.implicit(bodyInfo, target,
- isContinue: true);
+ isContinue: true);
}
bodyEntryBlock.setBlockFlow(info, conditionBlock);
}
@@ -3254,16 +3171,15 @@ class SsaBuilder extends ast.Visitor
loopEntryBlock.postProcessLoopHeader();
SubGraph bodyGraph = new SubGraph(loopEntryBlock, bodyExitBlock);
- HLoopBlockInformation loopBlockInfo =
- new HLoopBlockInformation(
- HLoopBlockInformation.DO_WHILE_LOOP,
- null,
- wrapExpressionGraph(conditionExpression),
- wrapStatementGraph(bodyGraph),
- null,
- loopEntryBlock.loopInformation.target,
- loopEntryBlock.loopInformation.labels,
- sourceInformationBuilder.buildLoop(node));
+ HLoopBlockInformation loopBlockInfo = new HLoopBlockInformation(
+ HLoopBlockInformation.DO_WHILE_LOOP,
+ null,
+ wrapExpressionGraph(conditionExpression),
+ wrapStatementGraph(bodyGraph),
+ null,
+ loopEntryBlock.loopInformation.target,
+ loopEntryBlock.loopInformation.labels,
+ sourceInformationBuilder.buildLoop(node));
loopEntryBlock.setBlockFlow(loopBlockInfo, current);
loopInfo.loopBlockInformation = loopBlockInfo;
} else {
@@ -3320,7 +3236,7 @@ class SsaBuilder extends ast.Visitor
TypeMask type =
new TypeMask.nonNullExact(closureClassElement, compiler.world);
push(new HForeignNew(closureClassElement, type, capturedVariables)
- ..sourceInformation = sourceInformationBuilder.buildCreate(node));
+ ..sourceInformation = sourceInformationBuilder.buildCreate(node));
Element methodElement = nestedClosureData.closureElement;
registry?.registerInstantiatedClosure(methodElement);
@@ -3343,15 +3259,14 @@ class SsaBuilder extends ast.Visitor
if (node.isThis()) {
visitThisGet(node);
} else {
- reporter.internalError(node,
- "SsaFromAstMixin.visitIdentifier on non-this.");
+ reporter.internalError(
+ node, "SsaFromAstMixin.visitIdentifier on non-this.");
}
}
visitIf(ast.If node) {
assert(isReachable);
- handleIf(
- node,
+ handleIf(node,
visitCondition: () => visit(node.condition),
visitThen: () => visit(node.thenPart),
visitElse: node.elsePart != null ? () => visit(node.elsePart) : null,
@@ -3359,13 +3274,12 @@ class SsaBuilder extends ast.Visitor
}
void handleIf(ast.Node diagnosticNode,
- {void visitCondition(),
- void visitThen(),
- void visitElse(),
- SourceInformation sourceInformation}) {
+ {void visitCondition(),
+ void visitThen(),
+ void visitElse(),
+ SourceInformation sourceInformation}) {
SsaBranchBuilder branchBuilder = new SsaBranchBuilder(this, diagnosticNode);
- branchBuilder.handleIf(
- visitCondition, visitThen, visitElse,
+ branchBuilder.handleIf(visitCondition, visitThen, visitElse,
sourceInformation: sourceInformation);
}
@@ -3378,19 +3292,17 @@ class SsaBuilder extends ast.Visitor
@override
void visitLogicalAnd(ast.Send node, ast.Node left, ast.Node right, _) {
SsaBranchBuilder branchBuilder = new SsaBranchBuilder(this, node);
- branchBuilder.handleLogicalAndOrWithLeftNode(
- left,
- () { visit(right); },
- isAnd: true);
+ branchBuilder.handleLogicalAndOrWithLeftNode(left, () {
+ visit(right);
+ }, isAnd: true);
}
@override
void visitLogicalOr(ast.Send node, ast.Node left, ast.Node right, _) {
SsaBranchBuilder branchBuilder = new SsaBranchBuilder(this, node);
- branchBuilder.handleLogicalAndOrWithLeftNode(
- left,
- () { visit(right); },
- isAnd: false);
+ branchBuilder.handleLogicalAndOrWithLeftNode(left, () {
+ visit(right);
+ }, isAnd: false);
}
@override
@@ -3400,13 +3312,12 @@ class SsaBuilder extends ast.Visitor
SourceInformation sourceInformation =
sourceInformationBuilder.buildGeneric(node);
push(new HNot(popBoolified(), backend.boolType)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
}
@override
- void visitUnary(ast.Send node,
- UnaryOperator operator,
- ast.Node expression,_) {
+ void visitUnary(
+ ast.Send node, UnaryOperator operator, ast.Node expression, _) {
assert(node.argumentsNode is ast.Prefix);
HInstruction operand = visitAndPop(expression);
@@ -3422,18 +3333,13 @@ class SsaBuilder extends ast.Visitor
}
pushInvokeDynamic(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- [operand],
+ node, elements.getSelector(node), elements.getTypeMask(node), [operand],
sourceInformation: sourceInformationBuilder.buildGeneric(node));
}
@override
- void visitBinary(ast.Send node,
- ast.Node left,
- BinaryOperator operator,
- ast.Node right, _) {
+ void visitBinary(ast.Send node, ast.Node left, BinaryOperator operator,
+ ast.Node right, _) {
handleBinary(node, left, right);
}
@@ -3454,24 +3360,17 @@ class SsaBuilder extends ast.Visitor
}
void handleBinary(ast.Send node, ast.Node left, ast.Node right) {
- visitBinarySend(
- visitAndPop(left),
- visitAndPop(right),
- elements.getSelector(node),
- elements.getTypeMask(node),
- node,
+ visitBinarySend(visitAndPop(left), visitAndPop(right),
+ elements.getSelector(node), elements.getTypeMask(node), node,
sourceInformation:
sourceInformationBuilder.buildGeneric(node.selector));
}
/// TODO(johnniwinther): Merge [visitBinarySend] with [handleBinary] and
/// remove use of [location] for source information.
- void visitBinarySend(HInstruction left,
- HInstruction right,
- Selector selector,
- TypeMask mask,
- ast.Send send,
- {SourceInformation sourceInformation}) {
+ void visitBinarySend(HInstruction left, HInstruction right, Selector selector,
+ TypeMask mask, ast.Send send,
+ {SourceInformation sourceInformation}) {
pushInvokeDynamic(send, selector, mask, [left, right],
sourceInformation: sourceInformation);
}
@@ -3496,10 +3395,7 @@ class SsaBuilder extends ast.Visitor
* [selector].
*/
void generateInstanceGetterWithCompiledReceiver(
- ast.Send send,
- Selector selector,
- TypeMask mask,
- HInstruction receiver) {
+ ast.Send send, Selector selector, TypeMask mask, HInstruction receiver) {
assert(Elements.isInstanceSend(send, elements));
assert(selector.isGetter);
pushInvokeDynamic(send, selector, mask, [receiver],
@@ -3508,8 +3404,8 @@ class SsaBuilder extends ast.Visitor
/// Inserts a call to checkDeferredIsLoaded for [prefixElement].
/// If [prefixElement] is [null] ndo nothing.
- void generateIsDeferredLoadedCheckIfNeeded(PrefixElement prefixElement,
- ast.Node location) {
+ void generateIsDeferredLoadedCheckIfNeeded(
+ PrefixElement prefixElement, ast.Node location) {
if (prefixElement == null) return;
String loadId =
compiler.deferredLoadTask.getImportDeferName(location, prefixElement);
@@ -3525,16 +3421,14 @@ class SsaBuilder extends ast.Visitor
/// resolves to a deferred library.
void generateIsDeferredLoadedCheckOfSend(ast.Send node) {
generateIsDeferredLoadedCheckIfNeeded(
- compiler.deferredLoadTask.deferredPrefixElement(node, elements),
- node);
+ compiler.deferredLoadTask.deferredPrefixElement(node, elements), node);
}
void handleInvalidStaticGet(ast.Send node, Element element) {
SourceInformation sourceInformation =
sourceInformationBuilder.buildGet(node);
generateThrowNoSuchMethod(
- node,
- noSuchMethodTargetSymbolString(element, 'get'),
+ node, noSuchMethodTargetSymbolString(element, 'get'),
argumentNodes: const Link<ast.Node>(),
sourceInformation: sourceInformation);
}
@@ -3556,32 +3450,27 @@ class SsaBuilder extends ast.Visitor
}
/// Read a static or top level [field] of constant value.
- void generateStaticConstGet(
- ast.Send node,
- FieldElement field,
- ConstantExpression constant,
- SourceInformation sourceInformation) {
+ void generateStaticConstGet(ast.Send node, FieldElement field,
+ ConstantExpression constant, SourceInformation sourceInformation) {
ConstantValue value = backend.constants.getConstantValue(constant);
HConstant instruction;
// Constants that are referred via a deferred prefix should be referred
// by reference.
- PrefixElement prefix = compiler.deferredLoadTask
- .deferredPrefixElement(node, elements);
+ PrefixElement prefix =
+ compiler.deferredLoadTask.deferredPrefixElement(node, elements);
if (prefix != null) {
instruction =
graph.addDeferredConstant(value, prefix, sourceInformation, compiler);
} else {
- instruction = graph.addConstant(
- value, compiler, sourceInformation: sourceInformation);
+ instruction = graph.addConstant(value, compiler,
+ sourceInformation: sourceInformation);
}
stack.add(instruction);
// The inferrer may have found a better type than the constant
// handler in the case of lists, because the constant handler
// does not look at elements in the list.
- TypeMask type =
- TypeMaskFactory.inferredTypeForElement(field, compiler);
- if (!type.containsAll(compiler.world) &&
- !instruction.isConstantNull()) {
+ TypeMask type = TypeMaskFactory.inferredTypeForElement(field, compiler);
+ if (!type.containsAll(compiler.world) && !instruction.isConstantNull()) {
// TODO(13429): The inferrer should know that an element
// cannot be null.
instruction.instructionType = type.nonNullable();
@@ -3607,17 +3496,15 @@ class SsaBuilder extends ast.Visitor
} else {
// TODO(5346): Try to avoid the need for calling [declaration] before
// creating an [HStatic].
- HInstruction instruction = new HStatic(
- field.declaration,
+ HInstruction instruction = new HStatic(field.declaration,
TypeMaskFactory.inferredTypeForElement(field, compiler))
- ..sourceInformation = sourceInformation;
+ ..sourceInformation = sourceInformation;
push(instruction);
}
} else {
HInstruction instruction = new HLazyStatic(
- field,
- TypeMaskFactory.inferredTypeForElement(field, compiler))
- ..sourceInformation = sourceInformation;
+ field, TypeMaskFactory.inferredTypeForElement(field, compiler))
+ ..sourceInformation = sourceInformation;
push(instruction);
}
}
@@ -3630,7 +3517,7 @@ class SsaBuilder extends ast.Visitor
generateDeferredLoaderGet(node, getter, sourceInformation);
} else {
pushInvokeStatic(node, getter, <HInstruction>[],
- sourceInformation: sourceInformation);
+ sourceInformation: sourceInformation);
}
}
@@ -3648,13 +3535,13 @@ class SsaBuilder extends ast.Visitor
SourceInformation sourceInformation =
sourceInformationBuilder.buildGet(node);
push(new HStatic(function.declaration, backend.nonNullType)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
}
/// Read a local variable, function or parameter.
void buildLocalGet(LocalElement local, SourceInformation sourceInformation) {
- stack.add(localsHandler.readLocal(
- local, sourceInformation: sourceInformation));
+ stack.add(
+ localsHandler.readLocal(local, sourceInformation: sourceInformation));
}
void handleLocalGet(ast.Send node, LocalElement local) {
@@ -3662,20 +3549,13 @@ class SsaBuilder extends ast.Visitor
}
@override
- void visitDynamicPropertyGet(
- ast.Send node,
- ast.Node receiver,
- Name name,
- _) {
+ void visitDynamicPropertyGet(ast.Send node, ast.Node receiver, Name name, _) {
generateDynamicGet(node);
}
@override
void visitIfNotNullDynamicPropertyGet(
- ast.Send node,
- ast.Node receiver,
- Name name,
- _) {
+ ast.Send node, ast.Node receiver, Name name, _) {
// exp?.x compiled as:
// t1 = exp;
// result = t1 == null ? t1 : t1.x;
@@ -3701,8 +3581,8 @@ class SsaBuilder extends ast.Visitor
/// Pushes a boolean checking [expression] against null.
pushCheckNull(HInstruction expression) {
- push(new HIdentity(expression, graph.addConstantNull(compiler),
- null, backend.boolType));
+ push(new HIdentity(
+ expression, graph.addConstantNull(compiler), null, backend.boolType));
}
@override
@@ -3721,72 +3601,47 @@ class SsaBuilder extends ast.Visitor
}
@override
- void visitStaticFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ void visitStaticFieldGet(ast.Send node, FieldElement field, _) {
generateStaticFieldGet(node, field);
}
@override
- void visitStaticFunctionGet(
- ast.Send node,
- MethodElement function,
- _) {
+ void visitStaticFunctionGet(ast.Send node, MethodElement function, _) {
generateStaticFunctionGet(node, function);
}
@override
- void visitStaticGetterGet(
- ast.Send node,
- FunctionElement getter,
- _) {
+ void visitStaticGetterGet(ast.Send node, FunctionElement getter, _) {
generateStaticGetterGet(node, getter);
}
@override
- void visitThisPropertyGet(
- ast.Send node,
- Name name,
- _) {
+ void visitThisPropertyGet(ast.Send node, Name name, _) {
generateDynamicGet(node);
}
@override
- void visitTopLevelFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ void visitTopLevelFieldGet(ast.Send node, FieldElement field, _) {
generateStaticFieldGet(node, field);
}
@override
- void visitTopLevelFunctionGet(
- ast.Send node,
- MethodElement function,
- _) {
+ void visitTopLevelFunctionGet(ast.Send node, MethodElement function, _) {
generateStaticFunctionGet(node, function);
}
@override
- void visitTopLevelGetterGet(
- ast.Send node,
- FunctionElement getter,
- _) {
+ void visitTopLevelGetterGet(ast.Send node, FunctionElement getter, _) {
generateStaticGetterGet(node, getter);
}
- void generateInstanceSetterWithCompiledReceiver(ast.Send send,
- HInstruction receiver,
- HInstruction value,
- {Selector selector,
- TypeMask mask,
- ast.Node location}) {
- assert(invariant(
- send == null ? location : send,
+ void generateInstanceSetterWithCompiledReceiver(
+ ast.Send send, HInstruction receiver, HInstruction value,
+ {Selector selector, TypeMask mask, ast.Node location}) {
+ assert(invariant(send == null ? location : send,
send == null || Elements.isInstanceSend(send, elements),
message: "Unexpected instance setter"
- "${send != null ? " element: ${elements[send]}" : ""}"));
+ "${send != null ? " element: ${elements[send]}" : ""}"));
if (selector == null) {
assert(send != null);
selector = elements.getSelector(send);
@@ -3805,9 +3660,8 @@ class SsaBuilder extends ast.Visitor
stack.add(value);
}
- void generateNoSuchSetter(ast.Node location,
- Element element,
- HInstruction value) {
+ void generateNoSuchSetter(
+ ast.Node location, Element element, HInstruction value) {
List<HInstruction> arguments =
value == null ? const <HInstruction>[] : <HInstruction>[value];
// An erroneous element indicates an unresolved static setter.
@@ -3816,16 +3670,15 @@ class SsaBuilder extends ast.Visitor
argumentValues: arguments);
}
- void generateNonInstanceSetter(ast.SendSet send,
- Element element,
- HInstruction value,
- {ast.Node location}) {
+ void generateNonInstanceSetter(
+ ast.SendSet send, Element element, HInstruction value,
+ {ast.Node location}) {
if (location == null) {
assert(send != null);
location = send;
}
- assert(invariant(location,
- send == null || !Elements.isInstanceSend(send, elements),
+ assert(invariant(
+ location, send == null || !Elements.isInstanceSend(send, elements),
message: "Unexpected non instance setter: $element."));
if (Elements.isStaticOrTopLevelField(element)) {
if (element.isSetter) {
@@ -3838,7 +3691,7 @@ class SsaBuilder extends ast.Visitor
}
stack.add(value);
} else if (Elements.isError(element)) {
- generateNoSuchSetter(location, element, send == null ? null : value);
+ generateNoSuchSetter(location, element, send == null ? null : value);
} else if (Elements.isMalformed(element)) {
// TODO(ahe): Do something like [generateWrongArgumentCountError].
stack.add(graph.addConstantNull(compiler));
@@ -3889,20 +3742,19 @@ class SsaBuilder extends ast.Visitor
// each part the generated sub-template's holes match the index of the
// inputs that are later used to instantiate it. We do this by starting
// the indexing with the number of inputs from previous sub-templates.
- templates.add(
- rtiEncoder.getTypeRepresentationWithPlaceholders(
- argument, (variable) {
- HInstruction runtimeType = addTypeVariableReference(variable);
- inputs.add(runtimeType);
- }, firstPlaceholderIndex: inputs.length));
+ templates.add(rtiEncoder.getTypeRepresentationWithPlaceholders(argument,
+ (variable) {
+ HInstruction runtimeType = addTypeVariableReference(variable);
+ inputs.add(runtimeType);
+ }, firstPlaceholderIndex: inputs.length));
}
// TODO(sra): This is a fresh template each time. We can't let the
// template manager build them.
- js.Template code = new js.Template(null,
- new js.ArrayInitializer(templates));
- HInstruction representation =
- new HForeignCode(code, backend.readableArrayType, inputs,
- nativeBehavior: native.NativeBehavior.PURE_ALLOCATION);
+ js.Template code =
+ new js.Template(null, new js.ArrayInitializer(templates));
+ HInstruction representation = new HForeignCode(
+ code, backend.readableArrayType, inputs,
+ nativeBehavior: native.NativeBehavior.PURE_ALLOCATION);
return representation;
}
}
@@ -3914,10 +3766,8 @@ class SsaBuilder extends ast.Visitor
ErroneousElement element = type.element;
generateTypeError(node, element.message);
} else {
- HInstruction converted = buildTypeConversion(
- expressionInstruction,
- localsHandler.substInContext(type),
- HTypeConversion.CAST_TYPE_CHECK);
+ HInstruction converted = buildTypeConversion(expressionInstruction,
+ localsHandler.substInContext(type), HTypeConversion.CAST_TYPE_CHECK);
if (converted != expressionInstruction) add(converted);
stack.add(converted);
}
@@ -3937,16 +3787,14 @@ class SsaBuilder extends ast.Visitor
push(new HNot(instruction, backend.boolType));
}
- HInstruction buildIsNode(ast.Node node,
- DartType type,
- HInstruction expression) {
+ HInstruction buildIsNode(
+ ast.Node node, DartType type, HInstruction expression) {
type = localsHandler.substInContext(type).unaliased;
if (type.isFunctionType) {
List arguments = [buildFunctionType(type), expression];
pushInvokeDynamic(
node,
- new Selector.call(
- new PrivateName('_isTest', helpers.jsHelperLibrary),
+ new Selector.call(new PrivateName('_isTest', helpers.jsHelperLibrary),
CallStructure.ONE_ARG),
null,
arguments);
@@ -3961,18 +3809,19 @@ class SsaBuilder extends ast.Visitor
} else if (RuntimeTypes.hasTypeArguments(type)) {
ClassElement element = type.element;
Element helper = helpers.checkSubtype;
- HInstruction representations =
- buildTypeArgumentRepresentations(type);
+ HInstruction representations = buildTypeArgumentRepresentations(type);
add(representations);
js.Name operator = backend.namer.operatorIs(element);
HInstruction isFieldName = addConstantStringFromName(operator);
HInstruction asFieldName = compiler.world.hasAnyStrictSubtype(element)
? addConstantStringFromName(backend.namer.substitutionName(element))
: graph.addConstantNull(compiler);
- List<HInstruction> inputs = <HInstruction>[expression,
- isFieldName,
- representations,
- asFieldName];
+ List<HInstruction> inputs = <HInstruction>[
+ expression,
+ isFieldName,
+ representations,
+ asFieldName
+ ];
pushInvokeStatic(node, helper, inputs, typeMask: backend.boolType);
HInstruction call = pop();
return new HIs.compound(type, expression, call, backend.boolType);
@@ -4006,15 +3855,14 @@ class SsaBuilder extends ast.Visitor
Link<ast.Node> arguments = node.arguments;
int positionalArgumentCount = callStructure.positionalArgumentCount;
for (int i = 0;
- i < positionalArgumentCount;
- arguments = arguments.tail, i++) {
+ i < positionalArgumentCount;
+ arguments = arguments.tail, i++) {
visit(arguments.head);
list.add(pop());
}
// Visit named arguments and add them into a temporary map.
- Map<String, HInstruction> instructions =
- new Map<String, HInstruction>();
+ Map<String, HInstruction> instructions = new Map<String, HInstruction>();
List<String> namedArguments = callStructure.namedArguments;
int nameIndex = 0;
for (; !arguments.isEmpty; arguments = arguments.tail) {
@@ -4039,8 +3887,7 @@ class SsaBuilder extends ast.Visitor
* Invariant: [element] must be an implementation element.
*/
List<HInstruction> makeStaticArgumentList(CallStructure callStructure,
- Link<ast.Node> arguments,
- FunctionElement element) {
+ Link<ast.Node> arguments, FunctionElement element) {
assert(invariant(element, element.isImplementation));
HInstruction compileArgument(ast.Node argument) {
@@ -4052,12 +3899,13 @@ class SsaBuilder extends ast.Visitor
arguments,
element,
compileArgument,
- backend.isJsInterop(element) ?
- handleConstantForOptionalParameterJsInterop :
- handleConstantForOptionalParameter);
+ backend.isJsInterop(element)
+ ? handleConstantForOptionalParameterJsInterop
+ : handleConstantForOptionalParameter);
}
- void addGenericSendArgumentsToList(Link<ast.Node> link, List<HInstruction> list) {
+ void addGenericSendArgumentsToList(
+ Link<ast.Node> link, List<HInstruction> list) {
for (; !link.isEmpty; link = link.tail) {
visit(link.head);
list.add(pop());
@@ -4081,7 +3929,7 @@ class SsaBuilder extends ast.Visitor
addDynamicSendArgumentsToList(node, inputs);
pushInvokeDynamic(node, selector, mask, inputs,
- sourceInformation: sourceInformation);
+ sourceInformation: sourceInformation);
if (selector.isSetter || selector.isIndexSet) {
pop();
stack.add(inputs.last);
@@ -4089,104 +3937,61 @@ class SsaBuilder extends ast.Visitor
}
@override
- visitDynamicPropertyInvoke(
- ast.Send node,
- ast.Node receiver,
- ast.NodeList arguments,
- Selector selector,
- _) {
+ visitDynamicPropertyInvoke(ast.Send node, ast.Node receiver,
+ ast.NodeList arguments, Selector selector, _) {
generateDynamicSend(node);
}
@override
- visitIfNotNullDynamicPropertyInvoke(
- ast.Send node,
- ast.Node receiver,
- ast.NodeList arguments,
- Selector selector,
- _) {
+ visitIfNotNullDynamicPropertyInvoke(ast.Send node, ast.Node receiver,
+ ast.NodeList arguments, Selector selector, _) {
/// Desugar `exp?.m()` to `(t1 = exp) == null ? t1 : t1.m()`
HInstruction receiver;
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleConditional(
- () {
- receiver = generateInstanceSendReceiver(node);
- pushCheckNull(receiver);
- },
- () => stack.add(receiver),
- () => _generateDynamicSend(node, receiver));
+ brancher.handleConditional(() {
+ receiver = generateInstanceSendReceiver(node);
+ pushCheckNull(receiver);
+ }, () => stack.add(receiver), () => _generateDynamicSend(node, receiver));
}
@override
visitThisPropertyInvoke(
- ast.Send node,
- ast.NodeList arguments,
- Selector selector,
- _) {
+ ast.Send node, ast.NodeList arguments, Selector selector, _) {
generateDynamicSend(node);
}
@override
- visitExpressionInvoke(
- ast.Send node,
- ast.Node expression,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- visitAndPop(expression),
+ visitExpressionInvoke(ast.Send node, ast.Node expression,
+ ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, visitAndPop(expression),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
visitThisInvoke(
- ast.Send node,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- localsHandler.readThis(),
+ ast.Send node, ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, localsHandler.readThis(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- visitParameterInvoke(
- ast.Send node,
- ParameterElement parameter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- localsHandler.readLocal(parameter),
+ visitParameterInvoke(ast.Send node, ParameterElement parameter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, localsHandler.readLocal(parameter),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- visitLocalVariableInvoke(
- ast.Send node,
- LocalVariableElement variable,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- localsHandler.readLocal(variable),
+ visitLocalVariableInvoke(ast.Send node, LocalVariableElement variable,
+ ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, localsHandler.readLocal(variable),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- visitLocalFunctionInvoke(
- ast.Send node,
- LocalFunctionElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- localsHandler.readLocal(function),
+ visitLocalFunctionInvoke(ast.Send node, LocalFunctionElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, localsHandler.readLocal(function),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@@ -4207,8 +4012,8 @@ class SsaBuilder extends ast.Visitor
// argument, which is the foreign code.
if (link.isEmpty || link.tail.isEmpty) {
// We should not get here because the call should be compiled to NSM.
- reporter.internalError(node.argumentsNode,
- 'At least two arguments expected.');
+ reporter.internalError(
+ node.argumentsNode, 'At least two arguments expected.');
}
native.NativeBehavior nativeBehavior =
compiler.enqueuer.resolution.nativeEnqueuer.getNativeBehaviorOf(node);
@@ -4217,12 +4022,11 @@ class SsaBuilder extends ast.Visitor
addGenericSendArgumentsToList(link.tail.tail, inputs);
if (nativeBehavior.codeTemplate.positionalArgumentCount != inputs.length) {
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text':
- 'Mismatch between number of placeholders'
- ' and number of arguments.'});
- stack.add(graph.addConstantNull(compiler)); // Result expected on stack.
+ reporter.reportErrorMessage(node, MessageKind.GENERIC, {
+ 'text': 'Mismatch between number of placeholders'
+ ' and number of arguments.'
+ });
+ stack.add(graph.addConstantNull(compiler)); // Result expected on stack.
return;
}
@@ -4236,18 +4040,15 @@ class SsaBuilder extends ast.Visitor
SourceInformation sourceInformation =
sourceInformationBuilder.buildCall(node, node.argumentsNode);
if (nativeBehavior.codeTemplate.isExpression) {
- push(new HForeignCode(
- nativeBehavior.codeTemplate, ssaType, inputs,
- effects: nativeBehavior.sideEffects,
- nativeBehavior: nativeBehavior)
- ..sourceInformation = sourceInformation);
+ push(new HForeignCode(nativeBehavior.codeTemplate, ssaType, inputs,
+ effects: nativeBehavior.sideEffects, nativeBehavior: nativeBehavior)
+ ..sourceInformation = sourceInformation);
} else {
- push(new HForeignCode(
- nativeBehavior.codeTemplate, ssaType, inputs,
+ push(new HForeignCode(nativeBehavior.codeTemplate, ssaType, inputs,
isStatement: true,
effects: nativeBehavior.sideEffects,
nativeBehavior: nativeBehavior)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
}
}
@@ -4262,8 +4063,8 @@ class SsaBuilder extends ast.Visitor
void handleForeignJsCurrentIsolateContext(ast.Send node) {
if (!node.arguments.isEmpty) {
- reporter.internalError(node,
- 'Too many arguments to JS_CURRENT_ISOLATE_CONTEXT.');
+ reporter.internalError(
+ node, 'Too many arguments to JS_CURRENT_ISOLATE_CONTEXT.');
}
if (!compiler.hasIsolateSupport) {
@@ -4271,9 +4072,7 @@ class SsaBuilder extends ast.Visitor
// to fetch the static state.
String name = backend.namer.staticStateHolder;
push(new HForeignCode(
- js.js.parseForeignJS(name),
- backend.dynamicType,
- <HInstruction>[],
+ js.js.parseForeignJS(name), backend.dynamicType, <HInstruction>[],
nativeBehavior: native.NativeBehavior.DEPENDS_OTHER));
} else {
// Call a helper method from the isolate library. The isolate
@@ -4281,8 +4080,7 @@ class SsaBuilder extends ast.Visitor
// Leg's isolate.
Element element = helpers.currentIsolate;
if (element == null) {
- reporter.internalError(node,
- 'Isolate library and compiler mismatch.');
+ reporter.internalError(node, 'Isolate library and compiler mismatch.');
}
pushInvokeStatic(null, element, [], typeMask: backend.dynamicType);
}
@@ -4290,89 +4088,79 @@ class SsaBuilder extends ast.Visitor
void handleForeignJsGetFlag(ast.Send node) {
List<ast.Node> arguments = node.arguments.toList();
- ast.Node argument;
- switch (arguments.length) {
- case 0:
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text': 'Error: Expected one argument to JS_GET_FLAG.'});
- return;
- case 1:
- argument = arguments[0];
- break;
- default:
- for (int i = 1; i < arguments.length; i++) {
- reporter.reportErrorMessage(
- arguments[i], MessageKind.GENERIC,
- {'text': 'Error: Extra argument to JS_GET_FLAG.'});
- }
- return;
- }
- ast.LiteralString string = argument.asLiteralString();
- if (string == null) {
- reporter.reportErrorMessage(
- argument, MessageKind.GENERIC,
- {'text': 'Error: Expected a literal string.'});
- }
- String name = string.dartString.slowToString();
- bool value = false;
- switch (name) {
- case 'MUST_RETAIN_METADATA':
- value = backend.mustRetainMetadata;
- break;
- case 'USE_CONTENT_SECURITY_POLICY':
- value = compiler.options.useContentSecurityPolicy;
- break;
- default:
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text': 'Error: Unknown internal flag "$name".'});
- }
- stack.add(graph.addConstantBool(value, compiler));
+ ast.Node argument;
+ switch (arguments.length) {
+ case 0:
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'Error: Expected one argument to JS_GET_FLAG.'});
+ return;
+ case 1:
+ argument = arguments[0];
+ break;
+ default:
+ for (int i = 1; i < arguments.length; i++) {
+ reporter.reportErrorMessage(arguments[i], MessageKind.GENERIC,
+ {'text': 'Error: Extra argument to JS_GET_FLAG.'});
+ }
+ return;
+ }
+ ast.LiteralString string = argument.asLiteralString();
+ if (string == null) {
+ reporter.reportErrorMessage(argument, MessageKind.GENERIC,
+ {'text': 'Error: Expected a literal string.'});
+ }
+ String name = string.dartString.slowToString();
+ bool value = false;
+ switch (name) {
+ case 'MUST_RETAIN_METADATA':
+ value = backend.mustRetainMetadata;
+ break;
+ case 'USE_CONTENT_SECURITY_POLICY':
+ value = compiler.options.useContentSecurityPolicy;
+ break;
+ default:
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'Error: Unknown internal flag "$name".'});
+ }
+ stack.add(graph.addConstantBool(value, compiler));
}
void handleForeignJsGetName(ast.Send node) {
List<ast.Node> arguments = node.arguments.toList();
ast.Node argument;
switch (arguments.length) {
- case 0:
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text': 'Error: Expected one argument to JS_GET_NAME.'});
- return;
- case 1:
- argument = arguments[0];
- break;
- default:
- for (int i = 1; i < arguments.length; i++) {
- reporter.reportErrorMessage(
- arguments[i], MessageKind.GENERIC,
- {'text': 'Error: Extra argument to JS_GET_NAME.'});
- }
- return;
+ case 0:
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'Error: Expected one argument to JS_GET_NAME.'});
+ return;
+ case 1:
+ argument = arguments[0];
+ break;
+ default:
+ for (int i = 1; i < arguments.length; i++) {
+ reporter.reportErrorMessage(arguments[i], MessageKind.GENERIC,
+ {'text': 'Error: Extra argument to JS_GET_NAME.'});
+ }
+ return;
}
Element element = elements[argument];
if (element == null ||
element is! FieldElement ||
element.enclosingClass != helpers.jsGetNameEnum) {
- reporter.reportErrorMessage(
- argument, MessageKind.GENERIC,
+ reporter.reportErrorMessage(argument, MessageKind.GENERIC,
{'text': 'Error: Expected a JsGetName enum value.'});
}
EnumClassElement enumClass = element.enclosingClass;
int index = enumClass.enumValues.indexOf(element);
- stack.add(
- addConstantStringFromName(
- backend.namer.getNameForJsGetName(
- argument, JsGetName.values[index])));
+ stack.add(addConstantStringFromName(
+ backend.namer.getNameForJsGetName(argument, JsGetName.values[index])));
}
void handleForeignJsBuiltin(ast.Send node) {
List<ast.Node> arguments = node.arguments.toList();
ast.Node argument;
if (arguments.length < 2) {
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
{'text': 'Error: Expected at least two arguments to JS_BUILTIN.'});
}
@@ -4380,8 +4168,7 @@ class SsaBuilder extends ast.Visitor
if (builtinElement == null ||
(builtinElement is! FieldElement) ||
builtinElement.enclosingClass != helpers.jsBuiltinEnum) {
- reporter.reportErrorMessage(
- argument, MessageKind.GENERIC,
+ reporter.reportErrorMessage(argument, MessageKind.GENERIC,
{'text': 'Error: Expected a JsBuiltin enum value.'});
}
EnumClassElement enumClass = builtinElement.enclosingClass;
@@ -4402,42 +4189,38 @@ class SsaBuilder extends ast.Visitor
TypeMask ssaType =
TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler);
- push(new HForeignCode(template,
- ssaType,
- compiledArguments,
- nativeBehavior: nativeBehavior));
+ push(new HForeignCode(template, ssaType, compiledArguments,
+ nativeBehavior: nativeBehavior));
}
void handleForeignJsEmbeddedGlobal(ast.Send node) {
List<ast.Node> arguments = node.arguments.toList();
ast.Node globalNameNode;
switch (arguments.length) {
- case 0:
- case 1:
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text': 'Error: Expected two arguments to JS_EMBEDDED_GLOBAL.'});
- return;
- case 2:
- // The type has been extracted earlier. We are only interested in the
- // name in this function.
- globalNameNode = arguments[1];
- break;
- default:
- for (int i = 2; i < arguments.length; i++) {
- reporter.reportErrorMessage(
- arguments[i], MessageKind.GENERIC,
- {'text': 'Error: Extra argument to JS_EMBEDDED_GLOBAL.'});
- }
- return;
+ case 0:
+ case 1:
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'Error: Expected two arguments to JS_EMBEDDED_GLOBAL.'});
+ return;
+ case 2:
+ // The type has been extracted earlier. We are only interested in the
+ // name in this function.
+ globalNameNode = arguments[1];
+ break;
+ default:
+ for (int i = 2; i < arguments.length; i++) {
+ reporter.reportErrorMessage(arguments[i], MessageKind.GENERIC,
+ {'text': 'Error: Extra argument to JS_EMBEDDED_GLOBAL.'});
+ }
+ return;
}
visit(globalNameNode);
HInstruction globalNameHNode = pop();
if (!globalNameHNode.isConstantString()) {
- reporter.reportErrorMessage(
- arguments[1], MessageKind.GENERIC,
- {'text': 'Error: Expected String as second argument '
- 'to JS_EMBEDDED_GLOBAL.'});
+ reporter.reportErrorMessage(arguments[1], MessageKind.GENERIC, {
+ 'text': 'Error: Expected String as second argument '
+ 'to JS_EMBEDDED_GLOBAL.'
+ });
return;
}
HConstant hConstant = globalNameHNode;
@@ -4450,7 +4233,7 @@ class SsaBuilder extends ast.Visitor
TypeMask ssaType =
TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler);
push(new HForeignCode(expr, ssaType, const [],
- nativeBehavior: nativeBehavior));
+ nativeBehavior: nativeBehavior));
}
void handleJsInterceptorConstant(ast.Send node) {
@@ -4472,8 +4255,7 @@ class SsaBuilder extends ast.Visitor
}
}
reporter.reportErrorMessage(
- node,
- MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
+ node, MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
stack.add(graph.addConstantNull(compiler));
}
@@ -4484,14 +4266,12 @@ class SsaBuilder extends ast.Visitor
// closure.
visit(link.tail.head);
push(new HInvokeClosure(new Selector.callClosure(0),
- <HInstruction>[pop()],
- backend.dynamicType));
+ <HInstruction>[pop()], backend.dynamicType));
} else {
// Call a helper method from the isolate library.
Element element = helpers.callInIsolate;
if (element == null) {
- reporter.internalError(node,
- 'Isolate library and compiler mismatch.');
+ reporter.internalError(node, 'Isolate library and compiler mismatch.');
}
List<HInstruction> inputs = <HInstruction>[];
addGenericSendArgumentsToList(link, inputs);
@@ -4501,14 +4281,14 @@ class SsaBuilder extends ast.Visitor
FunctionSignature handleForeignRawFunctionRef(ast.Send node, String name) {
if (node.arguments.isEmpty || !node.arguments.tail.isEmpty) {
- reporter.internalError(node.argumentsNode,
- '"$name" requires exactly one argument.');
+ reporter.internalError(
+ node.argumentsNode, '"$name" requires exactly one argument.');
}
ast.Node closure = node.arguments.head;
Element element = elements[closure];
if (!Elements.isStaticOrTopLevelFunction(element)) {
- reporter.internalError(closure,
- '"$name" requires a static or top-level method.');
+ reporter.internalError(
+ closure, '"$name" requires a static or top-level method.');
}
FunctionElement function = element;
// TODO(johnniwinther): Try to eliminate the need to distinguish declaration
@@ -4517,12 +4297,11 @@ class SsaBuilder extends ast.Visitor
FunctionElement implementation = function.implementation;
FunctionSignature params = implementation.functionSignature;
if (params.optionalParameterCount != 0) {
- reporter.internalError(closure,
- '"$name" does not handle closure with optional parameters.');
+ reporter.internalError(
+ closure, '"$name" does not handle closure with optional parameters.');
}
- registry?.registerStaticUse(
- new StaticUse.foreignUse(function));
+ registry?.registerStaticUse(new StaticUse.foreignUse(function));
push(new HForeignCode(
js.js.expressionTemplateYielding(
backend.emitter.staticFunctionAccess(function)),
@@ -4541,17 +4320,15 @@ class SsaBuilder extends ast.Visitor
void handleForeignJsSetStaticState(ast.Send node) {
if (node.arguments.isEmpty || !node.arguments.tail.isEmpty) {
- reporter.internalError(node.argumentsNode,
- 'Exactly one argument required.');
+ reporter.internalError(
+ node.argumentsNode, 'Exactly one argument required.');
}
visit(node.arguments.head);
String isolateName = backend.namer.staticStateHolder;
SideEffects sideEffects = new SideEffects.empty();
sideEffects.setAllSideEffects();
- push(new HForeignCode(
- js.js.parseForeignJS("$isolateName = #"),
- backend.dynamicType,
- <HInstruction>[pop()],
+ push(new HForeignCode(js.js.parseForeignJS("$isolateName = #"),
+ backend.dynamicType, <HInstruction>[pop()],
nativeBehavior: native.NativeBehavior.CHANGES_OTHER,
effects: sideEffects));
}
@@ -4561,9 +4338,8 @@ class SsaBuilder extends ast.Visitor
reporter.internalError(node.argumentsNode, 'Too many arguments.');
}
push(new HForeignCode(js.js.parseForeignJS(backend.namer.staticStateHolder),
- backend.dynamicType,
- <HInstruction>[],
- nativeBehavior: native.NativeBehavior.DEPENDS_OTHER));
+ backend.dynamicType, <HInstruction>[],
+ nativeBehavior: native.NativeBehavior.DEPENDS_OTHER));
}
void handleForeignSend(ast.Send node, FunctionElement element) {
@@ -4601,25 +4377,23 @@ class SsaBuilder extends ast.Visitor
}
}
- generateDeferredLoaderGet(ast.Send node,
- FunctionElement deferredLoader,
- SourceInformation sourceInformation) {
+ generateDeferredLoaderGet(ast.Send node, FunctionElement deferredLoader,
+ SourceInformation sourceInformation) {
// Until now we only handle these as getters.
invariant(node, deferredLoader.isDeferredLoaderGetter);
Element loadFunction = compiler.loadLibraryFunction;
PrefixElement prefixElement = deferredLoader.enclosingElement;
String loadId =
compiler.deferredLoadTask.getImportDeferName(node, prefixElement);
- var inputs = [graph.addConstantString(
- new ast.DartString.literal(loadId), compiler)];
+ var inputs = [
+ graph.addConstantString(new ast.DartString.literal(loadId), compiler)
+ ];
push(new HInvokeStatic(loadFunction, inputs, backend.nonNullType,
- targetCanThrow: false)
- ..sourceInformation = sourceInformation);
+ targetCanThrow: false)..sourceInformation = sourceInformation);
}
- generateSuperNoSuchMethodSend(ast.Send node,
- Selector selector,
- List<HInstruction> arguments) {
+ generateSuperNoSuchMethodSend(
+ ast.Send node, Selector selector, List<HInstruction> arguments) {
String name = selector.name;
ClassElement cls = currentNonClosureClass;
@@ -4638,8 +4412,8 @@ class SsaBuilder extends ast.Visitor
String publicName = name;
if (selector.isSetter) publicName += '=';
- ConstantValue nameConstant = constantSystem.createString(
- new ast.DartString.literal(publicName));
+ ConstantValue nameConstant =
+ constantSystem.createString(new ast.DartString.literal(publicName));
js.Name internalName = backend.namer.invocationName(selector);
@@ -4659,33 +4433,33 @@ class SsaBuilder extends ast.Visitor
ConstantValue kindConstant =
constantSystem.createInt(selector.invocationMirrorKind);
- pushInvokeStatic(null,
- createInvocationMirror,
- [graph.addConstant(nameConstant, compiler),
- graph.addConstantStringFromName(internalName, compiler),
- graph.addConstant(kindConstant, compiler),
- argumentsInstruction,
- argumentNamesInstruction],
- typeMask: backend.dynamicType);
+ pushInvokeStatic(
+ null,
+ createInvocationMirror,
+ [
+ graph.addConstant(nameConstant, compiler),
+ graph.addConstantStringFromName(internalName, compiler),
+ graph.addConstant(kindConstant, compiler),
+ argumentsInstruction,
+ argumentNamesInstruction
+ ],
+ typeMask: backend.dynamicType);
var inputs = <HInstruction>[pop()];
push(buildInvokeSuper(Selectors.noSuchMethod_, element, inputs));
}
/// Generate a call to a super method or constructor.
- void generateSuperInvoke(ast.Send node,
- FunctionElement function,
- SourceInformation sourceInformation) {
+ void generateSuperInvoke(ast.Send node, FunctionElement function,
+ SourceInformation sourceInformation) {
// TODO(5347): Try to avoid the need for calling [implementation] before
// calling [makeStaticArgumentList].
Selector selector = elements.getSelector(node);
- assert(invariant(node,
- selector.applies(function.implementation, compiler.world),
+ assert(invariant(
+ node, selector.applies(function.implementation, compiler.world),
message: "$selector does not apply to ${function.implementation}"));
- List<HInstruction> inputs =
- makeStaticArgumentList(selector.callStructure,
- node.arguments,
- function.implementation);
+ List<HInstruction> inputs = makeStaticArgumentList(
+ selector.callStructure, node.arguments, function.implementation);
push(buildInvokeSuper(selector, function, inputs, sourceInformation));
}
@@ -4701,22 +4475,17 @@ class SsaBuilder extends ast.Visitor
/// Invoke .call on the value retrieved from the super [element].
void handleSuperCallInvoke(ast.Send node, Element element) {
Selector selector = elements.getSelector(node);
- HInstruction target = buildInvokeSuper(
- selector, element, const <HInstruction>[],
- sourceInformationBuilder.buildGet(node));
+ HInstruction target = buildInvokeSuper(selector, element,
+ const <HInstruction>[], sourceInformationBuilder.buildGet(node));
add(target);
- generateCallInvoke(
- node,
- target,
+ generateCallInvoke(node, target,
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
/// Invoke super [method].
- void handleSuperMethodInvoke(
- ast.Send node,
- MethodElement method) {
- generateSuperInvoke(node, method,
- sourceInformationBuilder.buildCall(node, node.selector));
+ void handleSuperMethodInvoke(ast.Send node, MethodElement method) {
+ generateSuperInvoke(
+ node, method, sourceInformationBuilder.buildCall(node, node.selector));
}
/// Access an unresolved super property.
@@ -4731,185 +4500,116 @@ class SsaBuilder extends ast.Visitor
@override
void visitUnresolvedSuperIndex(
- ast.Send node,
- Element element,
- ast.Node index,
- _) {
+ ast.Send node, Element element, ast.Node index, _) {
handleUnresolvedSuperInvoke(node);
}
@override
void visitUnresolvedSuperUnary(
- ast.Send node,
- UnaryOperator operator,
- Element element,
- _) {
+ ast.Send node, UnaryOperator operator, Element element, _) {
handleUnresolvedSuperInvoke(node);
}
@override
- void visitUnresolvedSuperBinary(
- ast.Send node,
- Element element,
- BinaryOperator operator,
- ast.Node argument,
- _) {
+ void visitUnresolvedSuperBinary(ast.Send node, Element element,
+ BinaryOperator operator, ast.Node argument, _) {
handleUnresolvedSuperInvoke(node);
}
@override
- void visitUnresolvedSuperGet(
- ast.Send node,
- Element element,
- _) {
+ void visitUnresolvedSuperGet(ast.Send node, Element element, _) {
handleUnresolvedSuperInvoke(node);
}
@override
void visitUnresolvedSuperSet(
- ast.Send node,
- Element element,
- ast.Node rhs,
- _) {
+ ast.Send node, Element element, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperSetterGet(
- ast.Send node,
- MethodElement setter,
- _) {
+ void visitSuperSetterGet(ast.Send node, MethodElement setter, _) {
handleUnresolvedSuperInvoke(node);
}
@override
void visitUnresolvedSuperInvoke(
- ast.Send node,
- Element element,
- ast.Node argument,
- Selector selector,
- _) {
+ ast.Send node, Element element, ast.Node argument, Selector selector, _) {
handleUnresolvedSuperInvoke(node);
}
@override
- void visitSuperFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ void visitSuperFieldGet(ast.Send node, FieldElement field, _) {
handleSuperGet(node, field);
}
@override
- void visitSuperGetterGet(
- ast.Send node,
- MethodElement method,
- _) {
+ void visitSuperGetterGet(ast.Send node, MethodElement method, _) {
handleSuperGet(node, method);
}
@override
- void visitSuperMethodGet(
- ast.Send node,
- MethodElement method,
- _) {
+ void visitSuperMethodGet(ast.Send node, MethodElement method, _) {
handleSuperGet(node, method);
}
@override
- void visitSuperFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleSuperCallInvoke(node, field);
}
@override
- void visitSuperGetterInvoke(
- ast.Send node,
- MethodElement getter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperGetterInvoke(ast.Send node, MethodElement getter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleSuperCallInvoke(node, getter);
}
@override
- void visitSuperMethodInvoke(
- ast.Send node,
- MethodElement method,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperMethodInvoke(ast.Send node, MethodElement method,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleSuperMethodInvoke(node, method);
}
@override
- void visitSuperIndex(
- ast.Send node,
- MethodElement method,
- ast.Node index,
- _) {
+ void visitSuperIndex(ast.Send node, MethodElement method, ast.Node index, _) {
handleSuperMethodInvoke(node, method);
}
@override
void visitSuperEquals(
- ast.Send node,
- MethodElement method,
- ast.Node argument,
- _) {
+ ast.Send node, MethodElement method, ast.Node argument, _) {
handleSuperMethodInvoke(node, method);
}
@override
- void visitSuperBinary(
- ast.Send node,
- MethodElement method,
- BinaryOperator operator,
- ast.Node argument,
- _) {
+ void visitSuperBinary(ast.Send node, MethodElement method,
+ BinaryOperator operator, ast.Node argument, _) {
handleSuperMethodInvoke(node, method);
}
@override
void visitSuperNotEquals(
- ast.Send node,
- MethodElement method,
- ast.Node argument,
- _) {
+ ast.Send node, MethodElement method, ast.Node argument, _) {
handleSuperMethodInvoke(node, method);
pushWithPosition(new HNot(popBoolified(), backend.boolType), node.selector);
}
@override
void visitSuperUnary(
- ast.Send node,
- UnaryOperator operator,
- MethodElement method,
- _) {
+ ast.Send node, UnaryOperator operator, MethodElement method, _) {
handleSuperMethodInvoke(node, method);
}
@override
- void visitSuperMethodIncompatibleInvoke(
- ast.Send node,
- MethodElement method,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperMethodIncompatibleInvoke(ast.Send node, MethodElement method,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleInvalidSuperInvoke(node, arguments);
}
@override
- void visitSuperSetterInvoke(
- ast.Send node,
- SetterElement setter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperSetterInvoke(ast.Send node, SetterElement setter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleInvalidSuperInvoke(node, arguments);
}
@@ -4935,9 +4635,7 @@ class SsaBuilder extends ast.Visitor
* extract the type argument by the index of the variable in the list of type
* variables for that class.
*/
- HInstruction readTypeVariable(
- ClassElement cls,
- TypeVariableElement variable,
+ HInstruction readTypeVariable(ClassElement cls, TypeVariableElement variable,
{SourceInformation sourceInformation}) {
assert(sourceElement.isInstanceMember);
@@ -4949,20 +4647,14 @@ class SsaBuilder extends ast.Visitor
// string concatenation in the implementation), and may prevent
// segmentation of '$'.
js.Name substitutionName = backend.namer.runtimeTypeName(cls);
- HInstruction substitutionNameInstr = graph.addConstantStringFromName(
- substitutionName, compiler);
- pushInvokeStatic(null,
- helpers.getRuntimeTypeArgument,
- [target, substitutionNameInstr, index],
- typeMask: backend.dynamicType,
- sourceInformation: sourceInformation);
+ HInstruction substitutionNameInstr =
+ graph.addConstantStringFromName(substitutionName, compiler);
+ pushInvokeStatic(null, helpers.getRuntimeTypeArgument,
+ [target, substitutionNameInstr, index],
+ typeMask: backend.dynamicType, sourceInformation: sourceInformation);
} else {
- pushInvokeStatic(
- null,
- helpers.getTypeArgumentByIndex,
- [target, index],
- typeMask: backend.dynamicType,
- sourceInformation: sourceInformation);
+ pushInvokeStatic(null, helpers.getTypeArgumentByIndex, [target, index],
+ typeMask: backend.dynamicType, sourceInformation: sourceInformation);
}
return pop();
}
@@ -4972,16 +4664,14 @@ class SsaBuilder extends ast.Visitor
// fixed.
bool hasDirectLocal(Local local) {
return !localsHandler.isAccessedDirectly(local) ||
- localsHandler.directLocals[local] != null;
+ localsHandler.directLocals[local] != null;
}
/**
* Helper to create an instruction that gets the value of a type variable.
*/
- HInstruction addTypeVariableReference(
- TypeVariableType type,
+ HInstruction addTypeVariableReference(TypeVariableType type,
{SourceInformation sourceInformation}) {
-
assert(assertTypeInContext(type));
Element member = sourceElement;
bool isClosure = member.enclosingElement.isClosure;
@@ -4990,8 +4680,8 @@ class SsaBuilder extends ast.Visitor
member = closureClass.methodElement;
member = member.outermostEnclosingMemberOrTopLevel;
}
- bool isInConstructorContext = member.isConstructor ||
- member.isGenerativeConstructorBody;
+ bool isInConstructorContext =
+ member.isConstructor || member.isGenerativeConstructorBody;
Local typeVariableLocal = localsHandler.getTypeVariableAsLocal(type);
if (isClosure) {
if (member.isFactoryConstructor ||
@@ -4999,17 +4689,15 @@ class SsaBuilder extends ast.Visitor
// The type variable is used from a closure in a factory constructor.
// The value of the type argument is stored as a local on the closure
// itself.
- return localsHandler.readLocal(
- typeVariableLocal, sourceInformation: sourceInformation);
+ return localsHandler.readLocal(typeVariableLocal,
+ sourceInformation: sourceInformation);
} else if (member.isFunction ||
- member.isGetter ||
- member.isSetter ||
- isInConstructorContext) {
+ member.isGetter ||
+ member.isSetter ||
+ isInConstructorContext) {
// The type variable is stored on the "enclosing object" and needs to be
// accessed using the this-reference in the closure.
- return readTypeVariable(
- member.enclosingClass,
- type.element,
+ return readTypeVariable(member.enclosingClass, type.element,
sourceInformation: sourceInformation);
} else {
assert(member.isField);
@@ -5017,32 +4705,28 @@ class SsaBuilder extends ast.Visitor
return localsHandler.readLocal(typeVariableLocal);
}
} else if (isInConstructorContext ||
- // When [member] is a field, we can be either
- // generating a checked setter or inlining its
- // initializer in a constructor. An initializer is
- // never built standalone, so in that case [target] is not
- // the [member] itself.
- (member.isField && member != target)) {
+ // When [member] is a field, we can be either
+ // generating a checked setter or inlining its
+ // initializer in a constructor. An initializer is
+ // never built standalone, so in that case [target] is not
+ // the [member] itself.
+ (member.isField && member != target)) {
// The type variable is stored in a parameter of the method.
- return localsHandler.readLocal(
- typeVariableLocal, sourceInformation: sourceInformation);
+ return localsHandler.readLocal(typeVariableLocal,
+ sourceInformation: sourceInformation);
} else if (member.isInstanceMember) {
// The type variable is stored on the object.
- return readTypeVariable(
- member.enclosingClass,
- type.element,
+ return readTypeVariable(member.enclosingClass, type.element,
sourceInformation: sourceInformation);
} else {
- reporter.internalError(type.element,
- 'Unexpected type variable in static context.');
+ reporter.internalError(
+ type.element, 'Unexpected type variable in static context.');
return null;
}
}
- HInstruction analyzeTypeArgument(
- DartType argument,
+ HInstruction analyzeTypeArgument(DartType argument,
{SourceInformation sourceInformation}) {
-
assert(assertTypeInContext(argument));
if (argument.treatAsDynamic) {
// Represent [dynamic] as [null].
@@ -5050,16 +4734,16 @@ class SsaBuilder extends ast.Visitor
}
if (argument.isTypeVariable) {
- return addTypeVariableReference(
- argument, sourceInformation: sourceInformation);
+ return addTypeVariableReference(argument,
+ sourceInformation: sourceInformation);
}
List<HInstruction> inputs = <HInstruction>[];
js.Expression template =
rtiEncoder.getTypeRepresentationWithPlaceholders(argument, (variable) {
- inputs.add(addTypeVariableReference(variable));
- });
+ inputs.add(addTypeVariableReference(variable));
+ });
js.Template code = new js.Template(null, template);
HInstruction result = new HForeignCode(code, backend.stringType, inputs,
@@ -5068,9 +4752,8 @@ class SsaBuilder extends ast.Visitor
return result;
}
- HInstruction handleListConstructor(InterfaceType type,
- ast.Node currentNode,
- HInstruction newObject) {
+ HInstruction handleListConstructor(
+ InterfaceType type, ast.Node currentNode, HInstruction newObject) {
if (!backend.classNeedsRti(type.element) || type.treatAsRaw) {
return newObject;
}
@@ -5092,8 +4775,7 @@ class SsaBuilder extends ast.Visitor
}
HInstruction callSetRuntimeTypeInfo(ClassElement element,
- List<HInstruction> rtiInputs,
- HInstruction newObject) {
+ List<HInstruction> rtiInputs, HInstruction newObject) {
if (!backend.classNeedsRti(element) || element.typeVariables.isEmpty) {
return newObject;
}
@@ -5104,22 +4786,18 @@ class SsaBuilder extends ast.Visitor
// Set the runtime type information on the object.
Element typeInfoSetterElement = helpers.setRuntimeTypeInfo;
pushInvokeStatic(
- null,
- typeInfoSetterElement,
- <HInstruction>[newObject, typeInfo],
+ null, typeInfoSetterElement, <HInstruction>[newObject, typeInfo],
typeMask: backend.dynamicType,
sourceInformation: newObject.sourceInformation);
// The new object will now be referenced through the
// `setRuntimeTypeInfo` call. We therefore set the type of that
// instruction to be of the object's type.
- assert(invariant(
- CURRENT_ELEMENT_SPANNABLE,
+ assert(invariant(CURRENT_ELEMENT_SPANNABLE,
stack.last is HInvokeStatic || stack.last == newObject,
- message:
- "Unexpected `stack.last`: Found ${stack.last}, "
- "expected ${newObject} or an HInvokeStatic. "
- "State: element=$element, rtiInputs=$rtiInputs, stack=$stack."));
+ message: "Unexpected `stack.last`: Found ${stack.last}, "
+ "expected ${newObject} or an HInvokeStatic. "
+ "State: element=$element, rtiInputs=$rtiInputs, stack=$stack."));
stack.last.instructionType = newObject.instructionType;
return pop();
}
@@ -5136,9 +4814,9 @@ class SsaBuilder extends ast.Visitor
TypeMask computeType(element) {
Element originalElement = elements[send];
- if (isFixedListConstructorCall
- || Elements.isFilledListConstructorCall(
- originalElement, send, compiler)) {
+ if (isFixedListConstructorCall ||
+ Elements.isFilledListConstructorCall(
+ originalElement, send, compiler)) {
isFixedList = true;
TypeMask inferred =
TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
@@ -5152,7 +4830,7 @@ class SsaBuilder extends ast.Visitor
? backend.extendableArrayType
: inferred;
} else if (Elements.isConstructorOfTypedArraySubclass(
- originalElement, compiler)) {
+ originalElement, compiler)) {
isFixedList = true;
TypeMask inferred =
TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
@@ -5190,10 +4868,10 @@ class SsaBuilder extends ast.Visitor
if (isSymbolConstructor) {
constructor = compiler.symbolValidatedConstructor;
assert(invariant(send, constructor != null,
- message: 'Constructor Symbol.validated is missing'));
+ message: 'Constructor Symbol.validated is missing'));
callStructure = compiler.symbolValidatedConstructorSelector.callStructure;
assert(invariant(send, callStructure != null,
- message: 'Constructor Symbol.validated is missing'));
+ message: 'Constructor Symbol.validated is missing'));
}
bool isRedirected = constructorDeclaration.isRedirectingFactory;
@@ -5204,8 +4882,7 @@ class SsaBuilder extends ast.Visitor
while (target.isRedirectingFactory) {
if (constructorDeclaration.redirectionDeferredPrefix != null) {
generateIsDeferredLoadedCheckIfNeeded(
- target.redirectionDeferredPrefix,
- node);
+ target.redirectionDeferredPrefix, node);
}
target = target.immediateRedirectionTarget;
}
@@ -5241,8 +4918,8 @@ class SsaBuilder extends ast.Visitor
// calling [makeStaticArgumentList].
constructorImplementation = constructor.implementation;
if (constructorImplementation.isMalformed ||
- !callStructure.signatureApplies(
- constructorImplementation.functionSignature)) {
+ !callStructure
+ .signatureApplies(constructorImplementation.functionSignature)) {
generateWrongArgumentCountError(send, constructor, send.arguments);
return;
}
@@ -5254,16 +4931,18 @@ class SsaBuilder extends ast.Visitor
// Native class generative constructors take a pre-constructed object.
inputs.add(graph.addConstantNull(compiler));
}
- inputs.addAll(makeStaticArgumentList(callStructure,
- send.arguments,
- constructorImplementation));
+ inputs.addAll(makeStaticArgumentList(
+ callStructure, send.arguments, constructorImplementation));
TypeMask elementType = computeType(constructor);
if (isFixedListConstructorCall) {
if (!inputs[0].isNumber(compiler)) {
HTypeConversion conversion = new HTypeConversion(
- null, HTypeConversion.ARGUMENT_TYPE_CHECK, backend.numType,
- inputs[0], null);
+ null,
+ HTypeConversion.ARGUMENT_TYPE_CHECK,
+ backend.numType,
+ inputs[0],
+ null);
add(conversion);
inputs[0] = conversion;
}
@@ -5292,7 +4971,7 @@ class SsaBuilder extends ast.Visitor
// We set the instruction as [canThrow] to avoid it being dead code.
// We need a finer grained side effect.
add(new HForeignCode(code, backend.nullType, [stack.last],
- throwBehavior: native.NativeThrowBehavior.MAY));
+ throwBehavior: native.NativeThrowBehavior.MAY));
}
} else if (isGrowableListConstructorCall) {
push(buildLiteralList(<HInstruction>[]));
@@ -5323,8 +5002,9 @@ class SsaBuilder extends ast.Visitor
// this constructor to have the setRuntimeTypeInfo called where
// the 'new' is done.
if (backend.classNeedsRti(coreClasses.listClass) &&
- (isFixedListConstructorCall || isGrowableListConstructorCall ||
- isJSArrayTypedConstructor)) {
+ (isFixedListConstructorCall ||
+ isGrowableListConstructorCall ||
+ isJSArrayTypedConstructor)) {
newInstance = handleListConstructor(type, send, pop());
stack.add(newInstance);
}
@@ -5339,15 +5019,15 @@ class SsaBuilder extends ast.Visitor
}
}
- void potentiallyAddTypeArguments(List<HInstruction> inputs, ClassElement cls,
- InterfaceType expectedType,
- {SourceInformation sourceInformation}) {
+ void potentiallyAddTypeArguments(
+ List<HInstruction> inputs, ClassElement cls, InterfaceType expectedType,
+ {SourceInformation sourceInformation}) {
if (!backend.classNeedsRti(cls)) return;
assert(expectedType.typeArguments.isEmpty ||
cls.typeVariables.length == expectedType.typeArguments.length);
expectedType.typeArguments.forEach((DartType argument) {
- inputs.add(analyzeTypeArgument(
- argument, sourceInformation: sourceInformation));
+ inputs.add(
+ analyzeTypeArgument(argument, sourceInformation: sourceInformation));
});
}
@@ -5360,17 +5040,15 @@ class SsaBuilder extends ast.Visitor
new Map<DartType, Set<DartType>>();
bool definitelyFails = false;
- addTypeVariableBoundCheck(GenericType instance,
- DartType typeArgument,
- TypeVariableType typeVariable,
- DartType bound) {
+ addTypeVariableBoundCheck(GenericType instance, DartType typeArgument,
+ TypeVariableType typeVariable, DartType bound) {
if (definitelyFails) return;
- int subtypeRelation = compiler.types.computeSubtypeRelation(typeArgument, bound);
+ int subtypeRelation =
+ compiler.types.computeSubtypeRelation(typeArgument, bound);
if (subtypeRelation == Types.IS_SUBTYPE) return;
- String message =
- "Can't create an instance of malbounded type '$type': "
+ String message = "Can't create an instance of malbounded type '$type': "
"'${typeArgument}' is not a subtype of bound '${bound}' for "
"type variable '${typeVariable}' of type "
"${type == instance
@@ -5398,8 +5076,8 @@ class SsaBuilder extends ast.Visitor
}
for (InterfaceType supertype in type.element.allSupertypes) {
DartType instance = type.asInstanceOf(supertype.element);
- compiler.types.checkTypeVariableBounds(instance,
- addTypeVariableBoundCheck);
+ compiler.types
+ .checkTypeVariableBounds(instance, addTypeVariableBoundCheck);
if (definitelyFails) {
return true;
}
@@ -5413,13 +5091,9 @@ class SsaBuilder extends ast.Visitor
/// Generate an invocation to the static or top level [function].
void generateStaticFunctionInvoke(
- ast.Send node,
- FunctionElement function,
- CallStructure callStructure) {
+ ast.Send node, FunctionElement function, CallStructure callStructure) {
List<HInstruction> inputs = makeStaticArgumentList(
- callStructure,
- node.arguments,
- function.implementation);
+ callStructure, node.arguments, function.implementation);
if (function == compiler.identicalFunction) {
pushWithPosition(
@@ -5427,39 +5101,29 @@ class SsaBuilder extends ast.Visitor
return;
} else {
pushInvokeStatic(node, function, inputs,
- sourceInformation: sourceInformationBuilder.buildCall(
- node, node.selector));
+ sourceInformation:
+ sourceInformationBuilder.buildCall(node, node.selector));
}
}
/// Generate an invocation to a static or top level function with the wrong
/// number of arguments.
- void generateStaticFunctionIncompatibleInvoke(ast.Send node,
- Element element) {
+ void generateStaticFunctionIncompatibleInvoke(
+ ast.Send node, Element element) {
generateWrongArgumentCountError(node, element, node.arguments);
}
@override
- void visitStaticFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitStaticFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticFieldGet(node, field);
- generateCallInvoke(
- node,
- pop(),
+ generateCallInvoke(node, pop(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- void visitStaticFunctionInvoke(
- ast.Send node,
- MethodElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitStaticFunctionInvoke(ast.Send node, MethodElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticFunctionInvoke(node, function, callStructure);
}
@@ -5474,40 +5138,24 @@ class SsaBuilder extends ast.Visitor
}
@override
- void visitStaticGetterInvoke(
- ast.Send node,
- FunctionElement getter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitStaticGetterInvoke(ast.Send node, FunctionElement getter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticGetterGet(node, getter);
- generateCallInvoke(
- node,
- pop(),
+ generateCallInvoke(node, pop(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- void visitTopLevelFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitTopLevelFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticFieldGet(node, field);
- generateCallInvoke(
- node,
- pop(),
+ generateCallInvoke(node, pop(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- void visitTopLevelFunctionInvoke(
- ast.Send node,
- MethodElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitTopLevelFunctionInvoke(ast.Send node, MethodElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
if (backend.isForeign(function)) {
handleForeignSend(node, function);
} else {
@@ -5526,76 +5174,48 @@ class SsaBuilder extends ast.Visitor
}
@override
- void visitTopLevelGetterInvoke(
- ast.Send node,
- FunctionElement getter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitTopLevelGetterInvoke(ast.Send node, FunctionElement getter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticGetterGet(node, getter);
- generateCallInvoke(
- node,
- pop(),
+ generateCallInvoke(node, pop(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- void visitTopLevelSetterGet(
- ast.Send node,
- MethodElement setter,
- _) {
+ void visitTopLevelSetterGet(ast.Send node, MethodElement setter, _) {
handleInvalidStaticGet(node, setter);
}
@override
- void visitStaticSetterGet(
- ast.Send node,
- MethodElement setter,
- _) {
+ void visitStaticSetterGet(ast.Send node, MethodElement setter, _) {
handleInvalidStaticGet(node, setter);
}
@override
- void visitUnresolvedGet(
- ast.Send node,
- Element element,
- _) {
+ void visitUnresolvedGet(ast.Send node, Element element, _) {
generateStaticUnresolvedGet(node, element);
}
void handleInvalidStaticInvoke(ast.Send node, Element element) {
- generateThrowNoSuchMethod(node,
- noSuchMethodTargetSymbolString(element),
- argumentNodes: node.arguments);
+ generateThrowNoSuchMethod(node, noSuchMethodTargetSymbolString(element),
+ argumentNodes: node.arguments);
}
@override
- void visitStaticSetterInvoke(
- ast.Send node,
- MethodElement setter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitStaticSetterInvoke(ast.Send node, MethodElement setter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleInvalidStaticInvoke(node, setter);
}
@override
- void visitTopLevelSetterInvoke(
- ast.Send node,
- MethodElement setter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitTopLevelSetterInvoke(ast.Send node, MethodElement setter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleInvalidStaticInvoke(node, setter);
}
@override
- void visitUnresolvedInvoke(
- ast.Send node,
- Element element,
- ast.NodeList arguments,
- Selector selector,
- _) {
+ void visitUnresolvedInvoke(ast.Send node, Element element,
+ ast.NodeList arguments, Selector selector, _) {
if (element is ErroneousElement) {
// An erroneous element indicates that the function could not be
// resolved (a warning has been issued).
@@ -5616,70 +5236,43 @@ class SsaBuilder extends ast.Visitor
return graph.addConstantStringFromName(name, compiler);
}
- visitClassTypeLiteralGet(
- ast.Send node,
- ConstantExpression constant,
- _) {
+ visitClassTypeLiteralGet(ast.Send node, ConstantExpression constant, _) {
generateConstantTypeLiteral(node);
}
- visitClassTypeLiteralInvoke(
- ast.Send node,
- ConstantExpression constant,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ visitClassTypeLiteralInvoke(ast.Send node, ConstantExpression constant,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateConstantTypeLiteral(node);
generateTypeLiteralCall(node);
}
- visitTypedefTypeLiteralGet(
- ast.Send node,
- ConstantExpression constant,
- _) {
+ visitTypedefTypeLiteralGet(ast.Send node, ConstantExpression constant, _) {
generateConstantTypeLiteral(node);
}
- visitTypedefTypeLiteralInvoke(
- ast.Send node,
- ConstantExpression constant,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ visitTypedefTypeLiteralInvoke(ast.Send node, ConstantExpression constant,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateConstantTypeLiteral(node);
generateTypeLiteralCall(node);
}
visitTypeVariableTypeLiteralGet(
- ast.Send node,
- TypeVariableElement element,
- _) {
+ ast.Send node, TypeVariableElement element, _) {
generateTypeVariableLiteral(node, element.type);
}
- visitTypeVariableTypeLiteralInvoke(
- ast.Send node,
- TypeVariableElement element,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ visitTypeVariableTypeLiteralInvoke(ast.Send node, TypeVariableElement element,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateTypeVariableLiteral(node, element.type);
generateTypeLiteralCall(node);
}
- visitDynamicTypeLiteralGet(
- ast.Send node,
- ConstantExpression constant,
- _) {
+ visitDynamicTypeLiteralGet(ast.Send node, ConstantExpression constant, _) {
generateConstantTypeLiteral(node);
}
- visitDynamicTypeLiteralInvoke(
- ast.Send node,
- ConstantExpression constant,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ visitDynamicTypeLiteralInvoke(ast.Send node, ConstantExpression constant,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateConstantTypeLiteral(node);
generateTypeLiteralCall(node);
}
@@ -5697,18 +5290,14 @@ class SsaBuilder extends ast.Visitor
}
/// Generate the literal for [typeVariable] in the current context.
- void generateTypeVariableLiteral(ast.Send node,
- TypeVariableType typeVariable) {
+ void generateTypeVariableLiteral(
+ ast.Send node, TypeVariableType typeVariable) {
DartType type = localsHandler.substInContext(typeVariable);
HInstruction value = analyzeTypeArgument(type,
sourceInformation: sourceInformationBuilder.buildGet(node));
- pushInvokeStatic(node,
- helpers.runtimeTypeToString,
- [value],
- typeMask: backend.stringType);
- pushInvokeStatic(node,
- helpers.createRuntimeType,
- [pop()]);
+ pushInvokeStatic(node, helpers.runtimeTypeToString, [value],
+ typeMask: backend.stringType);
+ pushInvokeStatic(node, helpers.createRuntimeType, [pop()]);
}
/// Generate a call to a type literal.
@@ -5723,16 +5312,14 @@ class SsaBuilder extends ast.Visitor
}
/// Generate a '.call' invocation on [target].
- void generateCallInvoke(ast.Send node,
- HInstruction target,
- SourceInformation sourceInformation) {
+ void generateCallInvoke(
+ ast.Send node, HInstruction target, SourceInformation sourceInformation) {
Selector selector = elements.getSelector(node);
List<HInstruction> inputs = <HInstruction>[target];
addDynamicSendArgumentsToList(node, inputs);
push(new HInvokeClosure(
- new Selector.callClosureFrom(selector),
- inputs, backend.dynamicType)
- ..sourceInformation = sourceInformation);
+ new Selector.callClosureFrom(selector), inputs, backend.dynamicType)
+ ..sourceInformation = sourceInformation);
}
visitGetterSend(ast.Send node) {
@@ -5758,17 +5345,14 @@ class SsaBuilder extends ast.Visitor
}
void generateAbstractClassInstantiationError(ast.Node node, String message) {
- generateError(node,
- message,
- helpers.throwAbstractClassInstantiationError);
+ generateError(node, message, helpers.throwAbstractClassInstantiationError);
}
- void generateThrowNoSuchMethod(ast.Node diagnosticNode,
- String methodName,
- {Link<ast.Node> argumentNodes,
- List<HInstruction> argumentValues,
- List<String> existingArguments,
- SourceInformation sourceInformation}) {
+ void generateThrowNoSuchMethod(ast.Node diagnosticNode, String methodName,
+ {Link<ast.Node> argumentNodes,
+ List<HInstruction> argumentValues,
+ List<String> existingArguments,
+ SourceInformation sourceInformation}) {
Element helper = helpers.throwNoSuchMethod;
ConstantValue receiverConstant =
constantSystem.createString(new ast.DartString.empty());
@@ -5799,10 +5383,9 @@ class SsaBuilder extends ast.Visitor
} else {
existingNamesList = graph.addConstantNull(compiler);
}
- pushInvokeStatic(diagnosticNode,
- helper,
- [receiver, name, arguments, existingNamesList],
- sourceInformation: sourceInformation);
+ pushInvokeStatic(
+ diagnosticNode, helper, [receiver, name, arguments, existingNamesList],
+ sourceInformation: sourceInformation);
}
/**
@@ -5811,17 +5394,14 @@ class SsaBuilder extends ast.Visitor
* arguments.
*/
void generateWrongArgumentCountError(ast.Node diagnosticNode,
- FunctionElement function,
- Link<ast.Node> argumentNodes) {
+ FunctionElement function, Link<ast.Node> argumentNodes) {
List<String> existingArguments = <String>[];
FunctionSignature signature = function.functionSignature;
signature.forEachParameter((Element parameter) {
existingArguments.add(parameter.name);
});
- generateThrowNoSuchMethod(diagnosticNode,
- function.name,
- argumentNodes: argumentNodes,
- existingArguments: existingArguments);
+ generateThrowNoSuchMethod(diagnosticNode, function.name,
+ argumentNodes: argumentNodes, existingArguments: existingArguments);
}
@override
@@ -5842,8 +5422,7 @@ class SsaBuilder extends ast.Visitor
if (error.messageKind == MessageKind.CANNOT_FIND_CONSTRUCTOR ||
error.messageKind == MessageKind.CANNOT_FIND_UNNAMED_CONSTRUCTOR) {
generateThrowNoSuchMethod(
- node.send,
- noSuchMethodTargetSymbolString(error, 'constructor'),
+ node.send, noSuchMethodTargetSymbolString(error, 'constructor'),
argumentNodes: node.send.arguments);
} else {
MessageTemplate template = MessageTemplate.TEMPLATES[error.messageKind];
@@ -5877,26 +5456,20 @@ class SsaBuilder extends ast.Visitor
bulkHandleNew(node);
}
- void pushInvokeDynamic(ast.Node node,
- Selector selector,
- TypeMask mask,
- List<HInstruction> arguments,
- {SourceInformation sourceInformation}) {
-
+ void pushInvokeDynamic(ast.Node node, Selector selector, TypeMask mask,
+ List<HInstruction> arguments,
+ {SourceInformation sourceInformation}) {
// We prefer to not inline certain operations on indexables,
// because the constant folder will handle them better and turn
// them into simpler instructions that allow further
// optimizations.
bool isOptimizableOperationOnIndexable(Selector selector, Element element) {
- bool isLength = selector.isGetter
- && selector.name == "length";
+ bool isLength = selector.isGetter && selector.name == "length";
if (isLength || selector.isIndex) {
return compiler.world.isSubtypeOf(
- element.enclosingClass.declaration,
- helpers.jsIndexableClass);
+ element.enclosingClass.declaration, helpers.jsIndexableClass);
} else if (selector.isIndexSet) {
- return compiler.world.isSubtypeOf(
- element.enclosingClass.declaration,
+ return compiler.world.isSubtypeOf(element.enclosingClass.declaration,
helpers.jsMutableIndexableClass);
} else {
return false;
@@ -5940,35 +5513,32 @@ class SsaBuilder extends ast.Visitor
TypeMask type =
TypeMaskFactory.inferredTypeForSelector(selector, mask, compiler);
if (selector.isGetter) {
- push(
- new HInvokeDynamicGetter(selector, mask, null, inputs, type)
- ..sourceInformation = sourceInformation);
+ push(new HInvokeDynamicGetter(selector, mask, null, inputs, type)
+ ..sourceInformation = sourceInformation);
} else if (selector.isSetter) {
- push(
- new HInvokeDynamicSetter(selector, mask, null, inputs, type)
- ..sourceInformation = sourceInformation);
+ push(new HInvokeDynamicSetter(selector, mask, null, inputs, type)
+ ..sourceInformation = sourceInformation);
} else {
- push(
- new HInvokeDynamicMethod(selector, mask, inputs, type, isIntercepted)
- ..sourceInformation = sourceInformation);
+ push(new HInvokeDynamicMethod(selector, mask, inputs, type, isIntercepted)
+ ..sourceInformation = sourceInformation);
}
}
bool _hasNamedParameters(FunctionElement function) {
FunctionSignature params = function.functionSignature;
- return params.optionalParameterCount > 0
- && params.optionalParametersAreNamed;
+ return params.optionalParameterCount > 0 &&
+ params.optionalParametersAreNamed;
}
HForeignCode invokeJsInteropFunction(FunctionElement element,
- List<HInstruction> arguments,
- SourceInformation sourceInformation) {
+ List<HInstruction> arguments, SourceInformation sourceInformation) {
assert(backend.isJsInterop(element));
nativeEmitter.nativeMethods.add(element);
String templateString;
if (element.isFactoryConstructor &&
- backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass)) {
+ backend.jsInteropAnalysis
+ .hasAnonymousAnnotation(element.contextClass)) {
// Factory constructor that is syntactic sugar for creating a JavaScript
// object literal.
ConstructorElement constructor = element;
@@ -5980,7 +5550,7 @@ class SsaBuilder extends ast.Visitor
params.orderedForEachParameter((ParameterElement parameter) {
// TODO(jacobr): throw if parameter names do not match names of property
// names in the class.
- assert (parameter.isNamed);
+ assert(parameter.isNamed);
HInstruction argument = arguments[i];
if (argument != null) {
filteredArguments.add(argument);
@@ -5989,8 +5559,8 @@ class SsaBuilder extends ast.Visitor
}
i++;
});
- var codeTemplate = new js.Template(null,
- js.objectLiteral(parameterNameMap));
+ var codeTemplate =
+ new js.Template(null, js.objectLiteral(parameterNameMap));
var nativeBehavior = new native.NativeBehavior()
..codeTemplate = codeTemplate;
@@ -5998,13 +5568,12 @@ class SsaBuilder extends ast.Visitor
nativeBehavior.typesReturned.add(constructor.enclosingClass.thisType);
}
return new HForeignCode(
- codeTemplate,
- backend.dynamicType, filteredArguments,
+ codeTemplate, backend.dynamicType, filteredArguments,
nativeBehavior: nativeBehavior)
..sourceInformation = sourceInformation;
}
- var target = new HForeignCode(js.js.parseForeignJS(
- "${backend.namer.fixedBackendPath(element)}."
+ var target = new HForeignCode(
+ js.js.parseForeignJS("${backend.namer.fixedBackendPath(element)}."
"${backend.nativeData.getFixedBackendName(element)}"),
backend.dynamicType,
<HInstruction>[]);
@@ -6019,14 +5588,14 @@ class SsaBuilder extends ast.Visitor
var nativeBehavior = new native.NativeBehavior()
..sideEffects.setAllSideEffects();
- DartType type = element.isConstructor ?
- element.enclosingClass.thisType : element.type.returnType;
+ DartType type = element.isConstructor
+ ? element.enclosingClass.thisType
+ : element.type.returnType;
// Native behavior effects here are similar to native/behavior.dart.
// The return type is dynamic if we don't trust js-interop type
// declarations.
- nativeBehavior.typesReturned.add(
- compiler.options.trustJSInteropTypeAnnotations
- ? type : const DynamicType());
+ nativeBehavior.typesReturned.add(compiler
+ .options.trustJSInteropTypeAnnotations ? type : const DynamicType());
// The allocation effects include the declared type if it is native (which
// includes js interop types).
@@ -6036,10 +5605,11 @@ class SsaBuilder extends ast.Visitor
// It also includes any other JS interop type if we don't trust the
// annotation or if is declared too broad.
- if (!compiler.options.trustJSInteropTypeAnnotations || type.isObject ||
+ if (!compiler.options.trustJSInteropTypeAnnotations ||
+ type.isObject ||
type.isDynamic) {
- nativeBehavior.typesInstantiated.add(
- backend.helpers.jsJavaScriptObjectClass.thisType);
+ nativeBehavior.typesInstantiated
+ .add(backend.helpers.jsJavaScriptObjectClass.thisType);
}
String code;
@@ -6054,22 +5624,18 @@ class SsaBuilder extends ast.Visitor
js.Template codeTemplate = js.js.parseForeignJS(code);
nativeBehavior.codeTemplate = codeTemplate;
- return new HForeignCode(
- codeTemplate,
- backend.dynamicType, inputs,
- nativeBehavior: nativeBehavior)
- ..sourceInformation = sourceInformation;
+ return new HForeignCode(codeTemplate, backend.dynamicType, inputs,
+ nativeBehavior: nativeBehavior)..sourceInformation = sourceInformation;
}
- void pushInvokeStatic(ast.Node location,
- Element element,
- List<HInstruction> arguments,
- {TypeMask typeMask,
- InterfaceType instanceType,
- SourceInformation sourceInformation}) {
+ void pushInvokeStatic(
+ ast.Node location, Element element, List<HInstruction> arguments,
+ {TypeMask typeMask,
+ InterfaceType instanceType,
+ SourceInformation sourceInformation}) {
// TODO(johnniwinther): Use [sourceInformation] instead of [location].
if (tryInlineMethod(element, null, null, arguments, location,
- instanceType: instanceType)) {
+ instanceType: instanceType)) {
return;
}
@@ -6081,17 +5647,16 @@ class SsaBuilder extends ast.Visitor
// TODO(5346): Try to avoid the need for calling [declaration] before
var instruction;
if (backend.isJsInterop(element)) {
- instruction = invokeJsInteropFunction(element, arguments,
- sourceInformation);
+ instruction =
+ invokeJsInteropFunction(element, arguments, sourceInformation);
} else {
// creating an [HInvokeStatic].
- instruction = new HInvokeStatic(
- element.declaration, arguments, typeMask,
+ instruction = new HInvokeStatic(element.declaration, arguments, typeMask,
targetCanThrow: targetCanThrow)
..sourceInformation = sourceInformation;
if (!currentInlinedInstantiations.isEmpty) {
- instruction.instantiatedTypes = new List<DartType>.from(
- currentInlinedInstantiations);
+ instruction.instantiatedTypes =
+ new List<DartType>.from(currentInlinedInstantiations);
}
instruction.sideEffects = compiler.world.getSideEffectsOfElement(element);
}
@@ -6102,10 +5667,9 @@ class SsaBuilder extends ast.Visitor
}
}
- HInstruction buildInvokeSuper(Selector selector,
- Element element,
- List<HInstruction> arguments,
- [SourceInformation sourceInformation]) {
+ HInstruction buildInvokeSuper(
+ Selector selector, Element element, List<HInstruction> arguments,
+ [SourceInformation sourceInformation]) {
HInstruction receiver = localsHandler.readThis();
// TODO(5346): Try to avoid the need for calling [declaration] before
// creating an [HStatic].
@@ -6124,22 +5688,16 @@ class SsaBuilder extends ast.Visitor
} else {
type = TypeMaskFactory.inferredReturnTypeForElement(element, compiler);
}
- HInstruction instruction = new HInvokeSuper(
- element,
- currentNonClosureClass,
- selector,
- inputs,
- type,
- sourceInformation,
+ HInstruction instruction = new HInvokeSuper(element, currentNonClosureClass,
+ selector, inputs, type, sourceInformation,
isSetter: selector.isSetter || selector.isIndexSet);
instruction.sideEffects =
compiler.world.getSideEffectsOfSelector(selector, null);
return instruction;
}
- void handleComplexOperatorSend(ast.SendSet node,
- HInstruction receiver,
- Link<ast.Node> arguments) {
+ void handleComplexOperatorSend(
+ ast.SendSet node, HInstruction receiver, Link<ast.Node> arguments) {
HInstruction rhs;
if (node.isPrefix || node.isPostfix) {
rhs = graph.addConstantInt(1, compiler);
@@ -6155,7 +5713,7 @@ class SsaBuilder extends ast.Visitor
elements.getOperatorTypeMaskInComplexSendSet(node),
node,
sourceInformation:
- sourceInformationBuilder.buildGeneric(node.assignmentOperator));
+ sourceInformationBuilder.buildGeneric(node.assignmentOperator));
}
void handleSuperSendSet(ast.SendSet node) {
@@ -6163,10 +5721,9 @@ class SsaBuilder extends ast.Visitor
List<HInstruction> setterInputs = <HInstruction>[];
void generateSuperSendSet() {
Selector setterSelector = elements.getSelector(node);
- if (Elements.isUnresolved(element)
- || !setterSelector.applies(element, compiler.world)) {
- generateSuperNoSuchMethodSend(
- node, setterSelector, setterInputs);
+ if (Elements.isUnresolved(element) ||
+ !setterSelector.applies(element, compiler.world)) {
+ generateSuperNoSuchMethodSend(node, setterSelector, setterInputs);
pop();
} else {
add(buildInvokeSuper(setterSelector, element, setterInputs));
@@ -6195,25 +5752,21 @@ class SsaBuilder extends ast.Visitor
Selector getterSelector =
elements.getGetterSelectorInComplexSendSet(node);
if (Elements.isUnresolved(getter)) {
- generateSuperNoSuchMethodSend(
- node,
- getterSelector,
- getterInputs);
+ generateSuperNoSuchMethodSend(node, getterSelector, getterInputs);
getterInstruction = pop();
} else {
- getterInstruction = buildInvokeSuper(
- getterSelector, getter, getterInputs);
+ getterInstruction =
+ buildInvokeSuper(getterSelector, getter, getterInputs);
add(getterInstruction);
}
if (node.isIfNullAssignment) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleIfNull(() => stack.add(getterInstruction),
- () {
- addDynamicSendArgumentsToList(node, setterInputs);
- generateSuperSendSet();
- stack.add(setterInputs.last);
- });
+ brancher.handleIfNull(() => stack.add(getterInstruction), () {
+ addDynamicSendArgumentsToList(node, setterInputs);
+ generateSuperSendSet();
+ stack.add(setterInputs.last);
+ });
} else {
handleComplexOperatorSend(node, getterInstruction, arguments);
setterInputs.add(pop());
@@ -6237,66 +5790,43 @@ class SsaBuilder extends ast.Visitor
@override
void visitFinalSuperFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitSuperFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitSuperGetterSet(
- ast.SendSet node,
- FunctionElement getter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FunctionElement getter, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperIndexSet(
- ast.SendSet node,
- FunctionElement function,
- ast.Node index,
- ast.Node rhs,
- _) {
+ void visitSuperIndexSet(ast.SendSet node, FunctionElement function,
+ ast.Node index, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitSuperMethodSet(
- ast.Send node,
- MethodElement method,
- ast.Node rhs,
- _) {
+ ast.Send node, MethodElement method, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitSuperSetterSet(
- ast.SendSet node,
- FunctionElement setter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FunctionElement setter, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitUnresolvedSuperIndexSet(
- ast.Send node,
- Element element,
- ast.Node index,
- ast.Node rhs,
- _) {
+ ast.Send node, Element element, ast.Node index, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@@ -6323,24 +5853,14 @@ class SsaBuilder extends ast.Visitor
}
@override
- void visitUnresolvedSuperGetterIndexPrefix(
- ast.Send node,
- Element element,
- MethodElement setter,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitUnresolvedSuperGetterIndexPrefix(ast.Send node, Element element,
+ MethodElement setter, ast.Node index, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperGetterIndexPostfix(
- ast.Send node,
- Element element,
- MethodElement setter,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitUnresolvedSuperGetterIndexPostfix(ast.Send node, Element element,
+ MethodElement setter, ast.Node index, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@@ -6367,22 +5887,14 @@ class SsaBuilder extends ast.Visitor
}
@override
- void visitUnresolvedSuperIndexPrefix(
- ast.Send node,
- Element element,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitUnresolvedSuperIndexPrefix(ast.Send node, Element element,
+ ast.Node index, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperIndexPostfix(
- ast.Send node,
- Element element,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitUnresolvedSuperIndexPostfix(ast.Send node, Element element,
+ ast.Node index, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@@ -6423,209 +5935,124 @@ class SsaBuilder extends ast.Visitor
}
@override
- void visitUnresolvedSuperCompoundIndexSet(
- ast.Send node,
- Element element,
- ast.Node index,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSuperCompoundIndexSet(ast.Send node, Element element,
+ ast.Node index, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperFieldCompound(
- ast.Send node,
- FieldElement field,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperFieldCompound(ast.Send node, FieldElement field,
+ AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitFinalSuperFieldCompound(
- ast.Send node,
- FieldElement field,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitFinalSuperFieldCompound(ast.Send node, FieldElement field,
+ AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitFinalSuperFieldPrefix(
- ast.Send node,
- FieldElement field,
- IncDecOperator operator,
- _) {
+ ast.Send node, FieldElement field, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
void visitUnresolvedSuperPrefix(
- ast.Send node,
- Element element,
- IncDecOperator operator,
- _) {
+ ast.Send node, Element element, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
void visitUnresolvedSuperPostfix(
- ast.Send node,
- Element element,
- IncDecOperator operator,
- _) {
+ ast.Send node, Element element, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperCompound(
- ast.Send node,
- Element element,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSuperCompound(ast.Send node, Element element,
+ AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitFinalSuperFieldPostfix(
- ast.Send node,
- FieldElement field,
- IncDecOperator operator,
- _) {
+ ast.Send node, FieldElement field, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperFieldFieldCompound(
- ast.Send node,
- FieldElement readField,
- FieldElement writtenField,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperFieldFieldCompound(ast.Send node, FieldElement readField,
+ FieldElement writtenField, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperGetterSetterCompound(
- ast.Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperGetterSetterCompound(ast.Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperMethodSetterCompound(
- ast.Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperMethodSetterCompound(ast.Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperMethodCompound(
- ast.Send node,
- FunctionElement method,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperMethodCompound(ast.Send node, FunctionElement method,
+ AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperGetterCompound(
- ast.Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSuperGetterCompound(ast.Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperSetterCompound(
- ast.Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSuperSetterCompound(ast.Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperFieldSetterCompound(
- ast.Send node,
- FieldElement field,
- FunctionElement setter,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperFieldSetterCompound(ast.Send node, FieldElement field,
+ FunctionElement setter, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperGetterFieldCompound(
- ast.Send node,
- FunctionElement getter,
- FieldElement field,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperGetterFieldCompound(ast.Send node, FunctionElement getter,
+ FieldElement field, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitIndexSet(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, ast.Node index, ast.Node rhs, _) {
generateDynamicSend(node);
}
@override
- void visitCompoundIndexSet(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitCompoundIndexSet(ast.SendSet node, ast.Node receiver,
+ ast.Node index, AssignmentOperator operator, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
handleIndexSendSet(node);
}
@override
- void visitIndexPrefix(
- ast.Send node,
- ast.Node receiver,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitIndexPrefix(ast.Send node, ast.Node receiver, ast.Node index,
+ IncDecOperator operator, _) {
generateIsDeferredLoadedCheckOfSend(node);
handleIndexSendSet(node);
}
@override
- void visitIndexPostfix(
- ast.Send node,
- ast.Node receiver,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitIndexPostfix(ast.Send node, ast.Node receiver, ast.Node index,
+ IncDecOperator operator, _) {
generateIsDeferredLoadedCheckOfSend(node);
handleIndexSendSet(node);
}
@@ -6645,11 +6072,8 @@ class SsaBuilder extends ast.Visitor
index = pop();
}
- pushInvokeDynamic(
- node,
- elements.getGetterSelectorInComplexSendSet(node),
- elements.getGetterTypeMaskInComplexSendSet(node),
- [receiver, index]);
+ pushInvokeDynamic(node, elements.getGetterSelectorInComplexSendSet(node),
+ elements.getGetterTypeMaskInComplexSendSet(node), [receiver, index]);
HInstruction getterInstruction = pop();
if (node.isIfNullAssignment) {
// Compile x[i] ??= e as:
@@ -6658,26 +6082,19 @@ class SsaBuilder extends ast.Visitor
// t1 = x[i] = e;
// result = t1
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleIfNull(() => stack.add(getterInstruction),
- () {
- visit(arguments.head);
- HInstruction value = pop();
- pushInvokeDynamic(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- [receiver, index, value]);
- pop();
- stack.add(value);
- });
+ brancher.handleIfNull(() => stack.add(getterInstruction), () {
+ visit(arguments.head);
+ HInstruction value = pop();
+ pushInvokeDynamic(node, elements.getSelector(node),
+ elements.getTypeMask(node), [receiver, index, value]);
+ pop();
+ stack.add(value);
+ });
} else {
handleComplexOperatorSend(node, getterInstruction, arguments);
HInstruction value = pop();
- pushInvokeDynamic(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- [receiver, index, value]);
+ pushInvokeDynamic(node, elements.getSelector(node),
+ elements.getTypeMask(node), [receiver, index, value]);
pop();
if (node.isPostfix) {
stack.add(getterInstruction);
@@ -6689,37 +6106,21 @@ class SsaBuilder extends ast.Visitor
}
@override
- void visitThisPropertySet(
- ast.SendSet node,
- Name name,
- ast.Node rhs,
- _) {
+ void visitThisPropertySet(ast.SendSet node, Name name, ast.Node rhs, _) {
generateInstanceSetterWithCompiledReceiver(
- node,
- localsHandler.readThis(),
- visitAndPop(rhs));
+ node, localsHandler.readThis(), visitAndPop(rhs));
}
@override
void visitDynamicPropertySet(
- ast.SendSet node,
- ast.Node receiver,
- Name name,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, Name name, ast.Node rhs, _) {
generateInstanceSetterWithCompiledReceiver(
- node,
- generateInstanceSendReceiver(node),
- visitAndPop(rhs));
+ node, generateInstanceSendReceiver(node), visitAndPop(rhs));
}
@override
void visitIfNotNullDynamicPropertySet(
- ast.SendSet node,
- ast.Node receiver,
- Name name,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, Name name, ast.Node rhs, _) {
// compile e?.x = e2 to:
//
// t1 = e
@@ -6737,205 +6138,142 @@ class SsaBuilder extends ast.Visitor
() => stack.add(receiverInstruction),
() {
generateInstanceSetterWithCompiledReceiver(
- node,
- receiverInstruction,
- visitAndPop(rhs));
+ node, receiverInstruction, visitAndPop(rhs));
});
}
@override
void visitParameterSet(
- ast.SendSet node,
- ParameterElement parameter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ParameterElement parameter, ast.Node rhs, _) {
generateNonInstanceSetter(node, parameter, visitAndPop(rhs));
}
@override
void visitFinalParameterSet(
- ast.SendSet node,
- ParameterElement parameter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ParameterElement parameter, ast.Node rhs, _) {
generateNoSuchSetter(node, parameter, visitAndPop(rhs));
}
@override
void visitLocalVariableSet(
- ast.SendSet node,
- LocalVariableElement variable,
- ast.Node rhs,
- _) {
+ ast.SendSet node, LocalVariableElement variable, ast.Node rhs, _) {
generateNonInstanceSetter(node, variable, visitAndPop(rhs));
}
@override
void visitFinalLocalVariableSet(
- ast.SendSet node,
- LocalVariableElement variable,
- ast.Node rhs,
- _) {
+ ast.SendSet node, LocalVariableElement variable, ast.Node rhs, _) {
generateNoSuchSetter(node, variable, visitAndPop(rhs));
}
@override
void visitLocalFunctionSet(
- ast.SendSet node,
- LocalFunctionElement function,
- ast.Node rhs,
- _) {
+ ast.SendSet node, LocalFunctionElement function, ast.Node rhs, _) {
generateNoSuchSetter(node, function, visitAndPop(rhs));
}
@override
void visitTopLevelFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, field, visitAndPop(rhs));
}
@override
void visitFinalTopLevelFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, field, visitAndPop(rhs));
}
@override
void visitTopLevelGetterSet(
- ast.SendSet node,
- GetterElement getter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, GetterElement getter, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, getter, visitAndPop(rhs));
}
@override
void visitTopLevelSetterSet(
- ast.SendSet node,
- SetterElement setter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, SetterElement setter, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, setter, visitAndPop(rhs));
}
@override
void visitTopLevelFunctionSet(
- ast.SendSet node,
- MethodElement function,
- ast.Node rhs,
- _) {
+ ast.SendSet node, MethodElement function, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, function, visitAndPop(rhs));
}
@override
void visitStaticFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, field, visitAndPop(rhs));
}
@override
void visitFinalStaticFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, field, visitAndPop(rhs));
}
@override
void visitStaticGetterSet(
- ast.SendSet node,
- GetterElement getter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, GetterElement getter, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, getter, visitAndPop(rhs));
}
@override
void visitStaticSetterSet(
- ast.SendSet node,
- SetterElement setter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, SetterElement setter, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, setter, visitAndPop(rhs));
}
@override
void visitStaticFunctionSet(
- ast.SendSet node,
- MethodElement function,
- ast.Node rhs,
- _) {
+ ast.SendSet node, MethodElement function, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, function, visitAndPop(rhs));
}
@override
- void visitUnresolvedSet(
- ast.SendSet node,
- Element element,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSet(ast.SendSet node, Element element, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, element, visitAndPop(rhs));
}
@override
void visitClassTypeLiteralSet(
- ast.SendSet node,
- TypeConstantExpression constant,
- ast.Node rhs,
- _) {
+ ast.SendSet node, TypeConstantExpression constant, ast.Node rhs, _) {
generateThrowNoSuchMethod(node, constant.type.name,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
@override
void visitTypedefTypeLiteralSet(
- ast.SendSet node,
- TypeConstantExpression constant,
- ast.Node rhs,
- _) {
+ ast.SendSet node, TypeConstantExpression constant, ast.Node rhs, _) {
generateThrowNoSuchMethod(node, constant.type.name,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
@override
void visitDynamicTypeLiteralSet(
- ast.SendSet node,
- TypeConstantExpression constant,
- ast.Node rhs,
- _) {
+ ast.SendSet node, TypeConstantExpression constant, ast.Node rhs, _) {
generateThrowNoSuchMethod(node, constant.type.name,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
@override
void visitTypeVariableTypeLiteralSet(
- ast.SendSet node,
- TypeVariableElement element,
- ast.Node rhs,
- _) {
+ ast.SendSet node, TypeVariableElement element, ast.Node rhs, _) {
generateThrowNoSuchMethod(node, element.name,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
void handleCompoundSendSet(ast.SendSet node) {
@@ -6949,7 +6287,7 @@ class SsaBuilder extends ast.Visitor
} else {
ast.Identifier selector = node.selector;
generateThrowNoSuchMethod(node, selector.source,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
return;
}
@@ -6965,12 +6303,10 @@ class SsaBuilder extends ast.Visitor
HInstruction getterInstruction = pop();
if (node.isIfNullAssignment) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleIfNull(() => stack.add(getterInstruction),
- () {
- visit(node.arguments.head);
- generateInstanceSetterWithCompiledReceiver(
- node, receiver, pop());
- });
+ brancher.handleIfNull(() => stack.add(getterInstruction), () {
+ visit(node.arguments.head);
+ generateInstanceSetterWithCompiledReceiver(node, receiver, pop());
+ });
} else {
handleComplexOperatorSend(node, getterInstruction, node.arguments);
HInstruction value = pop();
@@ -6987,13 +6323,10 @@ class SsaBuilder extends ast.Visitor
// t1 == null ? t1 : (t1.x = t1.x op e2);
HInstruction receiver;
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleConditional(
- () {
- receiver = generateInstanceSendReceiver(node);
- pushCheckNull(receiver);
- },
- () => stack.add(receiver),
- () => generateAssignment(receiver));
+ brancher.handleConditional(() {
+ receiver = generateInstanceSendReceiver(node);
+ pushCheckNull(receiver);
+ }, () => stack.add(receiver), () => generateAssignment(receiver));
} else {
generateAssignment(generateInstanceSendReceiver(node));
}
@@ -7016,11 +6349,10 @@ class SsaBuilder extends ast.Visitor
HInstruction getterInstruction = pop();
if (node.isIfNullAssignment) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleIfNull(() => stack.add(getterInstruction),
- () {
- visit(node.arguments.head);
- generateNonInstanceSetter(node, element, pop());
- });
+ brancher.handleIfNull(() => stack.add(getterInstruction), () {
+ visit(node.arguments.head);
+ generateNonInstanceSetter(node, element, pop());
+ });
} else {
handleComplexOperatorSend(node, getterInstruction, node.arguments);
HInstruction value = pop();
@@ -7034,20 +6366,13 @@ class SsaBuilder extends ast.Visitor
@override
void handleDynamicCompounds(
- ast.Send node,
- ast.Node receiver,
- Name name,
- CompoundRhs rhs,
- _) {
+ ast.Send node, ast.Node receiver, Name name, CompoundRhs rhs, _) {
handleCompoundSendSet(node);
}
@override
void handleLocalCompounds(
- ast.SendSet node,
- LocalElement local,
- CompoundRhs rhs,
- _,
+ ast.SendSet node, LocalElement local, CompoundRhs rhs, _,
{bool isSetterValid}) {
handleCompoundSendSet(node);
}
@@ -7066,20 +6391,12 @@ class SsaBuilder extends ast.Visitor
@override
handleDynamicSetIfNulls(
- ast.Send node,
- ast.Node receiver,
- Name name,
- ast.Node rhs,
- arg) {
+ ast.Send node, ast.Node receiver, Name name, ast.Node rhs, arg) {
handleCompoundSendSet(node);
}
@override
- handleLocalSetIfNulls(
- ast.SendSet node,
- LocalElement local,
- ast.Node rhs,
- arg,
+ handleLocalSetIfNulls(ast.SendSet node, LocalElement local, ast.Node rhs, arg,
{bool isSetterValid}) {
handleCompoundSendSet(node);
}
@@ -7109,47 +6426,30 @@ class SsaBuilder extends ast.Visitor
}
@override
- handleSuperIndexSetIfNull(
- ast.SendSet node,
- Element indexFunction,
- Element indexSetFunction,
- ast.Node index,
- ast.Node rhs,
- arg,
- {bool isGetterValid,
- bool isSetterValid}) {
+ handleSuperIndexSetIfNull(ast.SendSet node, Element indexFunction,
+ Element indexSetFunction, ast.Node index, ast.Node rhs, arg,
+ {bool isGetterValid, bool isSetterValid}) {
handleCompoundSendSet(node);
}
@override
visitIndexSetIfNull(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- ast.Node rhs,
- arg,
- {bool isGetterValid,
- bool isSetterValid}) {
+ ast.SendSet node, ast.Node receiver, ast.Node index, ast.Node rhs, arg,
+ {bool isGetterValid, bool isSetterValid}) {
generateIsDeferredLoadedCheckOfSend(node);
handleIndexSendSet(node);
}
@override
handleTypeLiteralConstantSetIfNulls(
- ast.SendSet node,
- ConstantExpression constant,
- ast.Node rhs,
- arg) {
+ ast.SendSet node, ConstantExpression constant, ast.Node rhs, arg) {
// The type variable is never `null`.
generateConstantTypeLiteral(node);
}
@override
visitTypeVariableTypeLiteralSetIfNull(
- ast.Send node,
- TypeVariableElement element,
- ast.Node rhs,
- arg) {
+ ast.Send node, TypeVariableElement element, ast.Node rhs, arg) {
// The type variable is never `null`.
generateTypeVariableLiteral(node, element.type);
}
@@ -7194,9 +6494,7 @@ class SsaBuilder extends ast.Visitor
for (Link<ast.Node> link = node.nodes; !link.isEmpty; link = link.tail) {
if (isAborted()) {
reporter.reportHintMessage(
- link.head,
- MessageKind.GENERIC,
- {'text': 'dead code'});
+ link.head, MessageKind.GENERIC, {'text': 'dead code'});
} else {
visit(link.head);
}
@@ -7209,8 +6507,8 @@ class SsaBuilder extends ast.Visitor
visitOperator(ast.Operator node) {
// Operators are intercepted in their surrounding Send nodes.
- reporter.internalError(node,
- 'SsaBuilder.visitOperator should not be called.');
+ reporter.internalError(
+ node, 'SsaBuilder.visitOperator should not be called.');
}
visitCascade(ast.Cascade node) {
@@ -7236,14 +6534,12 @@ class SsaBuilder extends ast.Visitor
HInstruction exception = rethrowableException;
if (exception == null) {
exception = graph.addConstantNull(compiler);
- reporter.internalError(node,
- 'rethrowableException should not be null.');
+ reporter.internalError(node, 'rethrowableException should not be null.');
}
handleInTryStatement();
- closeAndGotoExit(
- new HThrow(exception,
- sourceInformationBuilder.buildThrow(node),
- isRethrow: true));
+ closeAndGotoExit(new HThrow(
+ exception, sourceInformationBuilder.buildThrow(node),
+ isRethrow: true));
}
visitRedirectingFactoryBody(ast.RedirectingFactoryBody node) {
@@ -7256,11 +6552,10 @@ class SsaBuilder extends ast.Visitor
redirectingConstructor.functionSignature;
List<Element> targetRequireds = targetSignature.requiredParameters;
- List<Element> redirectingRequireds
- = redirectingSignature.requiredParameters;
+ List<Element> redirectingRequireds =
+ redirectingSignature.requiredParameters;
- List<Element> targetOptionals =
- targetSignature.orderedOptionalParameters;
+ List<Element> targetOptionals = targetSignature.orderedOptionalParameters;
List<Element> redirectingOptionals =
redirectingSignature.orderedOptionalParameters;
@@ -7276,7 +6571,7 @@ class SsaBuilder extends ast.Visitor
if (position < redirectingRequireds.length) {
loadLocal(redirectingRequireds[position]);
} else if (position < redirectingSignature.parameterCount &&
- !redirectingSignature.optionalParametersAreNamed) {
+ !redirectingSignature.optionalParametersAreNamed) {
loadLocal(redirectingOptionals[position - redirectingRequireds.length]);
} else if (optionalParameter != null) {
inputs.add(handleConstantForOptionalParameter(optionalParameter));
@@ -7295,10 +6590,8 @@ class SsaBuilder extends ast.Visitor
if (targetOptionals.isNotEmpty) {
if (targetSignature.optionalParametersAreNamed) {
for (ParameterElement parameter in targetOptionals) {
- ParameterElement redirectingParameter =
- redirectingOptionals.firstWhere(
- (p) => p.name == parameter.name,
- orElse: () => null);
+ ParameterElement redirectingParameter = redirectingOptionals
+ .firstWhere((p) => p.name == parameter.name, orElse: () => null);
if (redirectingParameter == null) {
inputs.add(handleConstantForOptionalParameter(parameter));
} else {
@@ -7335,7 +6628,7 @@ class SsaBuilder extends ast.Visitor
///
/// We do not accept the internal Future implementation class.
bool isValidAsyncReturnType(DartType type) {
- assert (isBuildingAsyncFunction);
+ assert(isBuildingAsyncFunction);
// TODO(sigurdm): In an internal library a function could be declared:
//
// _FutureImpl foo async => 1;
@@ -7344,9 +6637,8 @@ class SsaBuilder extends ast.Visitor
// function is a `_FutureImpl`), but currently false is returned in this
// case.
return type.isDynamic ||
- type.isObject ||
- (type is InterfaceType &&
- type.element == coreClasses.futureClass);
+ type.isObject ||
+ (type is InterfaceType && type.element == coreClasses.futureClass);
}
visitReturn(ast.Return node) {
@@ -7363,9 +6655,8 @@ class SsaBuilder extends ast.Visitor
if (isBuildingAsyncFunction) {
if (compiler.options.enableTypeAssertions &&
!isValidAsyncReturnType(returnType)) {
- String message =
- "Async function returned a Future, "
- "was declared to return a $returnType.";
+ String message = "Async function returned a Future, "
+ "was declared to return a $returnType.";
generateTypeError(node, message);
pop();
return;
@@ -7399,20 +6690,19 @@ class SsaBuilder extends ast.Visitor
visit(node.expression);
HInstruction awaited = pop();
// TODO(herhut): Improve this type.
- push(new HAwait(awaited, new TypeMask.subclass(
- coreClasses.objectClass, compiler.world)));
+ push(new HAwait(awaited,
+ new TypeMask.subclass(coreClasses.objectClass, compiler.world)));
}
visitTypeAnnotation(ast.TypeAnnotation node) {
- reporter.internalError(node,
- 'Visiting type annotation in SSA builder.');
+ reporter.internalError(node, 'Visiting type annotation in SSA builder.');
}
visitVariableDefinitions(ast.VariableDefinitions node) {
assert(isReachable);
for (Link<ast.Node> link = node.definitions.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
ast.Node definition = link.head;
LocalElement local = elements[definition];
if (definition is ast.Identifier) {
@@ -7422,7 +6712,7 @@ class SsaBuilder extends ast.Visitor
ast.SendSet node = definition;
generateNonInstanceSetter(
node, local, visitAndPop(node.arguments.first));
- pop(); // Discard value.
+ pop(); // Discard value.
}
}
}
@@ -7449,8 +6739,8 @@ class SsaBuilder extends ast.Visitor
} else {
List<HInstruction> inputs = <HInstruction>[];
for (Link<ast.Node> link = node.elements.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
visit(link.head);
inputs.add(pop());
}
@@ -7468,8 +6758,7 @@ class SsaBuilder extends ast.Visitor
visitConditional(ast.Conditional node) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
brancher.handleConditional(() => visit(node.condition),
- () => visit(node.thenExpression),
- () => visit(node.elseExpression));
+ () => visit(node.thenExpression), () => visit(node.elseExpression));
}
visitStringInterpolation(ast.StringInterpolation node) {
@@ -7480,8 +6769,8 @@ class SsaBuilder extends ast.Visitor
visitStringInterpolationPart(ast.StringInterpolationPart node) {
// The parts are iterated in visitStringInterpolation.
- reporter.internalError(node,
- 'SsaBuilder.visitStringInterpolation should not be called.');
+ reporter.internalError(
+ node, 'SsaBuilder.visitStringInterpolation should not be called.');
}
visitEmptyStatement(ast.EmptyStatement node) {
@@ -7551,9 +6840,8 @@ class SsaBuilder extends ast.Visitor
visit(node.expression);
HInstruction expression = pop();
- pushInvokeStatic(node,
- helpers.streamIteratorConstructor,
- [expression, graph.addConstantNull(compiler)]);
+ pushInvokeStatic(node, helpers.streamIteratorConstructor,
+ [expression, graph.addConstantNull(compiler)]);
streamIterator = pop();
void buildInitializer() {}
@@ -7578,41 +6866,30 @@ class SsaBuilder extends ast.Visitor
TypeMask mask = elements.getTypeMask(identifier);
HInstruction value = pop();
- if (identifier.asSend() != null
- && Elements.isInstanceSend(identifier, elements)) {
+ if (identifier.asSend() != null &&
+ Elements.isInstanceSend(identifier, elements)) {
HInstruction receiver = generateInstanceSendReceiver(identifier);
assert(receiver != null);
- generateInstanceSetterWithCompiledReceiver(
- null,
- receiver,
- value,
- selector: selector,
- mask: mask,
- location: identifier);
+ generateInstanceSetterWithCompiledReceiver(null, receiver, value,
+ selector: selector, mask: mask, location: identifier);
} else {
- generateNonInstanceSetter(
- null, variable, value, location: identifier);
+ generateNonInstanceSetter(null, variable, value, location: identifier);
}
pop(); // Pop the value pushed by the setter call.
visit(node.body);
}
- void buildUpdate() {};
+ void buildUpdate() {}
+ ;
buildProtectedByFinally(() {
- handleLoop(node,
- buildInitializer,
- buildCondition,
- buildUpdate,
- buildBody);
+ handleLoop(
+ node, buildInitializer, buildCondition, buildUpdate, buildBody);
}, () {
- pushInvokeDynamic(node,
- Selectors.cancel,
- null,
- [streamIterator]);
- push(new HAwait(pop(), new TypeMask.subclass(
- coreClasses.objectClass, compiler.world)));
+ pushInvokeDynamic(node, Selectors.cancel, null, [streamIterator]);
+ push(new HAwait(pop(),
+ new TypeMask.subclass(coreClasses.objectClass, compiler.world)));
pop();
});
}
@@ -7689,17 +6966,12 @@ class SsaBuilder extends ast.Visitor
Elements.isInstanceSend(identifier, elements)) {
HInstruction receiver = generateInstanceSendReceiver(identifier);
assert(receiver != null);
- generateInstanceSetterWithCompiledReceiver(
- null,
- receiver,
- value,
- selector: selector,
- mask: mask,
- location: identifier);
+ generateInstanceSetterWithCompiledReceiver(null, receiver, value,
+ selector: selector, mask: mask, location: identifier);
} else {
generateNonInstanceSetter(null, variable, value, location: identifier);
}
- pop(); // Discard the value pushed by the setter call.
+ pop(); // Discard the value pushed by the setter call.
}
buildSyncForInIndexable(ast.ForIn node, TypeMask arrayType) {
@@ -7717,9 +6989,9 @@ class SsaBuilder extends ast.Visitor
TypeMask boolType = backend.boolType;
// These variables are shared by initializer, condition, body and update.
- HInstruction array; // Set in buildInitializer.
- bool isFixed; // Set in buildInitializer.
- HInstruction originalLength = null; // Set for growable lists.
+ HInstruction array; // Set in buildInitializer.
+ bool isFixed; // Set in buildInitializer.
+ HInstruction originalLength = null; // Set for growable lists.
HInstruction buildGetLength() {
Element lengthElement = helpers.jsIndexableLength;
@@ -7739,9 +7011,8 @@ class SsaBuilder extends ast.Visitor
//
HInstruction length = buildGetLength();
push(new HIdentity(length, originalLength, null, boolType));
- pushInvokeStatic(node,
- helpers.checkConcurrentModificationError,
- [pop(), array]);
+ pushInvokeStatic(
+ node, helpers.checkConcurrentModificationError, [pop(), array]);
pop();
}
@@ -7749,8 +7020,8 @@ class SsaBuilder extends ast.Visitor
visit(node.expression);
array = pop();
isFixed = isFixedLength(array.instructionType, compiler);
- localsHandler.updateLocal(indexVariable,
- graph.addConstantInt(0, compiler));
+ localsHandler.updateLocal(
+ indexVariable, graph.addConstantInt(0, compiler));
originalLength = buildGetLength();
}
@@ -7810,9 +7081,9 @@ class SsaBuilder extends ast.Visitor
visitLabeledStatement(ast.LabeledStatement node) {
ast.Statement body = node.statement;
- if (body is ast.Loop
- || body is ast.SwitchStatement
- || Elements.isUnusedLabel(node, elements)) {
+ if (body is ast.Loop ||
+ body is ast.SwitchStatement ||
+ Elements.isUnusedLabel(node, elements)) {
// Loops and switches handle their own labels.
visit(body);
return;
@@ -7843,8 +7114,8 @@ class SsaBuilder extends ast.Visitor
if (hasBreak) {
// There was at least one reachable break, so the label is needed.
entryBlock.setBlockFlow(
- new HLabeledBlockInformation(new HSubGraphBlockInformation(bodyGraph),
- handler.labels()),
+ new HLabeledBlockInformation(
+ new HSubGraphBlockInformation(bodyGraph), handler.labels()),
joinBlock);
}
handler.close();
@@ -7857,8 +7128,8 @@ class SsaBuilder extends ast.Visitor
}
List<HInstruction> listInputs = <HInstruction>[];
for (Link<ast.Node> link = node.entries.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
visit(link.head);
listInputs.add(pop());
listInputs.add(pop());
@@ -7917,8 +7188,8 @@ class SsaBuilder extends ast.Visitor
// dart2js unit tests).
TypeMask mapType =
new TypeMask.nonNullSubtype(helpers.mapLiteralClass, compiler.world);
- TypeMask returnTypeMask = TypeMaskFactory.inferredReturnTypeForElement(
- constructor, compiler);
+ TypeMask returnTypeMask =
+ TypeMaskFactory.inferredReturnTypeForElement(constructor, compiler);
TypeMask instructionType =
mapType.intersection(returnTypeMask, compiler.world);
@@ -7939,7 +7210,6 @@ class SsaBuilder extends ast.Visitor
Map<ast.CaseMatch, ConstantValue> buildSwitchCaseConstants(
ast.SwitchStatement node) {
-
Map<ast.CaseMatch, ConstantValue> constants =
new Map<ast.CaseMatch, ConstantValue>();
for (ast.SwitchCase switchCase in node.cases) {
@@ -7993,8 +7263,8 @@ class SsaBuilder extends ast.Visitor
* Builds a simple switch statement which does not handle uses of continue
* statements to labeled switch cases.
*/
- void buildSimpleSwitchStatement(ast.SwitchStatement node,
- Map<ast.CaseMatch, ConstantValue> constants) {
+ void buildSimpleSwitchStatement(
+ ast.SwitchStatement node, Map<ast.CaseMatch, ConstantValue> constants) {
JumpHandler jumpHandler = createJumpHandler(node, isLoopJump: false);
HInstruction buildExpression() {
visit(node.expression);
@@ -8015,13 +7285,8 @@ class SsaBuilder extends ast.Visitor
void buildSwitchCase(ast.SwitchCase node) {
visit(node.statements);
}
- handleSwitch(node,
- jumpHandler,
- buildExpression,
- node.cases,
- getConstants,
- isDefaultCase,
- buildSwitchCase);
+ handleSwitch(node, jumpHandler, buildExpression, node.cases, getConstants,
+ isDefaultCase, buildSwitchCase);
jumpHandler.close();
}
@@ -8029,10 +7294,11 @@ class SsaBuilder extends ast.Visitor
* Builds a switch statement that can handle arbitrary uses of continue
* statements to labeled switch cases.
*/
- void buildComplexSwitchStatement(ast.SwitchStatement node,
- Map<ast.CaseMatch, ConstantValue> constants,
- Map<ast.SwitchCase, int> caseIndex,
- bool hasDefault) {
+ void buildComplexSwitchStatement(
+ ast.SwitchStatement node,
+ Map<ast.CaseMatch, ConstantValue> constants,
+ Map<ast.SwitchCase, int> caseIndex,
+ bool hasDefault) {
// If the switch statement has switch cases targeted by continue
// statements we create the following encoding:
//
@@ -8104,17 +7370,11 @@ class SsaBuilder extends ast.Visitor
}
jumpTargets[switchTarget].generateBreak();
}
- handleSwitch(node,
- jumpHandler,
- buildExpression,
- switchCases,
- getConstants,
- isDefaultCase,
- buildSwitchCase);
+ handleSwitch(node, jumpHandler, buildExpression, switchCases, getConstants,
+ isDefaultCase, buildSwitchCase);
jumpHandler.close();
- HInstruction buildCondition() =>
- graph.addConstantBool(true, compiler);
+ HInstruction buildCondition() => graph.addConstantBool(true, compiler);
void buildSwitch() {
HInstruction buildExpression() {
@@ -8134,19 +7394,18 @@ class SsaBuilder extends ast.Visitor
// Pass a [NullJumpHandler] because the target for the contained break
// is not the generated switch statement but instead the loop generated
// in the call to [handleLoop] below.
- handleSwitch(node,
- new NullJumpHandler(reporter),
- buildExpression, node.cases, getConstants,
- (_) => false, // No case is default.
- buildSwitchCase);
+ handleSwitch(
+ node,
+ new NullJumpHandler(reporter),
+ buildExpression,
+ node.cases,
+ getConstants,
+ (_) => false, // No case is default.
+ buildSwitchCase);
}
void buildLoop() {
- handleLoop(node,
- () {},
- buildCondition,
- () {},
- buildSwitch);
+ handleLoop(node, () {}, buildCondition, () {}, buildSwitch);
}
if (hasDefault) {
@@ -8157,9 +7416,7 @@ class SsaBuilder extends ast.Visitor
void buildCondition() {
js.Template code = js.js.parseForeignJS('#');
push(new HForeignCode(
- code,
- backend.boolType,
- [localsHandler.readLocal(switchTarget)],
+ code, backend.boolType, [localsHandler.readLocal(switchTarget)],
nativeBehavior: native.NativeBehavior.PURE));
}
handleIf(node,
@@ -8189,7 +7446,6 @@ class SsaBuilder extends ast.Visitor
Iterable<ConstantValue> getConstants(ast.SwitchCase switchCase),
bool isDefaultCase(ast.SwitchCase switchCase),
void buildSwitchCase(ast.SwitchCase switchCase)) {
-
HBasicBlock expressionStart = openNewBlock();
HInstruction expression = buildExpression();
if (switchCases.isEmpty) {
@@ -8255,7 +7511,7 @@ class SsaBuilder extends ast.Visitor
});
jumpHandler.forEachContinue((HContinue instruction, LocalsHandler locals) {
assert(invariant(errorNode, false,
- message: 'Continue cannot target a switch.'));
+ message: 'Continue cannot target a switch.'));
});
if (!isAborted()) {
current.close(new HGoto());
@@ -8271,8 +7527,8 @@ class SsaBuilder extends ast.Visitor
close(new HGoto());
defaultCase.addSuccessor(joinBlock);
caseHandlers.add(savedLocals);
- statements.add(new HSubGraphBlockInformation(new SubGraph(
- defaultCase, defaultCase)));
+ statements.add(new HSubGraphBlockInformation(
+ new SubGraph(defaultCase, defaultCase)));
}
assert(caseHandlers.length == joinBlock.predecessors.length);
if (caseHandlers.length != 0) {
@@ -8289,13 +7545,11 @@ class SsaBuilder extends ast.Visitor
}
HSubExpressionBlockInformation expressionInfo =
- new HSubExpressionBlockInformation(new SubExpression(expressionStart,
- expressionEnd));
+ new HSubExpressionBlockInformation(
+ new SubExpression(expressionStart, expressionEnd));
expressionStart.setBlockFlow(
- new HSwitchBlockInformation(expressionInfo,
- statements,
- jumpHandler.target,
- jumpHandler.labels()),
+ new HSwitchBlockInformation(expressionInfo, statements,
+ jumpHandler.target, jumpHandler.labels()),
joinBlock);
jumpHandler.close();
@@ -8396,10 +7650,10 @@ class SsaBuilder extends ast.Visitor
open(exitBlock);
enterBlock.setBlockFlow(
new HTryBlockInformation(
- wrapStatementGraph(bodyGraph),
- null, // No catch-variable.
- null, // No catchGraph.
- wrapStatementGraph(finallyGraph)),
+ wrapStatementGraph(bodyGraph),
+ null, // No catch-variable.
+ null, // No catchGraph.
+ wrapStatementGraph(finallyGraph)),
exitBlock);
inTryStatement = oldInTryStatement;
}
@@ -8489,8 +7743,7 @@ class SsaBuilder extends ast.Visitor
if (catchBlock.exception != null) {
LocalVariableElement exceptionVariable =
elements[catchBlock.exception];
- localsHandler.updateLocal(exceptionVariable,
- unwrappedException);
+ localsHandler.updateLocal(exceptionVariable, unwrappedException);
}
ast.Node trace = catchBlock.trace;
if (trace != null) {
@@ -8504,24 +7757,20 @@ class SsaBuilder extends ast.Visitor
void visitElse() {
if (link.isEmpty) {
- closeAndGotoExit(
- new HThrow(exception,
- exception.sourceInformation,
- isRethrow: true));
+ closeAndGotoExit(new HThrow(exception, exception.sourceInformation,
+ isRethrow: true));
} else {
ast.CatchBlock newBlock = link.head;
- handleIf(node,
- visitCondition: () { pushCondition(newBlock); },
- visitThen: visitThen,
- visitElse: visitElse);
+ handleIf(node, visitCondition: () {
+ pushCondition(newBlock);
+ }, visitThen: visitThen, visitElse: visitElse);
}
}
ast.CatchBlock firstBlock = link.head;
- handleIf(node,
- visitCondition: () { pushCondition(firstBlock); },
- visitThen: visitThen,
- visitElse: visitElse);
+ handleIf(node, visitCondition: () {
+ pushCondition(firstBlock);
+ }, visitThen: visitThen, visitElse: visitElse);
if (!isAborted()) endCatchBlock = close(new HGoto());
rethrowableException = oldRethrowableException;
@@ -8542,7 +7791,9 @@ class SsaBuilder extends ast.Visitor
HBasicBlock exitBlock = graph.addNewBlock();
- addOptionalSuccessor(b1, b2) { if (b2 != null) b1.addSuccessor(b2); }
+ addOptionalSuccessor(b1, b2) {
+ if (b2 != null) b1.addSuccessor(b2);
+ }
addExitTrySuccessor(successor) {
if (successor == null) return;
// Iterate over all blocks created inside this try/catch, and
@@ -8596,11 +7847,8 @@ class SsaBuilder extends ast.Visitor
localsHandler = savedLocals;
open(exitBlock);
enterBlock.setBlockFlow(
- new HTryBlockInformation(
- wrapStatementGraph(bodyGraph),
- exception,
- wrapStatementGraph(catchGraph),
- wrapStatementGraph(finallyGraph)),
+ new HTryBlockInformation(wrapStatementGraph(bodyGraph), exception,
+ wrapStatementGraph(catchGraph), wrapStatementGraph(finallyGraph)),
exitBlock);
inTryStatement = oldInTryStatement;
}
@@ -8621,12 +7869,16 @@ class SsaBuilder extends ast.Visitor
* This method is invoked before inlining the body of [function] into this
* [SsaBuilder].
*/
- void enterInlinedMethod(FunctionElement function,
- ast.Node _,
- List<HInstruction> compiledArguments,
- {InterfaceType instanceType}) {
+ void enterInlinedMethod(FunctionElement function, ast.Node _,
+ List<HInstruction> compiledArguments,
+ {InterfaceType instanceType}) {
AstInliningState state = new AstInliningState(
- function, returnLocal, returnType, elements, stack, localsHandler,
+ function,
+ returnLocal,
+ returnType,
+ elements,
+ stack,
+ localsHandler,
inTryStatement,
allInlinedFunctionsCalledOnce && isFunctionCalledOnce(function));
inliningStack.add(state);
@@ -8634,8 +7886,8 @@ class SsaBuilder extends ast.Visitor
// Setting up the state of the (AST) builder is performed even when the
// inlined function is in IR, because the irInliner uses the [returnElement]
// of the AST builder.
- setupStateForInlining(
- function, compiledArguments, instanceType: instanceType);
+ setupStateForInlining(function, compiledArguments,
+ instanceType: instanceType);
}
void leaveInlinedMethod() {
@@ -8651,8 +7903,8 @@ class SsaBuilder extends ast.Visitor
void emitReturn(HInstruction value, ast.Node node) {
if (inliningStack.isEmpty) {
- closeAndGotoExit(new HReturn(value,
- sourceInformationBuilder.buildReturn(node)));
+ closeAndGotoExit(
+ new HReturn(value, sourceInformationBuilder.buildReturn(node)));
} else {
localsHandler.updateLocal(returnLocal, value);
}
@@ -8660,19 +7912,13 @@ class SsaBuilder extends ast.Visitor
@override
void handleTypeLiteralConstantCompounds(
- ast.SendSet node,
- ConstantExpression constant,
- CompoundRhs rhs,
- _) {
+ ast.SendSet node, ConstantExpression constant, CompoundRhs rhs, _) {
handleTypeLiteralCompound(node);
}
@override
void handleTypeVariableTypeLiteralCompounds(
- ast.SendSet node,
- TypeVariableElement typeVariable,
- CompoundRhs rhs,
- _) {
+ ast.SendSet node, TypeVariableElement typeVariable, CompoundRhs rhs, _) {
handleTypeLiteralCompound(node);
}
@@ -8680,43 +7926,29 @@ class SsaBuilder extends ast.Visitor
generateIsDeferredLoadedCheckOfSend(node);
ast.Identifier selector = node.selector;
generateThrowNoSuchMethod(node, selector.source,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
@override
- void visitConstantGet(
- ast.Send node,
- ConstantExpression constant,
- _) {
+ void visitConstantGet(ast.Send node, ConstantExpression constant, _) {
visitNode(node);
}
@override
- void visitConstantInvoke(
- ast.Send node,
- ConstantExpression constant,
- ast.NodeList arguments,
- CallStructure callStreucture,
- _) {
+ void visitConstantInvoke(ast.Send node, ConstantExpression constant,
+ ast.NodeList arguments, CallStructure callStreucture, _) {
visitNode(node);
}
@override
void errorUndefinedBinaryExpression(
- ast.Send node,
- ast.Node left,
- ast.Operator operator,
- ast.Node right,
- _) {
+ ast.Send node, ast.Node left, ast.Operator operator, ast.Node right, _) {
visitNode(node);
}
@override
void errorUndefinedUnaryExpression(
- ast.Send node,
- ast.Operator operator,
- ast.Node expression,
- _) {
+ ast.Send node, ast.Operator operator, ast.Node expression, _) {
visitNode(node);
}
@@ -8774,9 +8006,8 @@ class StringBuilderVisitor extends ast.Visitor {
TypeMask type = TypeMaskFactory.inferredTypeForSelector(
selector, expression.instructionType, compiler);
if (type.containsOnlyString(compiler.world)) {
- builder.pushInvokeDynamic(
- node, selector,
- expression.instructionType, <HInstruction>[expression]);
+ builder.pushInvokeDynamic(node, selector, expression.instructionType,
+ <HInstruction>[expression]);
append(builder.pop());
return;
}
@@ -8798,7 +8029,7 @@ class StringBuilderVisitor extends ast.Visitor {
}
void visitNodeList(ast.NodeList node) {
- node.visitChildren(this);
+ node.visitChildren(this);
}
void append(HInstruction expression) {
@@ -8806,8 +8037,8 @@ class StringBuilderVisitor extends ast.Visitor {
}
HInstruction concat(HInstruction left, HInstruction right) {
- HInstruction instruction = new HStringConcat(
- left, right, builder.backend.stringType);
+ HInstruction instruction =
+ new HStringConcat(left, right, builder.backend.stringType);
builder.add(instruction);
return instruction;
}
@@ -8842,22 +8073,17 @@ class InlineWeeder extends ast.Visitor {
final bool allowLoops;
final bool enableUserAssertions;
- InlineWeeder(this.maxInliningNodes,
- this.useMaxInliningNodes,
- this.allowLoops,
- this.enableUserAssertions);
+ InlineWeeder(this.maxInliningNodes, this.useMaxInliningNodes, this.allowLoops,
+ this.enableUserAssertions);
- static bool canBeInlined(FunctionElement function,
- int maxInliningNodes,
- bool useMaxInliningNodes,
- {bool allowLoops: false,
- bool enableUserAssertions: null}) {
+ static bool canBeInlined(
+ FunctionElement function, int maxInliningNodes, bool useMaxInliningNodes,
+ {bool allowLoops: false, bool enableUserAssertions: null}) {
assert(enableUserAssertions is bool); // Ensure we passed it.
if (function.resolvedAst.elements.containsTryStatement) return false;
- InlineWeeder weeder =
- new InlineWeeder(maxInliningNodes, useMaxInliningNodes, allowLoops,
- enableUserAssertions);
+ InlineWeeder weeder = new InlineWeeder(maxInliningNodes,
+ useMaxInliningNodes, allowLoops, enableUserAssertions);
ast.FunctionExpression functionExpression = function.node;
weeder.visit(functionExpression.initializers);
weeder.visit(functionExpression.body);
@@ -8936,8 +8162,7 @@ class InlineWeeder extends ast.Visitor {
void visitReturn(ast.Return node) {
if (!registerNode()) return;
- if (seenReturn
- || identical(node.beginToken.stringValue, 'native')) {
+ if (seenReturn || identical(node.beginToken.stringValue, 'native')) {
tooDifficult = true;
return;
}
@@ -8977,14 +8202,15 @@ class AstInliningState extends InliningState {
final bool inTryStatement;
final bool allFunctionsCalledOnce;
- AstInliningState(FunctionElement function,
- this.oldReturnLocal,
- this.oldReturnType,
- this.oldElements,
- this.oldStack,
- this.oldLocalsHandler,
- this.inTryStatement,
- this.allFunctionsCalledOnce)
+ AstInliningState(
+ FunctionElement function,
+ this.oldReturnLocal,
+ this.oldReturnType,
+ this.oldElements,
+ this.oldStack,
+ this.oldLocalsHandler,
+ this.inTryStatement,
+ this.allFunctionsCalledOnce)
: super(function);
}
@@ -9012,11 +8238,12 @@ class SsaBranchBuilder {
}
}
- void buildCondition(void visitCondition(),
- SsaBranch conditionBranch,
- SsaBranch thenBranch,
- SsaBranch elseBranch,
- SourceInformation sourceInformation) {
+ void buildCondition(
+ void visitCondition(),
+ SsaBranch conditionBranch,
+ SsaBranch thenBranch,
+ SsaBranch elseBranch,
+ SourceInformation sourceInformation) {
startBranch(conditionBranch);
visitCondition();
checkNotAborted();
@@ -9031,7 +8258,7 @@ class SsaBranchBuilder {
bool conditionBranchLocalsCanBeReused =
mergeLocals(conditionBranch, thenBranch, mayReuseFromLocals: true);
mergeLocals(conditionBranch, elseBranch,
- mayReuseFromLocals: conditionBranchLocalsCanBeReused);
+ mayReuseFromLocals: conditionBranchLocalsCanBeReused);
conditionBranch.graph =
new SubExpression(conditionBranch.block, conditionExitBlock);
@@ -9042,7 +8269,7 @@ class SsaBranchBuilder {
* return value implies that [mayReuseFromLocals] was set to [:true:].
*/
bool mergeLocals(SsaBranch fromBranch, SsaBranch toBranch,
- {bool mayReuseFromLocals}) {
+ {bool mayReuseFromLocals}) {
LocalsHandler fromLocals = fromBranch.exitLocals;
if (toBranch.startLocals == null) {
if (mayReuseFromLocals) {
@@ -9064,10 +8291,8 @@ class SsaBranchBuilder {
builder.open(branch.block);
}
- HInstruction buildBranch(SsaBranch branch,
- void visitBranch(),
- SsaBranch joinBranch,
- bool isExpression) {
+ HInstruction buildBranch(SsaBranch branch, void visitBranch(),
+ SsaBranch joinBranch, bool isExpression) {
startBranch(branch);
visitBranch();
branch.graph = new SubGraph(branch.block, builder.lastOpenedBlock);
@@ -9083,10 +8308,8 @@ class SsaBranchBuilder {
return null;
}
- handleIf(void visitCondition(),
- void visitThen(),
- void visitElse(),
- {SourceInformation sourceInformation}) {
+ handleIf(void visitCondition(), void visitThen(), void visitElse(),
+ {SourceInformation sourceInformation}) {
if (visitElse == null) {
// Make sure to have an else part to avoid a critical edge. A
// critical edge is an edge that connects a block with multiple
@@ -9096,30 +8319,24 @@ class SsaBranchBuilder {
visitElse = () {};
}
- _handleDiamondBranch(
- visitCondition, visitThen, visitElse, isExpression: false,
- sourceInformation: sourceInformation);
+ _handleDiamondBranch(visitCondition, visitThen, visitElse,
+ isExpression: false, sourceInformation: sourceInformation);
}
- handleConditional(void visitCondition(),
- void visitThen(),
- void visitElse()) {
+ handleConditional(void visitCondition(), void visitThen(), void visitElse()) {
assert(visitElse != null);
- _handleDiamondBranch(
- visitCondition, visitThen, visitElse, isExpression: true);
+ _handleDiamondBranch(visitCondition, visitThen, visitElse,
+ isExpression: true);
}
handleIfNull(void left(), void right()) {
// x ?? y is transformed into: x == null ? y : x
HInstruction leftExpression;
- handleConditional(
- () {
- left();
- leftExpression = builder.pop();
- builder.pushCheckNull(leftExpression);
- },
- right,
- () => builder.stack.add(leftExpression));
+ handleConditional(() {
+ left();
+ leftExpression = builder.pop();
+ builder.pushCheckNull(leftExpression);
+ }, right, () => builder.stack.add(leftExpression));
}
void handleLogicalAndOr(void left(), void right(), {bool isAnd}) {
@@ -9157,16 +8374,14 @@ class SsaBranchBuilder {
HConstant notIsAnd =
builder.graph.addConstantBool(!isAnd, builder.compiler);
JavaScriptBackend backend = builder.backend;
- HPhi result = new HPhi.manyInputs(null,
- <HInstruction>[boolifiedRight, notIsAnd],
- backend.dynamicType);
+ HPhi result = new HPhi.manyInputs(
+ null, <HInstruction>[boolifiedRight, notIsAnd], backend.dynamicType);
builder.current.addPhi(result);
builder.stack.add(result);
}
- void handleLogicalAndOrWithLeftNode(ast.Node left,
- void visitRight(),
- {bool isAnd}) {
+ void handleLogicalAndOrWithLeftNode(ast.Node left, void visitRight(),
+ {bool isAnd}) {
// This method is similar to [handleLogicalAndOr] but optimizes the case
// where left is a logical "and" or logical "or".
//
@@ -9182,27 +8397,24 @@ class SsaBranchBuilder {
// result = phi(t3, false);
ast.Send send = left.asSend();
- if (send != null &&
- (isAnd ? send.isLogicalAnd : send.isLogicalOr)) {
+ if (send != null && (isAnd ? send.isLogicalAnd : send.isLogicalOr)) {
ast.Node newLeft = send.receiver;
Link<ast.Node> link = send.argumentsNode.nodes;
assert(link.tail.isEmpty);
ast.Node middle = link.head;
handleLogicalAndOrWithLeftNode(
newLeft,
- () => handleLogicalAndOrWithLeftNode(middle, visitRight,
- isAnd: isAnd),
+ () =>
+ handleLogicalAndOrWithLeftNode(middle, visitRight, isAnd: isAnd),
isAnd: isAnd);
} else {
handleLogicalAndOr(() => builder.visit(left), visitRight, isAnd: isAnd);
}
}
- void _handleDiamondBranch(void visitCondition(),
- void visitThen(),
- void visitElse(),
- {bool isExpression,
- SourceInformation sourceInformation}) {
+ void _handleDiamondBranch(
+ void visitCondition(), void visitThen(), void visitElse(),
+ {bool isExpression, SourceInformation sourceInformation}) {
SsaBranch conditionBranch = new SsaBranch(this);
SsaBranch thenBranch = new SsaBranch(this);
SsaBranch elseBranch = new SsaBranch(this);
@@ -9212,7 +8424,7 @@ class SsaBranchBuilder {
builder.goto(builder.current, conditionBranch.block);
buildCondition(visitCondition, conditionBranch, thenBranch, elseBranch,
- sourceInformation);
+ sourceInformation);
HInstruction thenValue =
buildBranch(thenBranch, visitThen, joinBranch, isExpression);
HInstruction elseValue =
@@ -9234,11 +8446,10 @@ class SsaBranchBuilder {
joinBlock = joinBranch.block;
}
- HIfBlockInformation info =
- new HIfBlockInformation(
- new HSubExpressionBlockInformation(conditionBranch.graph),
- new HSubGraphBlockInformation(thenBranch.graph),
- new HSubGraphBlockInformation(elseBranch.graph));
+ HIfBlockInformation info = new HIfBlockInformation(
+ new HSubExpressionBlockInformation(conditionBranch.graph),
+ new HSubGraphBlockInformation(thenBranch.graph),
+ new HSubGraphBlockInformation(elseBranch.graph));
HBasicBlock conditionStartBlock = conditionBranch.block;
conditionStartBlock.setBlockFlow(info, joinBlock);
@@ -9261,8 +8472,7 @@ class TypeBuilder implements DartTypeVisitor<dynamic, SsaBuilder> {
builder.push(new HVoidType(type, new TypeMask.exact(cls, classWorld)));
}
- void visitTypeVariableType(TypeVariableType type,
- SsaBuilder builder) {
+ void visitTypeVariableType(TypeVariableType type, SsaBuilder builder) {
ClassElement cls = builder.backend.helpers.RuntimeType;
TypeMask instructionType = new TypeMask.subclass(cls, classWorld);
if (!builder.sourceElement.enclosingElement.isClosure &&
@@ -9270,9 +8480,8 @@ class TypeBuilder implements DartTypeVisitor<dynamic, SsaBuilder> {
HInstruction receiver = builder.localsHandler.readThis();
builder.push(new HReadTypeVariable(type, receiver, instructionType));
} else {
- builder.push(
- new HReadTypeVariable.noReceiver(
- type, builder.addTypeVariableReference(type), instructionType));
+ builder.push(new HReadTypeVariable.noReceiver(
+ type, builder.addTypeVariableReference(type), instructionType));
}
}
@@ -9295,15 +8504,14 @@ class TypeBuilder implements DartTypeVisitor<dynamic, SsaBuilder> {
List<String> names = type.namedParameters;
for (int index = 0; index < names.length; index++) {
ast.DartString dartString = new ast.DartString.literal(names[index]);
- inputs.add(
- builder.graph.addConstantString(dartString, builder.compiler));
+ inputs.add(builder.graph.addConstantString(dartString, builder.compiler));
namedParameterTypes[index].accept(this, builder);
inputs.add(builder.pop());
}
ClassElement cls = builder.backend.helpers.RuntimeFunctionType;
- builder.push(new HFunctionType(inputs, type,
- new TypeMask.exact(cls, classWorld)));
+ builder.push(
+ new HFunctionType(inputs, type, new TypeMask.exact(cls, classWorld)));
}
void visitMalformedType(MalformedType type, SsaBuilder builder) {
@@ -9326,8 +8534,8 @@ class TypeBuilder implements DartTypeVisitor<dynamic, SsaBuilder> {
} else {
cls = builder.backend.helpers.RuntimeTypeGeneric;
}
- builder.push(new HInterfaceType(inputs, type,
- new TypeMask.exact(cls, classWorld)));
+ builder.push(
+ new HInterfaceType(inputs, type, new TypeMask.exact(cls, classWorld)));
}
void visitTypedefType(TypedefType type, SsaBuilder builder) {
« no previous file with comments | « pkg/compiler/lib/src/source_file_provider.dart ('k') | pkg/compiler/lib/src/ssa/codegen.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698