Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 /** A formal parameter to a [Method]. */ | 5 /** A formal parameter to a [Method]. */ |
| 6 class Parameter { | 6 class Parameter { |
| 7 FormalNode definition; | 7 FormalNode definition; |
| 8 | 8 |
| 9 String name; | 9 String name; |
| 10 Type type; | 10 Type type; |
| (...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 682 if (p >= 0 && args.values[p].needsTemp) { | 682 if (p >= 0 && args.values[p].needsTemp) { |
| 683 if (lastParameter != null && lastParameter > p) { | 683 if (lastParameter != null && lastParameter > p) { |
| 684 return false; | 684 return false; |
| 685 } | 685 } |
| 686 lastParameter = p; | 686 lastParameter = p; |
| 687 } | 687 } |
| 688 } | 688 } |
| 689 return true; | 689 return true; |
| 690 } | 690 } |
| 691 | 691 |
| 692 /** Returns true if any of the arguments will need conversion. */ | |
| 693 // TODO(jmesserly): I don't like how this is coupled to invoke | |
| 694 bool needsArgumentConversion(Arguments args) { | |
| 695 int bareCount = args.bareCount; | |
| 696 for (int i = 0; i < bareCount; i++) { | |
| 697 var arg = args.values[i]; | |
| 698 if (arg.needsConversion(parameters[i].type)) { | |
| 699 return false; | |
| 700 } | |
| 701 } | |
| 702 | |
| 703 if (bareCount < parameters.length) { | |
| 704 genParameterValues(); | |
| 705 for (int i = bareCount; i < parameters.length; i++) { | |
| 706 var arg = args.getValue(parameters[i].name); | |
| 707 if (arg != null && arg.needsConversion(parameters[i].type)) { | |
| 708 return false; | |
| 709 } | |
| 710 } | |
| 711 } | |
| 712 | |
| 713 return true; | |
| 714 } | |
| 715 | |
| 692 static String _argCountMsg(int actual, int expected, [bool atLeast=false]) { | 716 static String _argCountMsg(int actual, int expected, [bool atLeast=false]) { |
| 693 // TODO(jimhug): better messages with default named args. | 717 // TODO(jimhug): better messages with default named args. |
| 694 return 'wrong number of arguments, expected ' + | 718 return 'wrong number of arguments, expected ' + |
| 695 '${atLeast ? "at least " : ""}$expected but found $actual'; | 719 '${atLeast ? "at least " : ""}$expected but found $actual'; |
| 696 } | 720 } |
| 697 | 721 |
| 698 Value _argError(MethodGenerator context, Node node, Value target, | 722 Value _argError(MethodGenerator context, Node node, Value target, |
| 699 Arguments args, String msg) { | 723 Arguments args, String msg) { |
| 700 if (isStatic || isConstructor) { | 724 if (isStatic || isConstructor) { |
| 701 world.error(msg, node.span); | 725 world.error(msg, node.span); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 993 } else if (name == '\$bit_not') { | 1017 } else if (name == '\$bit_not') { |
| 994 code = '~${target.code}'; | 1018 code = '~${target.code}'; |
| 995 } else if (name == '\$truncdiv') { | 1019 } else if (name == '\$truncdiv') { |
| 996 code = '$name(${target.code}, ${argsCode[0]})'; | 1020 code = '$name(${target.code}, ${argsCode[0]})'; |
| 997 } else if (name == '\$mod') { | 1021 } else if (name == '\$mod') { |
| 998 code = '$name(${target.code}, ${argsCode[0]})'; | 1022 code = '$name(${target.code}, ${argsCode[0]})'; |
| 999 } else { | 1023 } else { |
| 1000 var op = TokenKind.rawOperatorFromMethod(name); | 1024 var op = TokenKind.rawOperatorFromMethod(name); |
| 1001 code = '${target.code} $op ${argsCode[0]}'; | 1025 code = '${target.code} $op ${argsCode[0]}'; |
| 1002 } | 1026 } |
| 1027 | |
| 1003 return new Value(returnType, code); | 1028 return new Value(returnType, code); |
| 1004 } else { | 1029 } else { |
| 1005 var value; | 1030 var value; |
| 1006 num val0, val1, ival0, ival1; | 1031 num val0, val1, ival0, ival1; |
| 1007 val0 = target.dynamic.actualValue; | 1032 val0 = target.dynamic.actualValue; |
| 1008 ival0 = val0.toInt(); | 1033 ival0 = val0.toInt(); |
| 1009 if (args.values.length > 0) { | 1034 if (args.values.length > 0) { |
| 1010 val1 = args.values[0].dynamic.actualValue; | 1035 val1 = args.values[0].dynamic.actualValue; |
| 1011 ival1 = val1.toInt(); | 1036 ival1 = val1.toInt(); |
| 1012 } | 1037 } |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1444 } | 1469 } |
| 1445 | 1470 |
| 1446 void addFactory(String typeName, String name, Member member) { | 1471 void addFactory(String typeName, String name, Member member) { |
| 1447 getFactoriesFor(typeName)[name] = member; | 1472 getFactoriesFor(typeName)[name] = member; |
| 1448 } | 1473 } |
| 1449 | 1474 |
| 1450 Member getFactory(String typeName, String name) { | 1475 Member getFactory(String typeName, String name) { |
| 1451 return getFactoriesFor(typeName)[name]; | 1476 return getFactoriesFor(typeName)[name]; |
| 1452 } | 1477 } |
| 1453 | 1478 |
| 1454 void forEach(void f(MethodMember member)) { | 1479 void forEach(void f(Member member)) { |
|
Jennifer Messerly
2011/11/05 00:45:11
This was a run time type error: we are passing a C
| |
| 1455 factories.forEach((_, Map constructors) { | 1480 factories.forEach((_, Map constructors) { |
| 1456 constructors.forEach((_, Member member) { | 1481 constructors.forEach((_, Member member) { |
| 1457 f(member); | 1482 f(member); |
| 1458 }); | 1483 }); |
| 1459 }); | 1484 }); |
| 1460 } | 1485 } |
| 1461 } | 1486 } |
| OLD | NEW |