@@ -317,15 +317,7 @@ Lexer.prototype = {
317317 token . fn = fn ;
318318 token . constant = true ;
319319 } 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 ) ;
329321 }
330322
331323 this . tokens . push ( token ) ;
@@ -413,6 +405,18 @@ Parser.prototype = {
413405 this . throwError ( 'is an unexpected token' , this . tokens [ 0 ] ) ;
414406 }
415407
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+
416420 value . literal = ! ! value . literal ;
417421 value . constant = ! ! value . constant ;
418422
@@ -935,6 +939,11 @@ function getterFn(path, options, fullExp) {
935939 var evaledFnGetter = new Function ( 's' , 'l' , code ) ; // s=scope, l=locals
936940 /* jshint +W054 */
937941 evaledFnGetter . toString = valueFn ( code ) ;
942+ evaledFnGetter . assign = function ( self , value ) {
943+ return setter ( self , path , value , path ) ;
944+ } ;
945+ evaledFnGetter . $$parseShared = true ;
946+
938947 fn = evaledFnGetter ;
939948 }
940949
0 commit comments