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:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | 8 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; |
9 import '../common/names.dart'; | 9 import '../common/names.dart'; |
10 import '../common/tasks.dart' show CompilerTask; | 10 import '../common/tasks.dart' show CompilerTask; |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 expression, graph.addConstantNull(compiler), null, backend.boolType)); | 378 expression, graph.addConstantNull(compiler), null, backend.boolType)); |
379 } | 379 } |
380 | 380 |
381 @override | 381 @override |
382 void defaultExpression(ir.Expression expression) { | 382 void defaultExpression(ir.Expression expression) { |
383 // TODO(het): This is only to get tests working. | 383 // TODO(het): This is only to get tests working. |
384 String message = 'Unhandled ir.${expression.runtimeType} $expression'; | 384 String message = 'Unhandled ir.${expression.runtimeType} $expression'; |
385 HInstruction nullValue = graph.addConstantNull(compiler); | 385 HInstruction nullValue = graph.addConstantNull(compiler); |
386 HInstruction errorMessage = | 386 HInstruction errorMessage = |
387 graph.addConstantString(new DartString.literal(message), compiler); | 387 graph.addConstantString(new DartString.literal(message), compiler); |
388 HInstruction trap = new HForeignCode( | 388 HInstruction trap = new HForeignCode(js.js.parseForeignJS("#.#"), |
389 js.js.parseForeignJS("#.#"), | 389 backend.dynamicType, <HInstruction>[nullValue, errorMessage]); |
390 backend.dynamicType, | 390 trap.sideEffects |
391 <HInstruction>[nullValue, errorMessage]); | 391 ..setAllSideEffects() |
392 trap.sideEffects..setAllSideEffects()..setDependsOnSomething(); | 392 ..setDependsOnSomething(); |
393 push(trap); | 393 push(trap); |
394 } | 394 } |
395 | 395 |
396 /// Returns the current source element. | 396 /// Returns the current source element. |
397 /// | 397 /// |
398 /// The returned element is a declaration element. | 398 /// The returned element is a declaration element. |
399 // TODO(efortuna): Update this when we implement inlining. | 399 // TODO(efortuna): Update this when we implement inlining. |
400 @override | 400 @override |
401 Element get sourceElement => astAdapter.getElement(target); | 401 Element get sourceElement => astAdapter.getElement(target); |
402 | 402 |
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
945 // Invoke the getter | 945 // Invoke the getter |
946 _pushStaticInvocation(staticTarget, const <HInstruction>[], | 946 _pushStaticInvocation(staticTarget, const <HInstruction>[], |
947 astAdapter.returnTypeOf(staticTarget)); | 947 astAdapter.returnTypeOf(staticTarget)); |
948 } else if (staticTarget is ir.Field && staticTarget.isConst) { | 948 } else if (staticTarget is ir.Field && staticTarget.isConst) { |
949 assert(staticTarget.initializer != null); | 949 assert(staticTarget.initializer != null); |
950 stack.add(graph.addConstant( | 950 stack.add(graph.addConstant( |
951 astAdapter.getConstantFor(staticTarget.initializer), compiler)); | 951 astAdapter.getConstantFor(staticTarget.initializer), compiler)); |
952 } else { | 952 } else { |
953 if (_isLazyStatic(staticTarget)) { | 953 if (_isLazyStatic(staticTarget)) { |
954 push(new HLazyStatic(astAdapter.getField(staticTarget), | 954 push(new HLazyStatic(astAdapter.getField(staticTarget), |
955 astAdapter.inferredTypeOf(staticTarget))); | 955 astAdapter.inferredTypeOf(staticTarget))); |
956 } else { | 956 } else { |
957 push(new HStatic(astAdapter.getMember(staticTarget), | 957 push(new HStatic(astAdapter.getMember(staticTarget), |
958 astAdapter.inferredTypeOf(staticTarget))); | 958 astAdapter.inferredTypeOf(staticTarget))); |
959 } | 959 } |
960 } | 960 } |
961 } | 961 } |
962 | 962 |
963 bool _isLazyStatic(ir.Member target) { | 963 bool _isLazyStatic(ir.Member target) { |
964 return astAdapter.isLazyStatic(target); | 964 return astAdapter.isLazyStatic(target); |
965 } | 965 } |
966 | 966 |
967 @override | 967 @override |
968 void visitStaticSet(ir.StaticSet staticSet) { | 968 void visitStaticSet(ir.StaticSet staticSet) { |
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1634 TypeMask typeMask = new TypeMask.nonNullExact( | 1634 TypeMask typeMask = new TypeMask.nonNullExact( |
1635 astAdapter.getElement(target.enclosingClass), compiler.closedWorld); | 1635 astAdapter.getElement(target.enclosingClass), compiler.closedWorld); |
1636 _pushStaticInvocation(target, arguments, typeMask); | 1636 _pushStaticInvocation(target, arguments, typeMask); |
1637 } | 1637 } |
1638 | 1638 |
1639 @override | 1639 @override |
1640 void visitIsExpression(ir.IsExpression isExpression) { | 1640 void visitIsExpression(ir.IsExpression isExpression) { |
1641 isExpression.operand.accept(this); | 1641 isExpression.operand.accept(this); |
1642 HInstruction expression = pop(); | 1642 HInstruction expression = pop(); |
1643 | 1643 |
| 1644 // TODO(sra): Convert the type testing logic here to use ir.DartType. |
1644 DartType type = astAdapter.getDartType(isExpression.type); | 1645 DartType type = astAdapter.getDartType(isExpression.type); |
1645 | 1646 |
| 1647 type = localsHandler.substInContext(type).unaliased; |
| 1648 |
| 1649 if (type is MethodTypeVariableType) { |
| 1650 push(graph.addConstantBool(true, compiler)); |
| 1651 return; |
| 1652 } |
| 1653 |
| 1654 if (type is MalformedType) { |
| 1655 ErroneousElement element = type.element; |
| 1656 generateTypeError(isExpression, element.message); |
| 1657 push(new HIs.compound(type, expression, pop(), backend.boolType)); |
| 1658 return; |
| 1659 } |
| 1660 |
| 1661 if (type.isFunctionType) { |
| 1662 List arguments = <HInstruction>[buildFunctionType(type), expression]; |
| 1663 _pushDynamicInvocation(isExpression, backend.boolType, arguments, |
| 1664 selector: new Selector.call( |
| 1665 new PrivateName('_isTest', astAdapter.jsHelperLibrary), |
| 1666 CallStructure.ONE_ARG)); |
| 1667 push(new HIs.compound(type, expression, pop(), backend.boolType)); |
| 1668 return; |
| 1669 } |
| 1670 |
| 1671 if (type.isTypeVariable) { |
| 1672 HInstruction runtimeType = |
| 1673 typeBuilder.addTypeVariableReference(type, sourceElement); |
| 1674 _pushStaticInvocation(astAdapter.checkSubtypeOfRuntimeType, |
| 1675 <HInstruction>[expression, runtimeType], backend.boolType); |
| 1676 push(new HIs.variable(type, expression, pop(), backend.boolType)); |
| 1677 return; |
| 1678 } |
| 1679 |
| 1680 // TODO(sra): Type with type parameters. |
| 1681 |
1646 if (backend.hasDirectCheckFor(type)) { | 1682 if (backend.hasDirectCheckFor(type)) { |
1647 push(new HIs.direct(type, expression, backend.boolType)); | 1683 push(new HIs.direct(type, expression, backend.boolType)); |
1648 return; | 1684 return; |
1649 } | 1685 } |
1650 | 1686 |
1651 // The interceptor is not always needed. It is removed by optimization | 1687 // The interceptor is not always needed. It is removed by optimization |
1652 // when the receiver type or tested type permit. | 1688 // when the receiver type or tested type permit. |
1653 HInterceptor interceptor = _interceptorFor(expression); | 1689 HInterceptor interceptor = _interceptorFor(expression); |
1654 push(new HIs.raw(type, expression, interceptor, backend.boolType)); | 1690 push(new HIs.raw(type, expression, interceptor, backend.boolType)); |
1655 } | 1691 } |
(...skipping 19 matching lines...) Expand all Loading... |
1675 push(new HNot(popBoolified(), backend.boolType)); | 1711 push(new HNot(popBoolified(), backend.boolType)); |
1676 } | 1712 } |
1677 | 1713 |
1678 @override | 1714 @override |
1679 void visitStringConcatenation(ir.StringConcatenation stringConcat) { | 1715 void visitStringConcatenation(ir.StringConcatenation stringConcat) { |
1680 KernelStringBuilder stringBuilder = new KernelStringBuilder(this); | 1716 KernelStringBuilder stringBuilder = new KernelStringBuilder(this); |
1681 stringConcat.accept(stringBuilder); | 1717 stringConcat.accept(stringBuilder); |
1682 stack.add(stringBuilder.result); | 1718 stack.add(stringBuilder.result); |
1683 } | 1719 } |
1684 } | 1720 } |
OLD | NEW |