| 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 |