| 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 |