mirror of
https://github.com/dart-lang/sdk
synced 2024-10-03 11:11:05 +00:00
[dart2js] Chain null-field initializers
Change-Id: I1fff4143ee5698dd1c8c1c833fcb99828d1f8223 Reviewed-on: https://dart-review.googlesource.com/59860 Reviewed-by: Sigmund Cherem <sigmund@google.com> Commit-Queue: Stephen Adams <sra@google.com>
This commit is contained in:
parent
83142f08c6
commit
14dfd82d69
|
@ -825,17 +825,40 @@ class FragmentEmitter {
|
|||
thisRef = js.js('this');
|
||||
}
|
||||
|
||||
// Chain assignments of the same value, e.g. `this.b = this.a = null`.
|
||||
// Limit chain length so that the JavaScript parser has bounded recursion.
|
||||
const int maxChainLength = 30;
|
||||
js.Expression assignment = null;
|
||||
int chainLength = 0;
|
||||
bool previousIsNull = false;
|
||||
void flushAssignment() {
|
||||
if (assignment != null) {
|
||||
statements.add(js.js.statement('#;', assignment));
|
||||
assignment = null;
|
||||
chainLength = 0;
|
||||
previousIsNull = false;
|
||||
}
|
||||
}
|
||||
|
||||
for (Field field in cls.fields) {
|
||||
if (field.nullInitializerInAllocator) {
|
||||
// TODO(sra): Chain initializations, e.g. `this.b = this.a = null;`.
|
||||
statements.add(js.js.statement('#.# = null', [thisRef, field.name]));
|
||||
if (previousIsNull && chainLength < maxChainLength) {
|
||||
assignment = js.js('#.# = #', [thisRef, field.name, assignment]);
|
||||
} else {
|
||||
flushAssignment();
|
||||
assignment = js.js('#.# = null', [thisRef, field.name]);
|
||||
}
|
||||
++chainLength;
|
||||
previousIsNull = true;
|
||||
} else {
|
||||
flushAssignment();
|
||||
js.Parameter parameter = new js.Parameter('t${parameters.length}');
|
||||
parameters.add(parameter);
|
||||
statements.add(
|
||||
js.js.statement('#.# = #', [thisRef, field.name, parameter.name]));
|
||||
}
|
||||
}
|
||||
flushAssignment();
|
||||
|
||||
if (cls.hasRtiField) {
|
||||
js.Parameter parameter = new js.Parameter('t${parameters.length}');
|
||||
|
|
Loading…
Reference in a new issue