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 '../model.dart'; | |
8 import 'model_emitter.dart'; | |
9 import '../../common.dart'; | |
10 import '../../js/js.dart' as js; | |
11 | |
12 import '../../js_backend/js_backend.dart' show Namer, JavaScriptBackend; | |
13 import '../../js_emitter/js_emitter.dart' as emitterTask show | |
14 CodeEmitterTask, | |
15 Emitter; | |
16 | |
17 class Emitter implements emitterTask.Emitter { | |
18 final Compiler _compiler; | |
19 final Namer namer; | |
20 final ModelEmitter _emitter; | |
21 | |
22 Emitter(Compiler compiler, Namer namer) | |
23 : this._compiler = compiler, | |
24 this.namer = namer, | |
25 _emitter = new ModelEmitter(compiler, namer); | |
26 | |
27 void emitProgram(Program program) { | |
28 _emitter.emitProgram(program); | |
29 } | |
30 | |
31 // TODO(floitsch): copied from OldEmitter. Adjust or share. | |
32 bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) { | |
33 if (constant.isFunction) return true; // Already emitted. | |
34 if (constant.isPrimitive) return true; // Inlined. | |
35 if (constant.isDummy) return true; // Inlined. | |
36 // The name is null when the constant is already a JS constant. | |
37 // TODO(floitsch): every constant should be registered, so that we can | |
38 // share the ones that take up too much space (like some strings). | |
39 if (namer.constantName(constant) == null) return true; | |
40 return false; | |
41 } | |
42 | |
43 // TODO(floitsch): copied from OldEmitter. Adjust or share. | |
44 int compareConstants(ConstantValue a, ConstantValue b) { | |
45 // Inlined constants don't affect the order and sometimes don't even have | |
46 // names. | |
47 int cmp1 = isConstantInlinedOrAlreadyEmitted(a) ? 0 : 1; | |
48 int cmp2 = isConstantInlinedOrAlreadyEmitted(b) ? 0 : 1; | |
49 if (cmp1 + cmp2 < 2) return cmp1 - cmp2; | |
50 | |
51 // Emit constant interceptors first. Constant interceptors for primitives | |
52 // might be used by code that builds other constants. See Issue 18173. | |
53 if (a.isInterceptor != b.isInterceptor) { | |
54 return a.isInterceptor ? -1 : 1; | |
55 } | |
56 | |
57 // Sorting by the long name clusters constants with the same constructor | |
58 // which compresses a tiny bit better. | |
59 int r = namer.constantLongName(a).compareTo(namer.constantLongName(b)); | |
60 if (r != 0) return r; | |
61 // Resolve collisions in the long name by using the constant name (i.e. JS | |
62 // name) which is unique. | |
63 return namer.constantName(a).compareTo(namer.constantName(b)); | |
64 } | |
65 | |
66 js.Expression generateEmbeddedGlobalAccess(String global) { | |
67 // TODO(floitsch): We should not use "init" for globals. | |
68 return js.string("init.$global"); | |
69 } | |
70 | |
71 js.Expression constantReference(ConstantValue value) { | |
72 return _emitter.constantEmitter.reference(value); | |
73 } | |
74 | |
75 void invalidateCaches() {} | |
76 } | |
OLD | NEW |