Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart

Issue 895813006: dart2js: store typeVariableReader stubs in the model. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed comment. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of dart2js.js_emitter; 5 part of dart2js.js_emitter;
6 6
7 class ClassEmitter extends CodeEmitterHelper { 7 class ClassEmitter extends CodeEmitterHelper {
8 8
9 ClassStubGenerator get _stubGenerator => 9 ClassStubGenerator get _stubGenerator =>
10 new ClassStubGenerator(compiler, namer, backend); 10 new ClassStubGenerator(compiler, namer, backend);
(...skipping 21 matching lines...) Expand all
32 emitter.needsMixinSupport = true; 32 emitter.needsMixinSupport = true;
33 } 33 }
34 34
35 ClassBuilder builder = new ClassBuilder(classElement, namer); 35 ClassBuilder builder = new ClassBuilder(classElement, namer);
36 builder.superName = superName; 36 builder.superName = superName;
37 emitConstructorsForCSP(cls); 37 emitConstructorsForCSP(cls);
38 emitFields(cls, builder); 38 emitFields(cls, builder);
39 emitCheckedClassSetters(cls, builder); 39 emitCheckedClassSetters(cls, builder);
40 emitClassGettersSettersForCSP(cls, builder); 40 emitClassGettersSettersForCSP(cls, builder);
41 emitInstanceMembers(cls, builder); 41 emitInstanceMembers(cls, builder);
42 emitCallStubs(cls, builder); 42 emitStubs(cls.callStubs, builder);
43 emitStubs(cls.typeVariableReaderStubs, builder);
43 emitRuntimeTypeInformation(cls, builder); 44 emitRuntimeTypeInformation(cls, builder);
44 emitNativeInfo(cls, builder); 45 emitNativeInfo(cls, builder);
45 46
46 if (classElement == backend.closureClass) { 47 if (classElement == backend.closureClass) {
47 // We add a special getter here to allow for tearing off a closure from 48 // We add a special getter here to allow for tearing off a closure from
48 // itself. 49 // itself.
49 String name = namer.getMappedInstanceName(Compiler.CALL_OPERATOR_NAME); 50 String name = namer.getMappedInstanceName(Compiler.CALL_OPERATOR_NAME);
50 jsAst.Fun function = js('function() { return this; }'); 51 jsAst.Fun function = js('function() { return this; }');
51 builder.addProperty(namer.getterNameFromAccessorName(name), function); 52 builder.addProperty(namer.getterNameFromAccessorName(name), function);
52 } 53 }
53 54
54 emitTypeVariableReaders(classElement, builder);
55
56 emitClassBuilderWithReflectionData(cls, builder, enclosingBuilder); 55 emitClassBuilderWithReflectionData(cls, builder, enclosingBuilder);
57 } 56 }
58 /** 57 /**
59 * Emits the precompiled constructor when in CSP mode. 58 * Emits the precompiled constructor when in CSP mode.
60 */ 59 */
61 void emitConstructorsForCSP(Class cls) { 60 void emitConstructorsForCSP(Class cls) {
62 List<String> fieldNames = <String>[]; 61 List<String> fieldNames = <String>[];
63 62
64 if (!compiler.useContentSecurityPolicy) return; 63 if (!compiler.useContentSecurityPolicy) return;
65 64
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 if (field.needsGetter) { 205 if (field.needsGetter) {
207 emitGetterForCSP(member, field.name, field.accessorName, builder); 206 emitGetterForCSP(member, field.name, field.accessorName, builder);
208 } 207 }
209 if (field.needsUncheckedSetter) { 208 if (field.needsUncheckedSetter) {
210 emitSetterForCSP(member, field.name, field.accessorName, builder); 209 emitSetterForCSP(member, field.name, field.accessorName, builder);
211 } 210 }
212 }); 211 });
213 } 212 }
214 } 213 }
215 214
216 void emitCallStubs(Class cls, ClassBuilder builder) { 215 void emitStubs(Iterable<StubMethod> stubs, ClassBuilder builder) {
217 for (Method method in cls.callStubs) { 216 for (Method method in stubs) {
218 jsAst.Property property = builder.addProperty(method.name, method.code); 217 jsAst.Property property = builder.addProperty(method.name, method.code);
219 compiler.dumpInfoTask.registerElementAst(method.element, property); 218 compiler.dumpInfoTask.registerElementAst(method.element, property);
220 } 219 }
221 } 220 }
222 221
223 /** 222 /**
224 * Documentation wanted -- johnniwinther 223 * Documentation wanted -- johnniwinther
225 * 224 *
226 * Invariant: [classElement] must be a declaration element. 225 * Invariant: [classElement] must be a declaration element.
227 */ 226 */
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 Selector selector = isGetter 545 Selector selector = isGetter
547 ? new Selector.getter(member.name, member.library) 546 ? new Selector.getter(member.name, member.library)
548 : new Selector.setter(member.name, member.library); 547 : new Selector.setter(member.name, member.library);
549 String reflectionName = emitter.getReflectionName(selector, name); 548 String reflectionName = emitter.getReflectionName(selector, name);
550 if (reflectionName != null) { 549 if (reflectionName != null) {
551 var reflectable = 550 var reflectable =
552 js(backend.isAccessibleByReflection(member) ? '1' : '0'); 551 js(backend.isAccessibleByReflection(member) ? '1' : '0');
553 builder.addProperty('+$reflectionName', reflectable); 552 builder.addProperty('+$reflectionName', reflectable);
554 } 553 }
555 } 554 }
556
557 void emitTypeVariableReaders(ClassElement cls, ClassBuilder builder) {
558 List typeVariables = [];
559 ClassElement superclass = cls;
560 while (superclass != null) {
561 for (TypeVariableType parameter in superclass.typeVariables) {
562 if (backend.emitter.readTypeVariables.contains(parameter.element)) {
563 emitTypeVariableReader(cls, builder, parameter.element);
564 }
565 }
566 superclass = superclass.superclass;
567 }
568 }
569
570 void emitTypeVariableReader(ClassElement cls,
571 ClassBuilder builder,
572 TypeVariableElement element) {
573 String name = namer.readTypeVariableName(element);
574 int index = RuntimeTypes.getTypeVariableIndex(element);
575 jsAst.Expression computeTypeVariable;
576
577 Substitution substitution =
578 backend.rti.computeSubstitution(
579 cls, element.typeDeclaration, alwaysGenerateFunction: true);
580 if (substitution != null) {
581 computeTypeVariable =
582 js(r'#.apply(null, this.$builtinTypeInfo)',
583 substitution.getCodeForVariable(index, backend.rti));
584 } else {
585 // TODO(ahe): These can be generated dynamically.
586 computeTypeVariable =
587 js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]',
588 js.number(index));
589 }
590 jsAst.Expression convertRtiToRuntimeType = emitter
591 .staticFunctionAccess(backend.findHelper('convertRtiToRuntimeType'));
592 compiler.dumpInfoTask.registerElementAst(element,
593 builder.addProperty(name,
594 js('function () { return #(#) }',
595 [convertRtiToRuntimeType, computeTypeVariable])));
596 }
597 } 555 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart ('k') | pkg/compiler/lib/src/js_emitter/program_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698