diff options
| author | Lucas Galfasó | 2013-04-25 12:54:28 -0300 |
|---|---|---|
| committer | Pete Bacon Darwin | 2013-04-29 23:02:51 +0100 |
| commit | dcdf4fc78bb22fe040aa800cf37782419d561b1c (patch) | |
| tree | 77f3110ee4429c92b3dc94d595bff69c28e6c35b | |
| parent | cf38d8c55b6c18f41bb559016005627671e7d795 (diff) | |
| download | angular.js-dcdf4fc78bb22fe040aa800cf37782419d561b1c.tar.bz2 | |
fix(parse): fix context access and double function call
Fix a context duplication and invocation to a previous context when
doing an access modifier function on the result of a function
Currently, when doing `foo().bar()`, `foo` is called twice, the first
time to get the context and the second one for `bar` to get the
underlying object. Then the call to `bar` is called using the second
instance as self
This is equivalent to doing:
```
var instance1 = foo();
var instance2 = foo();
instance2.bar.apply(instance1);
```
Closes #2496
| -rw-r--r-- | src/ng/parse.js | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/ng/parse.js b/src/ng/parse.js index 836e8916..b85350a6 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -424,8 +424,8 @@ function parser(text, json, $filter, csp){ text.substring(0, token.index) + "] can not be assigned to", token); } right = logicalOR(); - return function(self, locals){ - return left.assign(self, right(self, locals), locals); + return function(scope, locals){ + return left.assign(scope, right(scope, locals), locals); }; } else { return left; @@ -542,12 +542,12 @@ function parser(text, json, $filter, csp){ var field = expect().text; var getter = getterFn(field, csp); return extend( - function(self, locals) { - return getter(object(self, locals), locals); + function(scope, locals, self) { + return getter(self || object(scope, locals), locals); }, { - assign:function(self, value, locals) { - return setter(object(self, locals), field, value); + assign:function(scope, value, locals) { + return setter(object(scope, locals), field, value); } } ); @@ -588,14 +588,14 @@ function parser(text, json, $filter, csp){ } while (expect(',')); } consume(')'); - return function(self, locals){ + return function(scope, locals){ var args = [], - context = contextGetter ? contextGetter(self, locals) : self; + context = contextGetter ? contextGetter(scope, locals) : scope; for ( var i = 0; i < argsFn.length; i++) { - args.push(argsFn[i](self, locals)); + args.push(argsFn[i](scope, locals)); } - var fnPtr = fn(self, locals) || noop; + var fnPtr = fn(scope, locals, context) || noop; // IE stupidity! return fnPtr.apply ? fnPtr.apply(context, args) |
