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
This commit is contained in:
Lucas Galfasó 2013-04-25 12:54:28 -03:00 committed by Pete Bacon Darwin
parent cf38d8c55b
commit dcdf4fc78b

View file

@ -424,8 +424,8 @@ function parser(text, json, $filter, csp){
text.substring(0, token.index) + "] can not be assigned to", token); text.substring(0, token.index) + "] can not be assigned to", token);
} }
right = logicalOR(); right = logicalOR();
return function(self, locals){ return function(scope, locals){
return left.assign(self, right(self, locals), locals); return left.assign(scope, right(scope, locals), locals);
}; };
} else { } else {
return left; return left;
@ -542,12 +542,12 @@ function parser(text, json, $filter, csp){
var field = expect().text; var field = expect().text;
var getter = getterFn(field, csp); var getter = getterFn(field, csp);
return extend( return extend(
function(self, locals) { function(scope, locals, self) {
return getter(object(self, locals), locals); return getter(self || object(scope, locals), locals);
}, },
{ {
assign:function(self, value, locals) { assign:function(scope, value, locals) {
return setter(object(self, locals), field, value); return setter(object(scope, locals), field, value);
} }
} }
); );
@ -588,14 +588,14 @@ function parser(text, json, $filter, csp){
} while (expect(',')); } while (expect(','));
} }
consume(')'); consume(')');
return function(self, locals){ return function(scope, locals){
var args = [], var args = [],
context = contextGetter ? contextGetter(self, locals) : self; context = contextGetter ? contextGetter(scope, locals) : scope;
for ( var i = 0; i < argsFn.length; i++) { 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! // IE stupidity!
return fnPtr.apply return fnPtr.apply
? fnPtr.apply(context, args) ? fnPtr.apply(context, args)