| Index: src/v8natives.js
|
| ===================================================================
|
| --- src/v8natives.js (revision 6703)
|
| +++ src/v8natives.js (working copy)
|
| @@ -1153,33 +1153,49 @@
|
| }
|
| // this_arg is not an argument that should be bound.
|
| var argc_bound = (%_ArgumentsLength() || 1) - 1;
|
| - if (argc_bound > 0) {
|
| + var fn = this;
|
| + if (argc_bound == 0) {
|
| + var result = function() {
|
| + if (%_IsConstructCall()) {
|
| + // %NewObjectFromBound implicitly uses arguments passed to this
|
| + // function. We do not pass the arguments object explicitly to avoid
|
| + // materializing it and guarantee that this function will be optimized.
|
| + return %NewObjectFromBound(fn, null);
|
| + }
|
| +
|
| + return fn.apply(this_arg, arguments);
|
| + };
|
| + } else {
|
| var bound_args = new $Array(argc_bound);
|
| for(var i = 0; i < argc_bound; i++) {
|
| bound_args[i] = %_Arguments(i+1);
|
| }
|
| +
|
| + var result = function() {
|
| + // If this is a construct call we use a special runtime method
|
| + // to generate the actual object using the bound function.
|
| + if (%_IsConstructCall()) {
|
| + // %NewObjectFromBound implicitly uses arguments passed to this
|
| + // function. We do not pass the arguments object explicitly to avoid
|
| + // materializing it and guarantee that this function will be optimized.
|
| + return %NewObjectFromBound(fn, bound_args);
|
| + }
|
| +
|
| + // Combine the args we got from the bind call with the args
|
| + // given as argument to the invocation.
|
| + var argc = %_ArgumentsLength();
|
| + var args = new $Array(argc + argc_bound);
|
| + // Add bound arguments.
|
| + for (var i = 0; i < argc_bound; i++) {
|
| + args[i] = bound_args[i];
|
| + }
|
| + // Add arguments from call.
|
| + for (var i = 0; i < argc; i++) {
|
| + args[argc_bound + i] = %_Arguments(i);
|
| + }
|
| + return fn.apply(this_arg, args);
|
| + };
|
| }
|
| - var fn = this;
|
| - var result = function() {
|
| - // Combine the args we got from the bind call with the args
|
| - // given as argument to the invocation.
|
| - var argc = %_ArgumentsLength();
|
| - var args = new $Array(argc + argc_bound);
|
| - // Add bound arguments.
|
| - for (var i = 0; i < argc_bound; i++) {
|
| - args[i] = bound_args[i];
|
| - }
|
| - // Add arguments from call.
|
| - for (var i = 0; i < argc; i++) {
|
| - args[argc_bound + i] = %_Arguments(i);
|
| - }
|
| - // If this is a construct call we use a special runtime method
|
| - // to generate the actual object using the bound function.
|
| - if (%_IsConstructCall()) {
|
| - return %NewObjectFromBound(fn, args);
|
| - }
|
| - return fn.apply(this_arg, args);
|
| - };
|
|
|
| // We already have caller and arguments properties on functions,
|
| // which are non-configurable. It therefore makes no sence to
|
|
|