@@ -317,15 +317,7 @@ Lexer.prototype = {
317
317
token . fn = fn ;
318
318
token . constant = true ;
319
319
} else {
320
- var getter = getterFn ( ident , this . options , parserText ) ;
321
- // TODO(perf): consider exposing the getter reference
322
- token . fn = extend ( function $parsePathGetter ( self , locals ) {
323
- return getter ( self , locals ) ;
324
- } , {
325
- assign : function ( self , value ) {
326
- return setter ( self , ident , value , parserText ) ;
327
- }
328
- } ) ;
320
+ token . fn = getterFn ( ident , this . options , parserText ) ;
329
321
}
330
322
331
323
this . tokens . push ( token ) ;
@@ -413,6 +405,19 @@ Parser.prototype = {
413
405
this . throwError ( 'is an unexpected token' , this . tokens [ 0 ] ) ;
414
406
}
415
407
408
+ //Every value returned must be unique.
409
+ //If the top most value is shared, such as a getterFn, it must be wrapped
410
+ // TODO(perf): consider exposing the getter reference, at least to $watch
411
+ if ( value . $$parseShared ) {
412
+ var exp = value ;
413
+ value = function $parsedWrapper ( self , locals ) {
414
+ return exp ( self , locals ) ;
415
+ } ;
416
+ value . assign = exp . assign ;
417
+ value . literal = exp . literal ;
418
+ value . constant = exp . constant ;
419
+ }
420
+
416
421
value . literal = ! ! value . literal ;
417
422
value . constant = ! ! value . constant ;
418
423
@@ -935,6 +940,11 @@ function getterFn(path, options, fullExp) {
935
940
var evaledFnGetter = new Function ( 's' , 'l' , code ) ; // s=scope, l=locals
936
941
/* jshint +W054 */
937
942
evaledFnGetter . toString = valueFn ( code ) ;
943
+ evaledFnGetter . assign = function ( self , value ) {
944
+ return setter ( self , path , value , path ) ;
945
+ } ;
946
+ evaledFnGetter . $$parseShared = true ;
947
+
938
948
fn = evaledFnGetter ;
939
949
}
940
950
0 commit comments