@@ -247,8 +247,14 @@ class Scope {
247
247
}
248
248
}
249
249
250
- AST ast = rootScope._astParser (expression,
251
- formatters: formatters, collection: collection);
250
+ String astKey =
251
+ "${collection ? "C" : "." }${formatters == null ? "." : formatters .hashCode }$expression " ;
252
+ AST ast = rootScope.astCache[astKey];
253
+ if (ast == null ) {
254
+ ast = rootScope.astCache[astKey] =
255
+ rootScope._astParser (expression,
256
+ formatters: formatters, collection: collection);
257
+ }
252
258
253
259
return watch = watchAST (ast, fn, canChangeModel: canChangeModel);
254
260
}
@@ -559,6 +565,9 @@ class RootScope extends Scope {
559
565
final ScopeDigestTTL _ttl;
560
566
final VmTurnZone _zone;
561
567
568
+ // For Scope.watch().
569
+ final Map <String , AST > astCache = new HashMap <String , AST >();
570
+
562
571
_FunctionChain _runAsyncHead, _runAsyncTail;
563
572
_FunctionChain _domWriteHead, _domWriteTail;
564
573
_FunctionChain _domReadHead, _domReadTail;
@@ -618,7 +627,7 @@ class RootScope extends Scope {
618
627
619
628
RootScope (Object context, Parser parser, ASTParser astParser, FieldGetterFactory fieldGetterFactory,
620
629
FormatterMap formatters, this ._exceptionHandler, this ._ttl, this ._zone,
621
- ScopeStats _scopeStats)
630
+ ScopeStats _scopeStats, CacheRegister cacheRegister )
622
631
: _scopeStats = _scopeStats,
623
632
_parser = parser,
624
633
_astParser = astParser,
@@ -632,6 +641,7 @@ class RootScope extends Scope {
632
641
{
633
642
_zone.onTurnDone = apply;
634
643
_zone.onError = (e, s, ls) => _exceptionHandler (e, s);
644
+ cacheRegister.registerCache ("ScopeWatchASTs" , astCache);
635
645
}
636
646
637
647
RootScope get rootScope => this ;
0 commit comments