| 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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 fields.add(name); | 73 fields.add(name); |
| 74 }); | 74 }); |
| 75 } | 75 } |
| 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 task.precompiledFunction.add( | 83 jsAst.Expression constructorAst = js('function(#) { #; }', |
| 84 new jsAst.FunctionDeclaration( | 84 [fields, |
| 85 new jsAst.VariableDeclaration(constructorName), | 85 fields.map((name) => js('this.# = #', [name, name]))]); |
| 86 js('function(#) { #; }', | 86 task.emitPrecompiledConstructor(constructorName, constructorAst); |
| 87 [fields, | |
| 88 fields.map((name) => js('this.# = #', [name, name]))]))); | |
| 89 // TODO(floitsch): do we actually need the name field? | |
| 90 // TODO(floitsch): these should all go through the namer. | |
| 91 | |
| 92 task.precompiledFunction.add( | |
| 93 js.statement(r'''{ | |
| 94 #.builtin$cls = #; | |
| 95 if (!"name" in #) | |
| 96 #.name = #; | |
| 97 $desc=$collectedClasses.#; | |
| 98 if ($desc instanceof Array) $desc = $desc[1]; | |
| 99 #.prototype = $desc; | |
| 100 }''', | |
| 101 [ constructorName, js.string(constructorName), | |
| 102 constructorName, | |
| 103 constructorName, js.string(constructorName), | |
| 104 constructorName, | |
| 105 constructorName | |
| 106 ])); | |
| 107 | |
| 108 task.precompiledConstructorNames.add(js('#', constructorName)); | |
| 109 } | 87 } |
| 110 | 88 |
| 111 /// Returns `true` if fields added. | 89 /// Returns `true` if fields added. |
| 112 bool emitFields(Element element, | 90 bool emitFields(Element element, |
| 113 ClassBuilder builder, | 91 ClassBuilder builder, |
| 114 String superName, | 92 String superName, |
| 115 { bool classIsNative: false, | 93 { bool classIsNative: false, |
| 116 bool emitStatics: false, | 94 bool emitStatics: false, |
| 117 bool onlyForRti: false }) { | 95 bool onlyForRti: false }) { |
| 118 assert(!emitStatics || !onlyForRti); | 96 assert(!emitStatics || !onlyForRti); |
| (...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]', index); | 600 js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]', index); |
| 623 } | 601 } |
| 624 jsAst.Expression convertRtiToRuntimeType = | 602 jsAst.Expression convertRtiToRuntimeType = |
| 625 namer.elementAccess(backend.findHelper('convertRtiToRuntimeType')); | 603 namer.elementAccess(backend.findHelper('convertRtiToRuntimeType')); |
| 626 compiler.dumpInfoTask.registerElementAst(element, | 604 compiler.dumpInfoTask.registerElementAst(element, |
| 627 builder.addProperty(name, | 605 builder.addProperty(name, |
| 628 js('function () { return #(#) }', | 606 js('function () { return #(#) }', |
| 629 [convertRtiToRuntimeType, computeTypeVariable]))); | 607 [convertRtiToRuntimeType, computeTypeVariable]))); |
| 630 } | 608 } |
| 631 } | 609 } |
| OLD | NEW |