Chromium Code Reviews| 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..17176a021520a52f2202b1523901319143513e32 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
| @@ -267,16 +267,21 @@ class OldEmitter implements Emitter { |
| // }, |
| // }); |
| + bool hasIsolateSupport = compiler.hasIsolateSupport; |
| + String fieldNamesProperty = r"$__fields__"; |
| + |
| var defineClass = js('''function(name, cls, fields) { |
| var accessors = []; |
| var str = "function " + cls + "("; |
| var body = ""; |
| + if (#hasIsolateSupport) { var fieldNames = ""; } |
|
Lasse Reichstein Nielsen
2014/11/24 12:55:41
Wouldn't it be better to not have this line at all
floitsch
2014/11/24 15:06:56
The js-pretty printer removes "if (false) ..." and
|
| 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 = [ |
| 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(''' |
|
sigurdm
2014/11/24 09:06:09
Give type
floitsch
2014/11/24 15:06:56
Done.
|
| + # = 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, args) { |
|
sigurdm
2014/11/24 09:06:09
Perhaps name third argument 'fields'
floitsch
2014/11/24 15:06:56
Done.
|
| + #[name].apply(o, args); |
| + return o; |
| + }''', [ initializeEmptyInstanceAccess, allClassesAccess ]); |
| + |
| + result.addAll([classIdExtractorAssignment, |
| + classFieldsExtractorAssignment, |
| + instanceFromClassIdAssignment, |
| + initializeEmptyInstanceAssignment]); |
| + } |
| + return result; |
| } |
| /** Needs defineClass to be defined. */ |