Index: src/v8natives.js |
diff --git a/src/v8natives.js b/src/v8natives.js |
index b0fb5bf171114e2946faf36960c8fe95545b7a6a..0f60ff9ca9196422e6efdb77a26a9346104a9be9 100644 |
--- a/src/v8natives.js |
+++ b/src/v8natives.js |
@@ -1153,33 +1153,43 @@ function FunctionBind(this_arg) { // Length is 1. |
} |
// 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()) { |
+ 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()) { |
+ 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 |