OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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:js_runtime/shared/embedded_names.dart'; | 5 import 'package:js_runtime/shared/embedded_names.dart'; |
6 import 'package:kernel/ast.dart' as ir; | 6 import 'package:kernel/ast.dart' as ir; |
7 | 7 |
8 import '../closure.dart'; | 8 import '../closure.dart'; |
9 import '../common.dart'; | 9 import '../common.dart'; |
10 import '../compiler.dart'; | 10 import '../compiler.dart'; |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 } | 273 } |
274 | 274 |
275 TypeMask typeOfIteratorMoveNext(ir.ForInStatement forInStatement) { | 275 TypeMask typeOfIteratorMoveNext(ir.ForInStatement forInStatement) { |
276 return _resultOf(_target).typeOfIteratorMoveNext(getNode(forInStatement)); | 276 return _resultOf(_target).typeOfIteratorMoveNext(getNode(forInStatement)); |
277 } | 277 } |
278 | 278 |
279 bool isJsIndexableIterator( | 279 bool isJsIndexableIterator( |
280 ir.ForInStatement forInStatement, ClosedWorld closedWorld) { | 280 ir.ForInStatement forInStatement, ClosedWorld closedWorld) { |
281 TypeMask mask = typeOfIterator(forInStatement); | 281 TypeMask mask = typeOfIterator(forInStatement); |
282 return mask != null && | 282 return mask != null && |
283 mask.satisfies(_backend.helpers.jsIndexableClass, closedWorld) && | 283 mask.satisfies( |
| 284 _compiler.commonElements.jsIndexableClass, closedWorld) && |
284 // String is indexable but not iterable. | 285 // String is indexable but not iterable. |
285 !mask.satisfies(_backend.helpers.jsStringClass, closedWorld); | 286 !mask.satisfies(_compiler.commonElements.jsStringClass, closedWorld); |
286 } | 287 } |
287 | 288 |
288 bool isFixedLength(TypeMask mask, ClosedWorld closedWorld) { | 289 bool isFixedLength(TypeMask mask, ClosedWorld closedWorld) { |
289 if (mask.isContainer && (mask as ContainerTypeMask).length != null) { | 290 if (mask.isContainer && (mask as ContainerTypeMask).length != null) { |
290 // A container on which we have inferred the length. | 291 // A container on which we have inferred the length. |
291 return true; | 292 return true; |
292 } | 293 } |
293 // TODO(sra): Recognize any combination of fixed length indexables. | 294 // TODO(sra): Recognize any combination of fixed length indexables. |
294 if (mask.containsOnly(closedWorld.backendClasses.fixedListClass) || | 295 if (mask.containsOnly(closedWorld.backendClasses.fixedListClass) || |
295 mask.containsOnly(closedWorld.backendClasses.constListClass) || | 296 mask.containsOnly(closedWorld.backendClasses.constListClass) || |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 | 363 |
363 // Is the member a lazy initialized static or top-level member? | 364 // Is the member a lazy initialized static or top-level member? |
364 bool isLazyStatic(ir.Member member) { | 365 bool isLazyStatic(ir.Member member) { |
365 if (member is ir.Field) { | 366 if (member is ir.Field) { |
366 FieldElement field = _nodeToElement[member]; | 367 FieldElement field = _nodeToElement[member]; |
367 return field.constant == null; | 368 return field.constant == null; |
368 } | 369 } |
369 return false; | 370 return false; |
370 } | 371 } |
371 | 372 |
372 LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary; | 373 LibraryElement get jsHelperLibrary => |
| 374 _compiler.commonElements.jsHelperLibrary; |
373 | 375 |
374 KernelJumpTarget getJumpTarget(ir.TreeNode node, | 376 KernelJumpTarget getJumpTarget(ir.TreeNode node, |
375 {bool isContinueTarget: false}) { | 377 {bool isContinueTarget: false}) { |
376 return _jumpTargets.putIfAbsent(node, () { | 378 return _jumpTargets.putIfAbsent(node, () { |
377 if (node is ir.LabeledStatement && _jumpTargets.containsKey(node.body)) { | 379 if (node is ir.LabeledStatement && _jumpTargets.containsKey(node.body)) { |
378 return _jumpTargets[node.body]; | 380 return _jumpTargets[node.body]; |
379 } | 381 } |
380 return new KernelJumpTarget(node, this, | 382 return new KernelJumpTarget(node, this, |
381 makeContinueLabel: isContinueTarget); | 383 makeContinueLabel: isContinueTarget); |
382 }); | 384 }); |
383 } | 385 } |
384 | 386 |
385 ir.Procedure get checkDeferredIsLoaded => | 387 ir.Procedure get checkDeferredIsLoaded => |
386 kernel.functions[_backend.helpers.checkDeferredIsLoaded]; | 388 kernel.functions[_compiler.commonElements.checkDeferredIsLoaded]; |
387 | 389 |
388 TypeMask get checkDeferredIsLoadedType => | 390 TypeMask get checkDeferredIsLoadedType => |
389 TypeMaskFactory.inferredReturnTypeForElement( | 391 TypeMaskFactory.inferredReturnTypeForElement( |
390 _backend.helpers.checkDeferredIsLoaded, _globalInferenceResults); | 392 _compiler.commonElements.checkDeferredIsLoaded, |
| 393 _globalInferenceResults); |
391 | 394 |
392 ir.Procedure get createInvocationMirror => | 395 ir.Procedure get createInvocationMirror => |
393 kernel.functions[_backend.helpers.createInvocationMirror]; | 396 kernel.functions[_compiler.commonElements.createInvocationMirror]; |
394 | 397 |
395 ir.Class get mapLiteralClass => | 398 ir.Class get mapLiteralClass => |
396 kernel.classes[_backend.helpers.mapLiteralClass]; | 399 kernel.classes[_compiler.commonElements.mapLiteralClass]; |
397 | 400 |
398 ir.Procedure get mapLiteralConstructor => | 401 ir.Procedure get mapLiteralConstructor => |
399 kernel.functions[_backend.helpers.mapLiteralConstructor]; | 402 kernel.functions[_compiler.commonElements.mapLiteralConstructor]; |
400 | 403 |
401 ir.Procedure get mapLiteralConstructorEmpty => | 404 ir.Procedure get mapLiteralConstructorEmpty => |
402 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty]; | 405 kernel.functions[_compiler.commonElements.mapLiteralConstructorEmpty]; |
403 | 406 |
404 ir.Procedure get mapLiteralUntypedEmptyMaker => | 407 ir.Procedure get mapLiteralUntypedEmptyMaker => |
405 kernel.functions[_backend.helpers.mapLiteralUntypedEmptyMaker]; | 408 kernel.functions[_compiler.commonElements.mapLiteralUntypedEmptyMaker]; |
406 | 409 |
407 ir.Procedure get exceptionUnwrapper => | 410 ir.Procedure get exceptionUnwrapper => |
408 kernel.functions[_backend.helpers.exceptionUnwrapper]; | 411 kernel.functions[_compiler.commonElements.exceptionUnwrapper]; |
409 | 412 |
410 TypeMask get exceptionUnwrapperType => | 413 TypeMask get exceptionUnwrapperType => |
411 TypeMaskFactory.inferredReturnTypeForElement( | 414 TypeMaskFactory.inferredReturnTypeForElement( |
412 _backend.helpers.exceptionUnwrapper, _globalInferenceResults); | 415 _compiler.commonElements.exceptionUnwrapper, _globalInferenceResults); |
413 | 416 |
414 ir.Procedure get traceFromException => | 417 ir.Procedure get traceFromException => |
415 kernel.functions[_backend.helpers.traceFromException]; | 418 kernel.functions[_compiler.commonElements.traceFromException]; |
416 | 419 |
417 TypeMask get traceFromExceptionType => | 420 TypeMask get traceFromExceptionType => |
418 TypeMaskFactory.inferredReturnTypeForElement( | 421 TypeMaskFactory.inferredReturnTypeForElement( |
419 _backend.helpers.traceFromException, _globalInferenceResults); | 422 _compiler.commonElements.traceFromException, _globalInferenceResults); |
420 | 423 |
421 ir.Procedure get streamIteratorConstructor => | 424 ir.Procedure get streamIteratorConstructor => |
422 kernel.functions[_backend.helpers.streamIteratorConstructor]; | 425 kernel.functions[_compiler.commonElements.streamIteratorConstructor]; |
423 | 426 |
424 TypeMask get streamIteratorConstructorType => | 427 TypeMask get streamIteratorConstructorType => |
425 TypeMaskFactory.inferredReturnTypeForElement( | 428 TypeMaskFactory.inferredReturnTypeForElement( |
426 // ignore: UNNECESSARY_CAST | 429 // ignore: UNNECESSARY_CAST |
427 _backend.helpers.streamIteratorConstructor as FunctionEntity, | 430 _compiler.commonElements.streamIteratorConstructor as FunctionEntity, |
428 _globalInferenceResults); | 431 _globalInferenceResults); |
429 | 432 |
430 ir.Procedure get fallThroughError => | 433 ir.Procedure get fallThroughError => |
431 kernel.functions[_backend.helpers.fallThroughError]; | 434 kernel.functions[_compiler.commonElements.fallThroughError]; |
432 | 435 |
433 TypeMask get fallThroughErrorType => | 436 TypeMask get fallThroughErrorType => |
434 TypeMaskFactory.inferredReturnTypeForElement( | 437 TypeMaskFactory.inferredReturnTypeForElement( |
435 _backend.helpers.fallThroughError, _globalInferenceResults); | 438 _compiler.commonElements.fallThroughError, _globalInferenceResults); |
436 | 439 |
437 ir.Procedure get mapLiteralUntypedMaker => | 440 ir.Procedure get mapLiteralUntypedMaker => |
438 kernel.functions[_backend.helpers.mapLiteralUntypedMaker]; | 441 kernel.functions[_compiler.commonElements.mapLiteralUntypedMaker]; |
439 | 442 |
440 ir.Procedure get checkConcurrentModificationError => | 443 ir.Procedure get checkConcurrentModificationError => kernel |
441 kernel.functions[_backend.helpers.checkConcurrentModificationError]; | 444 .functions[_compiler.commonElements.checkConcurrentModificationError]; |
442 | 445 |
443 TypeMask get checkConcurrentModificationErrorReturnType => | 446 TypeMask get checkConcurrentModificationErrorReturnType => |
444 TypeMaskFactory.inferredReturnTypeForElement( | 447 TypeMaskFactory.inferredReturnTypeForElement( |
445 _backend.helpers.checkConcurrentModificationError, | 448 _compiler.commonElements.checkConcurrentModificationError, |
446 _globalInferenceResults); | 449 _globalInferenceResults); |
447 | 450 |
448 ir.Procedure get checkSubtype => | 451 ir.Procedure get checkSubtype => |
449 kernel.functions[_backend.helpers.checkSubtype]; | 452 kernel.functions[_compiler.commonElements.checkSubtype]; |
450 | 453 |
451 ir.Procedure get checkSubtypeOfRuntimeType => | 454 ir.Procedure get checkSubtypeOfRuntimeType => |
452 kernel.functions[_backend.helpers.checkSubtypeOfRuntimeType]; | 455 kernel.functions[_compiler.commonElements.checkSubtypeOfRuntimeType]; |
453 | 456 |
454 ir.Procedure get functionTypeTest => | 457 ir.Procedure get functionTypeTest => |
455 kernel.functions[_backend.helpers.functionTypeTest]; | 458 kernel.functions[_compiler.commonElements.functionTypeTest]; |
456 | 459 |
457 ir.Procedure get throwTypeError => | 460 ir.Procedure get throwTypeError => |
458 kernel.functions[_backend.helpers.throwTypeError]; | 461 kernel.functions[_compiler.commonElements.throwTypeError]; |
459 | 462 |
460 TypeMask get throwTypeErrorType => | 463 TypeMask get throwTypeErrorType => |
461 TypeMaskFactory.inferredReturnTypeForElement( | 464 TypeMaskFactory.inferredReturnTypeForElement( |
462 _backend.helpers.throwTypeError, _globalInferenceResults); | 465 _compiler.commonElements.throwTypeError, _globalInferenceResults); |
463 | 466 |
464 ir.Procedure get assertHelper => | 467 ir.Procedure get assertHelper => |
465 kernel.functions[_backend.helpers.assertHelper]; | 468 kernel.functions[_compiler.commonElements.assertHelper]; |
466 | 469 |
467 TypeMask get assertHelperReturnType => | 470 TypeMask get assertHelperReturnType => |
468 TypeMaskFactory.inferredReturnTypeForElement( | 471 TypeMaskFactory.inferredReturnTypeForElement( |
469 _backend.helpers.assertHelper, _globalInferenceResults); | 472 _compiler.commonElements.assertHelper, _globalInferenceResults); |
470 | 473 |
471 ir.Procedure get assertTest => kernel.functions[_backend.helpers.assertTest]; | 474 ir.Procedure get assertTest => |
| 475 kernel.functions[_compiler.commonElements.assertTest]; |
472 | 476 |
473 TypeMask get assertTestReturnType => | 477 TypeMask get assertTestReturnType => |
474 TypeMaskFactory.inferredReturnTypeForElement( | 478 TypeMaskFactory.inferredReturnTypeForElement( |
475 _backend.helpers.assertTest, _globalInferenceResults); | 479 _compiler.commonElements.assertTest, _globalInferenceResults); |
476 | 480 |
477 ir.Procedure get assertThrow => | 481 ir.Procedure get assertThrow => |
478 kernel.functions[_backend.helpers.assertThrow]; | 482 kernel.functions[_compiler.commonElements.assertThrow]; |
479 | 483 |
480 ir.Procedure get setRuntimeTypeInfo => | 484 ir.Procedure get setRuntimeTypeInfo => |
481 kernel.functions[_backend.helpers.setRuntimeTypeInfo]; | 485 kernel.functions[_compiler.commonElements.setRuntimeTypeInfo]; |
482 | 486 |
483 TypeMask get assertThrowReturnType => | 487 TypeMask get assertThrowReturnType => |
484 TypeMaskFactory.inferredReturnTypeForElement( | 488 TypeMaskFactory.inferredReturnTypeForElement( |
485 _backend.helpers.assertThrow, _globalInferenceResults); | 489 _compiler.commonElements.assertThrow, _globalInferenceResults); |
486 | 490 |
487 ir.Procedure get runtimeTypeToString => | 491 ir.Procedure get runtimeTypeToString => |
488 kernel.functions[_backend.helpers.runtimeTypeToString]; | 492 kernel.functions[_compiler.commonElements.runtimeTypeToString]; |
489 | 493 |
490 ir.Procedure get createRuntimeType => | 494 ir.Procedure get createRuntimeType => |
491 kernel.functions[_backend.helpers.createRuntimeType]; | 495 kernel.functions[_compiler.commonElements.createRuntimeType]; |
492 | 496 |
493 TypeMask get createRuntimeTypeReturnType => | 497 TypeMask get createRuntimeTypeReturnType => |
494 TypeMaskFactory.inferredReturnTypeForElement( | 498 TypeMaskFactory.inferredReturnTypeForElement( |
495 _backend.helpers.createRuntimeType, _globalInferenceResults); | 499 _compiler.commonElements.createRuntimeType, _globalInferenceResults); |
496 | 500 |
497 ir.Class get objectClass => | 501 ir.Class get objectClass => |
498 kernel.classes[_compiler.commonElements.objectClass]; | 502 kernel.classes[_compiler.commonElements.objectClass]; |
499 | 503 |
500 ir.Class get futureClass => | 504 ir.Class get futureClass => |
501 kernel.classes[_compiler.commonElements.futureClass]; | 505 kernel.classes[_compiler.commonElements.futureClass]; |
502 | 506 |
503 TypeMask makeSubtypeOfObject(ClosedWorld closedWorld) => | 507 TypeMask makeSubtypeOfObject(ClosedWorld closedWorld) => |
504 new TypeMask.subclass(_compiler.commonElements.objectClass, closedWorld); | 508 new TypeMask.subclass(_compiler.commonElements.objectClass, closedWorld); |
505 | 509 |
506 ir.Procedure get currentIsolate => | 510 ir.Procedure get currentIsolate => |
507 kernel.functions[_backend.helpers.currentIsolate]; | 511 kernel.functions[_compiler.commonElements.currentIsolate]; |
508 | 512 |
509 ir.Procedure get callInIsolate => | 513 ir.Procedure get callInIsolate => |
510 kernel.functions[_backend.helpers.callInIsolate]; | 514 kernel.functions[_compiler.commonElements.callInIsolate]; |
511 | 515 |
512 bool isInForeignLibrary(ir.Member member) => | 516 bool isInForeignLibrary(ir.Member member) => |
513 _backend.isForeign(getElement(member)); | 517 _backend.isForeign(getElement(member)); |
514 | 518 |
515 native.NativeBehavior getNativeBehavior(ir.Node node) { | 519 native.NativeBehavior getNativeBehavior(ir.Node node) { |
516 return elements.getNativeData(getNode(node)); | 520 return elements.getNativeData(getNode(node)); |
517 } | 521 } |
518 | 522 |
519 js.Name getNameForJsGetName(ir.Node argument, ConstantValue constant) { | 523 js.Name getNameForJsGetName(ir.Node argument, ConstantValue constant) { |
520 int index = _extractEnumIndexFromConstantValue( | 524 int index = _extractEnumIndexFromConstantValue( |
521 constant, _backend.helpers.jsGetNameEnum); | 525 constant, _compiler.commonElements.jsGetNameEnum); |
522 if (index == null) return null; | 526 if (index == null) return null; |
523 return _backend.namer | 527 return _backend.namer |
524 .getNameForJsGetName(getNode(argument), JsGetName.values[index]); | 528 .getNameForJsGetName(getNode(argument), JsGetName.values[index]); |
525 } | 529 } |
526 | 530 |
527 js.Template getJsBuiltinTemplate(ConstantValue constant) { | 531 js.Template getJsBuiltinTemplate(ConstantValue constant) { |
528 int index = _extractEnumIndexFromConstantValue( | 532 int index = _extractEnumIndexFromConstantValue( |
529 constant, _backend.helpers.jsBuiltinEnum); | 533 constant, _compiler.commonElements.jsBuiltinEnum); |
530 if (index == null) return null; | 534 if (index == null) return null; |
531 return _backend.emitter.builtinTemplateFor(JsBuiltin.values[index]); | 535 return _backend.emitter.builtinTemplateFor(JsBuiltin.values[index]); |
532 } | 536 } |
533 | 537 |
534 int _extractEnumIndexFromConstantValue( | 538 int _extractEnumIndexFromConstantValue( |
535 ConstantValue constant, ClassEntity classElement) { | 539 ConstantValue constant, ClassEntity classElement) { |
536 if (constant is ConstructedConstantValue) { | 540 if (constant is ConstructedConstantValue) { |
537 if (constant.type.element == classElement) { | 541 if (constant.type.element == classElement) { |
538 assert(constant.fields.length == 1 || constant.fields.length == 2); | 542 assert(constant.fields.length == 1 || constant.fields.length == 2); |
539 ConstantValue indexConstant = constant.fields.values.first; | 543 ConstantValue indexConstant = constant.fields.values.first; |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
817 JumpTarget continueTarget = | 821 JumpTarget continueTarget = |
818 astAdapter.getJumpTarget(switchCase, isContinueTarget: true); | 822 astAdapter.getJumpTarget(switchCase, isContinueTarget: true); |
819 assert(continueTarget is KernelJumpTarget); | 823 assert(continueTarget is KernelJumpTarget); |
820 targetIndexMap[continueTarget] = switchIndex; | 824 targetIndexMap[continueTarget] = switchIndex; |
821 assert(builder.jumpTargets[continueTarget] == null); | 825 assert(builder.jumpTargets[continueTarget] == null); |
822 builder.jumpTargets[continueTarget] = this; | 826 builder.jumpTargets[continueTarget] = this; |
823 switchIndex++; | 827 switchIndex++; |
824 } | 828 } |
825 } | 829 } |
826 } | 830 } |
OLD | NEW |