Index: lib/compiler/implementation/ssa/builder.dart |
diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart |
index d48f76ee959121bff3828e1f9aab731273648cab..df16e1dcbfea2880390622b7c5e45927b8370ecc 100644 |
--- a/lib/compiler/implementation/ssa/builder.dart |
+++ b/lib/compiler/implementation/ssa/builder.dart |
@@ -2874,7 +2874,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
HInstruction runtimeType = createForeign(runtimeTypeString, rtiInputs); |
add(runtimeType); |
runtimeCodeInputs.add(runtimeType); |
- runtimeCode.add('runtimeType: #'); |
+ runtimeCode.add("runtimeType: '#'"); |
} |
if (needsRti) { |
if (runtimeTypeIsUsed) runtimeCode.add(', '); |
@@ -2952,9 +2952,23 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
return; |
} |
if (compiler.world.needsRti(constructor.enclosingElement)) { |
- type.arguments.forEach((DartType argument) { |
- inputs.add(analyzeTypeArgument(argument, node)); |
- }); |
+ if (!type.arguments.isEmpty()) { |
+ type.arguments.forEach((DartType argument) { |
+ inputs.add(analyzeTypeArgument(argument, node)); |
+ }); |
+ } else if (compiler.enabledRuntimeType) { |
+ Link<DartType> variables = |
+ constructor.getEnclosingClass().typeVariables; |
+ if (!variables.isEmpty()) { |
+ // If the class has type variables but no type arguments have been |
+ // provided, add [:dynamic:] as argument for all type variables. |
+ DartString stringDynamic = new DartString.literal('dynamic'); |
+ HInstruction input = graph.addConstantString(stringDynamic, |
+ node, |
+ constantSystem); |
+ variables.forEach((_) => inputs.add(input)); |
+ } |
+ } |
} |
HType elementType = computeType(constructor); |
@@ -3024,6 +3038,16 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
} |
} |
+ visitTypeReferenceSend(Send node) { |
+ ClassElement element = elements[node]; |
+ String string = rti.generateRuntimeTypeString(element, 0); |
+ DartString className = new DartString.literal(string); |
+ Element helper = |
+ compiler.findHelper(const SourceString('getOrCreateCachedRuntimeType')); |
+ Constant typeName = constantSystem.createString(className, node.selector); |
+ pushInvokeHelper1(helper, graph.addConstant(typeName)); |
+ } |
+ |
visitGetterSend(Send node) { |
generateGetter(node, elements[node]); |
} |
@@ -3183,7 +3207,11 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
// [receiver] is only used if the node is an instance send. |
HInstruction receiver = null; |
- if (Elements.isInstanceSend(node, elements)) { |
+ Element selectorElement = elements[node.selector]; |
+ if (!Elements.isUnresolved(selectorElement) |
+ && selectorElement.kind == ElementKind.CLASS) { |
+ visitTypeReferenceSend(node); |
+ } else if (Elements.isInstanceSend(node, elements)) { |
receiver = generateInstanceSendReceiver(node); |
generateInstanceGetterWithCompiledReceiver(node, receiver); |
} else { |