| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 library dart2js.new_js_emitter.emitter; | 5 library dart2js.new_js_emitter.emitter; |
| 6 | 6 |
| 7 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart' show | |
| 8 JsBuiltin; | |
| 9 | |
| 10 import '../program_builder.dart' show ProgramBuilder; | 7 import '../program_builder.dart' show ProgramBuilder; |
| 11 import '../model.dart'; | 8 import '../model.dart'; |
| 12 import 'model_emitter.dart'; | 9 import 'model_emitter.dart'; |
| 13 import '../../common.dart'; | 10 import '../../common.dart'; |
| 14 import '../../elements/elements.dart' show FieldElement; | 11 import '../../elements/elements.dart' show FieldElement; |
| 15 import '../../js/js.dart' as js; | 12 import '../../js/js.dart' as js; |
| 16 | 13 |
| 17 import '../../js_backend/js_backend.dart' show | 14 import '../../js_backend/js_backend.dart' show |
| 18 JavaScriptBackend, | 15 JavaScriptBackend, |
| 19 Namer; | 16 Namer; |
| 20 | 17 |
| 21 import '../js_emitter.dart' show | 18 import '../js_emitter.dart' show |
| 22 NativeEmitter; | 19 NativeEmitter; |
| 23 | 20 |
| 24 import '../js_emitter.dart' as emitterTask show | 21 import '../js_emitter.dart' as emitterTask show |
| 25 Emitter; | 22 Emitter; |
| 26 | 23 |
| 27 import '../../util/util.dart' show | |
| 28 NO_LOCATION_SPANNABLE; | |
| 29 | |
| 30 class Emitter implements emitterTask.Emitter { | 24 class Emitter implements emitterTask.Emitter { |
| 31 final Compiler _compiler; | 25 final Compiler _compiler; |
| 32 final Namer namer; | 26 final Namer namer; |
| 33 final ModelEmitter _emitter; | 27 final ModelEmitter _emitter; |
| 34 | 28 |
| 35 JavaScriptBackend get _backend => _compiler.backend; | |
| 36 | |
| 37 Emitter(Compiler compiler, Namer namer, NativeEmitter nativeEmitter) | 29 Emitter(Compiler compiler, Namer namer, NativeEmitter nativeEmitter) |
| 38 : this._compiler = compiler, | 30 : this._compiler = compiler, |
| 39 this.namer = namer, | 31 this.namer = namer, |
| 40 _emitter = new ModelEmitter(compiler, namer, nativeEmitter); | 32 _emitter = new ModelEmitter(compiler, namer, nativeEmitter); |
| 41 | 33 |
| 42 @override | 34 @override |
| 43 int emitProgram(ProgramBuilder programBuilder) { | 35 int emitProgram(ProgramBuilder programBuilder) { |
| 44 Program program = programBuilder.buildProgram(); | 36 Program program = programBuilder.buildProgram(); |
| 45 return _emitter.emitProgram(program); | 37 return _emitter.emitProgram(program); |
| 46 } | 38 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 67 return _emitter.generateEmbeddedGlobalAccess(global); | 59 return _emitter.generateEmbeddedGlobalAccess(global); |
| 68 } | 60 } |
| 69 | 61 |
| 70 @override | 62 @override |
| 71 // TODO(herhut): Use a single shared function. | 63 // TODO(herhut): Use a single shared function. |
| 72 js.Expression generateFunctionThatReturnsNull() { | 64 js.Expression generateFunctionThatReturnsNull() { |
| 73 return js.js('function() {}'); | 65 return js.js('function() {}'); |
| 74 } | 66 } |
| 75 | 67 |
| 76 js.PropertyAccess _globalPropertyAccess(Element element) { | 68 js.PropertyAccess _globalPropertyAccess(Element element) { |
| 77 String name = namer.globalPropertyName(element); | 69 String name = namer.globalPropertyName(element); |
| 78 js.PropertyAccess pa = new js.PropertyAccess.field( | 70 js.PropertyAccess pa = new js.PropertyAccess.field( |
| 79 new js.VariableUse(namer.globalObjectFor(element)), | 71 new js.VariableUse(namer.globalObjectFor(element)), |
| 80 name); | 72 name); |
| 81 return pa; | 73 return pa; |
| 82 } | 74 } |
| 83 | 75 |
| 84 @override | 76 @override |
| 85 js.Expression isolateLazyInitializerAccess(FieldElement element) { | 77 js.Expression isolateLazyInitializerAccess(FieldElement element) { |
| 86 return js.js('#.#', [namer.globalObjectFor(element), | 78 return js.js('#.#', [namer.globalObjectFor(element), |
| 87 namer.lazyInitializerName(element)]); | 79 namer.lazyInitializerName(element)]); |
| 88 } | 80 } |
| 89 | 81 |
| 90 @override | 82 @override |
| 91 js.Expression isolateStaticClosureAccess(FunctionElement element) { | 83 js.Expression isolateStaticClosureAccess(FunctionElement element) { |
| 92 return _emitter.generateStaticClosureAccess(element); | 84 return _emitter.generateStaticClosureAccess(element); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 123 } | 115 } |
| 124 | 116 |
| 125 @override | 117 @override |
| 126 js.Expression typeAccess(Element element) { | 118 js.Expression typeAccess(Element element) { |
| 127 // TODO(floitsch): minify 'ensureResolved'. | 119 // TODO(floitsch): minify 'ensureResolved'. |
| 128 // TODO(floitsch): don't emit `ensureResolved` for eager classes. | 120 // TODO(floitsch): don't emit `ensureResolved` for eager classes. |
| 129 return js.js('#.ensureResolved()', _globalPropertyAccess(element)); | 121 return js.js('#.ensureResolved()', _globalPropertyAccess(element)); |
| 130 } | 122 } |
| 131 | 123 |
| 132 @override | 124 @override |
| 133 js.Template templateForBuiltin(JsBuiltin builtin) { | 125 void invalidateCaches() {} |
| 134 String typeNameProperty = ModelEmitter.typeNameProperty; | |
| 135 | |
| 136 switch (builtin) { | |
| 137 case JsBuiltin.dartObjectConstructor: | |
| 138 return js.js.expressionTemplateYielding( | |
| 139 typeAccess(_compiler.objectClass)); | |
| 140 | |
| 141 case JsBuiltin.isFunctionType: | |
| 142 return _backend.rti.representationGenerator.templateForIsFunctionType; | |
| 143 | |
| 144 case JsBuiltin.isFunctionTypeLiteral: | |
| 145 String functionClassName = | |
| 146 _backend.namer.runtimeTypeName(compiler.functionClass); | |
| 147 | |
| 148 return jsAst.js.expressionTemplateFor( | |
| 149 '#.$typeNameProperty === "$functionClassName"'); | |
| 150 | |
| 151 case JsBuiltin.typeName: | |
| 152 return jsAst.js.expressionTemplateFor("#.$typeNameProperty"); | |
| 153 | |
| 154 case JsBuiltin.rawRuntimeType: | |
| 155 return jsAst.js.expressionTemplateFor("#.constructor"); | |
| 156 | |
| 157 case JsBuiltin.createFunctionType: | |
| 158 return _backend.rti.representationGenerator | |
| 159 .templateForCreateFunctionType; | |
| 160 | |
| 161 default: | |
| 162 _compiler.internalError(NO_LOCATION_SPANNABLE, | |
| 163 "Unhandled Builtin: $builtin"); | |
| 164 return null; | |
| 165 } | |
| 166 } | |
| 167 | |
| 168 @override | |
| 169 void invalidateCaches() { | |
| 170 } | |
| 171 } | 126 } |
| OLD | NEW |