Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
index 79731e783359e9743f581d5bdabe3286c9cfa4c6..2f90ddf8f9358c3c006bdf82d36e69a981ccf0d5 100644 |
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
@@ -405,13 +405,16 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
// where (C', x) = Build(e, C) |
// |
// Return without a subexpression is translated as if it were return null. |
- ir.Primitive visitReturn(ast.Return node) { |
+ visitReturn(ast.Return node) { |
assert(irBuilder.isOpen); |
- assert(invariant(node, node.beginToken.value != 'native')); |
- irBuilder.buildReturn( |
- value: build(node.expression), |
- sourceInformation: sourceInformationBuilder.buildReturn(node)); |
- return null; |
+ SourceInformation source = sourceInformationBuilder.buildReturn(node); |
+ if (node.beginToken.value == 'native') { |
+ irBuilder.buildNativeFunctionBody(node.expression, source); |
+ } else { |
+ irBuilder.buildReturn( |
+ value: build(node.expression), |
+ sourceInformation: source); |
+ } |
} |
visitSwitchStatement(ast.SwitchStatement node) { |
@@ -2281,12 +2284,23 @@ class GlobalProgramInformation { |
DartType unaliasType(DartType type) => type.unalias(_compiler); |
TypeMask getTypeMaskForForeign(NativeBehavior behavior) { |
+ if (behavior == null) { |
+ return _backend.dynamicType; |
+ } |
return TypeMaskFactory.fromNativeBehavior(behavior, _compiler); |
} |
FieldElement locateSingleField(Selector selector, TypeMask type) { |
return _compiler.world.locateSingleField(selector, type); |
} |
+ |
+ Element get closureConverter { |
+ return _backend.getClosureConverter(); |
+ } |
+ |
+ void addNativeMethod(FunctionElement function) { |
+ _backend.emitter.nativeEmitter.nativeMethods.add(function); |
+ } |
} |
/// IR builder specific to the JavaScript backend, coupled to the [JsIrBuilder]. |