Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit a9dc429

Browse files
jbdeboertravis@travis-ci.org
authored andcommitted
fix(compiler): Do not store injectors with TaggingElementBinders
TaggingElementBinders are long-lived objects and the injectors are specific to a View. By storing injectors, Angular is retaining more memory than needed. With this change, injectors are local to a ViewFactory.call() invocation.
1 parent 6102d8a commit a9dc429

File tree

2 files changed

+11
-11
lines changed

2 files changed

+11
-11
lines changed

lib/core_dom/element_binder.dart

+1-3
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,6 @@ class TaggedTextBinder {
403403
class TaggedElementBinder {
404404
final ElementBinder binder;
405405
int parentBinderOffset;
406-
var injector;
407406
bool isTopLevel;
408407

409408
List<TaggedTextBinder> textBinders;
@@ -416,6 +415,5 @@ class TaggedElementBinder {
416415
}
417416

418417
String toString() => "[TaggedElementBinder binder:$binder parentBinderOffset:"
419-
"$parentBinderOffset textBinders:$textBinders "
420-
"injector:$injector]";
418+
"$parentBinderOffset textBinders:$textBinders]";
421419
}

lib/core_dom/tagging_view_factory.dart

+10-8
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,31 @@ class TaggingViewFactory implements ViewFactory {
1818
try {
1919
assert((timerId = _perf.startTimer('ng.view')) != false);
2020
var view = new View(nodes, injector.get(EventHandler));
21-
_link(view, nodes, elementBinders, injector);
21+
_link(view, nodes, injector);
2222
return view;
2323
} finally {
2424
assert(_perf.stopTimer(timerId) != false);
2525
}
2626
}
2727

28-
_bindTagged(TaggedElementBinder tagged, rootInjector, elementBinders, View view, boundNode) {
28+
_bindTagged(TaggedElementBinder tagged, int elementBinderIndex, rootInjector, elementInjectors, View view, boundNode) {
2929
var binder = tagged.binder;
30-
var parentInjector = tagged.parentBinderOffset == -1 ? rootInjector : elementBinders[tagged.parentBinderOffset].injector;
30+
var parentInjector = tagged.parentBinderOffset == -1 ? rootInjector : elementInjectors[tagged.parentBinderOffset];
3131
assert(parentInjector != null);
3232

33-
tagged.injector = binder != null ? binder.bind(view, parentInjector, boundNode) : parentInjector;
33+
var elementInjector = elementInjectors[elementBinderIndex] =
34+
binder != null ? binder.bind(view, parentInjector, boundNode) : parentInjector;
3435

3536
if (tagged.textBinders != null) {
3637
for (var k = 0, kk = tagged.textBinders.length; k < kk; k++) {
3738
TaggedTextBinder taggedText = tagged.textBinders[k];
38-
taggedText.binder.bind(view, tagged.injector, boundNode.childNodes[taggedText.offsetIndex]);
39+
taggedText.binder.bind(view, elementInjector, boundNode.childNodes[taggedText.offsetIndex]);
3940
}
4041
}
4142
}
4243

43-
View _link(View view, List<dom.Node> nodeList, List elementBinders, Injector rootInjector) {
44+
View _link(View view, List<dom.Node> nodeList, Injector rootInjector) {
45+
var elementInjectors = new List(elementBinders.length);
4446
var directiveDefsByName = {};
4547

4648
var elementBinderIndex = 0;
@@ -64,13 +66,13 @@ class TaggingViewFactory implements ViewFactory {
6466
TaggedElementBinder tagged = elementBinders[elementBinderIndex];
6567
var boundNode = j == -1 ? node : elts[j];
6668

67-
_bindTagged(tagged, rootInjector, elementBinders, view, boundNode);
69+
_bindTagged(tagged, elementBinderIndex, rootInjector, elementInjectors, view, boundNode);
6870
}
6971
} else if (node.nodeType == 3 || node.nodeType == 8) {
7072
TaggedElementBinder tagged = elementBinders[elementBinderIndex];
7173
assert(tagged.binder != null || tagged.isTopLevel);
7274
if (tagged.binder != null) {
73-
_bindTagged(tagged, rootInjector, elementBinders, view, node);
75+
_bindTagged(tagged, elementBinderIndex, rootInjector, elementInjectors, view, node);
7476
}
7577
elementBinderIndex++;
7678
} else {

0 commit comments

Comments
 (0)