Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(944)

Unified Diff: pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart

Issue 742873002: Isolates: allow sending of arbitrary objects in dart2js. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove unnecessary comment. Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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. */

Powered by Google App Engine
This is Rietveld 408576698