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 |