Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/lib/js_helper.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart |
| index 7ed7b2d1177b7f4d399b8e8f7091a6e8fdaf45ea..6ab95d52ab540cd349bb2bc81be1d588f0df552a 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart |
| @@ -1631,22 +1631,62 @@ String getClassName(var object) { |
| return JS('String', r'#.constructor.builtin$cls', object); |
| } |
| +String getTypeArgumentAsString(List runtimeType) { |
| + String className = runtimeTypeToString(runtimeType[0]); |
| + if (runtimeType.length = 1) return className; |
|
ngeoffray
2012/12/06 23:21:45
== 1
karlklose
2012/12/07 07:46:35
Argh, this is bad. Good catch.
|
| + return '$className<${joinArguments(runtimeType, 1)}>'; |
| +} |
| + |
| +String runtimeTypeToString(type) { |
| + if (type == null) { |
| + return 'dynamic'; |
| + } else if (type is String) { |
| + // A native class. The string is the unique name. |
| + return type; |
| + } else if (isJsArray(type)) { |
| + // A list representing a type with arguments. |
| + return getTypeArgumentAsString(type); |
| + } else { |
| + // A reference to the constructor. |
| + return JS('String', r'#.builtin$cls', type); |
| + } |
| +} |
| + |
| +String joinArguments(var types, int startIndex) { |
| + bool firstArgument = true; |
| + StringBuffer buffer = new StringBuffer(); |
| + for (int index = startIndex; index < types.length; index++) { |
| + if (firstArgument) { |
| + firstArgument = false; |
| + } else { |
| + buffer. add(', '); |
| + } |
| + var argument = types[index]; |
| + buffer.add(runtimeTypeToString(argument)); |
| + } |
| + return buffer.toString(); |
| +} |
| + |
| String getRuntimeTypeString(var object) { |
| String className = isJsArray(object) ? 'List' : getClassName(object); |
| var typeInfo = JS('var', r'#.builtin$typeInfo', object); |
| if (typeInfo == null) return className; |
| - StringBuffer arguments = new StringBuffer(); |
| - for (var i = 0; i < typeInfo.length; i++) { |
| - if (i > 0) { |
| - arguments.add(', '); |
| - } |
| - var argument = typeInfo[i]; |
| - if (argument == null) { |
| - argument = 'dynamic'; |
| + return "$className<${joinArguments(typeInfo, 0)}>"; |
| +} |
| + |
| +bool isSubtype(var s, var t) { |
| + if (s == null || t == null) return true; |
| + if (!isJsArray(s)) return s == t; |
| + // TODO(karlklose): support subtyping: if s[0] != t[0], check if there is |
| + // a function is$s[0] on t[0] and call it with substitutes type arguments. |
|
ngeoffray
2012/12/06 23:21:45
Please don't use JS in this method. The compiler k
karlklose
2012/12/07 07:46:35
Done.
|
| + if (JS('var', '#[0]', s) != JS('var', '#[0]', t)) return false; |
| + int len = JS('int', '#.length', s); |
| + for (int i = 1; i < len; i++) { |
| + if (!isSubtype(JS('var', '#[0]', s), JS('var', '#[0]', s))) { |
| + return false; |
| } |
| - arguments.add(argument); |
| } |
| - return '$className<$arguments>'; |
| + return true; |
| } |
| createRuntimeType(String name) => new TypeImpl(name); |