| Index: pkg/compiler/lib/src/js_backend/codegen/codegen.dart
|
| diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
|
| index f101a7610ca8a7353f55d27bb79670adc653df87..a1b623fc25ece50a7c8c89729d428ab957b9f194 100644
|
| --- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
|
| +++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
|
| @@ -240,7 +240,6 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
|
|
| @override
|
| js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) {
|
| - checkStaticTargetIsValid(node, node.target);
|
| if (node.constant != null) return giveup(node);
|
|
|
| registry.registerInstantiatedType(node.type);
|
| @@ -276,44 +275,14 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| visitArguments(node.arguments));
|
| }
|
|
|
| - /// Checks that the target of the static call is not an [ErroneousElement].
|
| - ///
|
| - /// This helper should be removed and the code to generate the CPS IR for
|
| - /// the dart2js backend should construct a call to a helper that throw an
|
| - /// appropriate error message instead of the static call.
|
| - ///
|
| - /// See [SsaBuilder.visitStaticSend] as an example how to do this.
|
| - void checkStaticTargetIsValid(tree_ir.Node node, Element target) {
|
| - if (target.isErroneous) {
|
| - giveup(node, 'cannot generate error handling code'
|
| - ' for call to unresolved target');
|
| - }
|
| - }
|
| -
|
| @override
|
| js.Expression visitInvokeStatic(tree_ir.InvokeStatic node) {
|
| - checkStaticTargetIsValid(node, node.target);
|
| Selector selector = node.selector;
|
| - if (node.target is FunctionElement) {
|
| - assert(selector.isGetter || selector.isSetter || selector.isCall);
|
| - FunctionElement target = node.target;
|
| - List<js.Expression> arguments = visitArguments(node.arguments);
|
| - return buildStaticInvoke(selector, target, arguments,
|
| - sourceInformation: node.sourceInformation);
|
| - } else {
|
| - assert(selector.isGetter || selector.isSetter);
|
| - FieldElement target = node.target;
|
| - registry.registerStaticUse(target);
|
| - js.Expression field = glue.staticFieldAccess(target);
|
| - if (selector.isGetter) {
|
| - assert(node.arguments.isEmpty);
|
| - return field;
|
| - } else {
|
| - assert(node.arguments.length == 1);
|
| - js.Expression value = visitExpression(node.arguments.first);
|
| - return new js.Assignment(field, value);
|
| - }
|
| - }
|
| + assert(selector.isGetter || selector.isSetter || selector.isCall);
|
| + FunctionElement target = node.target;
|
| + List<js.Expression> arguments = visitArguments(node.arguments);
|
| + return buildStaticInvoke(selector, target, arguments,
|
| + sourceInformation: node.sourceInformation);
|
| }
|
|
|
| @override
|
| @@ -618,6 +587,27 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| return new js.Assignment(field, visitExpression(node.value));
|
| }
|
|
|
| + @override
|
| + js.Expression visitGetStatic(tree_ir.GetStatic node) {
|
| + assert(node.element is FieldElement || node.element is FunctionElement);
|
| + if (node.element is FieldElement) {
|
| + registry.registerStaticUse(node.element.declaration);
|
| + return glue.staticFieldAccess(node.element);
|
| + } else {
|
| + registry.registerGetOfStaticFunction(node.element.declaration);
|
| + return glue.isolateStaticClosureAccess(node.element);
|
| + }
|
| + }
|
| +
|
| + @override
|
| + js.Expression visitSetStatic(tree_ir.SetStatic node) {
|
| + assert(node.element is FieldElement);
|
| + registry.registerStaticUse(node.element.declaration);
|
| + js.Expression field = glue.staticFieldAccess(node.element);
|
| + js.Expression value = visitExpression(node.value);
|
| + return new js.Assignment(field, value);
|
| + }
|
| +
|
| js.Expression buildStaticHelperInvocation(FunctionElement helper,
|
| List<js.Expression> arguments) {
|
| registry.registerStaticUse(helper);
|
|
|