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

Unified Diff: pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart

Issue 2829533002: dart2js: --fast-startup: use alias for 'this' (Closed)
Patch Set: Created 3 years, 8 months 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 74b4ec64bd26f46944458e0e2739f1297c7ea7ed..8ad76eb880e96aadf550441981c5afee6aacc6c5 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -652,23 +652,33 @@ class FragmentEmitter {
return js.js('function #() { }', name);
}
- List<js.Name> fieldNames =
- cls.fields.map((Field field) => field.name).toList();
- if (cls.hasRtiField) {
- fieldNames.add(namer.rtiFieldJsName);
+ var statements = <js.Statement>[];
+ var parameters = <js.Name>[];
+ var thisRef;
+
+ // If there are many references to `this`, cache it in a local.
+ if (cls.fields.length + (cls.hasRtiField ? 1 : 0) >= 4) {
+ statements.add(js.js.statement('var _ = this;'));
+ thisRef = js.js('_');
+ } else {
+ thisRef = js.js('this');
}
- Iterable<js.Name> assignments = fieldNames.map((js.Name field) {
- return js.js("this.#field = #field", {"field": field});
- });
-
- // TODO(sra): Cache 'this' in a one-character local for 4 or more uses of
- // 'this'. i.e. "var _=this;_.a=a;_.b=b;..."
+ for (Field field in cls.fields) {
+ js.Name paramName = field.name;
+ parameters.add(paramName);
+ statements
+ .add(js.js.statement('#.# = #', [thisRef, field.name, paramName]));
+ }
- // TODO(sra): Separate field and field initializer parameter names so the
- // latter may be fully minified.
+ if (cls.hasRtiField) {
+ js.Name paramName = namer.rtiFieldJsName;
+ parameters.add(paramName);
+ statements.add(js.js
+ .statement('#.# = #', [thisRef, namer.rtiFieldJsName, paramName]));
+ }
- return js.js('function #(#) { # }', [name, fieldNames, assignments]);
+ return js.js('function #(#) { # }', [name, parameters, statements]);
}
/// Emits the prototype-section of the fragment.
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698