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; | |
Johnni Winther
2015/04/14 07:41:30
Bad indentation.
floitsch
2015/04/15 14:34:35
Done.
| |
9 | |
7 import '../program_builder.dart' show ProgramBuilder; | 10 import '../program_builder.dart' show ProgramBuilder; |
8 import '../model.dart'; | 11 import '../model.dart'; |
9 import 'model_emitter.dart'; | 12 import 'model_emitter.dart'; |
10 import '../../common.dart'; | 13 import '../../common.dart'; |
11 import '../../elements/elements.dart' show FieldElement; | 14 import '../../elements/elements.dart' show FieldElement; |
12 import '../../js/js.dart' as js; | 15 import '../../js/js.dart' as js; |
13 | 16 |
14 import '../../js_backend/js_backend.dart' show | 17 import '../../js_backend/js_backend.dart' show |
15 JavaScriptBackend, | 18 JavaScriptBackend, |
16 Namer; | 19 Namer; |
17 | 20 |
18 import '../js_emitter.dart' show | 21 import '../js_emitter.dart' show |
19 NativeEmitter; | 22 NativeEmitter; |
20 | 23 |
21 import '../js_emitter.dart' as emitterTask show | 24 import '../js_emitter.dart' as emitterTask show |
22 Emitter; | 25 Emitter; |
26 | |
27 import '../../util/util.dart' show | |
28 NO_LOCATION_SPANNABLE; | |
Johnni Winther
2015/04/14 07:41:30
Bad indentation.
floitsch
2015/04/15 14:34:35
Done.
| |
23 | 29 |
24 class Emitter implements emitterTask.Emitter { | 30 class Emitter implements emitterTask.Emitter { |
25 final Compiler _compiler; | 31 final Compiler _compiler; |
26 final Namer namer; | 32 final Namer namer; |
27 final ModelEmitter _emitter; | 33 final ModelEmitter _emitter; |
28 | 34 |
35 JavaScriptBackend get _backend => _compiler.backend; | |
36 | |
29 Emitter(Compiler compiler, Namer namer, NativeEmitter nativeEmitter) | 37 Emitter(Compiler compiler, Namer namer, NativeEmitter nativeEmitter) |
30 : this._compiler = compiler, | 38 : this._compiler = compiler, |
31 this.namer = namer, | 39 this.namer = namer, |
Johnni Winther
2015/04/14 07:41:30
Bad indentation.
floitsch
2015/04/15 14:34:35
Done.
| |
32 _emitter = new ModelEmitter(compiler, namer, nativeEmitter); | 40 _emitter = new ModelEmitter(compiler, namer, nativeEmitter); |
33 | 41 |
34 @override | 42 @override |
35 int emitProgram(ProgramBuilder programBuilder) { | 43 int emitProgram(ProgramBuilder programBuilder) { |
36 Program program = programBuilder.buildProgram(); | 44 Program program = programBuilder.buildProgram(); |
37 return _emitter.emitProgram(program); | 45 return _emitter.emitProgram(program); |
38 } | 46 } |
39 | 47 |
40 // TODO(floitsch): copied from OldEmitter. Adjust or share. | 48 // TODO(floitsch): copied from OldEmitter. Adjust or share. |
41 @override | 49 @override |
42 bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) { | 50 bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) { |
(...skipping 16 matching lines...) Expand all Loading... | |
59 return _emitter.generateEmbeddedGlobalAccess(global); | 67 return _emitter.generateEmbeddedGlobalAccess(global); |
60 } | 68 } |
61 | 69 |
62 @override | 70 @override |
63 // TODO(herhut): Use a single shared function. | 71 // TODO(herhut): Use a single shared function. |
64 js.Expression generateFunctionThatReturnsNull() { | 72 js.Expression generateFunctionThatReturnsNull() { |
65 return js.js('function() {}'); | 73 return js.js('function() {}'); |
66 } | 74 } |
67 | 75 |
68 js.PropertyAccess _globalPropertyAccess(Element element) { | 76 js.PropertyAccess _globalPropertyAccess(Element element) { |
69 String name = namer.globalPropertyName(element); | 77 String name = namer.globalPropertyName(element); |
70 js.PropertyAccess pa = new js.PropertyAccess.field( | 78 js.PropertyAccess pa = new js.PropertyAccess.field( |
71 new js.VariableUse(namer.globalObjectFor(element)), | 79 new js.VariableUse(namer.globalObjectFor(element)), |
72 name); | 80 name); |
73 return pa; | 81 return pa; |
74 } | 82 } |
75 | 83 |
76 @override | 84 @override |
77 js.Expression isolateLazyInitializerAccess(FieldElement element) { | 85 js.Expression isolateLazyInitializerAccess(FieldElement element) { |
78 return js.js('#.#', [namer.globalObjectFor(element), | 86 return js.js('#.#', [namer.globalObjectFor(element), |
79 namer.lazyInitializerName(element)]); | 87 namer.lazyInitializerName(element)]); |
Johnni Winther
2015/04/14 07:41:30
Bad indentation.
floitsch
2015/04/15 14:34:36
Done.
| |
80 } | 88 } |
81 | 89 |
82 @override | 90 @override |
83 js.Expression isolateStaticClosureAccess(FunctionElement element) { | 91 js.Expression isolateStaticClosureAccess(FunctionElement element) { |
84 return _emitter.generateStaticClosureAccess(element); | 92 return _emitter.generateStaticClosureAccess(element); |
85 } | 93 } |
86 | 94 |
87 @override | 95 @override |
88 js.PropertyAccess staticFieldAccess(FieldElement element) { | 96 js.PropertyAccess staticFieldAccess(FieldElement element) { |
89 return _globalPropertyAccess(element); | 97 return _globalPropertyAccess(element); |
90 } | 98 } |
91 | 99 |
92 @override | 100 @override |
93 js.PropertyAccess staticFunctionAccess(FunctionElement element) { | 101 js.PropertyAccess staticFunctionAccess(FunctionElement element) { |
94 return _globalPropertyAccess(element); | 102 return _globalPropertyAccess(element); |
95 } | 103 } |
96 | 104 |
97 @override | 105 @override |
98 js.PropertyAccess constructorAccess(ClassElement element) { | 106 js.PropertyAccess constructorAccess(ClassElement element) { |
99 return _globalPropertyAccess(element); | 107 return _globalPropertyAccess(element); |
100 } | 108 } |
101 | 109 |
102 @override | 110 @override |
103 js.PropertyAccess prototypeAccess(ClassElement element, | 111 js.PropertyAccess prototypeAccess(ClassElement element, |
104 bool hasBeenInstantiated) { | 112 bool hasBeenInstantiated) { |
105 js.Expression constructor = | 113 js.Expression constructor = |
106 hasBeenInstantiated ? constructorAccess(element) : typeAccess(element); | 114 hasBeenInstantiated ? constructorAccess(element) : typeAccess(element); |
Johnni Winther
2015/04/14 07:41:30
Bad indentation.
floitsch
2015/04/15 14:34:35
Done.
| |
107 return js.js('#.prototype', constructor); | 115 return js.js('#.prototype', constructor); |
108 } | 116 } |
109 | 117 |
110 @override | 118 @override |
111 js.Expression interceptorClassAccess(ClassElement element) { | 119 js.Expression interceptorClassAccess(ClassElement element) { |
112 // Some interceptors are eagerly constructed. However, native interceptors | 120 // Some interceptors are eagerly constructed. However, native interceptors |
113 // aren't. | 121 // aren't. |
114 return js.js('#.ensureResolved()', _globalPropertyAccess(element)); | 122 return js.js('#.ensureResolved()', _globalPropertyAccess(element)); |
115 } | 123 } |
116 | 124 |
117 @override | 125 @override |
118 js.Expression typeAccess(Element element) { | 126 js.Expression typeAccess(Element element) { |
119 // TODO(floitsch): minify 'ensureResolved'. | 127 // TODO(floitsch): minify 'ensureResolved'. |
120 // TODO(floitsch): don't emit `ensureResolved` for eager classes. | 128 // TODO(floitsch): don't emit `ensureResolved` for eager classes. |
121 return js.js('#.ensureResolved()', _globalPropertyAccess(element)); | 129 return js.js('#.ensureResolved()', _globalPropertyAccess(element)); |
122 } | 130 } |
123 | 131 |
124 @override | 132 @override |
125 void invalidateCaches() {} | 133 js.Template templateForBuiltin(JsBuiltin builtin) { |
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 } | |
126 } | 171 } |
OLD | NEW |