Chromium Code Reviews| Index: lib/compiler/implementation/ssa/builder.dart |
| diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart |
| index 91d2d4567f85ebd1833377a4054c31adfc32ae60..f3485c6e7b6f311765c7a985df487c8ef6f90f59 100644 |
| --- a/lib/compiler/implementation/ssa/builder.dart |
| +++ b/lib/compiler/implementation/ssa/builder.dart |
| @@ -1320,13 +1320,11 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
| // Create the runtime type information, if needed. |
| InterfaceType type = classElement.computeType(compiler); |
| - List<HInstruction> inputs = <HInstruction>[]; |
| - if (compiler.world.needsRti(classElement)) { |
|
ngeoffray
2012/10/10 07:32:24
I don't think you should remove this check.
karlklose
2012/10/23 10:33:52
Done.
|
| - classElement.typeVariables.forEach((TypeVariableType typeVariable) { |
| - inputs.add(localsHandler.directLocals[typeVariable.element]); |
| - }); |
| - callSetRuntimeTypeInfo(classElement, inputs, newObject); |
| - } |
| + List<HInstruction> inputs = <HInstruction>[]; |
| + classElement.typeVariables.forEach((TypeVariableType typeVariable) { |
| + inputs.add(localsHandler.directLocals[typeVariable.element]); |
| + }); |
| + callSetRuntimeTypeInfo(classElement, inputs, newObject); |
| // Generate calls to the constructor bodies. |
| for (int index = constructors.length - 1; index >= 0; index--) { |
| @@ -2708,7 +2706,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
| HInstruction context = localsHandler.readThis(); |
| add(target); |
| var inputs = <HInstruction>[target, context]; |
| - if (node.isPropertyAccess) { |
| + if (node.isPropertyAccessOrTypeReference) { |
| push(new HInvokeSuper(inputs)); |
| } else if (element.isFunction() || element.isGenerativeConstructor()) { |
| // TODO(5347): Try to avoid the need for calling [implementation] before |
| @@ -2803,7 +2801,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(', '); |
| @@ -2876,9 +2874,21 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
| } |
| InterfaceType type = elements.getType(annotation); |
| 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()) { |
|
ngeoffray
2012/10/10 07:32:24
Please add a comment that you need to put runtime
karlklose
2012/10/23 10:33:52
Here I add 'dynamic' as type argument for type var
|
| + DartString stringDynamic = new DartString.literal('dynamic'); |
| + HInstruction input = graph.addConstantString(stringDynamic, |
| + node, |
| + constantSystem); |
| + variables.forEach((_) => inputs.add(input)); |
| + } |
| + } |
| } |
| HType elementType = computeType(constructor); |
| @@ -2940,6 +2950,17 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
| } |
| } |
| + visitClassLiteralSend(Send node) { |
| + ClassElement element = elements[node]; |
| + String string = |
| + RuntimeTypeInformation.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]); |
| } |
| @@ -3090,7 +3111,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) { |
| + visitClassLiteralSend(node); |
|
ngeoffray
2012/10/10 07:32:24
What is this about? Object = 42?
karlklose
2012/10/23 10:33:52
also for ++ and --.
|
| + } else if (Elements.isInstanceSend(node, elements)) { |
| receiver = generateInstanceSendReceiver(node); |
| generateInstanceGetterWithCompiledReceiver(node, receiver); |
| } else { |