Index: pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart |
index dead0f481fec23b8ca7ffa4aa94614602440fb8b..ca3ea0642cd01e89ad318e2e5da715907e9d8c86 100644 |
--- a/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart |
+++ b/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart |
@@ -7,6 +7,7 @@ library dart2js.new_js_emitter.emitter; |
import '../model.dart'; |
import 'model_emitter.dart'; |
import '../../common.dart'; |
+import '../../elements/elements.dart' show FieldElement; |
import '../../js/js.dart' as js; |
import '../../js_backend/js_backend.dart' show Namer, JavaScriptBackend; |
@@ -24,11 +25,13 @@ class Emitter implements emitterTask.Emitter { |
this.namer = namer, |
_emitter = new ModelEmitter(compiler, namer); |
+ @override |
void emitProgram(Program program) { |
_emitter.emitProgram(program); |
} |
// TODO(floitsch): copied from OldEmitter. Adjust or share. |
+ @override |
bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) { |
if (constant.isFunction) return true; // Already emitted. |
if (constant.isPrimitive) return true; // Inlined. |
@@ -41,6 +44,7 @@ class Emitter implements emitterTask.Emitter { |
} |
// TODO(floitsch): copied from OldEmitter. Adjust or share. |
+ @override |
int compareConstants(ConstantValue a, ConstantValue b) { |
// Inlined constants don't affect the order and sometimes don't even have |
// names. |
@@ -63,26 +67,18 @@ class Emitter implements emitterTask.Emitter { |
return namer.constantName(a).compareTo(namer.constantName(b)); |
} |
+ @override |
js.Expression generateEmbeddedGlobalAccess(String global) { |
// TODO(floitsch): We should not use "init" for globals. |
return js.string("init.$global"); |
} |
+ @override |
js.Expression constantReference(ConstantValue value) { |
return _emitter.constantEmitter.reference(value); |
} |
- js.Expression isolateLazyInitializerAccess(Element element) { |
- return js.js('#.#', [namer.globalObjectFor(element), |
- namer.getLazyInitializerName(element)]); |
- } |
- |
- js.Expression isolateStaticClosureAccess(Element element) { |
- return js.js('#.#()', |
- [namer.globalObjectFor(element), namer.getStaticClosureName(element)]); |
- } |
- |
- js.PropertyAccess globalPropertyAccess(Element element) { |
+ js.PropertyAccess _globalPropertyAccess(Element element) { |
String name = namer.getNameX(element); |
js.PropertyAccess pa = new js.PropertyAccess.field( |
new js.VariableUse(namer.globalObjectFor(element)), |
@@ -90,21 +86,54 @@ class Emitter implements emitterTask.Emitter { |
return pa; |
} |
- js.PropertyAccess staticFieldAccess(Element element) { |
- return globalPropertyAccess(element); |
+ @override |
+ js.Expression isolateLazyInitializerAccess(FieldElement element) { |
+ return js.js('#.#', [namer.globalObjectFor(element), |
+ namer.getLazyInitializerName(element)]); |
} |
- |
- js.PropertyAccess staticFunctionAccess(Element element) { |
- return globalPropertyAccess(element); |
+ |
+ @override |
+ js.Expression isolateStaticClosureAccess(FunctionElement element) { |
+ return js.js('#.#()', |
+ [namer.globalObjectFor(element), namer.getStaticClosureName(element)]); |
} |
- |
- js.PropertyAccess classAccess(Element element) { |
- return globalPropertyAccess(element); |
+ |
+ @override |
+ js.PropertyAccess staticFieldAccess(FieldElement element) { |
+ return _globalPropertyAccess(element); |
} |
- |
- js.PropertyAccess typedefAccess(Element element) { |
- return globalPropertyAccess(element); |
+ |
+ @override |
+ js.PropertyAccess staticFunctionAccess(FunctionElement element) { |
+ return _globalPropertyAccess(element); |
+ } |
+ |
+ @override |
+ js.PropertyAccess constructorAccess(ClassElement element) { |
+ return _globalPropertyAccess(element); |
+ } |
+ |
+ @override |
+ js.PropertyAccess prototypeAccess(ClassElement element, |
+ bool hasBeenInstantiated) { |
+ js.Expression constructor = |
+ hasBeenInstantiated ? constructorAccess(element) : typeAccess(element); |
+ return js.js('#.prototype', constructor); |
} |
- |
+ |
+ @override |
+ js.PropertyAccess interceptorClassAccess(ClassElement element) { |
+ // Interceptors are eagerly constructed. It's safe to just access them. |
+ return _globalPropertyAccess(element); |
+ } |
+ |
+ @override |
+ js.Expression typeAccess(Element element) { |
+ // TODO(floitsch): minify 'ensureResolved'. |
+ // TODO(floitsch): don't emit `ensureResolved` for eager classes. |
+ return js.js('#.ensureResolved()', _globalPropertyAccess(element)); |
+ } |
+ |
+ @override |
void invalidateCaches() {} |
} |