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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 String constructorName = namer.getNameOfClass(classElement); | 76 String constructorName = namer.getNameOfClass(classElement); |
77 | 77 |
78 // TODO(sra): Implement placeholders in VariableDeclaration position: | 78 // TODO(sra): Implement placeholders in VariableDeclaration position: |
79 // task.precompiledFunction.add(js.statement('function #(#) { #; }', | 79 // task.precompiledFunction.add(js.statement('function #(#) { #; }', |
80 // [ constructorName, fields, | 80 // [ constructorName, fields, |
81 // fields.map( | 81 // fields.map( |
82 // (name) => js('this.# = #', [name, name]))])); | 82 // (name) => js('this.# = #', [name, name]))])); |
83 jsAst.Expression constructorAst = js('function(#) { #; }', | 83 jsAst.Expression constructorAst = js('function(#) { #; }', |
84 [fields, | 84 [fields, |
85 fields.map((name) => js('this.# = #', [name, name]))]); | 85 fields.map((name) => js('this.# = #', [name, name]))]); |
86 task.emitPrecompiledConstructor(constructorName, constructorAst); | 86 OutputUnit outputUnit = |
| 87 compiler.deferredLoadTask.outputUnitForElement(classElement); |
| 88 task.emitPrecompiledConstructor( |
| 89 outputUnit, constructorName, constructorAst); |
87 } | 90 } |
88 | 91 |
89 /// Returns `true` if fields added. | 92 /// Returns `true` if fields added. |
90 bool emitFields(Element element, | 93 bool emitFields(Element element, |
91 ClassBuilder builder, | 94 ClassBuilder builder, |
92 String superName, | 95 String superName, |
93 { bool classIsNative: false, | 96 { bool classIsNative: false, |
94 bool emitStatics: false, | 97 bool emitStatics: false, |
95 bool onlyForRti: false }) { | 98 bool onlyForRti: false }) { |
96 assert(!emitStatics || !onlyForRti); | 99 assert(!emitStatics || !onlyForRti); |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 member, setterName, builder, isGetter: false); | 518 member, setterName, builder, isGetter: false); |
516 } | 519 } |
517 | 520 |
518 void generateGetter(Element member, String fieldName, String accessorName, | 521 void generateGetter(Element member, String fieldName, String accessorName, |
519 ClassBuilder builder) { | 522 ClassBuilder builder) { |
520 String getterName = namer.getterNameFromAccessorName(accessorName); | 523 String getterName = namer.getterNameFromAccessorName(accessorName); |
521 ClassElement cls = member.enclosingClass; | 524 ClassElement cls = member.enclosingClass; |
522 String className = namer.getNameOfClass(cls); | 525 String className = namer.getNameOfClass(cls); |
523 String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; | 526 String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; |
524 List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; | 527 List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; |
525 task.precompiledFunction.add( | 528 OutputUnit outputUnit = |
| 529 compiler.deferredLoadTask.outputUnitForElement(member); |
| 530 task.cspPrecompiledFunctionFor(outputUnit).add( |
526 js('#.prototype.# = function(#) { return #.# }', | 531 js('#.prototype.# = function(#) { return #.# }', |
527 [className, getterName, args, receiver, fieldName])); | 532 [className, getterName, args, receiver, fieldName])); |
528 if (backend.isAccessibleByReflection(member)) { | 533 if (backend.isAccessibleByReflection(member)) { |
529 task.precompiledFunction.add( | 534 task.cspPrecompiledFunctionFor(outputUnit).add( |
530 js('#.prototype.#.${namer.reflectableField} = 1', | 535 js('#.prototype.#.${namer.reflectableField} = 1', |
531 [className, getterName])); | 536 [className, getterName])); |
532 } | 537 } |
533 } | 538 } |
534 | 539 |
535 void generateSetter(Element member, String fieldName, String accessorName, | 540 void generateSetter(Element member, String fieldName, String accessorName, |
536 ClassBuilder builder) { | 541 ClassBuilder builder) { |
537 String setterName = namer.setterNameFromAccessorName(accessorName); | 542 String setterName = namer.setterNameFromAccessorName(accessorName); |
538 ClassElement cls = member.enclosingClass; | 543 ClassElement cls = member.enclosingClass; |
539 String className = namer.getNameOfClass(cls); | 544 String className = namer.getNameOfClass(cls); |
540 String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; | 545 String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; |
541 List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; | 546 List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; |
542 task.precompiledFunction.add( | 547 OutputUnit outputUnit = |
| 548 compiler.deferredLoadTask.outputUnitForElement(member); |
| 549 task.cspPrecompiledFunctionFor(outputUnit).add( |
543 // TODO: remove 'return'? | 550 // TODO: remove 'return'? |
544 js('#.prototype.# = function(#, v) { return #.# = v; }', | 551 js('#.prototype.# = function(#, v) { return #.# = v; }', |
545 [className, setterName, args, receiver, fieldName])); | 552 [className, setterName, args, receiver, fieldName])); |
546 if (backend.isAccessibleByReflection(member)) { | 553 if (backend.isAccessibleByReflection(member)) { |
547 task.precompiledFunction.add( | 554 task.cspPrecompiledFunctionFor(outputUnit).add( |
548 js('#.prototype.#.${namer.reflectableField} = 1', | 555 js('#.prototype.#.${namer.reflectableField} = 1', |
549 [className, setterName])); | 556 [className, setterName])); |
550 } | 557 } |
551 } | 558 } |
552 | 559 |
553 void generateReflectionDataForFieldGetterOrSetter(Element member, | 560 void generateReflectionDataForFieldGetterOrSetter(Element member, |
554 String name, | 561 String name, |
555 ClassBuilder builder, | 562 ClassBuilder builder, |
556 {bool isGetter}) { | 563 {bool isGetter}) { |
557 Selector selector = isGetter | 564 Selector selector = isGetter |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]', index); | 607 js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]', index); |
601 } | 608 } |
602 jsAst.Expression convertRtiToRuntimeType = | 609 jsAst.Expression convertRtiToRuntimeType = |
603 namer.elementAccess(backend.findHelper('convertRtiToRuntimeType')); | 610 namer.elementAccess(backend.findHelper('convertRtiToRuntimeType')); |
604 compiler.dumpInfoTask.registerElementAst(element, | 611 compiler.dumpInfoTask.registerElementAst(element, |
605 builder.addProperty(name, | 612 builder.addProperty(name, |
606 js('function () { return #(#) }', | 613 js('function () { return #(#) }', |
607 [convertRtiToRuntimeType, computeTypeVariable]))); | 614 [convertRtiToRuntimeType, computeTypeVariable]))); |
608 } | 615 } |
609 } | 616 } |
OLD | NEW |