Chromium Code Reviews| Index: src/v8natives.js |
| diff --git a/src/v8natives.js b/src/v8natives.js |
| index fd8b7f20689e6a87d89cc9db30c358caa84b7413..85f6c4f28df2074ea9dbb958f15f4a6e4b313d58 100644 |
| --- a/src/v8natives.js |
| +++ b/src/v8natives.js |
| @@ -1756,24 +1756,23 @@ function FunctionBind(this_arg) { // Length is 1. |
| } |
| -function NewFunction(arg1) { // length == 1 |
| - var n = %_ArgumentsLength(); |
| - var p = ''; |
| - if (n > 1) { |
| - p = new InternalArray(n - 1); |
| - for (var i = 0; i < n - 1; i++) p[i] = %_Arguments(i); |
| - p = Join(p, n - 1, ',', NonStringToString); |
| +// InternalArray, string, boolean -> Function |
| +function NewFunction(formals, body, is_generator) { |
| + var formals_string = ''; |
| + if (formals.length > 0) { |
| + formals_string = Join(formals, formals.length, ',', NonStringToString); |
| // If the formal parameters string include ) - an illegal |
| // character - it may make the combined function expression |
| // compile. We avoid this problem by checking for this early on. |
| - if (p.indexOf(')') != -1) throw MakeSyntaxError('paren_in_arg_string',[]); |
| + if (formals_string.indexOf(')') != -1) |
| + throw MakeSyntaxError('paren_in_arg_string', []); |
| // If the formal parameters include an unbalanced block comment, the |
| // function must be rejected. Since JavaScript does not allow nested |
| // comments we can include a trailing block comment to catch this. |
| - p += '\n/' + '**/'; |
| + formals_string += '\n/' + '**/'; |
| } |
| - var body = (n > 0) ? ToString(%_Arguments(n - 1)) : ''; |
| - var source = '(function(' + p + ') {\n' + body + '\n})'; |
| + var head = is_generator ? '(function*(' : '(function('; |
| + var source = head + formals_string + ') {\n' + body + '\n})'; |
| var global_receiver = %GlobalReceiver(global); |
| var f = %_CallFunction(global_receiver, %CompileString(source, true)); |
| @@ -1783,12 +1782,24 @@ function NewFunction(arg1) { // length == 1 |
| } |
| +function FunctionConstructor(arg1) { // length == 1 |
| + var n = %_ArgumentsLength(); |
| + if (n > 0) { |
|
Michael Starzinger
2013/05/14 13:51:31
We should try to have a fast-path for the case whe
|
| + var formals = new InternalArray(n - 1); |
| + for (var i = 0; i < n - 1; i++) formals[i] = %_Arguments(i); |
| + return NewFunction(formals, ToString(%_Arguments(n - 1)), false); |
| + } else { |
| + return NewFunction(new InternalArray(0), '', false); |
| + } |
| +} |
| + |
| + |
| // ---------------------------------------------------------------------------- |
| function SetUpFunction() { |
| %CheckIsBootstrapping(); |
| - %SetCode($Function, NewFunction); |
| + %SetCode($Function, FunctionConstructor); |
| %SetProperty($Function.prototype, "constructor", $Function, DONT_ENUM); |
| InstallFunctions($Function.prototype, DONT_ENUM, $Array( |