OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
6 | 6 |
7 import '../closure.dart'; | 7 import '../closure.dart'; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/tasks.dart'; | 9 import '../common/tasks.dart'; |
10 import '../constants/expressions.dart'; | 10 import '../constants/expressions.dart'; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 /// If no variables are captured, this parameter is null. | 124 /// If no variables are captured, this parameter is null. |
125 void _produceSyntheticElements(MemberEntity member, ir.FunctionNode node, | 125 void _produceSyntheticElements(MemberEntity member, ir.FunctionNode node, |
126 KernelScopeInfo info, JsClosedWorld closedWorldRefiner) { | 126 KernelScopeInfo info, JsClosedWorld closedWorldRefiner) { |
127 KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(member); | 127 KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(member); |
128 KernelClosureClass closureClass = closedWorldRefiner.buildClosureClass( | 128 KernelClosureClass closureClass = closedWorldRefiner.buildClosureClass( |
129 member, node, member.library, info, node.location, localsMap); | 129 member, node, member.library, info, node.location, localsMap); |
130 | 130 |
131 // We want the original declaration where that function is used to point | 131 // We want the original declaration where that function is used to point |
132 // to the correct closure class. | 132 // to the correct closure class. |
133 _closureRepresentationMap[closureClass.callMethod] = closureClass; | 133 _closureRepresentationMap[closureClass.callMethod] = closureClass; |
134 Entity entity = localsMap.getLocalFunction(node.parent); | 134 Entity entity; |
| 135 if (node.parent is ir.Member) { |
| 136 entity = _elementMap.getMember(node.parent); |
| 137 } else { |
| 138 entity = localsMap.getLocalFunction(node.parent); |
| 139 } |
135 assert(entity != null); | 140 assert(entity != null); |
136 _closureRepresentationMap[entity] = closureClass; | 141 _closureRepresentationMap[entity] = closureClass; |
137 } | 142 } |
138 | 143 |
139 @override | 144 @override |
140 ScopeInfo getScopeInfo(Entity entity) { | 145 ScopeInfo getScopeInfo(Entity entity) { |
141 // TODO(johnniwinther): Remove this check when constructor bodies a created | 146 // TODO(johnniwinther): Remove this check when constructor bodies a created |
142 // eagerly with the J-model; a constructor body should have it's own | 147 // eagerly with the J-model; a constructor body should have it's own |
143 // [ClosureRepresentationInfo]. | 148 // [ClosureRepresentationInfo]. |
144 if (entity is ConstructorBodyEntity) { | 149 if (entity is ConstructorBodyEntity) { |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 | 335 |
331 final Map<Local, JField> localToFieldMap = new Map<Local, JField>(); | 336 final Map<Local, JField> localToFieldMap = new Map<Local, JField>(); |
332 | 337 |
333 KernelClosureClass.fromScopeInfo( | 338 KernelClosureClass.fromScopeInfo( |
334 ir.FunctionNode closureSourceNode, | 339 ir.FunctionNode closureSourceNode, |
335 this.name, | 340 this.name, |
336 this.classIndex, | 341 this.classIndex, |
337 this.library, | 342 this.library, |
338 KernelScopeInfo info, | 343 KernelScopeInfo info, |
339 KernelToLocalsMap localsMap) | 344 KernelToLocalsMap localsMap) |
340 : closureEntity = localsMap.getLocalFunction(closureSourceNode.parent), | 345 : closureEntity = closureSourceNode.parent is ir.Member |
| 346 ? null |
| 347 : localsMap.getLocalFunction(closureSourceNode.parent), |
341 super.from(info, localsMap); | 348 super.from(info, localsMap); |
342 | 349 |
343 ClassEntity get closureClassEntity => this; | 350 ClassEntity get closureClassEntity => this; |
344 | 351 |
345 List<Local> get createdFieldEntities => localToFieldMap.keys.toList(); | 352 List<Local> get createdFieldEntities => localToFieldMap.keys.toList(); |
346 | 353 |
347 // TODO(efortuna): Implement. | 354 // TODO(efortuna): Implement. |
348 FieldEntity get thisFieldEntity => null; | 355 FieldEntity get thisFieldEntity => null; |
349 | 356 |
350 void forEachCapturedVariable(f(Local from, JField to)) { | 357 void forEachCapturedVariable(f(Local from, JField to)) { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 ClosureMemberData(this.definition); | 434 ClosureMemberData(this.definition); |
428 | 435 |
429 @override | 436 @override |
430 Iterable<ConstantValue> getMetadata(KernelToElementMap elementMap) { | 437 Iterable<ConstantValue> getMetadata(KernelToElementMap elementMap) { |
431 return const <ConstantValue>[]; | 438 return const <ConstantValue>[]; |
432 } | 439 } |
433 } | 440 } |
434 | 441 |
435 class ClosureFunctionData extends ClosureMemberData implements FunctionData { | 442 class ClosureFunctionData extends ClosureMemberData implements FunctionData { |
436 final FunctionType functionType; | 443 final FunctionType functionType; |
| 444 final ir.FunctionNode functionNode; |
437 | 445 |
438 ClosureFunctionData(MemberDefinition definition, this.functionType) | 446 ClosureFunctionData( |
| 447 ClosureMemberDefinition definition, this.functionType, this.functionNode) |
439 : super(definition); | 448 : super(definition); |
440 | 449 |
441 @override | |
442 void forEachParameter(KernelToElementMapForBuilding elementMap, | 450 void forEachParameter(KernelToElementMapForBuilding elementMap, |
443 void f(DartType type, String name, ConstantValue defaultValue)) { | 451 void f(DartType type, String name, ConstantValue defaultValue)) { |
444 // TODO(johnniwinther,efortuna): Implement this. | 452 void handleParameter(ir.VariableDeclaration node, {bool isOptional: true}) { |
445 throw new UnimplementedError('ClosureFunctionData.forEachParameter'); | 453 DartType type = elementMap.getDartType(node.type); |
| 454 String name = node.name; |
| 455 ConstantValue defaultValue; |
| 456 if (isOptional) { |
| 457 if (node.initializer != null) { |
| 458 defaultValue = elementMap.getConstantValue(node.initializer); |
| 459 } else { |
| 460 defaultValue = new NullConstantValue(); |
| 461 } |
| 462 } |
| 463 f(type, name, defaultValue); |
| 464 } |
| 465 |
| 466 for (int i = 0; i < functionNode.positionalParameters.length; i++) { |
| 467 handleParameter(functionNode.positionalParameters[i], |
| 468 isOptional: i < functionNode.requiredParameterCount); |
| 469 } |
| 470 functionNode.namedParameters.toList() |
| 471 ..sort(namedOrdering) |
| 472 ..forEach(handleParameter); |
446 } | 473 } |
447 | 474 |
448 @override | 475 @override |
449 FunctionType getFunctionType(KernelToElementMap elementMap) { | 476 FunctionType getFunctionType(KernelToElementMap elementMap) { |
450 return functionType; | 477 return functionType; |
451 } | 478 } |
452 } | 479 } |
453 | 480 |
454 class ClosureFieldData extends ClosureMemberData implements FieldData { | 481 class ClosureFieldData extends ClosureMemberData implements FieldData { |
455 ClosureFieldData(MemberDefinition definition) : super(definition); | 482 ClosureFieldData(MemberDefinition definition) : super(definition); |
(...skipping 30 matching lines...) Expand all Loading... |
486 KernelScopeInfo scopeInfo; | 513 KernelScopeInfo scopeInfo; |
487 | 514 |
488 /// Collected [CapturedScope] data for nodes. | 515 /// Collected [CapturedScope] data for nodes. |
489 Map<ir.Node, KernelCapturedScope> capturedScopesMap = | 516 Map<ir.Node, KernelCapturedScope> capturedScopesMap = |
490 <ir.Node, KernelCapturedScope>{}; | 517 <ir.Node, KernelCapturedScope>{}; |
491 | 518 |
492 /// Collected [ScopeInfo] data for nodes. | 519 /// Collected [ScopeInfo] data for nodes. |
493 Map<ir.FunctionNode, KernelScopeInfo> closuresToGenerate = | 520 Map<ir.FunctionNode, KernelScopeInfo> closuresToGenerate = |
494 <ir.FunctionNode, KernelScopeInfo>{}; | 521 <ir.FunctionNode, KernelScopeInfo>{}; |
495 } | 522 } |
OLD | NEW |