@@ -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,18 @@ 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
+ if ( value . $$parseShared ) {
411
+ var exp = value ;
412
+ value = function $parsedWrapper ( self , locals ) {
413
+ return exp ( self , locals ) ;
414
+ } ;
415
+ value . assign = exp . assign ;
416
+ value . literal = exp . literal ;
417
+ value . constant = exp . constant ;
418
+ }
419
+
416
420
value . literal = ! ! value . literal ;
417
421
value . constant = ! ! value . constant ;
418
422
@@ -935,6 +939,11 @@ function getterFn(path, options, fullExp) {
935
939
var evaledFnGetter = new Function ( 's' , 'l' , code ) ; // s=scope, l=locals
936
940
/* jshint +W054 */
937
941
evaledFnGetter . toString = valueFn ( code ) ;
942
+ evaledFnGetter . assign = function ( self , value ) {
943
+ return setter ( self , path , value , path ) ;
944
+ } ;
945
+ evaledFnGetter . $$parseShared = true ;
946
+
938
947
fn = evaledFnGetter ;
939
948
}
940
949
0 commit comments