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 library dart2js.kernel.backend_strategy; | 5 library dart2js.kernel.backend_strategy; |
6 | 6 |
7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
8 | 8 |
9 import '../backend_strategy.dart'; | 9 import '../backend_strategy.dart'; |
10 import '../closure.dart'; | 10 import '../closure.dart'; |
(...skipping 26 matching lines...) Expand all Loading... |
37 import 'element_map_impl.dart'; | 37 import 'element_map_impl.dart'; |
38 import 'kernel_strategy.dart'; | 38 import 'kernel_strategy.dart'; |
39 | 39 |
40 /// A backend strategy based on Kernel IR nodes. | 40 /// A backend strategy based on Kernel IR nodes. |
41 abstract class KernelBackendStrategy implements BackendStrategy { | 41 abstract class KernelBackendStrategy implements BackendStrategy { |
42 KernelToElementMap get elementMap; | 42 KernelToElementMap get elementMap; |
43 GlobalLocalsMap get globalLocalsMapForTesting; | 43 GlobalLocalsMap get globalLocalsMapForTesting; |
44 } | 44 } |
45 | 45 |
46 /// Backend strategy that uses the kernel elements as the backend model. | 46 /// Backend strategy that uses the kernel elements as the backend model. |
47 // TODO(johnniwinther): Replace this with a strategy based on the J-element | 47 // TODO(redemption): Replace this with a strategy based on the J-element |
48 // model. | 48 // model. |
49 class KernelBackendStrategyImpl implements KernelBackendStrategy { | 49 class KernelBackendStrategyImpl implements KernelBackendStrategy { |
50 final Compiler _compiler; | 50 final Compiler _compiler; |
51 Sorter _sorter; | 51 Sorter _sorter; |
52 ClosureConversionTask _closureDataLookup; | 52 ClosureConversionTask _closureDataLookup; |
53 final GlobalLocalsMap _globalLocalsMap = new GlobalLocalsMap(); | 53 final GlobalLocalsMap _globalLocalsMap = new GlobalLocalsMap(); |
54 | 54 |
55 KernelBackendStrategyImpl(this._compiler); | 55 KernelBackendStrategyImpl(this._compiler); |
56 | 56 |
57 KernelToElementMap get elementMap { | 57 KernelToElementMap get elementMap { |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 work.element.enclosingClass, | 166 work.element.enclosingClass, |
167 _elementMap.getMemberNode(work.element), | 167 _elementMap.getMemberNode(work.element), |
168 _compiler, | 168 _compiler, |
169 _elementMap, | 169 _elementMap, |
170 new KernelToTypeInferenceMapImpl(closedWorld), | 170 new KernelToTypeInferenceMapImpl(closedWorld), |
171 localsMap, | 171 localsMap, |
172 closedWorld, | 172 closedWorld, |
173 _compiler.codegenWorldBuilder, | 173 _compiler.codegenWorldBuilder, |
174 work.registry, | 174 work.registry, |
175 _compiler.backendStrategy.closureDataLookup, | 175 _compiler.backendStrategy.closureDataLookup, |
176 // TODO(johnniwinther): Support these: | 176 // TODO(redemption): Support these: |
177 const SourceInformationBuilder(), | 177 const SourceInformationBuilder(), |
178 null, // Function node used as capture scope id. | 178 null, // Function node used as capture scope id. |
179 targetIsConstructorBody: false); | 179 targetIsConstructorBody: false); |
180 return builder.build(); | 180 return builder.build(); |
181 } | 181 } |
182 } | 182 } |
183 | 183 |
184 class KernelToTypeInferenceMapImpl implements KernelToTypeInferenceMap { | 184 class KernelToTypeInferenceMapImpl implements KernelToTypeInferenceMap { |
185 final ClosedWorld _closedWorld; | 185 final ClosedWorld _closedWorld; |
186 | 186 |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 _members.add(member); | 291 _members.add(member); |
292 } | 292 } |
293 | 293 |
294 @override | 294 @override |
295 void leaveInlinedMember(MemberEntity member) { | 295 void leaveInlinedMember(MemberEntity member) { |
296 assert(member == currentMember); | 296 assert(member == currentMember); |
297 _members.removeLast(); | 297 _members.removeLast(); |
298 } | 298 } |
299 | 299 |
300 @override | 300 @override |
301 JumpTarget getJumpTarget(ir.TreeNode node, {bool isContinueTarget: false}) { | 301 JumpTarget getJumpTargetForBreak(ir.BreakStatement node) { |
302 // TODO(johnniwinther): Support jump targets. | 302 throw new UnimplementedError('KernelToLocalsMapImpl.getJumpTargetForBreak'); |
| 303 } |
| 304 |
| 305 @override |
| 306 JumpTarget getJumpTargetForContinueSwitch(ir.ContinueSwitchStatement node) { |
| 307 throw new UnimplementedError( |
| 308 'KernelToLocalsMapImpl.getJumpTargetForContinueSwitch'); |
| 309 } |
| 310 |
| 311 @override |
| 312 JumpTarget getJumpTargetForSwitchCase(ir.SwitchCase node) { |
| 313 throw new UnimplementedError( |
| 314 'KernelToLocalsMapImpl.getJumpTargetForSwitchCase'); |
| 315 } |
| 316 |
| 317 @override |
| 318 JumpTarget getJumpTargetForDo(ir.DoStatement node) { |
| 319 // TODO(redemption): Support do statement as jump target. |
303 return null; | 320 return null; |
304 } | 321 } |
305 | 322 |
| 323 @override |
| 324 JumpTarget getJumpTargetForLabel(ir.LabeledStatement node) { |
| 325 throw new UnimplementedError('KernelToLocalsMapImpl.getJumpTargetForLabel'); |
| 326 } |
| 327 |
| 328 @override |
| 329 JumpTarget getJumpTargetForSwitch(ir.SwitchStatement node) { |
| 330 throw new UnimplementedError( |
| 331 'KernelToLocalsMapImpl.getJumpTargetForSwitch'); |
| 332 } |
| 333 |
| 334 @override |
| 335 JumpTarget getJumpTargetForFor(ir.ForStatement node) { |
| 336 // TODO(redemption): Support for statement as jump target. |
| 337 return null; |
| 338 } |
| 339 |
| 340 @override |
| 341 JumpTarget getJumpTargetForForIn(ir.ForInStatement node) { |
| 342 // TODO(redemption): Support for-in statement as jump target. |
| 343 return null; |
| 344 } |
| 345 |
| 346 @override |
| 347 JumpTarget getJumpTargetForWhile(ir.WhileStatement node) { |
| 348 // TODO(redemption): Support while statement as jump target. |
| 349 return null; |
| 350 } |
| 351 |
306 @override | 352 @override |
307 Local getLocal(ir.VariableDeclaration node) { | 353 Local getLocal(ir.VariableDeclaration node) { |
308 return _map.putIfAbsent(node, () { | 354 return _map.putIfAbsent(node, () { |
309 return new KLocal(node.name, currentMember); | 355 return new KLocal(node.name, currentMember); |
310 }); | 356 }); |
311 } | 357 } |
312 | 358 |
313 @override | 359 @override |
314 LoopClosureRepresentationInfo getClosureRepresentationInfoForLoop( | 360 LoopClosureRepresentationInfo getClosureRepresentationInfoForLoop( |
315 ClosureDataLookup closureLookup, ir.TreeNode node) { | 361 ClosureDataLookup closureLookup, ir.TreeNode node) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 Iterable<ClassEntity> sortClasses(Iterable<ClassEntity> classes) { | 427 Iterable<ClassEntity> sortClasses(Iterable<ClassEntity> classes) { |
382 return classes.toList() | 428 return classes.toList() |
383 ..sort((ClassEntity a, ClassEntity b) { | 429 ..sort((ClassEntity a, ClassEntity b) { |
384 int r = _compareLibraries(a.library, b.library); | 430 int r = _compareLibraries(a.library, b.library); |
385 if (r != 0) return r; | 431 if (r != 0) return r; |
386 return _compareNodes( | 432 return _compareNodes( |
387 a, elementMap.getClassNode(a), b, elementMap.getClassNode(b)); | 433 a, elementMap.getClassNode(a), b, elementMap.getClassNode(b)); |
388 }); | 434 }); |
389 } | 435 } |
390 } | 436 } |
OLD | NEW |