| Index: pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
|
| index 5f1e9407549475d794a0530404bcaa848e3549a2..9c353c4b2aaada121bd675074ec916a0646babb2 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
|
| @@ -5,27 +5,32 @@
|
| library dart2js.js_emitter.class_stub_generator;
|
|
|
| import '../common/names.dart' show Identifiers;
|
| -import '../compiler.dart' show Compiler;
|
| +import '../common_elements.dart' show CommonElements;
|
| import '../elements/entities.dart';
|
| import '../js/js.dart' as jsAst;
|
| import '../js/js.dart' show js;
|
| -import '../js_backend/js_backend.dart' show JavaScriptBackend, Namer;
|
| +import '../js_backend/namer.dart' show Namer;
|
| +import '../js_backend/interceptor_data.dart' show InterceptorData;
|
| +import '../options.dart';
|
| import '../universe/selector.dart' show Selector;
|
| import '../universe/world_builder.dart'
|
| show CodegenWorldBuilder, SelectorConstraints;
|
| import '../world.dart' show ClosedWorld;
|
|
|
| +import 'code_emitter_task.dart';
|
| import 'model.dart';
|
|
|
| class ClassStubGenerator {
|
| - final Namer namer;
|
| - final JavaScriptBackend backend;
|
| - final CodegenWorldBuilder worldBuilder;
|
| - final ClosedWorld closedWorld;
|
| + final Namer _namer;
|
| + final CodegenWorldBuilder _worldBuilder;
|
| + final ClosedWorld _closedWorld;
|
| + final InterceptorData _interceptorData;
|
| final bool enableMinification;
|
| + final Emitter _emitter;
|
| + final CommonElements _commonElements;
|
|
|
| - ClassStubGenerator(
|
| - this.namer, this.backend, this.worldBuilder, this.closedWorld,
|
| + ClassStubGenerator(this._emitter, this._commonElements, this._namer,
|
| + this._worldBuilder, this._interceptorData, this._closedWorld,
|
| {this.enableMinification});
|
|
|
| jsAst.Expression generateClassConstructor(
|
| @@ -40,7 +45,7 @@ class ClassStubGenerator {
|
| var typeParameters = const <jsAst.Parameter>[];
|
| var typeInits = const <jsAst.Expression>[];
|
| if (hasRtiField) {
|
| - var rtiName = namer.rtiFieldJsName;
|
| + var rtiName = _namer.rtiFieldJsName;
|
| typeParameters = rtiName;
|
| typeInits = js('this.# = #', [rtiName, rtiName]);
|
| }
|
| @@ -49,25 +54,25 @@ class ClassStubGenerator {
|
| typeParameters,
|
| fields.map((name) => js('this.# = #', [name, name])),
|
| typeInits,
|
| - namer.deferredAction
|
| + _namer.deferredAction
|
| ]);
|
| }
|
|
|
| jsAst.Expression generateGetter(MemberEntity member, jsAst.Name fieldName) {
|
| ClassEntity cls = member.enclosingClass;
|
| String receiver =
|
| - backend.interceptorData.isInterceptedClass(cls) ? 'receiver' : 'this';
|
| + _interceptorData.isInterceptedClass(cls) ? 'receiver' : 'this';
|
| List<String> args =
|
| - backend.interceptorData.isInterceptedMethod(member) ? ['receiver'] : [];
|
| + _interceptorData.isInterceptedMethod(member) ? ['receiver'] : [];
|
| return js('function(#) { return #.# }', [args, receiver, fieldName]);
|
| }
|
|
|
| jsAst.Expression generateSetter(MemberEntity member, jsAst.Name fieldName) {
|
| ClassEntity cls = member.enclosingClass;
|
| String receiver =
|
| - backend.interceptorData.isInterceptedClass(cls) ? 'receiver' : 'this';
|
| + _interceptorData.isInterceptedClass(cls) ? 'receiver' : 'this';
|
| List<String> args =
|
| - backend.interceptorData.isInterceptedMethod(member) ? ['receiver'] : [];
|
| + _interceptorData.isInterceptedMethod(member) ? ['receiver'] : [];
|
| // TODO(floitsch): remove 'return'?
|
| return js(
|
| 'function(#, v) { return #.# = v; }', [args, receiver, fieldName]);
|
| @@ -82,10 +87,9 @@ class ClassStubGenerator {
|
| MemberEntity member, Map<Selector, SelectorConstraints> selectors) {
|
| // If the method is intercepted, the stub gets the
|
| // receiver explicitely and we need to pass it to the getter call.
|
| - bool isInterceptedMethod =
|
| - backend.interceptorData.isInterceptedMethod(member);
|
| + bool isInterceptedMethod = _interceptorData.isInterceptedMethod(member);
|
| bool isInterceptedClass =
|
| - backend.interceptorData.isInterceptedClass(member.enclosingClass);
|
| + _interceptorData.isInterceptedClass(member.enclosingClass);
|
|
|
| const String receiverArgumentName = r'$receiver';
|
|
|
| @@ -93,13 +97,13 @@ class ClassStubGenerator {
|
| jsAst.Expression receiver =
|
| js(isInterceptedClass ? receiverArgumentName : 'this');
|
| if (member.isGetter) {
|
| - jsAst.Name getterName = namer.getterForElement(member);
|
| + jsAst.Name getterName = _namer.getterForElement(member);
|
| if (isInterceptedMethod) {
|
| return js('this.#(#)', [getterName, receiver]);
|
| }
|
| return js('#.#()', [receiver, getterName]);
|
| } else {
|
| - jsAst.Name fieldName = namer.instanceFieldPropertyName(member);
|
| + jsAst.Name fieldName = _namer.instanceFieldPropertyName(member);
|
| return js('#.#', [receiver, fieldName]);
|
| }
|
| }
|
| @@ -114,12 +118,12 @@ class ClassStubGenerator {
|
| for (Selector selector in selectors.keys) {
|
| if (generatedSelectors.contains(selector)) continue;
|
| if (!selector.appliesUnnamed(member)) continue;
|
| - if (selectors[selector].applies(member, selector, closedWorld)) {
|
| + if (selectors[selector].applies(member, selector, _closedWorld)) {
|
| generatedSelectors.add(selector);
|
|
|
| - jsAst.Name invocationName = namer.invocationName(selector);
|
| + jsAst.Name invocationName = _namer.invocationName(selector);
|
| Selector callSelector = new Selector.callClosureFrom(selector);
|
| - jsAst.Name closureCallName = namer.invocationName(callSelector);
|
| + jsAst.Name closureCallName = _namer.invocationName(callSelector);
|
|
|
| List<jsAst.Parameter> parameters = <jsAst.Parameter>[];
|
| List<jsAst.Expression> arguments = <jsAst.Expression>[];
|
| @@ -147,7 +151,7 @@ class ClassStubGenerator {
|
| Map<jsAst.Name, Selector> jsNames = <jsAst.Name, Selector>{};
|
|
|
| // Do not generate no such method handlers if there is no class.
|
| - if (worldBuilder.directlyInstantiatedClasses.isEmpty) {
|
| + if (_worldBuilder.directlyInstantiatedClasses.isEmpty) {
|
| return jsNames;
|
| }
|
|
|
| @@ -155,16 +159,16 @@ class ClassStubGenerator {
|
| String ignore, Map<Selector, SelectorConstraints> selectors) {
|
| for (Selector selector in selectors.keys) {
|
| SelectorConstraints maskSet = selectors[selector];
|
| - if (maskSet.needsNoSuchMethodHandling(selector, closedWorld)) {
|
| - jsAst.Name jsName = namer.invocationMirrorInternalName(selector);
|
| + if (maskSet.needsNoSuchMethodHandling(selector, _closedWorld)) {
|
| + jsAst.Name jsName = _namer.invocationMirrorInternalName(selector);
|
| jsNames[jsName] = selector;
|
| }
|
| }
|
| }
|
|
|
| - worldBuilder.forEachInvokedName(addNoSuchMethodHandlers);
|
| - worldBuilder.forEachInvokedGetter(addNoSuchMethodHandlers);
|
| - worldBuilder.forEachInvokedSetter(addNoSuchMethodHandlers);
|
| + _worldBuilder.forEachInvokedName(addNoSuchMethodHandlers);
|
| + _worldBuilder.forEachInvokedGetter(addNoSuchMethodHandlers);
|
| + _worldBuilder.forEachInvokedSetter(addNoSuchMethodHandlers);
|
| return jsNames;
|
| }
|
|
|
| @@ -179,13 +183,11 @@ class ClassStubGenerator {
|
| .map((String name) => js.string(name))
|
| .toList();
|
|
|
| - jsAst.Name methodName = namer.asName(selector.invocationMirrorMemberName);
|
| - jsAst.Name internalName = namer.invocationMirrorInternalName(selector);
|
| + jsAst.Name methodName = _namer.asName(selector.invocationMirrorMemberName);
|
| + jsAst.Name internalName = _namer.invocationMirrorInternalName(selector);
|
|
|
| - assert(
|
| - backend.interceptorData.isInterceptedName(Identifiers.noSuchMethod_));
|
| - bool isIntercepted =
|
| - backend.interceptorData.isInterceptedName(selector.name);
|
| + assert(_interceptorData.isInterceptedName(Identifiers.noSuchMethod_));
|
| + bool isIntercepted = _interceptorData.isInterceptedName(selector.name);
|
| jsAst.Expression expression = js(
|
| '''this.#noSuchMethodName(#receiver,
|
| #createInvocationMirror(#methodName,
|
| @@ -195,9 +197,9 @@ class ClassStubGenerator {
|
| #namedArguments))''',
|
| {
|
| 'receiver': isIntercepted ? r'$receiver' : 'this',
|
| - 'noSuchMethodName': namer.noSuchMethodName,
|
| - 'createInvocationMirror': backend.emitter.staticFunctionAccess(
|
| - backend.commonElements.createInvocationMirror),
|
| + 'noSuchMethodName': _namer.noSuchMethodName,
|
| + 'createInvocationMirror': _emitter
|
| + .staticFunctionAccess(_commonElements.createInvocationMirror),
|
| 'methodName':
|
| js.quoteName(enableMinification ? internalName : methodName),
|
| 'internalName': js.quoteName(internalName),
|
| @@ -232,17 +234,14 @@ class ClassStubGenerator {
|
| /// * `isStatic`.
|
| /// * `name`.
|
| /// * `isIntercepted.
|
| -List<jsAst.Statement> buildTearOffCode(JavaScriptBackend backend) {
|
| - Namer namer = backend.namer;
|
| - Compiler compiler = backend.compiler;
|
| -
|
| - FunctionEntity closureFromTearOff = backend.commonElements.closureFromTearOff;
|
| +List<jsAst.Statement> buildTearOffCode(CompilerOptions options, Emitter emitter,
|
| + Namer namer, CommonElements commonElements) {
|
| + FunctionEntity closureFromTearOff = commonElements.closureFromTearOff;
|
| jsAst.Expression tearOffAccessExpression;
|
| jsAst.Expression tearOffGlobalObjectString;
|
| jsAst.Expression tearOffGlobalObject;
|
| if (closureFromTearOff != null) {
|
| - tearOffAccessExpression =
|
| - backend.emitter.staticFunctionAccess(closureFromTearOff);
|
| + tearOffAccessExpression = emitter.staticFunctionAccess(closureFromTearOff);
|
| tearOffGlobalObject =
|
| js.stringPart(namer.globalObjectForMethod(closureFromTearOff));
|
| tearOffGlobalObjectString =
|
| @@ -257,9 +256,9 @@ List<jsAst.Statement> buildTearOffCode(JavaScriptBackend backend) {
|
| }
|
|
|
| jsAst.Statement tearOffGetter;
|
| - if (!compiler.options.useContentSecurityPolicy) {
|
| - jsAst.Expression tearOffAccessText = new jsAst.UnparsedNode(
|
| - tearOffAccessExpression, compiler.options, false);
|
| + if (!options.useContentSecurityPolicy) {
|
| + jsAst.Expression tearOffAccessText =
|
| + new jsAst.UnparsedNode(tearOffAccessExpression, options, false);
|
| tearOffGetter = js.statement(
|
| '''
|
| function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) {
|
|
|