| Index: pkg/compiler/lib/src/js_model/locals.dart
|
| diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
|
| index 84d3d2876f32c43fc0ca40d57e83d06f8b97a11c..53bb0151c27ab7a1cf44e24c8c2cb6864db6e562 100644
|
| --- a/pkg/compiler/lib/src/js_model/locals.dart
|
| +++ b/pkg/compiler/lib/src/js_model/locals.dart
|
| @@ -37,6 +37,7 @@ class KernelToLocalsMapImpl implements KernelToLocalsMap {
|
| Map<ir.VariableDeclaration, JLocal> _map = <ir.VariableDeclaration, JLocal>{};
|
| Map<ir.TreeNode, JJumpTarget> _jumpTargetMap;
|
| Set<ir.BreakStatement> _breaksAsContinue;
|
| + List<ir.VariableDeclaration> _parameterList = <ir.VariableDeclaration>[];
|
|
|
| MemberEntity get currentMember => _members.last;
|
|
|
| @@ -137,12 +138,27 @@ class KernelToLocalsMapImpl implements KernelToLocalsMap {
|
| @override
|
| Local getLocalVariable(ir.VariableDeclaration node) {
|
| return _map.putIfAbsent(node, () {
|
| - return new JLocal(
|
| - node.name, currentMember, node.parent is ir.FunctionNode);
|
| + Local local;
|
| + if (node.parent is ir.FunctionNode) {
|
| + local = new JParameter(_parameterList.length, node.name, currentMember);
|
| + _parameterList.add(node);
|
| + } else {
|
| + local = new JLocal(node.name, currentMember);
|
| + }
|
| + return local;
|
| });
|
| }
|
|
|
| @override
|
| + ir.FunctionNode getFunctionNodeForParameter(covariant JParameter parameter) {
|
| + return _parameterList[parameter.parameterIndex].parent;
|
| + }
|
| +
|
| + ir.DartType getParameterType(covariant JParameter parameter) {
|
| + return _parameterList[parameter.parameterIndex].type;
|
| + }
|
| +
|
| + @override
|
| CapturedLoopScope getCapturedLoopScope(
|
| ClosureDataLookup closureLookup, ir.TreeNode node) {
|
| return closureLookup.getCapturedLoopScope(node);
|
| @@ -347,18 +363,19 @@ class JLocal implements Local {
|
| final String name;
|
| final MemberEntity memberContext;
|
|
|
| - /// True if this local represents a local parameter.
|
| - final bool isRegularParameter;
|
| + JLocal(this.name, this.memberContext);
|
|
|
| - JLocal(this.name, this.memberContext, [isParameter = false])
|
| - : isRegularParameter = isParameter;
|
| + /// True if this local represents a local parameter.
|
| + bool get isRegularParameter => false;
|
|
|
| @override
|
| Entity get executableContext => memberContext;
|
|
|
| + String get _kind => 'local';
|
| +
|
| String toString() {
|
| StringBuffer sb = new StringBuffer();
|
| - sb.write('local(');
|
| + sb.write('$_kind(');
|
| if (memberContext.enclosingClass != null) {
|
| sb.write(memberContext.enclosingClass.name);
|
| sb.write('.');
|
| @@ -370,3 +387,14 @@ class JLocal implements Local {
|
| return sb.toString();
|
| }
|
| }
|
| +
|
| +class JParameter extends JLocal {
|
| + final int parameterIndex;
|
| +
|
| + JParameter(this.parameterIndex, String name, MemberEntity memberContext)
|
| + : super(name, memberContext);
|
| +
|
| + bool get isRegularParameter => true;
|
| +
|
| + String get _kind => 'parameter';
|
| +}
|
|
|