| Index: pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
|
| index 0ea1989c086d203fba248ef852890c3e388e6e12..b939e1e6b078096864a540b5e9f23aef74426ba2 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
|
| @@ -252,7 +252,7 @@ class OldEmitter implements Emitter {
|
| }''');
|
| }
|
|
|
| - List get defineClassFunction {
|
| + List<jsAst.Node> get defineClassFunction {
|
| // First the class name, then the field names in an array and the members
|
| // (inside an Object literal).
|
| // The caller can also pass in the constructor as a function if needed.
|
| @@ -267,16 +267,21 @@ class OldEmitter implements Emitter {
|
| // },
|
| // });
|
|
|
| - var defineClass = js('''function(name, cls, fields) {
|
| + bool hasIsolateSupport = compiler.hasIsolateSupport;
|
| + String fieldNamesProperty = r"$__fields__";
|
| +
|
| + jsAst.Expression defineClass = js('''function(name, cls, fields) {
|
| var accessors = [];
|
|
|
| var str = "function " + cls + "(";
|
| var body = "";
|
| + if (#hasIsolateSupport) { var fieldNames = ""; }
|
|
|
| for (var i = 0; i < fields.length; i++) {
|
| if(i != 0) str += ", ";
|
|
|
| var field = generateAccessor(fields[i], accessors, cls);
|
| + if (#hasIsolateSupport) { fieldNames += "'" + field + "',"; }
|
| var parameter = "parameter_" + field;
|
| str += parameter;
|
| body += ("this." + field + " = " + parameter + ";\\n");
|
| @@ -289,17 +294,65 @@ class OldEmitter implements Emitter {
|
| if (typeof defineClass.name != "string") {
|
| str += cls + ".name=\\"" + cls + "\\";\\n";
|
| }
|
| + if (#hasIsolateSupport) {
|
| + str += cls + ".$fieldNamesProperty=[" + fieldNames + "];\\n";
|
| + }
|
| str += accessors.join("");
|
|
|
| return str;
|
| - }''');
|
| + }''', { 'hasIsolateSupport': hasIsolateSupport });
|
| +
|
| // Declare a function called "generateAccessor". This is used in
|
| // defineClassFunction (it's a local declaration in init()).
|
| - return [
|
| + List result = <jsAst.Node>[
|
| generateAccessorFunction,
|
| js('$generateAccessorHolder = generateAccessor'),
|
| new jsAst.FunctionDeclaration(
|
| new jsAst.VariableDeclaration('defineClass'), defineClass) ];
|
| +
|
| + if (hasIsolateSupport) {
|
| + jsAst.Expression classIdExtractorAccess =
|
| + generateEmbeddedGlobalAccess(embeddedNames.CLASS_ID_EXTRACTOR);
|
| + var classIdExtractorAssignment =
|
| + js('# = function(o) { return o.constructor.name; }',
|
| + classIdExtractorAccess);
|
| +
|
| + jsAst.Expression classFieldsExtractorAccess =
|
| + generateEmbeddedGlobalAccess(embeddedNames.CLASS_FIELDS_EXTRACTOR);
|
| + var classFieldsExtractorAssignment = js('''
|
| + # = function(o) {
|
| + var fieldNames = o.constructor.$fieldNamesProperty;
|
| + if (!fieldNames) return []; // TODO(floitsch): do something else here.
|
| + var result = [];
|
| + result.length = fieldNames.length;
|
| + for (var i = 0; i < fieldNames.length; i++) {
|
| + result[i] = o[fieldNames[i]];
|
| + }
|
| + return result;
|
| + }''', classFieldsExtractorAccess);
|
| +
|
| + jsAst.Expression instanceFromClassIdAccess =
|
| + generateEmbeddedGlobalAccess(embeddedNames.INSTANCE_FROM_CLASS_ID);
|
| + jsAst.Expression allClassesAccess =
|
| + generateEmbeddedGlobalAccess(embeddedNames.ALL_CLASSES);
|
| + var instanceFromClassIdAssignment =
|
| + js('# = function(name) { return new #[name](); }',
|
| + [instanceFromClassIdAccess, allClassesAccess]);
|
| +
|
| + jsAst.Expression initializeEmptyInstanceAccess =
|
| + generateEmbeddedGlobalAccess(embeddedNames.INITIALIZE_EMPTY_INSTANCE);
|
| + var initializeEmptyInstanceAssignment = js('''
|
| + # = function(name, o, fields) {
|
| + #[name].apply(o, fields);
|
| + return o;
|
| + }''', [ initializeEmptyInstanceAccess, allClassesAccess ]);
|
| +
|
| + result.addAll([classIdExtractorAssignment,
|
| + classFieldsExtractorAssignment,
|
| + instanceFromClassIdAssignment,
|
| + initializeEmptyInstanceAssignment]);
|
| + }
|
| + return result;
|
| }
|
|
|
| /** Needs defineClass to be defined. */
|
|
|