Index: sdk/lib/_internal/compiler/js_lib/js_helper.dart |
diff --git a/sdk/lib/_internal/compiler/js_lib/js_helper.dart b/sdk/lib/_internal/compiler/js_lib/js_helper.dart |
index ff4701d2c9f0b0c1f6dedb3bd025be792e15c13a..470b0daf0c6c9fbfde2060cf685437d68d4caa2b 100644 |
--- a/sdk/lib/_internal/compiler/js_lib/js_helper.dart |
+++ b/sdk/lib/_internal/compiler/js_lib/js_helper.dart |
@@ -87,12 +87,12 @@ part 'linked_hash_map.dart'; |
abstract class InternalMap { |
} |
-/// Extracts the classname from the isCheckProperty. |
+/// Extracts the JavaScript-constructor name from the given isCheckProperty. |
// TODO(floitsch): move this to foreign_helper.dart or similar. |
@ForceInline() |
-String classNameFromIsCheckProperty(String isCheckProperty) { |
+String isCheckPropertyToJsConstructorName(String isCheckProperty) { |
return JS_BUILTIN('returns:String;depends:none;effects:none', |
- JsBuiltin.classNameFromIsCheckProperty, |
+ JsBuiltin.isCheckPropertyToJsConstructorName, |
isCheckProperty); |
} |
@@ -108,17 +108,24 @@ bool isDartFunctionType(Object type) { |
/// Creates a function type object. |
// TODO(floitsch): move this to foreign_helper.dart or similar. |
@ForceInline() |
-createDartFunctionType() { |
+createDartFunctionTypeRti() { |
return JS_BUILTIN('returns:=Object;effects:none;depends:none', |
- JsBuiltin.createFunctionType); |
+ JsBuiltin.createFunctionTypeRti); |
} |
/// Retrieves the class name from type information stored on the constructor of |
/// [type]. |
// TODO(floitsch): move this to foreign_helper.dart or similar. |
@ForceInline() |
-String getDartTypeName(Object type) { |
- return JS_BUILTIN('String', JsBuiltin.typeName, type); |
+String rawRtiToJsConstructorName(Object rti) { |
+ return JS_BUILTIN('String', JsBuiltin.rawRtiToJsConstructorName, rti); |
+} |
+ |
+/// Returns the rti from the given [constructorName]. |
+// TODO(floitsch): make this a builtin. |
+jsConstructorNameToRti(String constructorName) { |
+ var getTypeFromName = JS_EMBEDDED_GLOBAL('', GET_TYPE_FROM_NAME); |
+ return JS('', '#(#)', getTypeFromName, constructorName); |
} |
/// Returns the raw runtime type of the given object [o]. |
@@ -168,6 +175,7 @@ bool isNullTypeRti(type) { |
} |
/// Returns the metadata of the given [index]. |
+// TODO(floitsch): move this to foreign_helper.dart or similar. |
@ForceInline() |
getMetadata(int index) { |
return JS_BUILTIN('returns:var;effects:none;depends:none', |
@@ -175,6 +183,7 @@ getMetadata(int index) { |
} |
/// Returns the type of the given [index]. |
+// TODO(floitsch): move this to foreign_helper.dart or similar. |
@ForceInline() |
getType(int index) { |
return JS_BUILTIN('returns:var;effects:none;depends:none', |
@@ -791,6 +800,9 @@ class Primitives { |
/// with the given type arguments. |
/// |
/// In minified mode, uses the unminified names if available. |
+ /// |
+ /// The given [className] string generally contains the name of the JavaScript |
+ /// constructor of the given class. |
static String formatType(String className, List typeArguments) { |
return unmangleAllIdentifiersIfPreservedAnyways |
('$className${joinArguments(typeArguments, 0)}'); |
@@ -821,7 +833,7 @@ class Primitives { |
} |
/// In minified mode, uses the unminified names if available. |
- static String objectToString(Object object) { |
+ static String objectToHumanReadableString(Object object) { |
String name = objectTypeName(object); |
return "Instance of '$name'"; |
} |
@@ -1345,10 +1357,6 @@ class Primitives { |
return JS('', '#.apply(#, #)', jsFunction, function, positionalArguments); |
} |
- static _mangledNameMatchesType(String mangledName, TypeImpl type) { |
- return JS('bool', '# == #', mangledName, type._typeName); |
- } |
- |
static bool identicalImplementation(a, b) { |
return JS('bool', '# == null', a) |
? JS('bool', '# == null', b) |
@@ -1972,29 +1980,17 @@ unwrapException(ex) { |
var match; |
// Using JS to give type hints to the compiler to help tree-shaking. |
// TODO(ahe): That should be unnecessary due to type inference. |
- var nsme = |
- JS('TypeErrorDecoder', '#', TypeErrorDecoder.noSuchMethodPattern); |
- var notClosure = |
- JS('TypeErrorDecoder', '#', TypeErrorDecoder.notClosurePattern); |
- var nullCall = |
- JS('TypeErrorDecoder', '#', TypeErrorDecoder.nullCallPattern); |
- var nullLiteralCall = |
- JS('TypeErrorDecoder', '#', TypeErrorDecoder.nullLiteralCallPattern); |
- var undefCall = |
- JS('TypeErrorDecoder', '#', TypeErrorDecoder.undefinedCallPattern); |
- var undefLiteralCall = |
- JS('TypeErrorDecoder', '#', |
- TypeErrorDecoder.undefinedLiteralCallPattern); |
- var nullProperty = |
- JS('TypeErrorDecoder', '#', TypeErrorDecoder.nullPropertyPattern); |
- var nullLiteralProperty = |
- JS('TypeErrorDecoder', '#', |
- TypeErrorDecoder.nullLiteralPropertyPattern); |
- var undefProperty = |
- JS('TypeErrorDecoder', '#', TypeErrorDecoder.undefinedPropertyPattern); |
+ var nsme = TypeErrorDecoder.noSuchMethodPattern; |
+ var notClosure = TypeErrorDecoder.notClosurePattern; |
+ var nullCall = TypeErrorDecoder.nullCallPattern; |
+ var nullLiteralCall = TypeErrorDecoder.nullLiteralCallPattern; |
+ var undefCall = TypeErrorDecoder.undefinedCallPattern; |
+ var undefLiteralCall = TypeErrorDecoder.undefinedLiteralCallPattern; |
+ var nullProperty = TypeErrorDecoder.nullPropertyPattern; |
+ var nullLiteralProperty = TypeErrorDecoder.nullLiteralPropertyPattern; |
+ var undefProperty = TypeErrorDecoder.undefinedPropertyPattern; |
var undefLiteralProperty = |
- JS('TypeErrorDecoder', '#', |
- TypeErrorDecoder.undefinedLiteralPropertyPattern); |
+ TypeErrorDecoder.undefinedLiteralPropertyPattern; |
if ((match = nsme.matchTypeError(message)) != null) { |
return saveStackTrace(new JsNoSuchMethodError(message, match)); |
} else if ((match = notClosure.matchTypeError(message)) != null) { |
@@ -2216,6 +2212,9 @@ abstract class Closure implements Function { |
String callName = JS('String|Null', '#[#]', function, |
JS_GET_NAME(JsGetName.CALL_NAME_PROPERTY)); |
+ // This variable holds either an index into the types-table, or a function |
+ // that can compute a function-rti. (The latter is necessary if the type |
+ // is dependent on generic arguments). |
var functionType; |
if (reflectionInfo is List) { |
JS('', '#.\$reflectionInfo = #', function, reflectionInfo); |
@@ -2650,7 +2649,7 @@ class BoundClosure extends TearOffClosure { |
toString() { |
var receiver = _receiver == null ? _self : _receiver; |
- return "Closure '$_name' of ${Primitives.objectToString(receiver)}"; |
+ return "Closure '$_name' of ${Primitives.objectToHumanReadableString(receiver)}"; |
} |
@NoInline() |
@@ -2868,7 +2867,7 @@ intTypeCast(value) { |
} |
void propertyTypeError(value, property) { |
- String name = classNameFromIsCheckProperty(property); |
+ String name = isCheckPropertyToJsConstructorName(property); |
throw new TypeErrorImplementation(value, name); |
} |
@@ -3228,7 +3227,7 @@ class RuntimeFunctionType extends RuntimeType { |
} |
toRti() { |
- var result = createDartFunctionType(); |
+ var result = createDartFunctionTypeRti(); |
if (isVoid) { |
JS('', '#[#] = true', result, JS_FUNCTION_TYPE_VOID_RETURN_TAG()); |
} else { |
@@ -3334,11 +3333,11 @@ RuntimeFunctionType buildNamedFunctionType(returnType, |
} |
RuntimeType buildInterfaceType(rti, typeArguments) { |
- String name = JS('String', r'#.name', rti); |
+ String jsConstructorName = rawRtiToJsConstructorName(rti); |
if (typeArguments == null || typeArguments.isEmpty) { |
- return new RuntimeTypePlain(name); |
+ return new RuntimeTypePlain(jsConstructorName); |
} |
- return new RuntimeTypeGeneric(name, typeArguments, null); |
+ return new RuntimeTypeGeneric(jsConstructorName, typeArguments, null); |
} |
class DynamicRuntimeType extends RuntimeType { |
@@ -3410,41 +3409,41 @@ RuntimeType convertRtiToRuntimeType(rti) { |
} |
class RuntimeTypePlain extends RuntimeType { |
- final String name; |
+ /// The constructor name of this raw type. |
+ final String _jsConstructorName; |
- RuntimeTypePlain(this.name); |
+ RuntimeTypePlain(this._jsConstructorName); |
toRti() { |
- var getTypeFromName = JS_EMBEDDED_GLOBAL('', GET_TYPE_FROM_NAME); |
- var rti = JS('', '#(#)', getTypeFromName, name); |
- if (rti == null) throw "no type for '$name'"; |
+ var rti = jsConstructorNameToRti(_jsConstructorName); |
+ if (rti == null) throw "no type for '$_jsConstructorName'"; |
return rti; |
} |
- String toString() => name; |
+ String toString() => _jsConstructorName; |
} |
class RuntimeTypeGeneric extends RuntimeType { |
- final String name; |
+ /// The constructor name of the raw type for this generic type. |
+ final String _jsConstructorName; |
final List<RuntimeType> arguments; |
var rti; |
- RuntimeTypeGeneric(this.name, this.arguments, this.rti); |
+ RuntimeTypeGeneric(this._jsConstructorName, this.arguments, this.rti); |
toRti() { |
if (rti != null) return rti; |
- var getTypeFromName = JS_EMBEDDED_GLOBAL('', GET_TYPE_FROM_NAME); |
- var result = JS('JSExtendableArray', '[#(#)]', getTypeFromName, name); |
+ var result = [jsConstructorNameToRti(_jsConstructorName)]; |
if (result[0] == null) { |
- throw "no type for '$name<...>'"; |
+ throw "no type for '$_jsConstructorName<...>'"; |
} |
for (RuntimeType argument in arguments) { |
- JS('', '#.push(#)', result, argument.toRti()); |
+ result.add(argument.toRti()); |
} |
return rti = result; |
} |
- String toString() => '$name<${arguments.join(", ")}>'; |
+ String toString() => '$_jsConstructorName<${arguments.join(", ")}>'; |
} |
class FunctionTypeInfoDecoderRing { |
@@ -3475,6 +3474,7 @@ class FunctionTypeInfoDecoderRing { |
String _convert(type) { |
String result = runtimeTypeToString(type); |
if (result != null) return result; |
+ // Currently the [runtimeTypeToString] method doesn't handle function rtis. |
if (JS('bool', '"func" in #', type)) { |
return new FunctionTypeInfoDecoderRing(type).toString(); |
} else { |