| Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
|
| index b7d7cdfddfe5fe99039c1bac7d33dc0898ad8945..7927ba0277d21597e7657f93bdfbc29cf98e419d 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
|
| @@ -6,41 +6,30 @@ library dart2js.ir_builder;
|
|
|
| import '../closure.dart' as closure;
|
| import '../common.dart';
|
| -import '../common/names.dart' show
|
| - Names,
|
| - Selectors;
|
| -import '../compile_time_constants.dart' show
|
| - BackendConstantEnvironment;
|
| +import '../common/names.dart' show Names, Selectors;
|
| +import '../compile_time_constants.dart' show BackendConstantEnvironment;
|
| import '../constants/constant_system.dart';
|
| -import '../constants/values.dart' show
|
| - ConstantValue,
|
| - PrimitiveConstantValue;
|
| +import '../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
|
| import '../dart_types.dart';
|
| import '../elements/elements.dart';
|
| import '../io/source_information.dart';
|
| -import '../js/js.dart' as js show
|
| - js,
|
| - objectLiteral,
|
| - Expression,
|
| - LiteralStatement,
|
| - Template,
|
| - InterpolatedExpression,
|
| - isIdentityTemplate;
|
| -import '../native/native.dart' show
|
| - NativeBehavior;
|
| +import '../js/js.dart' as js
|
| + show
|
| + js,
|
| + objectLiteral,
|
| + Expression,
|
| + LiteralStatement,
|
| + Template,
|
| + InterpolatedExpression,
|
| + isIdentityTemplate;
|
| +import '../native/native.dart' show NativeBehavior;
|
| import '../tree/tree.dart' as ast;
|
| -import '../types/types.dart' show
|
| - TypeMask;
|
| -import '../universe/call_structure.dart' show
|
| - CallStructure;
|
| -import '../universe/selector.dart' show
|
| - Selector,
|
| - SelectorKind;
|
| -
|
| -import 'cps_ir_builder_task.dart' show
|
| - GlobalProgramInformation;
|
| -import 'cps_ir_nodes.dart' as ir;
|
| +import '../types/types.dart' show TypeMask;
|
| +import '../universe/call_structure.dart' show CallStructure;
|
| +import '../universe/selector.dart' show Selector, SelectorKind;
|
|
|
| +import 'cps_ir_builder_task.dart' show GlobalProgramInformation;
|
| +import 'cps_ir_nodes.dart' as ir;
|
|
|
| /// A mapping from variable elements to their compile-time values.
|
| ///
|
| @@ -110,7 +99,7 @@ class Environment {
|
|
|
| ir.Primitive lookup(Local element) {
|
| assert(invariant(element, variable2index.containsKey(element),
|
| - message: "Unknown variable: $element."));
|
| + message: "Unknown variable: $element."));
|
| return index2value[variable2index[element]];
|
| }
|
|
|
| @@ -158,8 +147,8 @@ abstract class JumpCollector {
|
| /// The environment is the one in effect at the point where the jump's
|
| /// continuation will be bound. Continuations can take an extra argument
|
| /// (see [addJump]).
|
| - JumpCollector(this._continuationEnvironment, this.target,
|
| - bool hasExtraArgument) {
|
| + JumpCollector(
|
| + this._continuationEnvironment, this.target, bool hasExtraArgument) {
|
| if (hasExtraArgument) _continuationEnvironment.extend(null, null);
|
| }
|
|
|
| @@ -168,7 +157,8 @@ abstract class JumpCollector {
|
| /// There is no jump target, it is implicitly the exit from the function.
|
| /// There is no environment at the destination.
|
| JumpCollector.retrn(this._continuation)
|
| - : _continuationEnvironment = null, target = null;
|
| + : _continuationEnvironment = null,
|
| + target = null;
|
|
|
| /// Construct a collector for collecting goto jumps.
|
| ///
|
| @@ -280,8 +270,8 @@ class ForwardJumpCollector extends JumpCollector {
|
| [ir.Primitive value, SourceInformation sourceInformation]) {
|
| assert(_continuation == null);
|
| _buildTryExit(builder);
|
| - ir.InvokeContinuation invoke = new ir.InvokeContinuation.uninitialized(
|
| - isEscapingTry: isEscapingTry);
|
| + ir.InvokeContinuation invoke =
|
| + new ir.InvokeContinuation.uninitialized(isEscapingTry: isEscapingTry);
|
| builder.add(invoke);
|
| _invocations.add(invoke);
|
| // Truncate the environment at the invocation site so it only includes
|
| @@ -316,8 +306,8 @@ class ForwardJumpCollector extends JumpCollector {
|
| int length = _continuationEnvironment.length;
|
| for (int varIndex = 0; varIndex < length; ++varIndex) {
|
| for (Environment invocationEnvironment in _invocationEnvironments) {
|
| - assert(invocationEnvironment.sameDomain(length,
|
| - _continuationEnvironment));
|
| + assert(invocationEnvironment.sameDomain(
|
| + length, _continuationEnvironment));
|
| if (invocationEnvironment[varIndex] !=
|
| _continuationEnvironment[varIndex]) {
|
| ir.Parameter parameter = new ir.Parameter(
|
| @@ -399,10 +389,9 @@ class BackwardJumpCollector extends JumpCollector {
|
| if (value != null) ++delta;
|
| if (delta > 0) builder.environment.discard(delta);
|
| if (value != null) builder.environment.extend(null, value);
|
| - builder.add(new ir.InvokeContinuation(_continuation,
|
| - builder.environment.index2value,
|
| - isRecursive: true,
|
| - isEscapingTry: isEscapingTry));
|
| + builder.add(new ir.InvokeContinuation(
|
| + _continuation, builder.environment.index2value,
|
| + isRecursive: true, isEscapingTry: isEscapingTry));
|
| builder._current = null;
|
| }
|
| }
|
| @@ -424,8 +413,7 @@ class ReturnJumpCollector extends JumpCollector {
|
| [ir.Primitive value, SourceInformation sourceInformation]) {
|
| isEmpty = false;
|
| builder.add(new ir.InvokeContinuation(continuation, <ir.Primitive>[value],
|
| - isEscapingTry: isEscapingTry,
|
| - sourceInformation: sourceInformation));
|
| + isEscapingTry: isEscapingTry, sourceInformation: sourceInformation));
|
| builder._current = null;
|
| }
|
| }
|
| @@ -444,7 +432,8 @@ class GotoJumpCollector extends JumpCollector {
|
| JumpCollector _breakJoin;
|
|
|
| GotoJumpCollector(JumpTarget target, this._stateVariableIndex,
|
| - this._stateValue, this._breakJoin) : super.goto(target);
|
| + this._stateValue, this._breakJoin)
|
| + : super.goto(target);
|
|
|
| void addJump(IrBuilder builder,
|
| [ir.Primitive value, SourceInformation sourceInformation]) {
|
| @@ -599,11 +588,10 @@ class IrBuilder {
|
| GlobalProgramInformation get program => state.program;
|
|
|
| IrBuilder(GlobalProgramInformation program,
|
| - BackendConstantEnvironment constants,
|
| - ExecutableElement currentElement)
|
| - : state = new IrBuilderSharedState(program, constants, currentElement),
|
| - environment = new Environment.empty(),
|
| - mutableVariables = <Local, ir.MutableVariable>{};
|
| + BackendConstantEnvironment constants, ExecutableElement currentElement)
|
| + : state = new IrBuilderSharedState(program, constants, currentElement),
|
| + environment = new Environment.empty(),
|
| + mutableVariables = <Local, ir.MutableVariable>{};
|
|
|
| IrBuilder._internal(this.state, this.environment, this.mutableVariables);
|
|
|
| @@ -630,8 +618,7 @@ class IrBuilder {
|
|
|
| /// Creates a [ir.MutableVariable] for the given local.
|
| void makeMutableVariable(Local local) {
|
| - mutableVariables[local] =
|
| - new ir.MutableVariable(local);
|
| + mutableVariables[local] = new ir.MutableVariable(local);
|
| }
|
|
|
| /// Remove an [ir.MutableVariable] for a local.
|
| @@ -650,8 +637,7 @@ class IrBuilder {
|
| bool get isOpen => root == null || _current != null;
|
|
|
| List<ir.Primitive> buildFunctionHeader(Iterable<Local> parameters,
|
| - {ClosureScope closureScope,
|
| - ClosureEnvironment env}) {
|
| + {ClosureScope closureScope, ClosureEnvironment env}) {
|
| _createThisParameter();
|
| _enterClosureEnvironment(env);
|
| _enterScope(closureScope);
|
| @@ -687,10 +673,8 @@ class IrBuilder {
|
| return primitive;
|
| }
|
|
|
| - ir.Primitive buildInvokeStatic(Element element,
|
| - Selector selector,
|
| - List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildInvokeStatic(Element element, Selector selector,
|
| + List<ir.Primitive> arguments, SourceInformation sourceInformation) {
|
| assert(!element.isLocal);
|
| assert(!element.isInstanceMember);
|
| assert(isOpen);
|
| @@ -701,41 +685,38 @@ class IrBuilder {
|
| new ir.InvokeStatic(element, selector, arguments, sourceInformation));
|
| }
|
|
|
| - ir.Primitive _buildInvokeSuper(Element target,
|
| - Selector selector,
|
| - List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive _buildInvokeSuper(Element target, Selector selector,
|
| + List<ir.Primitive> arguments, SourceInformation sourceInformation) {
|
| assert(target.isInstanceMember);
|
| assert(isOpen);
|
| return addPrimitive(new ir.InvokeMethodDirectly(
|
| buildThis(), target, selector, arguments, sourceInformation));
|
| }
|
|
|
| - ir.Primitive _buildInvokeDynamic(ir.Primitive receiver,
|
| - Selector selector,
|
| - TypeMask mask,
|
| - List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive _buildInvokeDynamic(
|
| + ir.Primitive receiver,
|
| + Selector selector,
|
| + TypeMask mask,
|
| + List<ir.Primitive> arguments,
|
| + SourceInformation sourceInformation) {
|
| assert(isOpen);
|
| - return addPrimitive(new ir.InvokeMethod(
|
| - receiver, selector, mask, arguments,
|
| + return addPrimitive(new ir.InvokeMethod(receiver, selector, mask, arguments,
|
| sourceInformation: sourceInformation));
|
| }
|
|
|
| - ir.Primitive _buildInvokeCall(ir.Primitive target,
|
| - CallStructure callStructure,
|
| - TypeMask mask,
|
| - List<ir.Definition> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive _buildInvokeCall(
|
| + ir.Primitive target,
|
| + CallStructure callStructure,
|
| + TypeMask mask,
|
| + List<ir.Definition> arguments,
|
| + SourceInformation sourceInformation) {
|
| Selector selector = callStructure.callSelector;
|
| return _buildInvokeDynamic(
|
| target, selector, mask, arguments, sourceInformation);
|
| }
|
|
|
| - ir.Primitive buildStaticNoSuchMethod(
|
| - Selector selector,
|
| - List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildStaticNoSuchMethod(Selector selector,
|
| + List<ir.Primitive> arguments, SourceInformation sourceInformation) {
|
| ir.Primitive receiver = buildStringConstant('');
|
| ir.Primitive name = buildStringConstant(selector.name);
|
| ir.Primitive argumentList = buildListLiteral(null, arguments);
|
| @@ -748,7 +729,7 @@ class IrBuilder {
|
|
|
| /// Create a [ir.Constant] from [value] and add it to the CPS term.
|
| ir.Constant buildConstant(ConstantValue value,
|
| - {SourceInformation sourceInformation}) {
|
| + {SourceInformation sourceInformation}) {
|
| assert(isOpen);
|
| return addPrimitive(
|
| new ir.Constant(value, sourceInformation: sourceInformation));
|
| @@ -787,9 +768,9 @@ class IrBuilder {
|
|
|
| /// Creates a non-constant list literal of the provided [type] and with the
|
| /// provided [values].
|
| - ir.Primitive buildListLiteral(InterfaceType type,
|
| - Iterable<ir.Primitive> values,
|
| - {TypeMask allocationSiteType}) {
|
| + ir.Primitive buildListLiteral(
|
| + InterfaceType type, Iterable<ir.Primitive> values,
|
| + {TypeMask allocationSiteType}) {
|
| assert(isOpen);
|
| return addPrimitive(new ir.LiteralList(type, values.toList(),
|
| allocationSiteType: allocationSiteType));
|
| @@ -832,12 +813,13 @@ class IrBuilder {
|
| ir.Continuation elseContinuation = new ir.Continuation([]);
|
| thenContinuation.body = thenBuilder.root;
|
| elseContinuation.body = elseBuilder.root;
|
| - add(new ir.LetCont(join.continuation,
|
| - new ir.LetCont.two(thenContinuation, elseContinuation,
|
| - new ir.Branch.strict(condition,
|
| - thenContinuation,
|
| - elseContinuation,
|
| - sourceInformation))));
|
| + add(new ir.LetCont(
|
| + join.continuation,
|
| + new ir.LetCont.two(
|
| + thenContinuation,
|
| + elseContinuation,
|
| + new ir.Branch.strict(condition, thenContinuation, elseContinuation,
|
| + sourceInformation))));
|
| environment = join.environment;
|
| return environment.discard(1);
|
| }
|
| @@ -863,12 +845,8 @@ class IrBuilder {
|
| ir.FunctionDefinition makeFunctionDefinition(
|
| SourceInformation sourceInformation) {
|
| _ensureReturn();
|
| - return new ir.FunctionDefinition(
|
| - state.currentElement,
|
| - state.thisParameter,
|
| - state.functionParameters,
|
| - state.returnContinuation,
|
| - root,
|
| + return new ir.FunctionDefinition(state.currentElement, state.thisParameter,
|
| + state.functionParameters, state.returnContinuation, root,
|
| sourceInformation: sourceInformation);
|
| }
|
|
|
| @@ -882,65 +860,51 @@ class IrBuilder {
|
| SourceInformation sourceInformation) {
|
| // TODO(johnniwinther): This shouldn't be necessary.
|
| SelectorKind kind = Elements.isOperatorName(method.name)
|
| - ? SelectorKind.OPERATOR : SelectorKind.CALL;
|
| - Selector selector =
|
| - new Selector(kind, method.memberName, callStructure);
|
| + ? SelectorKind.OPERATOR
|
| + : SelectorKind.CALL;
|
| + Selector selector = new Selector(kind, method.memberName, callStructure);
|
| return _buildInvokeSuper(method, selector, arguments, sourceInformation);
|
| }
|
|
|
| /// Create a read access of the [method] on the super class, i.e. a
|
| /// closurization of [method].
|
| - ir.Primitive buildSuperMethodGet(MethodElement method,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildSuperMethodGet(
|
| + MethodElement method, SourceInformation sourceInformation) {
|
| // TODO(johnniwinther): This should have its own ir node.
|
| - return _buildInvokeSuper(
|
| - method,
|
| - new Selector.getter(method.memberName),
|
| - const <ir.Primitive>[],
|
| - sourceInformation);
|
| + return _buildInvokeSuper(method, new Selector.getter(method.memberName),
|
| + const <ir.Primitive>[], sourceInformation);
|
| }
|
|
|
| /// Create a getter invocation of the [getter] on the super class.
|
| - ir.Primitive buildSuperGetterGet(MethodElement getter,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildSuperGetterGet(
|
| + MethodElement getter, SourceInformation sourceInformation) {
|
| // TODO(johnniwinther): This should have its own ir node.
|
| - return _buildInvokeSuper(
|
| - getter,
|
| - new Selector.getter(getter.memberName),
|
| - const <ir.Primitive>[],
|
| - sourceInformation);
|
| + return _buildInvokeSuper(getter, new Selector.getter(getter.memberName),
|
| + const <ir.Primitive>[], sourceInformation);
|
| }
|
|
|
| /// Create an setter invocation of the [setter] on the super class with
|
| /// [value].
|
| - ir.Primitive buildSuperSetterSet(MethodElement setter,
|
| - ir.Primitive value,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildSuperSetterSet(MethodElement setter, ir.Primitive value,
|
| + SourceInformation sourceInformation) {
|
| // TODO(johnniwinther): This should have its own ir node.
|
| - _buildInvokeSuper(
|
| - setter,
|
| - new Selector.setter(setter.memberName),
|
| - <ir.Primitive>[value],
|
| - sourceInformation);
|
| + _buildInvokeSuper(setter, new Selector.setter(setter.memberName),
|
| + <ir.Primitive>[value], sourceInformation);
|
| return value;
|
| }
|
|
|
| /// Create an invocation of the index [method] on the super class with
|
| /// the provided [index].
|
| - ir.Primitive buildSuperIndex(MethodElement method,
|
| - ir.Primitive index,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildSuperIndex(MethodElement method, ir.Primitive index,
|
| + SourceInformation sourceInformation) {
|
| return _buildInvokeSuper(
|
| - method, new Selector.index(), <ir.Primitive>[index],
|
| - sourceInformation);
|
| + method, new Selector.index(), <ir.Primitive>[index], sourceInformation);
|
| }
|
|
|
| /// Create an invocation of the index set [method] on the super class with
|
| /// the provided [index] and [value].
|
| - ir.Primitive buildSuperIndexSet(MethodElement method,
|
| - ir.Primitive index,
|
| - ir.Primitive value,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildSuperIndexSet(MethodElement method, ir.Primitive index,
|
| + ir.Primitive value, SourceInformation sourceInformation) {
|
| _buildInvokeSuper(method, new Selector.indexSet(),
|
| <ir.Primitive>[index, value], sourceInformation);
|
| return value;
|
| @@ -949,21 +913,20 @@ class IrBuilder {
|
| /// Create a dynamic invocation on [receiver] where the method name and
|
| /// argument structure are defined by [selector] and the argument values are
|
| /// defined by [arguments].
|
| - ir.Primitive buildDynamicInvocation(ir.Primitive receiver,
|
| - Selector selector,
|
| - TypeMask mask,
|
| - List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildDynamicInvocation(
|
| + ir.Primitive receiver,
|
| + Selector selector,
|
| + TypeMask mask,
|
| + List<ir.Primitive> arguments,
|
| + SourceInformation sourceInformation) {
|
| return _buildInvokeDynamic(
|
| receiver, selector, mask, arguments, sourceInformation);
|
| }
|
|
|
| /// Create a dynamic getter invocation on [receiver] where the getter name is
|
| /// defined by [selector].
|
| - ir.Primitive buildDynamicGet(ir.Primitive receiver,
|
| - Selector selector,
|
| - TypeMask mask,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildDynamicGet(ir.Primitive receiver, Selector selector,
|
| + TypeMask mask, SourceInformation sourceInformation) {
|
| assert(selector.isGetter);
|
| FieldElement field = program.locateSingleField(selector, mask);
|
| if (field != null) {
|
| @@ -978,11 +941,8 @@ class IrBuilder {
|
|
|
| /// Create a dynamic setter invocation on [receiver] where the setter name and
|
| /// argument are defined by [selector] and [value], respectively.
|
| - ir.Primitive buildDynamicSet(ir.Primitive receiver,
|
| - Selector selector,
|
| - TypeMask mask,
|
| - ir.Primitive value,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildDynamicSet(ir.Primitive receiver, Selector selector,
|
| + TypeMask mask, ir.Primitive value, SourceInformation sourceInformation) {
|
| assert(selector.isSetter);
|
| FieldElement field = program.locateSingleField(selector, mask);
|
| if (field != null) {
|
| @@ -990,22 +950,22 @@ class IrBuilder {
|
| // treated as a field access, since the setter might not be emitted.
|
| buildFieldSet(receiver, field, value, sourceInformation);
|
| } else {
|
| - _buildInvokeDynamic(receiver, selector, mask, <ir.Primitive>[value],
|
| - sourceInformation);
|
| + _buildInvokeDynamic(
|
| + receiver, selector, mask, <ir.Primitive>[value], sourceInformation);
|
| }
|
| return value;
|
| }
|
|
|
| /// Create a dynamic index set invocation on [receiver] with the provided
|
| /// [index] and [value].
|
| - ir.Primitive buildDynamicIndexSet(ir.Primitive receiver,
|
| - TypeMask mask,
|
| - ir.Primitive index,
|
| - ir.Primitive value,
|
| - SourceInformation sourceInformation) {
|
| - _buildInvokeDynamic(
|
| - receiver, new Selector.indexSet(), mask, <ir.Primitive>[index, value],
|
| - sourceInformation);
|
| + ir.Primitive buildDynamicIndexSet(
|
| + ir.Primitive receiver,
|
| + TypeMask mask,
|
| + ir.Primitive index,
|
| + ir.Primitive value,
|
| + SourceInformation sourceInformation) {
|
| + _buildInvokeDynamic(receiver, new Selector.indexSet(), mask,
|
| + <ir.Primitive>[index, value], sourceInformation);
|
| return value;
|
| }
|
|
|
| @@ -1019,42 +979,37 @@ class IrBuilder {
|
| SourceInformation sourceInformation) {
|
| // TODO(johnniwinther): Maybe this should have its own ir node.
|
| return buildCallInvocation(
|
| - buildLocalGet(function), callStructure, arguments,
|
| - sourceInformation);
|
| + buildLocalGet(function), callStructure, arguments, sourceInformation);
|
| }
|
|
|
| /// Create a static invocation of [function].
|
| ///
|
| /// The arguments are not named and their values are defined by [arguments].
|
| - ir.Primitive buildStaticFunctionInvocation(
|
| - MethodElement function,
|
| - List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildStaticFunctionInvocation(MethodElement function,
|
| + List<ir.Primitive> arguments, SourceInformation sourceInformation) {
|
| Selector selector = new Selector.call(
|
| function.memberName, new CallStructure(arguments.length));
|
| return buildInvokeStatic(function, selector, arguments, sourceInformation);
|
| }
|
|
|
| /// Create a getter invocation of the static [getter].
|
| - ir.Primitive buildStaticGetterGet(MethodElement getter,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildStaticGetterGet(
|
| + MethodElement getter, SourceInformation sourceInformation) {
|
| Selector selector = new Selector.getter(getter.memberName);
|
| return buildInvokeStatic(
|
| getter, selector, const <ir.Primitive>[], sourceInformation);
|
| }
|
|
|
| /// Create a write access to the static [field] with the [value].
|
| - ir.Primitive buildStaticFieldSet(FieldElement field,
|
| - ir.Primitive value,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildStaticFieldSet(FieldElement field, ir.Primitive value,
|
| + SourceInformation sourceInformation) {
|
| addPrimitive(new ir.SetStatic(field, value, sourceInformation));
|
| return value;
|
| }
|
|
|
| /// Create a setter invocation of the static [setter] with the [value].
|
| - ir.Primitive buildStaticSetterSet(MethodElement setter,
|
| - ir.Primitive value,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildStaticSetterSet(MethodElement setter, ir.Primitive value,
|
| + SourceInformation sourceInformation) {
|
| Selector selector = new Selector.setter(setter.memberName);
|
| buildInvokeStatic(
|
| setter, selector, <ir.Primitive>[value], sourceInformation);
|
| @@ -1064,23 +1019,18 @@ class IrBuilder {
|
| /// Create an erroneous invocation where argument structure is defined by
|
| /// [selector] and the argument values are defined by [arguments].
|
| // TODO(johnniwinther): Make this more fine-grained.
|
| - ir.Primitive buildErroneousInvocation(
|
| - Element element,
|
| - Selector selector,
|
| - List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildErroneousInvocation(Element element, Selector selector,
|
| + List<ir.Primitive> arguments, SourceInformation sourceInformation) {
|
| // TODO(johnniwinther): This should have its own ir node.
|
| return buildInvokeStatic(element, selector, arguments, sourceInformation);
|
| }
|
|
|
| /// Concatenate string values. The arguments must be strings.
|
| - ir.Primitive buildStringConcatenation(List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildStringConcatenation(
|
| + List<ir.Primitive> arguments, SourceInformation sourceInformation) {
|
| assert(isOpen);
|
| return addPrimitive(new ir.ApplyBuiltinOperator(
|
| - ir.BuiltinOperator.StringConcatenate,
|
| - arguments,
|
| - sourceInformation));
|
| + ir.BuiltinOperator.StringConcatenate, arguments, sourceInformation));
|
| }
|
|
|
| /// Create an invocation of the `call` method of [functionExpression], where
|
| @@ -1102,10 +1052,11 @@ class IrBuilder {
|
| /// An if-then statement is created if [buildElsePart] is a no-op.
|
| // TODO(johnniwinther): Unify implementation with [buildConditional] and
|
| // [_buildLogicalOperator].
|
| - void buildIf(ir.Primitive condition,
|
| - void buildThenPart(IrBuilder builder),
|
| - void buildElsePart(IrBuilder builder),
|
| - SourceInformation sourceInformation) {
|
| + void buildIf(
|
| + ir.Primitive condition,
|
| + void buildThenPart(IrBuilder builder),
|
| + void buildElsePart(IrBuilder builder),
|
| + SourceInformation sourceInformation) {
|
| assert(isOpen);
|
|
|
| // The then and else parts are delimited.
|
| @@ -1129,14 +1080,12 @@ class IrBuilder {
|
| ? <ir.Continuation>[elseContinuation, thenContinuation]
|
| : <ir.Continuation>[thenContinuation, elseContinuation];
|
|
|
| - ir.Expression result =
|
| - new ir.LetCont.many(arms,
|
| - new ir.Branch.strict(condition,
|
| - thenContinuation,
|
| - elseContinuation,
|
| - sourceInformation));
|
| + ir.Expression result = new ir.LetCont.many(
|
| + arms,
|
| + new ir.Branch.strict(
|
| + condition, thenContinuation, elseContinuation, sourceInformation));
|
|
|
| - JumpCollector join; // Null if there is no join.
|
| + JumpCollector join; // Null if there is no join.
|
| if (thenBuilder.isOpen && elseBuilder.isOpen) {
|
| // There is a join-point continuation. Build the term
|
| // 'let cont join(x, ...) = [] in Result' and plug invocations of the
|
| @@ -1181,9 +1130,10 @@ class IrBuilder {
|
|
|
| void addRecursiveContinuation(BackwardJumpCollector collector) {
|
| assert(environment.length == collector.environment.length);
|
| - add(new ir.LetCont(collector.continuation,
|
| - new ir.InvokeContinuation(collector.continuation,
|
| - environment.index2value)));
|
| + add(new ir.LetCont(
|
| + collector.continuation,
|
| + new ir.InvokeContinuation(
|
| + collector.continuation, environment.index2value)));
|
| environment = collector.environment;
|
| }
|
|
|
| @@ -1200,14 +1150,15 @@ class IrBuilder {
|
| ///
|
| /// [loopVariables] is the list of variables declared in the for-loop
|
| /// initializer.
|
| - void buildFor({SubbuildFunction buildInitializer,
|
| - SubbuildFunction buildCondition,
|
| - SourceInformation conditionSourceInformation,
|
| - SubbuildFunction buildBody,
|
| - SubbuildFunction buildUpdate,
|
| - JumpTarget target,
|
| - ClosureScope closureScope,
|
| - List<LocalElement> loopVariables}) {
|
| + void buildFor(
|
| + {SubbuildFunction buildInitializer,
|
| + SubbuildFunction buildCondition,
|
| + SourceInformation conditionSourceInformation,
|
| + SubbuildFunction buildBody,
|
| + SubbuildFunction buildUpdate,
|
| + JumpTarget target,
|
| + ClosureScope closureScope,
|
| + List<LocalElement> loopVariables}) {
|
| assert(isOpen);
|
|
|
| // For loops use four named continuations: the entry to the condition,
|
| @@ -1290,8 +1241,8 @@ class IrBuilder {
|
| // Connect the inner and outer body builders. This is done only after
|
| // it is guaranteed that the updateBuilder has a non-empty term.
|
| if (hasContinues) {
|
| - outerBodyBuilder.add(new ir.LetCont(continueCollector.continuation,
|
| - innerBodyBuilder.root));
|
| + outerBodyBuilder.add(new ir.LetCont(
|
| + continueCollector.continuation, innerBodyBuilder.root));
|
| continueCollector.continuation.body = updateBuilder.root;
|
| } else {
|
| outerBodyBuilder.add(innerBodyBuilder.root);
|
| @@ -1303,12 +1254,11 @@ class IrBuilder {
|
| bodyContinuation.body = outerBodyBuilder.root;
|
| // Note the order of continuations: the first one is the one that will
|
| // be filled by LetCont.plug.
|
| - ir.LetCont branch =
|
| - new ir.LetCont.two(exitContinuation, bodyContinuation,
|
| - new ir.Branch.strict(condition,
|
| - bodyContinuation,
|
| - exitContinuation,
|
| - conditionSourceInformation));
|
| + ir.LetCont branch = new ir.LetCont.two(
|
| + exitContinuation,
|
| + bodyContinuation,
|
| + new ir.Branch.strict(condition, bodyContinuation, exitContinuation,
|
| + conditionSourceInformation));
|
| // If there are breaks in the body, then there must be a join-point
|
| // continuation for the normal exit and the breaks. Otherwise, the
|
| // successor is translated in the hole in the exit continuation.
|
| @@ -1342,22 +1292,23 @@ class IrBuilder {
|
| /// [buildBody] creates the body, `b`, of the loop. The jump [target] is used
|
| /// to identify which `break` and `continue` statements that have this for-in
|
| /// statement as their target.
|
| - void buildForIn({SubbuildFunction buildExpression,
|
| - SubbuildFunction buildVariableDeclaration,
|
| - Element variableElement,
|
| - Selector variableSelector,
|
| - TypeMask variableMask,
|
| - SourceInformation variableSetSourceInformation,
|
| - TypeMask currentMask,
|
| - SourceInformation currentSourceInformation,
|
| - TypeMask iteratorMask,
|
| - SourceInformation iteratorSourceInformation,
|
| - TypeMask moveNextMask,
|
| - SourceInformation moveNextSourceInformation,
|
| - SubbuildFunction buildBody,
|
| - JumpTarget target,
|
| - ClosureScope closureScope,
|
| - SourceInformation conditionSourceInformation}) {
|
| + void buildForIn(
|
| + {SubbuildFunction buildExpression,
|
| + SubbuildFunction buildVariableDeclaration,
|
| + Element variableElement,
|
| + Selector variableSelector,
|
| + TypeMask variableMask,
|
| + SourceInformation variableSetSourceInformation,
|
| + TypeMask currentMask,
|
| + SourceInformation currentSourceInformation,
|
| + TypeMask iteratorMask,
|
| + SourceInformation iteratorSourceInformation,
|
| + TypeMask moveNextMask,
|
| + SourceInformation moveNextSourceInformation,
|
| + SubbuildFunction buildBody,
|
| + JumpTarget target,
|
| + ClosureScope closureScope,
|
| + SourceInformation conditionSourceInformation}) {
|
| // The for-in loop
|
| //
|
| // for (a in e) s;
|
| @@ -1377,11 +1328,8 @@ class IrBuilder {
|
| // in expressionReceiver.iterator () iteratorInvoked
|
| ir.Primitive expressionReceiver = buildExpression(this);
|
| List<ir.Primitive> emptyArguments = <ir.Primitive>[];
|
| - ir.Primitive iterator = addPrimitive(
|
| - new ir.InvokeMethod(expressionReceiver,
|
| - Selectors.iterator,
|
| - iteratorMask,
|
| - emptyArguments));
|
| + ir.Primitive iterator = addPrimitive(new ir.InvokeMethod(
|
| + expressionReceiver, Selectors.iterator, iteratorMask, emptyArguments));
|
|
|
| // Fill with:
|
| // let cont loop(x, ...) =
|
| @@ -1391,11 +1339,8 @@ class IrBuilder {
|
| // in loop(v, ...)
|
| JumpCollector loop = new BackwardJumpCollector(environment, target: target);
|
| addRecursiveContinuation(loop);
|
| - ir.Primitive condition = addPrimitive(
|
| - new ir.InvokeMethod(iterator,
|
| - Selectors.moveNext,
|
| - moveNextMask,
|
| - emptyArguments));
|
| + ir.Primitive condition = addPrimitive(new ir.InvokeMethod(
|
| + iterator, Selectors.moveNext, moveNextMask, emptyArguments));
|
|
|
| // As a delimited term, build:
|
| // <<BODY>> =
|
| @@ -1410,38 +1355,31 @@ class IrBuilder {
|
| if (buildVariableDeclaration != null) {
|
| buildVariableDeclaration(bodyBuilder);
|
| }
|
| - ir.Primitive currentValue = bodyBuilder.addPrimitive(
|
| - new ir.InvokeMethod(
|
| - iterator,
|
| - Selectors.current,
|
| - currentMask,
|
| - emptyArguments,
|
| - sourceInformation: currentSourceInformation));
|
| + ir.Primitive currentValue = bodyBuilder.addPrimitive(new ir.InvokeMethod(
|
| + iterator, Selectors.current, currentMask, emptyArguments,
|
| + sourceInformation: currentSourceInformation));
|
| // TODO(johnniwinther): Extract this as a provided strategy.
|
| if (Elements.isLocal(variableElement)) {
|
| bodyBuilder.buildLocalVariableSet(
|
| - variableElement,
|
| - currentValue,
|
| - variableSetSourceInformation);
|
| + variableElement, currentValue, variableSetSourceInformation);
|
| } else if (Elements.isError(variableElement) ||
|
| - Elements.isMalformed(variableElement)) {
|
| + Elements.isMalformed(variableElement)) {
|
| Selector selector = new Selector.setter(
|
| new Name(variableElement.name, variableElement.library));
|
| List<ir.Primitive> value = <ir.Primitive>[currentValue];
|
| // Note the comparison below. It can be the case that an element isError
|
| // and isMalformed.
|
| if (Elements.isError(variableElement)) {
|
| - bodyBuilder.buildStaticNoSuchMethod(selector, value,
|
| - variableSetSourceInformation);
|
| + bodyBuilder.buildStaticNoSuchMethod(
|
| + selector, value, variableSetSourceInformation);
|
| } else {
|
| bodyBuilder.buildErroneousInvocation(
|
| variableElement, selector, value, variableSetSourceInformation);
|
| }
|
| } else if (Elements.isStaticOrTopLevel(variableElement)) {
|
| if (variableElement.isField) {
|
| - bodyBuilder.addPrimitive(
|
| - new ir.SetStatic(
|
| - variableElement, currentValue, variableSetSourceInformation));
|
| + bodyBuilder.addPrimitive(new ir.SetStatic(
|
| + variableElement, currentValue, variableSetSourceInformation));
|
| } else {
|
| bodyBuilder.buildStaticSetterSet(
|
| variableElement, currentValue, variableSetSourceInformation);
|
| @@ -1449,9 +1387,8 @@ class IrBuilder {
|
| } else {
|
| ir.Primitive receiver = bodyBuilder.buildThis();
|
| assert(receiver != null);
|
| - bodyBuilder.buildDynamicSet(
|
| - receiver, variableSelector, variableMask, currentValue,
|
| - variableSetSourceInformation);
|
| + bodyBuilder.buildDynamicSet(receiver, variableSelector, variableMask,
|
| + currentValue, variableSetSourceInformation);
|
| }
|
|
|
| // Translate the body in the hole in the delimited term above, and add
|
| @@ -1477,12 +1414,11 @@ class IrBuilder {
|
| bodyContinuation.body = bodyBuilder.root;
|
| // Note the order of continuations: the first one is the one that will
|
| // be filled by LetCont.plug.
|
| - ir.LetCont branch =
|
| - new ir.LetCont.two(exitContinuation, bodyContinuation,
|
| - new ir.Branch.strict(condition,
|
| - bodyContinuation,
|
| - exitContinuation,
|
| - conditionSourceInformation));
|
| + ir.LetCont branch = new ir.LetCont.two(
|
| + exitContinuation,
|
| + bodyContinuation,
|
| + new ir.Branch.strict(condition, bodyContinuation, exitContinuation,
|
| + conditionSourceInformation));
|
| // If there are breaks in the body, then there must be a join-point
|
| // continuation for the normal exit and the breaks. Otherwise, the
|
| // successor is translated in the hole in the exit continuation.
|
| @@ -1505,11 +1441,12 @@ class IrBuilder {
|
| ///
|
| /// The jump [target] is used to identify which `break` and `continue`
|
| /// statements that have this `while` statement as their target.
|
| - void buildWhile({SubbuildFunction buildCondition,
|
| - SubbuildFunction buildBody,
|
| - JumpTarget target,
|
| - ClosureScope closureScope,
|
| - SourceInformation sourceInformation}) {
|
| + void buildWhile(
|
| + {SubbuildFunction buildCondition,
|
| + SubbuildFunction buildBody,
|
| + JumpTarget target,
|
| + ClosureScope closureScope,
|
| + SourceInformation sourceInformation}) {
|
| assert(isOpen);
|
| // While loops use four named continuations: the entry to the body, the
|
| // loop exit, the loop back edge (continue), and the loop exit (break).
|
| @@ -1554,12 +1491,11 @@ class IrBuilder {
|
| bodyContinuation.body = bodyBuilder.root;
|
| // Note the order of continuations: the first one is the one that will
|
| // be filled by LetCont.plug.
|
| - ir.LetCont branch =
|
| - new ir.LetCont.two(exitContinuation, bodyContinuation,
|
| - new ir.Branch.strict(condition,
|
| - bodyContinuation,
|
| - exitContinuation,
|
| - sourceInformation));
|
| + ir.LetCont branch = new ir.LetCont.two(
|
| + exitContinuation,
|
| + bodyContinuation,
|
| + new ir.Branch.strict(
|
| + condition, bodyContinuation, exitContinuation, sourceInformation));
|
| // If there are breaks in the body, then there must be a join-point
|
| // continuation for the normal exit and the breaks. Otherwise, the
|
| // successor is translated in the hole in the exit continuation.
|
| @@ -1577,7 +1513,6 @@ class IrBuilder {
|
| }
|
| }
|
|
|
| -
|
| /// Creates a do-while loop.
|
| ///
|
| /// The body and condition are created by [buildBody] and [buildCondition].
|
| @@ -1585,11 +1520,12 @@ class IrBuilder {
|
| /// statements in the body that have the loop as their target.
|
| /// [closureScope] contains all the variables declared in the loop (but not
|
| /// declared in some inner closure scope).
|
| - void buildDoWhile({SubbuildFunction buildBody,
|
| - SubbuildFunction buildCondition,
|
| - JumpTarget target,
|
| - ClosureScope closureScope,
|
| - SourceInformation sourceInformation}) {
|
| + void buildDoWhile(
|
| + {SubbuildFunction buildBody,
|
| + SubbuildFunction buildCondition,
|
| + JumpTarget target,
|
| + ClosureScope closureScope,
|
| + SourceInformation sourceInformation}) {
|
| assert(isOpen);
|
| // The CPS translation of [[do body; while (condition); successor]] is:
|
| //
|
| @@ -1642,12 +1578,11 @@ class IrBuilder {
|
| repeatBuilder.jumpTo(loop);
|
| repeatContinuation.body = repeatBuilder.root;
|
|
|
| - continueBuilder.add(
|
| - new ir.LetCont.two(exitContinuation, repeatContinuation,
|
| - new ir.Branch.strict(condition,
|
| - repeatContinuation,
|
| - exitContinuation,
|
| - sourceInformation)));
|
| + continueBuilder.add(new ir.LetCont.two(
|
| + exitContinuation,
|
| + repeatContinuation,
|
| + new ir.Branch.strict(condition, repeatContinuation, exitContinuation,
|
| + sourceInformation)));
|
| continueCollector.continuation.body = continueBuilder.root;
|
|
|
| // Construct the loop continuation (i.e., the body and condition).
|
| @@ -1655,18 +1590,16 @@ class IrBuilder {
|
| // let cont continue(x, ...) =
|
| // <Continue>
|
| // in [[body]]; continue(v, ...)
|
| - loopBuilder.add(
|
| - new ir.LetCont(continueCollector.continuation,
|
| - bodyBuilder.root));
|
| + loopBuilder
|
| + .add(new ir.LetCont(continueCollector.continuation, bodyBuilder.root));
|
|
|
| // And tie it all together.
|
| add(new ir.LetCont(breakCollector.continuation, loopBuilder.root));
|
| environment = breakCollector.environment;
|
| }
|
|
|
| - void buildSimpleSwitch(JumpCollector join,
|
| - List<SwitchCaseInfo> cases,
|
| - SubbuildFunction buildDefaultBody) {
|
| + void buildSimpleSwitch(JumpCollector join, List<SwitchCaseInfo> cases,
|
| + SubbuildFunction buildDefaultBody) {
|
| IrBuilder casesBuilder = makeDelimitedBuilder();
|
| for (SwitchCaseInfo caseInfo in cases) {
|
| ir.Primitive condition = caseInfo.buildCondition(casesBuilder);
|
| @@ -1678,12 +1611,11 @@ class IrBuilder {
|
| // A LetCont.two term has a hole as the body of the first listed
|
| // continuation, to be plugged by the translation. Therefore put the
|
| // else continuation first.
|
| - casesBuilder.add(
|
| - new ir.LetCont.two(elseContinuation, thenContinuation,
|
| - new ir.Branch.strict(condition,
|
| - thenContinuation,
|
| - elseContinuation,
|
| - caseInfo.sourceInformation)));
|
| + casesBuilder.add(new ir.LetCont.two(
|
| + elseContinuation,
|
| + thenContinuation,
|
| + new ir.Branch.strict(condition, thenContinuation, elseContinuation,
|
| + caseInfo.sourceInformation)));
|
| }
|
|
|
| if (buildDefaultBody == null) {
|
| @@ -1715,13 +1647,14 @@ class IrBuilder {
|
| ///
|
| /// Please see the function's implementation for where these functions are
|
| /// called.
|
| - void _helpBuildTryCatch(TryStatementInfo variables,
|
| + void _helpBuildTryCatch(
|
| + TryStatementInfo variables,
|
| void enterTry(IrBuilder builder),
|
| SubbuildFunction buildTryBlock,
|
| void leaveTry(IrBuilder builder),
|
| List<ir.Parameter> buildCatch(IrBuilder builder, JumpCollector join),
|
| - void leaveTryCatch(IrBuilder builder, JumpCollector join,
|
| - ir.Expression body)) {
|
| + void leaveTryCatch(
|
| + IrBuilder builder, JumpCollector join, ir.Expression body)) {
|
| JumpCollector join = new ForwardJumpCollector(environment);
|
| IrBuilder tryCatchBuilder = makeDelimitedBuilder();
|
|
|
| @@ -1759,8 +1692,7 @@ class IrBuilder {
|
| List<ir.Parameter> catchParameters = buildCatch(catchBuilder, join);
|
| ir.Continuation catchContinuation = new ir.Continuation(catchParameters);
|
| catchContinuation.body = catchBuilder.root;
|
| - tryCatchBuilder.add(
|
| - new ir.LetHandler(catchContinuation, tryBuilder.root));
|
| + tryCatchBuilder.add(new ir.LetHandler(catchContinuation, tryBuilder.root));
|
|
|
| leaveTryCatch(this, join, tryCatchBuilder.root);
|
| }
|
| @@ -1772,9 +1704,8 @@ class IrBuilder {
|
| /// [buildTryBlock] builds the try block.
|
| /// [catchClauseInfos] provides access to the catch type, exception variable,
|
| /// and stack trace variable, and a function for building the catch block.
|
| - void buildTryCatch(TryStatementInfo variables,
|
| - SubbuildFunction buildTryBlock,
|
| - List<CatchClauseInfo> catchClauseInfos) {
|
| + void buildTryCatch(TryStatementInfo variables, SubbuildFunction buildTryBlock,
|
| + List<CatchClauseInfo> catchClauseInfos) {
|
| assert(isOpen);
|
| // Catch handlers are in scope for their body. The CPS translation of
|
| // [[try tryBlock catch (ex, st) catchBlock; successor]] is:
|
| @@ -1828,8 +1759,7 @@ class IrBuilder {
|
| restoreJump(builder.state.returnCollector);
|
| }
|
|
|
| - List<ir.Parameter> buildCatch(IrBuilder builder,
|
| - JumpCollector join) {
|
| + List<ir.Parameter> buildCatch(IrBuilder builder, JumpCollector join) {
|
| // Translate the catch clauses. Multiple clauses are translated as if
|
| // they were explicitly cascaded if/else type tests.
|
|
|
| @@ -1871,9 +1801,8 @@ class IrBuilder {
|
|
|
| // Expand multiple catch clauses into an explicit if/then/else. Iterate
|
| // them in reverse so the current block becomes the next else block.
|
| - ir.Expression catchBody = (catchAll == null)
|
| - ? new ir.Rethrow()
|
| - : buildCatchClause(catchAll);
|
| + ir.Expression catchBody =
|
| + (catchAll == null) ? new ir.Rethrow() : buildCatchClause(catchAll);
|
| for (CatchClauseInfo clause in catchClauseInfos.reversed) {
|
| ir.Continuation thenContinuation = new ir.Continuation([]);
|
| ir.Continuation elseContinuation = new ir.Continuation([]);
|
| @@ -1884,16 +1813,14 @@ class IrBuilder {
|
| // environment with the nested builder because this part cannot mutate
|
| // it.
|
| IrBuilder checkBuilder = builder.makeDelimitedBuilder(environment);
|
| - ir.Primitive typeMatches =
|
| - checkBuilder.buildTypeOperator(exceptionParameter,
|
| - clause.type,
|
| - clause.sourceInformation,
|
| - isTypeTest: true);
|
| - checkBuilder.add(new ir.LetCont.two(thenContinuation, elseContinuation,
|
| - new ir.Branch.strict(typeMatches,
|
| - thenContinuation,
|
| - elseContinuation,
|
| - clause.sourceInformation)));
|
| + ir.Primitive typeMatches = checkBuilder.buildTypeOperator(
|
| + exceptionParameter, clause.type, clause.sourceInformation,
|
| + isTypeTest: true);
|
| + checkBuilder.add(new ir.LetCont.two(
|
| + thenContinuation,
|
| + elseContinuation,
|
| + new ir.Branch.strict(typeMatches, thenContinuation,
|
| + elseContinuation, clause.sourceInformation)));
|
| catchBody = checkBuilder.root;
|
| }
|
| builder.add(catchBody);
|
| @@ -1901,16 +1828,16 @@ class IrBuilder {
|
| return <ir.Parameter>[exceptionParameter, traceParameter];
|
| }
|
|
|
| - void leaveTryCatch(IrBuilder builder, JumpCollector join,
|
| - ir.Expression body) {
|
| + void leaveTryCatch(
|
| + IrBuilder builder, JumpCollector join, ir.Expression body) {
|
| // Add the binding for the join-point continuation and continue the
|
| // translation in its body.
|
| builder.add(new ir.LetCont(join.continuation, body));
|
| builder.environment = join.environment;
|
| }
|
|
|
| - _helpBuildTryCatch(variables, enterTry, buildTryBlock, leaveTry,
|
| - buildCatch, leaveTryCatch);
|
| + _helpBuildTryCatch(variables, enterTry, buildTryBlock, leaveTry, buildCatch,
|
| + leaveTryCatch);
|
| }
|
|
|
| /// Translates a try/finally.
|
| @@ -1920,8 +1847,7 @@ class IrBuilder {
|
| /// [buildTryBlock] builds the try block.
|
| /// [buildFinallyBlock] builds the finally block.
|
| void buildTryFinally(TryStatementInfo variables,
|
| - SubbuildFunction buildTryBlock,
|
| - SubbuildFunction buildFinallyBlock) {
|
| + SubbuildFunction buildTryBlock, SubbuildFunction buildFinallyBlock) {
|
| assert(isOpen);
|
| // Try/finally is implemented in terms of try/catch and by duplicating the
|
| // code for finally at all exits. The encoding is:
|
| @@ -1952,13 +1878,13 @@ class IrBuilder {
|
| savedContinues = builder.state.continueCollectors;
|
| savedReturn = builder.state.returnCollector;
|
|
|
| - builder.state.breakCollectors = newBreaks =
|
| - savedBreaks.map(interceptJump).toList();
|
| - builder.state.continueCollectors = newContinues =
|
| - savedContinues.map(interceptJump).toList();
|
| + builder.state.breakCollectors =
|
| + newBreaks = savedBreaks.map(interceptJump).toList();
|
| + builder.state.continueCollectors =
|
| + newContinues = savedContinues.map(interceptJump).toList();
|
| builder.state.returnCollector = newReturn =
|
| new ForwardJumpCollector(environment, hasExtraArgument: true)
|
| - ..enterTry(variables.boxedOnEntry);
|
| + ..enterTry(variables.boxedOnEntry);
|
| }
|
|
|
| void leaveTry(IrBuilder builder) {
|
| @@ -1976,8 +1902,7 @@ class IrBuilder {
|
| builder.state.returnCollector = savedReturn;
|
| }
|
|
|
| - List<ir.Parameter> buildCatch(IrBuilder builder,
|
| - JumpCollector join) {
|
| + List<ir.Parameter> buildCatch(IrBuilder builder, JumpCollector join) {
|
| // The catch block of the try/catch used for try/finally is the finally
|
| // code followed by a rethrow.
|
| buildFinallyBlock(builder);
|
| @@ -1988,13 +1913,13 @@ class IrBuilder {
|
| return <ir.Parameter>[new ir.Parameter(null), new ir.Parameter(null)];
|
| }
|
|
|
| - void leaveTryCatch(IrBuilder builder, JumpCollector join,
|
| - ir.Expression body) {
|
| + void leaveTryCatch(
|
| + IrBuilder builder, JumpCollector join, ir.Expression body) {
|
| // Build a list of continuations for jumps from the try block and
|
| // duplicate the finally code before jumping to the actual target.
|
| List<ir.Continuation> exits = <ir.Continuation>[join.continuation];
|
| - void addJump(JumpCollector newCollector,
|
| - JumpCollector originalCollector) {
|
| + void addJump(
|
| + JumpCollector newCollector, JumpCollector originalCollector) {
|
| if (newCollector.isEmpty) return;
|
| IrBuilder builder = makeDelimitedBuilder(newCollector.environment);
|
| buildFinallyBlock(builder);
|
| @@ -2021,8 +1946,8 @@ class IrBuilder {
|
| buildFinallyBlock(builder);
|
| }
|
|
|
| - _helpBuildTryCatch(variables, enterTry, buildTryBlock, leaveTry,
|
| - buildCatch, leaveTryCatch);
|
| + _helpBuildTryCatch(variables, enterTry, buildTryBlock, leaveTry, buildCatch,
|
| + leaveTryCatch);
|
| }
|
|
|
| /// Create a return statement `return value;` or `return;` if [value] is
|
| @@ -2041,16 +1966,14 @@ class IrBuilder {
|
|
|
| /// Generate the body for a native function [function] that is annotated with
|
| /// an implementation in JavaScript (provided as string in [javaScriptCode]).
|
| - void buildNativeFunctionBody(
|
| - FunctionElement function,
|
| - String javaScriptCode,
|
| + void buildNativeFunctionBody(FunctionElement function, String javaScriptCode,
|
| SourceInformation sourceInformation) {
|
| NativeBehavior behavior = new NativeBehavior();
|
| behavior.sideEffects.setAllSideEffects();
|
| // Generate a [ForeignCode] statement from the given native code.
|
| buildForeignCode(
|
| - js.js.statementTemplateYielding(
|
| - new js.LiteralStatement(javaScriptCode)),
|
| + js.js
|
| + .statementTemplateYielding(new js.LiteralStatement(javaScriptCode)),
|
| <ir.Primitive>[],
|
| behavior,
|
| sourceInformation);
|
| @@ -2062,9 +1985,8 @@ class IrBuilder {
|
| /// Generates a call to the real target, which is given by [functions]'s
|
| /// `fixedBackendName`, passing all parameters as arguments. The target can
|
| /// be the JavaScript implementation of a function, getter, or setter.
|
| - void buildRedirectingNativeFunctionBody(FunctionElement function,
|
| - String name,
|
| - SourceInformation sourceInformation) {
|
| + void buildRedirectingNativeFunctionBody(FunctionElement function, String name,
|
| + SourceInformation sourceInformation) {
|
| List<ir.Primitive> arguments = <ir.Primitive>[];
|
| NativeBehavior behavior = new NativeBehavior();
|
| behavior.sideEffects.setAllSideEffects();
|
| @@ -2084,9 +2006,8 @@ class IrBuilder {
|
| // The parameter type is a function type either directly or through
|
| // typedef(s).
|
| ir.Constant arity = buildIntegerConstant(type.computeArity());
|
| - input = buildStaticFunctionInvocation(
|
| - program.closureConverter, <ir.Primitive>[input, arity],
|
| - sourceInformation);
|
| + input = buildStaticFunctionInvocation(program.closureConverter,
|
| + <ir.Primitive>[input, arity], sourceInformation);
|
| }
|
| arguments.add(input);
|
| argumentTemplates.add('#');
|
| @@ -2115,10 +2036,8 @@ class IrBuilder {
|
| !(value is ir.Constant && value.value.isNull);
|
|
|
| /// Builds a call to a resolved js-interop element.
|
| - ir.Primitive buildInvokeJsInteropMember(
|
| - FunctionElement element,
|
| - List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildInvokeJsInteropMember(FunctionElement element,
|
| + List<ir.Primitive> arguments, SourceInformation sourceInformation) {
|
| program.addNativeMethod(element);
|
| String target = program.getJsInteropTargetPath(element);
|
| // Strip off trailing arguments that were not specified.
|
| @@ -2128,8 +2047,9 @@ class IrBuilder {
|
| var inputs = arguments.where(_isNotNull).toList();
|
|
|
| var behavior = new 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.
|
| @@ -2144,7 +2064,8 @@ class IrBuilder {
|
|
|
| // It also includes any other JS interop type if we don't trust the
|
| // annotation or if is declared too broad.
|
| - if (!program.trustJSInteropTypeAnnotations || type.isObject ||
|
| + if (!program.trustJSInteropTypeAnnotations ||
|
| + type.isObject ||
|
| type.isDynamic) {
|
| behavior.typesInstantiated.add(program.jsJavascriptObjectType);
|
| }
|
| @@ -2158,17 +2079,15 @@ class IrBuilder {
|
| var args = new List.filled(inputs.length, '#').join(',');
|
| code = element.isConstructor ? "new $target($args)" : "$target($args)";
|
| }
|
| - return buildForeignCode(js.js.parseForeignJS(code),
|
| - inputs, behavior, sourceInformation);
|
| + return buildForeignCode(
|
| + js.js.parseForeignJS(code), inputs, behavior, sourceInformation);
|
| // TODO(sigmund): should we record the source-information here?
|
| }
|
|
|
| /// Builds an object literal that results from invoking a factory constructor
|
| /// of a js-interop anonymous type.
|
| - ir.Primitive buildJsInteropObjectLiteral(
|
| - ConstructorElement constructor,
|
| - List<ir.Primitive> arguments,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildJsInteropObjectLiteral(ConstructorElement constructor,
|
| + List<ir.Primitive> arguments, SourceInformation sourceInformation) {
|
| assert(program.isJsInteropAnonymous(constructor));
|
| program.addNativeMethod(constructor);
|
| FunctionSignature params = constructor.functionSignature;
|
| @@ -2178,7 +2097,7 @@ class IrBuilder {
|
| 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);
|
| ir.Primitive argument = arguments[i++];
|
| if (_isNotNull(argument)) {
|
| filteredArguments.add(argument);
|
| @@ -2220,8 +2139,7 @@ class IrBuilder {
|
| }
|
|
|
| /// Creates a labeled statement
|
| - void buildLabeledStatement({SubbuildFunction buildBody,
|
| - JumpTarget target}) {
|
| + void buildLabeledStatement({SubbuildFunction buildBody, JumpTarget target}) {
|
| JumpCollector join = new ForwardJumpCollector(environment, target: target);
|
| IrBuilder innerBuilder = makeDelimitedBuilder();
|
| innerBuilder.state.breakCollectors.add(join);
|
| @@ -2257,8 +2175,8 @@ class IrBuilder {
|
| return buildJumpInternal(target, state.continueCollectors);
|
| }
|
|
|
| - bool buildJumpInternal(JumpTarget target,
|
| - Iterable<JumpCollector> collectors) {
|
| + bool buildJumpInternal(
|
| + JumpTarget target, Iterable<JumpCollector> collectors) {
|
| assert(isOpen);
|
| for (JumpCollector collector in collectors) {
|
| if (target == collector.target) {
|
| @@ -2291,8 +2209,7 @@ class IrBuilder {
|
|
|
| /// Create a negation of [condition].
|
| ir.Primitive buildNegation(
|
| - ir.Primitive condition,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive condition, SourceInformation sourceInformation) {
|
| // ! e is translated as e ? false : true
|
|
|
| // Add a continuation parameter for the result of the expression.
|
| @@ -2310,16 +2227,17 @@ class IrBuilder {
|
| ir.Constant falseConstant = makeBoolConstant(false);
|
|
|
| thenContinuation.body = new ir.LetPrim(falseConstant)
|
| - ..plug(new ir.InvokeContinuation(joinContinuation, [falseConstant]));
|
| + ..plug(new ir.InvokeContinuation(joinContinuation, [falseConstant]));
|
| elseContinuation.body = new ir.LetPrim(trueConstant)
|
| - ..plug(new ir.InvokeContinuation(joinContinuation, [trueConstant]));
|
| -
|
| - add(new ir.LetCont(joinContinuation,
|
| - new ir.LetCont.two(thenContinuation, elseContinuation,
|
| - new ir.Branch.strict(condition,
|
| - thenContinuation,
|
| - elseContinuation,
|
| - sourceInformation))));
|
| + ..plug(new ir.InvokeContinuation(joinContinuation, [trueConstant]));
|
| +
|
| + add(new ir.LetCont(
|
| + joinContinuation,
|
| + new ir.LetCont.two(
|
| + thenContinuation,
|
| + elseContinuation,
|
| + new ir.Branch.strict(condition, thenContinuation, elseContinuation,
|
| + sourceInformation))));
|
| return resultParameter;
|
| }
|
|
|
| @@ -2376,12 +2294,11 @@ class IrBuilder {
|
| rightTrueContinuation.body = rightTrueBuilder.root;
|
| rightFalseContinuation.body = rightFalseBuilder.root;
|
| // The right subexpression has two continuations.
|
| - rightBuilder.add(
|
| - new ir.LetCont.two(rightTrueContinuation, rightFalseContinuation,
|
| - new ir.Branch.strict(rightValue,
|
| - rightTrueContinuation,
|
| - rightFalseContinuation,
|
| - sourceInformation)));
|
| + rightBuilder.add(new ir.LetCont.two(
|
| + rightTrueContinuation,
|
| + rightFalseContinuation,
|
| + new ir.Branch.strict(rightValue, rightTrueContinuation,
|
| + rightFalseContinuation, sourceInformation)));
|
| // Depending on the operator, the left subexpression's continuations are
|
| // either the right subexpression or an invocation of the join-point
|
| // continuation.
|
| @@ -2393,21 +2310,21 @@ class IrBuilder {
|
| leftFalseContinuation.body = emptyBuilder.root;
|
| }
|
|
|
| - add(new ir.LetCont(join.continuation,
|
| - new ir.LetCont.two(leftTrueContinuation, leftFalseContinuation,
|
| - new ir.Branch.strict(leftValue,
|
| - leftTrueContinuation,
|
| - leftFalseContinuation,
|
| - sourceInformation))));
|
| + add(new ir.LetCont(
|
| + join.continuation,
|
| + new ir.LetCont.two(
|
| + leftTrueContinuation,
|
| + leftFalseContinuation,
|
| + new ir.Branch.strict(leftValue, leftTrueContinuation,
|
| + leftFalseContinuation, sourceInformation))));
|
| environment = join.environment;
|
| return environment.discard(1);
|
| }
|
|
|
| ir.Primitive buildIdentical(ir.Primitive x, ir.Primitive y,
|
| - {SourceInformation sourceInformation}) {
|
| + {SourceInformation sourceInformation}) {
|
| return addPrimitive(new ir.ApplyBuiltinOperator(
|
| - ir.BuiltinOperator.Identical, <ir.Primitive>[x, y],
|
| - sourceInformation));
|
| + ir.BuiltinOperator.Identical, <ir.Primitive>[x, y], sourceInformation));
|
| }
|
|
|
| /// Called when entering a nested function with free variables.
|
| @@ -2428,8 +2345,8 @@ class IrBuilder {
|
| } else {
|
| // Unboxed variables are loaded from the function object immediately.
|
| // This includes BoxLocals which are themselves unboxed variables.
|
| - environment.extend(local,
|
| - addPrimitive(new ir.GetField(thisPrim, location.field)));
|
| + environment.extend(
|
| + local, addPrimitive(new ir.GetField(thisPrim, location.field)));
|
| }
|
| });
|
|
|
| @@ -2482,9 +2399,7 @@ class IrBuilder {
|
| ClosureLocation location = state.boxedVariables[parameterElement];
|
| if (location != null) {
|
| addPrimitive(new ir.SetField(
|
| - environment.lookup(location.box),
|
| - location.field,
|
| - parameter));
|
| + environment.lookup(location.box), location.field, parameter));
|
| } else {
|
| environment.extend(parameterElement, parameter);
|
| }
|
| @@ -2499,7 +2414,7 @@ class IrBuilder {
|
| }
|
|
|
| void declareLocalVariable(LocalElement variableElement,
|
| - {ir.Primitive initialValue}) {
|
| + {ir.Primitive initialValue}) {
|
| assert(isOpen);
|
| if (initialValue == null) {
|
| initialValue = buildNullConstant();
|
| @@ -2507,13 +2422,9 @@ class IrBuilder {
|
| ClosureLocation location = state.boxedVariables[variableElement];
|
| if (location != null) {
|
| addPrimitive(new ir.SetField(
|
| - environment.lookup(location.box),
|
| - location.field,
|
| - initialValue));
|
| + environment.lookup(location.box), location.field, initialValue));
|
| } else if (isInMutableVariable(variableElement)) {
|
| - add(new ir.LetMutable(
|
| - getMutableVariable(variableElement),
|
| - initialValue));
|
| + add(new ir.LetMutable(getMutableVariable(variableElement), initialValue));
|
| } else {
|
| initialValue.useElementAsHint(variableElement);
|
| environment.extend(variableElement, initialValue);
|
| @@ -2521,16 +2432,17 @@ class IrBuilder {
|
| }
|
|
|
| /// Add [functionElement] to the environment with provided [definition].
|
| - void declareLocalFunction(LocalFunctionElement functionElement,
|
| - closure.ClosureClassElement classElement,
|
| - SourceInformation sourceInformation) {
|
| + void declareLocalFunction(
|
| + LocalFunctionElement functionElement,
|
| + closure.ClosureClassElement classElement,
|
| + SourceInformation sourceInformation) {
|
| ir.Primitive closure =
|
| - buildFunctionExpression(classElement, sourceInformation);
|
| + buildFunctionExpression(classElement, sourceInformation);
|
| declareLocalVariable(functionElement, initialValue: closure);
|
| }
|
|
|
| ir.Primitive buildFunctionExpression(closure.ClosureClassElement classElement,
|
| - SourceInformation sourceInformation) {
|
| + SourceInformation sourceInformation) {
|
| List<ir.Primitive> arguments = <ir.Primitive>[];
|
| for (closure.ClosureFieldElement field in classElement.closureFields) {
|
| // Captured 'this' and type variables are not always available as locals
|
| @@ -2552,22 +2464,19 @@ class IrBuilder {
|
|
|
| /// Create a read access of [local] function, variable, or parameter.
|
| // TODO(johnniwinther): Make [sourceInformation] mandatory.
|
| - ir.Primitive buildLocalGet(
|
| - LocalElement local,
|
| + ir.Primitive buildLocalGet(LocalElement local,
|
| {SourceInformation sourceInformation}) {
|
| assert(isOpen);
|
| ClosureLocation location = state.boxedVariables[local];
|
| if (location != null) {
|
| ir.Primitive result = new ir.GetField(
|
| - environment.lookup(location.box),
|
| - location.field,
|
| + environment.lookup(location.box), location.field,
|
| sourceInformation: sourceInformation);
|
| result.useElementAsHint(local);
|
| return addPrimitive(result);
|
| } else if (isInMutableVariable(local)) {
|
| - return addPrimitive(
|
| - new ir.GetMutable(
|
| - getMutableVariable(local), sourceInformation: sourceInformation));
|
| + return addPrimitive(new ir.GetMutable(getMutableVariable(local),
|
| + sourceInformation: sourceInformation));
|
| } else {
|
| return environment.lookup(local);
|
| }
|
| @@ -2575,22 +2484,16 @@ class IrBuilder {
|
|
|
| /// Create a write access to [local] variable or parameter with the provided
|
| /// [value].
|
| - ir.Primitive buildLocalVariableSet(
|
| - LocalElement local,
|
| - ir.Primitive value,
|
| + ir.Primitive buildLocalVariableSet(LocalElement local, ir.Primitive value,
|
| SourceInformation sourceInformation) {
|
| assert(isOpen);
|
| ClosureLocation location = state.boxedVariables[local];
|
| if (location != null) {
|
| addPrimitive(new ir.SetField(
|
| - environment.lookup(location.box),
|
| - location.field,
|
| - value,
|
| + environment.lookup(location.box), location.field, value,
|
| sourceInformation: sourceInformation));
|
| } else if (isInMutableVariable(local)) {
|
| - addPrimitive(new ir.SetMutable(
|
| - getMutableVariable(local),
|
| - value,
|
| + addPrimitive(new ir.SetMutable(getMutableVariable(local), value,
|
| sourceInformation: sourceInformation));
|
| } else {
|
| value.useElementAsHint(local);
|
| @@ -2603,8 +2506,8 @@ class IrBuilder {
|
| ///
|
| /// The loop variables will subsequently be declared using
|
| /// [declareLocalVariable].
|
| - void _enterForLoopInitializer(ClosureScope scope,
|
| - List<LocalElement> loopVariables) {
|
| + void _enterForLoopInitializer(
|
| + ClosureScope scope, List<LocalElement> loopVariables) {
|
| if (scope == null) return;
|
| // If there are no boxed loop variables, don't create the box here, let
|
| // it be created inside the body instead.
|
| @@ -2613,8 +2516,7 @@ class IrBuilder {
|
| }
|
|
|
| /// Called before building the body of a for-loop.
|
| - void _enterForLoopBody(ClosureScope scope,
|
| - List<LocalElement> loopVariables) {
|
| + void _enterForLoopBody(ClosureScope scope, List<LocalElement> loopVariables) {
|
| if (scope == null) return;
|
| // If there are boxed loop variables, the box has already been created
|
| // at the initializer.
|
| @@ -2623,8 +2525,8 @@ class IrBuilder {
|
| }
|
|
|
| /// Called before building the update of a for-loop.
|
| - void _enterForLoopUpdate(ClosureScope scope,
|
| - List<LocalElement> loopVariables) {
|
| + void _enterForLoopUpdate(
|
| + ClosureScope scope, List<LocalElement> loopVariables) {
|
| if (scope == null) return;
|
| // If there are no boxed loop variables, then the box is created inside the
|
| // body, so there is no need to explicitly renew it.
|
| @@ -2650,38 +2552,29 @@ class IrBuilder {
|
| return state.thisParameter;
|
| }
|
|
|
| - ir.Primitive buildFieldGet(
|
| - ir.Primitive receiver,
|
| - FieldElement target,
|
| + ir.Primitive buildFieldGet(ir.Primitive receiver, FieldElement target,
|
| SourceInformation sourceInformation) {
|
| return addPrimitive(new ir.GetField(receiver, target,
|
| sourceInformation: sourceInformation,
|
| isFinal: program.fieldNeverChanges(target)));
|
| }
|
|
|
| - void buildFieldSet(ir.Primitive receiver,
|
| - FieldElement target,
|
| - ir.Primitive value,
|
| - SourceInformation sourceInformation) {
|
| - addPrimitive(new ir.SetField(
|
| - receiver, target, value, sourceInformation: sourceInformation));
|
| + void buildFieldSet(ir.Primitive receiver, FieldElement target,
|
| + ir.Primitive value, SourceInformation sourceInformation) {
|
| + addPrimitive(new ir.SetField(receiver, target, value,
|
| + sourceInformation: sourceInformation));
|
| }
|
|
|
| ir.Primitive buildSuperFieldGet(
|
| - FieldElement target,
|
| - SourceInformation sourceInformation) {
|
| - return addPrimitive(
|
| - new ir.GetField(
|
| - buildThis(), target, sourceInformation: sourceInformation));
|
| + FieldElement target, SourceInformation sourceInformation) {
|
| + return addPrimitive(new ir.GetField(buildThis(), target,
|
| + sourceInformation: sourceInformation));
|
| }
|
|
|
| - ir.Primitive buildSuperFieldSet(
|
| - FieldElement target,
|
| - ir.Primitive value,
|
| + ir.Primitive buildSuperFieldSet(FieldElement target, ir.Primitive value,
|
| SourceInformation sourceInformation) {
|
| - addPrimitive(
|
| - new ir.SetField(
|
| - buildThis(), target, value, sourceInformation: sourceInformation));
|
| + addPrimitive(new ir.SetField(buildThis(), target, value,
|
| + sourceInformation: sourceInformation));
|
| return value;
|
| }
|
|
|
| @@ -2690,8 +2583,8 @@ class IrBuilder {
|
| /// The header for a constructor body differs from other functions in that
|
| /// some parameters are already boxed, and the box is passed as an argument
|
| /// instead of being created in the header.
|
| - void buildConstructorBodyHeader(Iterable<Local> parameters,
|
| - ClosureScope closureScope) {
|
| + void buildConstructorBodyHeader(
|
| + Iterable<Local> parameters, ClosureScope closureScope) {
|
| _createThisParameter();
|
| for (Local param in parameters) {
|
| ir.Parameter parameter = _createLocalParameter(param);
|
| @@ -2731,8 +2624,7 @@ class IrBuilder {
|
| ? buildNullConstant()
|
| : buildTypeExpression(argument);
|
| });
|
| - arguments = new List<ir.Primitive>.from(arguments)
|
| - ..addAll(typeArguments);
|
| + arguments = new List<ir.Primitive>.from(arguments)..addAll(typeArguments);
|
| }
|
| return addPrimitive(new ir.InvokeConstructor(
|
| type, element, selector, arguments, sourceInformation,
|
| @@ -2749,8 +2641,8 @@ class IrBuilder {
|
| ir.Primitive value = buildTypeVariableAccess(variable);
|
| arguments.add(value);
|
| });
|
| - return addPrimitive(new ir.TypeExpression(ir.TypeExpressionKind.COMPLETE,
|
| - type, arguments));
|
| + return addPrimitive(new ir.TypeExpression(
|
| + ir.TypeExpressionKind.COMPLETE, type, arguments));
|
| } else if (type.treatAsDynamic) {
|
| return buildNullConstant();
|
| } else {
|
| @@ -2766,7 +2658,7 @@ class IrBuilder {
|
| /// corresponding type argument (field initializers are evaluated before the
|
| /// receiver object is created).
|
| ir.Primitive buildTypeVariableAccess(TypeVariableType variable,
|
| - {SourceInformation sourceInformation}) {
|
| + {SourceInformation sourceInformation}) {
|
| // If the local exists in the environment, use that.
|
| // This is put here when we are inside a constructor or field initializer,
|
| // (or possibly a closure inside one of these).
|
| @@ -2791,25 +2683,26 @@ class IrBuilder {
|
| }
|
|
|
| /// Reifies the value of [variable] on the current receiver object.
|
| - ir.Primitive buildReifyTypeVariable(TypeVariableType variable,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive buildReifyTypeVariable(
|
| + TypeVariableType variable, SourceInformation sourceInformation) {
|
| ir.Primitive typeArgument =
|
| buildTypeVariableAccess(variable, sourceInformation: sourceInformation);
|
| return addPrimitive(
|
| new ir.ReifyRuntimeType(typeArgument, sourceInformation));
|
| }
|
|
|
| - ir.Primitive buildInvocationMirror(Selector selector,
|
| - List<ir.Primitive> arguments) {
|
| + ir.Primitive buildInvocationMirror(
|
| + Selector selector, List<ir.Primitive> arguments) {
|
| return addPrimitive(new ir.CreateInvocationMirror(selector, arguments));
|
| }
|
|
|
| - ir.Primitive buildForeignCode(js.Template codeTemplate,
|
| - List<ir.Primitive> arguments,
|
| - NativeBehavior behavior,
|
| - SourceInformation sourceInformation,
|
| - {Element dependency,
|
| - TypeMask type}) {
|
| + ir.Primitive buildForeignCode(
|
| + js.Template codeTemplate,
|
| + List<ir.Primitive> arguments,
|
| + NativeBehavior behavior,
|
| + SourceInformation sourceInformation,
|
| + {Element dependency,
|
| + TypeMask type}) {
|
| assert(behavior != null);
|
| if (type == null) {
|
| type = program.getTypeMaskForForeign(behavior);
|
| @@ -2822,11 +2715,7 @@ class IrBuilder {
|
| return addPrimitive(new ir.Refinement(arguments.single, type));
|
| }
|
| ir.Primitive result = addPrimitive(new ir.ForeignCode(
|
| - codeTemplate,
|
| - type,
|
| - arguments,
|
| - behavior,
|
| - sourceInformation,
|
| + codeTemplate, type, arguments, behavior, sourceInformation,
|
| dependency: dependency));
|
| if (!codeTemplate.isExpression) {
|
| // Close the term if this is a "throw" expression or native body.
|
| @@ -2837,10 +2726,9 @@ class IrBuilder {
|
| }
|
|
|
| /// Creates a type test or type cast of [value] against [type].
|
| - ir.Primitive buildTypeOperator(ir.Primitive value,
|
| - DartType type,
|
| - SourceInformation sourceInformation,
|
| - {bool isTypeTest}) {
|
| + ir.Primitive buildTypeOperator(
|
| + ir.Primitive value, DartType type, SourceInformation sourceInformation,
|
| + {bool isTypeTest}) {
|
| assert(isOpen);
|
| assert(isTypeTest != null);
|
|
|
| @@ -2849,10 +2737,8 @@ class IrBuilder {
|
| if (type.isMalformed) {
|
| ErroneousElement element = type.element;
|
| ir.Primitive message = buildStringConstant(element.message);
|
| - return buildStaticFunctionInvocation(
|
| - program.throwTypeErrorHelper,
|
| - <ir.Primitive>[message],
|
| - sourceInformation);
|
| + return buildStaticFunctionInvocation(program.throwTypeErrorHelper,
|
| + <ir.Primitive>[message], sourceInformation);
|
| }
|
|
|
| List<ir.Primitive> typeArguments = const <ir.Primitive>[];
|
| @@ -2891,11 +2777,11 @@ class IrBuilder {
|
| /// expression whose result is either [value] if [value] is not null, or
|
| /// `right` if [value] is null. Only when [value] is null, [buildRight] is
|
| /// evaluated to produce the `right` value.
|
| - ir.Primitive buildIfNull(ir.Primitive value,
|
| - ir.Primitive buildRight(IrBuilder builder),
|
| - SourceInformation sourceInformation) {
|
| - ir.Primitive condition =
|
| - _buildCheckNull(value, sourceInformation);
|
| + ir.Primitive buildIfNull(
|
| + ir.Primitive value,
|
| + ir.Primitive buildRight(IrBuilder builder),
|
| + SourceInformation sourceInformation) {
|
| + ir.Primitive condition = _buildCheckNull(value, sourceInformation);
|
| return buildConditional(
|
| condition, buildRight, (_) => value, sourceInformation);
|
| }
|
| @@ -2903,18 +2789,18 @@ class IrBuilder {
|
| /// Create a conditional send. This is equivalent to a conditional expression
|
| /// that checks if [receiver] is null, if so, it returns null, otherwise it
|
| /// evaluates the [buildSend] expression.
|
| - ir.Primitive buildIfNotNullSend(ir.Primitive receiver,
|
| - ir.Primitive buildSend(IrBuilder builder),
|
| - SourceInformation sourceInformation) {
|
| - ir.Primitive condition =
|
| - _buildCheckNull(receiver, sourceInformation);
|
| + ir.Primitive buildIfNotNullSend(
|
| + ir.Primitive receiver,
|
| + ir.Primitive buildSend(IrBuilder builder),
|
| + SourceInformation sourceInformation) {
|
| + ir.Primitive condition = _buildCheckNull(receiver, sourceInformation);
|
| return buildConditional(
|
| condition, (_) => receiver, buildSend, sourceInformation);
|
| }
|
|
|
| /// Creates a type test checking whether [value] is null.
|
| - ir.Primitive _buildCheckNull(ir.Primitive value,
|
| - SourceInformation sourceInformation) {
|
| + ir.Primitive _buildCheckNull(
|
| + ir.Primitive value, SourceInformation sourceInformation) {
|
| assert(isOpen);
|
| return buildIdentical(value, buildNullConstant(),
|
| sourceInformation: sourceInformation);
|
| @@ -3017,11 +2903,12 @@ class CatchClauseInfo {
|
| final SubbuildFunction buildCatchBlock;
|
| final SourceInformation sourceInformation;
|
|
|
| - CatchClauseInfo({this.type,
|
| - this.exceptionVariable,
|
| - this.stackTraceVariable,
|
| - this.buildCatchBlock,
|
| - this.sourceInformation});
|
| + CatchClauseInfo(
|
| + {this.type,
|
| + this.exceptionVariable,
|
| + this.stackTraceVariable,
|
| + this.buildCatchBlock,
|
| + this.sourceInformation});
|
| }
|
|
|
| class SwitchCaseInfo {
|
|
|