Chromium Code Reviews| Index: pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart |
| diff --git a/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart |
| index f3e8bafb7e0842f72d1a3535deb2654985f1e279..b40e20d1db69b4ee462cfe9330740967bdef8a92 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart |
| @@ -17,6 +17,7 @@ import 'package:_internal/compiler/js_lib/shared/embedded_names.dart' show |
| INITIALIZE_LOADED_HUNK, |
| IS_HUNK_LOADED; |
| +import '../js_emitter.dart' show NativeGenerator; |
| import '../model.dart'; |
| class ModelEmitter { |
| @@ -38,6 +39,11 @@ class ModelEmitter { |
| constantEmitter = |
| new ConstantEmitter(compiler, namer, makeConstantListTemplate); |
| + js.Expression generateEmbeddedGlobalAccess(String global) { |
| + // TODO(floitsch): We should not use "init" for globals. |
| + return js.js("init.$global"); |
| + } |
| + |
| void emitProgram(Program program) { |
| List<Output> outputs = program.outputs; |
| MainOutput mainUnit = outputs.first; |
| @@ -75,7 +81,20 @@ class ModelEmitter { |
| List<js.Expression> elements = unit.libraries.map(emitLibrary).toList(); |
| elements.add( |
| emitLazilyInitializedStatics(unit.staticLazilyInitializedFields)); |
| + |
| + js.Statement nativeBoilerplate; |
| + if (NativeGenerator.needsBoilerplate(backend)) { |
| + nativeBoilerplate = NativeGenerator.generateBoilerplate( |
| + backend, |
| + generateEmbeddedGlobalAccess, |
| + // TODO(floitsch): convertToFastObject. |
| + js.js("(function(x) { return x; })", [])); |
| + } else { |
| + nativeBoilerplate = js.js.statement(";"); |
| + } |
| + |
| js.Expression code = new js.ArrayInitializer(elements); |
| + |
| return js.js.statement( |
| boilerplate, |
|
sra1
2015/01/05 20:14:23
Use the uncached version unless you are sure that
floitsch
2015/01/06 12:54:57
Boilerplate is a big string at the bottom of the f
sra1
2015/01/07 04:43:28
My bad. I thought it was computed.
If it is a con
floitsch
2015/01/07 13:11:46
what's a constant-like name?
I wanted to use capit
|
| {'deferredInitializer': emitDeferredInitializerGlobal(program.loadMap), |
| @@ -86,6 +105,7 @@ class ModelEmitter { |
| 'embeddedGlobals': emitEmbeddedGlobals(program.loadMap), |
| 'constants': emitConstants(unit.constants), |
| 'staticNonFinals': emitStaticNonFinalFields(unit.staticNonFinalFields), |
| + 'nativeBoilerplate': nativeBoilerplate, |
| 'eagerClasses': emitEagerClassInitializations(unit.libraries), |
| 'main': unit.main, |
| 'code': code}); |
| @@ -130,8 +150,6 @@ class ModelEmitter { |
| globals.add(emitInitializeLoadedHunk()); |
| } |
| - if (globals.isEmpty) return new js.Block.empty(); |
| - |
| js.ObjectInitializer globalsObject = new js.ObjectInitializer(globals); |
| List<js.Statement> statements = |
| @@ -539,6 +557,9 @@ class ModelEmitter { |
| // Initialize static non-final fields. |
| #staticNonFinals; |
| + // Add native boilerplate code. |
| + #nativeBoilerplate; |
| + |
| // Initialize eager classes. |
| #eagerClasses; |