Chromium Code Reviews| Index: pkg/compiler/lib/src/ssa/builder_kernel.dart |
| diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart |
| index 510815a424e88b96d68f91c936709882ddb80546..110307ad9c6a1021b863c34ddcc23f9f56b2bfb2 100644 |
| --- a/pkg/compiler/lib/src/ssa/builder_kernel.dart |
| +++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart |
| @@ -16,6 +16,7 @@ import '../js_backend/backend.dart' show JavaScriptBackend; |
| import '../kernel/kernel.dart'; |
| import '../resolution/tree_elements.dart'; |
| import '../tree/dartstring.dart'; |
| +import '../tree/tree.dart' as ast; |
| import '../types/masks.dart'; |
| import '../universe/call_structure.dart' show CallStructure; |
| import '../universe/selector.dart'; |
| @@ -28,6 +29,7 @@ import 'loop_handler.dart'; |
| import 'nodes.dart'; |
| import 'ssa_branch_builder.dart'; |
| import 'type_builder.dart'; |
| +import 'types.dart' show TypeMaskFactory; |
| class SsaKernelBuilderTask extends CompilerTask { |
| final JavaScriptBackend backend; |
| @@ -206,6 +208,40 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder { |
| Element get sourceElement => astAdapter.getElement(target); |
| @override |
| + void pushInvokeStatic(MethodElement element, List<HInstruction> arguments, |
|
Harry Terkelsen
2016/11/15 22:44:48
This class should not have any methods with Elemen
Emily Fortuna
2016/11/16 01:53:44
Thank you, I intended to get rid of this, but got
|
| + {TypeMask typeMask, |
| + InterfaceType instanceType, |
| + SourceInformation sourceInformation, |
| + // TODO(efortuna): Leaving this part of the signature for consistency with |
| + // builder.dart. Remove this parameter once we are no longer using |
| + // builder.dart. |
| + ast.Node location}) { |
| + assert(element.isDeclaration); |
| + // TODO(efortuna): try to inline method. |
| + |
| + if (typeMask == null) { |
| + typeMask = |
| + TypeMaskFactory.inferredReturnTypeForElement(element, compiler); |
| + } |
| + bool targetCanThrow = !compiler.closedWorld.getCannotThrow(element); |
| + // TODO(5346): Try to avoid the need for calling [declaration] before |
|
Harry Terkelsen
2016/11/15 22:44:48
this TODO makes no sense to me?
Emily Fortuna
2016/11/16 01:53:44
Agreed.... it was copied from builder.dart. Is it
|
| + var instruction; |
| + if (backend.isJsInterop(element)) { |
| + // TODO(efortuna): Implement JS Introp function. |
| + } else { |
| + // creating an [HInvokeStatic]. |
| + instruction = new HInvokeStatic(element, arguments, typeMask, |
| + targetCanThrow: targetCanThrow) |
| + ..sourceInformation = sourceInformation; |
| + // TODO(efortuna): Test if we have any inlined instantiations here. |
| + instruction.sideEffects = |
| + compiler.closedWorld.getSideEffectsOfElement(element); |
| + } |
| + // TODO(efortuna): Attach source information if available from location. |
| + push(instruction); |
| + } |
| + |
| + @override |
| void visitBlock(ir.Block block) { |
| assert(!isAborted()); |
| for (ir.Statement statement in block.statements) { |
| @@ -542,6 +578,21 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder { |
| stack.add(graph.addConstantNull(compiler)); |
| } |
| + HInstruction setRtiIfNeeded(HInstruction object, ir.ListLiteral listLiteral) { |
| + InterfaceType type = localsHandler |
| + .substInContext(elements.getType(astAdapter.getNode(listLiteral))); |
| + if (!backend.classNeedsRti(type.element) || type.treatAsRaw) { |
| + return object; |
| + } |
| + List<HInstruction> arguments = <HInstruction>[]; |
| + for (DartType argument in type.typeArguments) { |
| + arguments.add(typeBuilder.analyzeTypeArgument(argument, sourceElement)); |
| + } |
| + // TODO(15489): Register at codegen. |
| + registry?.registerInstantiation(type); |
| + return callSetRuntimeTypeInfoWithTypeArguments(type, arguments, object); |
| + } |
| + |
| @override |
| void visitListLiteral(ir.ListLiteral listLiteral) { |
| HInstruction listInstruction; |
| @@ -556,7 +607,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder { |
| } |
| listInstruction = new HLiteralList(elements, backend.extendableArrayType); |
| add(listInstruction); |
| - // TODO(het): set runtime type info |
| + listInstruction = setRtiIfNeeded(listInstruction, listLiteral); |
| } |
| TypeMask type = astAdapter.typeOfNewList(targetElement, listLiteral); |