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

Side by Side Diff: dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart

Issue 57773002: Repro for OOM bug in test.dart (applies to r29345). (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 1 month 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 * Documentation wanted -- johnniwinther 9 * Documentation wanted -- johnniwinther
10 * 10 *
(...skipping 24 matching lines...) Expand all
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698