Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Side by Side Diff: pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart

Issue 954253002: dart2js: add compiler builtins to the core-runtime. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Move more foreigns to builtins. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698