OLD | NEW |
| (Empty) |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library dart2js.new_js_emitter.emitter; | |
6 | |
7 import 'package:js_runtime/shared/embedded_names.dart' show | |
8 JsBuiltin, | |
9 METADATA, | |
10 TYPES; | |
11 | |
12 import '../program_builder.dart' show ProgramBuilder; | |
13 import '../model.dart'; | |
14 import 'model_emitter.dart'; | |
15 import '../../common.dart'; | |
16 import '../../elements/elements.dart' show FieldElement; | |
17 import '../../js/js.dart' as js; | |
18 | |
19 import '../../js_backend/js_backend.dart' show | |
20 JavaScriptBackend, | |
21 Namer; | |
22 | |
23 import '../js_emitter.dart' show | |
24 NativeEmitter; | |
25 | |
26 import '../js_emitter.dart' as emitterTask show | |
27 Emitter; | |
28 | |
29 import '../../util/util.dart' show | |
30 NO_LOCATION_SPANNABLE; | |
31 | |
32 class Emitter implements emitterTask.Emitter { | |
33 final Compiler _compiler; | |
34 final Namer namer; | |
35 final ModelEmitter _emitter; | |
36 | |
37 JavaScriptBackend get _backend => _compiler.backend; | |
38 | |
39 Emitter(Compiler compiler, Namer namer, NativeEmitter nativeEmitter) | |
40 : this._compiler = compiler, | |
41 this.namer = namer, | |
42 _emitter = new ModelEmitter(compiler, namer, nativeEmitter); | |
43 | |
44 @override | |
45 int emitProgram(ProgramBuilder programBuilder) { | |
46 Program program = programBuilder.buildProgram(); | |
47 return _emitter.emitProgram(program); | |
48 } | |
49 | |
50 // TODO(floitsch): copied from OldEmitter. Adjust or share. | |
51 @override | |
52 bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) { | |
53 return _emitter.isConstantInlinedOrAlreadyEmitted(constant); | |
54 } | |
55 | |
56 // TODO(floitsch): copied from OldEmitter. Adjust or share. | |
57 @override | |
58 int compareConstants(ConstantValue a, ConstantValue b) { | |
59 return _emitter.compareConstants(a, b); | |
60 } | |
61 | |
62 @override | |
63 js.Expression constantReference(ConstantValue value) { | |
64 return _emitter.generateConstantReference(value); | |
65 } | |
66 | |
67 @override | |
68 js.Expression generateEmbeddedGlobalAccess(String global) { | |
69 return _emitter.generateEmbeddedGlobalAccess(global); | |
70 } | |
71 | |
72 @override | |
73 // TODO(herhut): Use a single shared function. | |
74 js.Expression generateFunctionThatReturnsNull() { | |
75 return js.js('function() {}'); | |
76 } | |
77 | |
78 js.PropertyAccess _globalPropertyAccess(Element element) { | |
79 js.Name name = namer.globalPropertyName(element); | |
80 js.PropertyAccess pa = new js.PropertyAccess( | |
81 new js.VariableUse(namer.globalObjectFor(element)), name); | |
82 return pa; | |
83 } | |
84 | |
85 @override | |
86 js.Expression isolateLazyInitializerAccess(FieldElement element) { | |
87 return js.js('#.#', [namer.globalObjectFor(element), | |
88 namer.lazyInitializerName(element)]); | |
89 } | |
90 | |
91 @override | |
92 js.Expression isolateStaticClosureAccess(FunctionElement element) { | |
93 return _emitter.generateStaticClosureAccess(element); | |
94 } | |
95 | |
96 @override | |
97 js.PropertyAccess staticFieldAccess(FieldElement element) { | |
98 return _globalPropertyAccess(element); | |
99 } | |
100 | |
101 @override | |
102 js.PropertyAccess staticFunctionAccess(FunctionElement element) { | |
103 return _globalPropertyAccess(element); | |
104 } | |
105 | |
106 @override | |
107 js.PropertyAccess constructorAccess(ClassElement element) { | |
108 return _globalPropertyAccess(element); | |
109 } | |
110 | |
111 @override | |
112 js.PropertyAccess prototypeAccess(ClassElement element, | |
113 bool hasBeenInstantiated) { | |
114 js.Expression constructor = | |
115 hasBeenInstantiated ? constructorAccess(element) : typeAccess(element); | |
116 return js.js('#.prototype', constructor); | |
117 } | |
118 | |
119 @override | |
120 js.Expression interceptorClassAccess(ClassElement element) { | |
121 // Some interceptors are eagerly constructed. However, native interceptors | |
122 // aren't. | |
123 return js.js('#.ensureResolved()', _globalPropertyAccess(element)); | |
124 } | |
125 | |
126 @override | |
127 js.Expression typeAccess(Element element) { | |
128 // TODO(floitsch): minify 'ensureResolved'. | |
129 // TODO(floitsch): don't emit `ensureResolved` for eager classes. | |
130 return js.js('#.ensureResolved()', _globalPropertyAccess(element)); | |
131 } | |
132 | |
133 @override | |
134 js.Template templateForBuiltin(JsBuiltin builtin) { | |
135 String typeNameProperty = ModelEmitter.typeNameProperty; | |
136 | |
137 switch (builtin) { | |
138 case JsBuiltin.dartObjectConstructor: | |
139 return js.js.expressionTemplateYielding( | |
140 typeAccess(_compiler.objectClass)); | |
141 | |
142 case JsBuiltin.isCheckPropertyToJsConstructorName: | |
143 int isPrefixLength = namer.operatorIsPrefix.length; | |
144 return js.js.expressionTemplateFor('#.substring($isPrefixLength)'); | |
145 | |
146 case JsBuiltin.isFunctionType: | |
147 return _backend.rti.representationGenerator.templateForIsFunctionType; | |
148 | |
149 case JsBuiltin.rawRtiToJsConstructorName: | |
150 return js.js.expressionTemplateFor("#.$typeNameProperty"); | |
151 | |
152 case JsBuiltin.rawRuntimeType: | |
153 return js.js.expressionTemplateFor("#.constructor"); | |
154 | |
155 case JsBuiltin.createFunctionTypeRti: | |
156 return _backend.rti.representationGenerator | |
157 .templateForCreateFunctionType; | |
158 | |
159 case JsBuiltin.isSubtype: | |
160 // TODO(floitsch): move this closer to where is-check properties are | |
161 // built. | |
162 String isPrefix = namer.operatorIsPrefix; | |
163 return js.js.expressionTemplateFor("('$isPrefix' + #) in #.prototype"); | |
164 | |
165 case JsBuiltin.isGivenTypeRti: | |
166 return js.js.expressionTemplateFor('#.$typeNameProperty === #'); | |
167 | |
168 case JsBuiltin.getMetadata: | |
169 return _emitter.templateForReadMetadata; | |
170 | |
171 case JsBuiltin.getType: | |
172 return _emitter.templateForReadType; | |
173 | |
174 default: | |
175 _compiler.internalError(NO_LOCATION_SPANNABLE, | |
176 "Unhandled Builtin: $builtin"); | |
177 return null; | |
178 } | |
179 } | |
180 | |
181 @override | |
182 void invalidateCaches() { | |
183 } | |
184 } | |
OLD | NEW |