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. */ |