| OLD | NEW |
| 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 * Documentation wanted -- johnniwinther | 9 * Documentation wanted -- johnniwinther |
| 10 * | 10 * |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 } | 35 } |
| 36 | 36 |
| 37 ClassBuilder builder = new ClassBuilder(); | 37 ClassBuilder builder = new ClassBuilder(); |
| 38 emitClassConstructor(classElement, builder, runtimeName, | 38 emitClassConstructor(classElement, builder, runtimeName, |
| 39 onlyForRti: onlyForRti); | 39 onlyForRti: onlyForRti); |
| 40 emitFields(classElement, builder, superName, onlyForRti: onlyForRti); | 40 emitFields(classElement, builder, superName, onlyForRti: onlyForRti); |
| 41 emitClassGettersSetters(classElement, builder, onlyForRti: onlyForRti); | 41 emitClassGettersSetters(classElement, builder, onlyForRti: onlyForRti); |
| 42 emitInstanceMembers(classElement, builder, onlyForRti: onlyForRti); | 42 emitInstanceMembers(classElement, builder, onlyForRti: onlyForRti); |
| 43 task.typeTestEmitter.emitIsTests(classElement, builder); | 43 task.typeTestEmitter.emitIsTests(classElement, builder); |
| 44 | 44 |
| 45 emitTypeVariableReaders(classElement, builder); |
| 46 |
| 45 emitClassBuilderWithReflectionData( | 47 emitClassBuilderWithReflectionData( |
| 46 className, classElement, builder, buffer); | 48 className, classElement, builder, buffer); |
| 47 } | 49 } |
| 48 | 50 |
| 49 void emitClassConstructor(ClassElement classElement, | 51 void emitClassConstructor(ClassElement classElement, |
| 50 ClassBuilder builder, | 52 ClassBuilder builder, |
| 51 String runtimeName, | 53 String runtimeName, |
| 52 {bool onlyForRti: false}) { | 54 {bool onlyForRti: false}) { |
| 53 List<String> fields = <String>[]; | 55 List<String> fields = <String>[]; |
| 54 if (!onlyForRti && !classElement.isNative()) { | 56 if (!onlyForRti && !classElement.isNative()) { |
| (...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 Selector selector = isGetter | 596 Selector selector = isGetter |
| 595 ? new Selector.getter(member.name, member.getLibrary()) | 597 ? new Selector.getter(member.name, member.getLibrary()) |
| 596 : new Selector.setter(member.name, member.getLibrary()); | 598 : new Selector.setter(member.name, member.getLibrary()); |
| 597 String reflectionName = task.getReflectionName(selector, name); | 599 String reflectionName = task.getReflectionName(selector, name); |
| 598 if (reflectionName != null) { | 600 if (reflectionName != null) { |
| 599 var reflectable = | 601 var reflectable = |
| 600 js(backend.isAccessibleByReflection(member) ? '1' : '0'); | 602 js(backend.isAccessibleByReflection(member) ? '1' : '0'); |
| 601 builder.addProperty('+$reflectionName', reflectable); | 603 builder.addProperty('+$reflectionName', reflectable); |
| 602 } | 604 } |
| 603 } | 605 } |
| 606 |
| 607 void emitTypeVariableReaders(ClassElement cls, ClassBuilder builder) { |
| 608 List typeVariables = []; |
| 609 ClassElement superclass = cls; |
| 610 while (superclass != null) { |
| 611 GenericType type = superclass.thisType; |
| 612 for (TypeVariableType parameter in type.typeArguments) { |
| 613 if (task.readTypeVariables.contains(parameter.element)) { |
| 614 emitTypeVariableReader(cls, builder, parameter.element); |
| 615 } |
| 616 } |
| 617 superclass = superclass.superclass; |
| 618 } |
| 619 } |
| 620 |
| 621 void emitTypeVariableReader(ClassElement cls, |
| 622 ClassBuilder builder, |
| 623 TypeVariableElement element) { |
| 624 String name = namer.readTypeVariableName(element); |
| 625 jsAst.Expression index = |
| 626 js.toExpression(RuntimeTypes.getTypeVariableIndex(element)); |
| 627 jsAst.Expression computeTypeVariable; |
| 628 |
| 629 if (!backend.rti.isTrivialSubstitution(cls, element.enclosingElement)) { |
| 630 Substitution substitution = |
| 631 backend.rti.computeSubstitution( |
| 632 cls, element.enclosingElement, alwaysGenerateFunction: true); |
| 633 jsAst.Expression typeArguments = |
| 634 substitution.getCode(backend.rti, true)['apply']( |
| 635 ['null', r'this.$builtinTypeInfo']); |
| 636 computeTypeVariable = typeArguments[index]; |
| 637 } else { |
| 638 computeTypeVariable = |
| 639 js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]', index); |
| 640 } |
| 641 jsAst.Expression convertRtiToRuntimeType = |
| 642 namer.elementAccess(compiler.findHelper('convertRtiToRuntimeType')); |
| 643 builder.addProperty( |
| 644 name, js.fun( |
| 645 [], [js.return_(convertRtiToRuntimeType(computeTypeVariable))])); |
| 646 } |
| 604 } | 647 } |
| OLD | NEW |