Chromium Code Reviews| Index: src/v8natives.js |
| diff --git a/src/v8natives.js b/src/v8natives.js |
| index fd8b7f20689e6a87d89cc9db30c358caa84b7413..a92526c72f11554e479e1a5b32f63e7cf55f4f80 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 |
|
rossberg
2013/05/13 11:33:46
Nit: JS functions aren't curried. ;)
wingo
2013/05/14 10:11:50
My notational ignorance showing again :)
|
| +function NewFunctionHelper(formals, body, is_generator) { |
| + var formals_string = ''; |
| + if (formals.length) { |
|
rossberg
2013/05/13 11:33:46
Nit: ... > 0
wingo
2013/05/14 10:11:50
Done.
|
| + 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',[]); |
|
rossberg
2013/05/13 11:33:46
Nit: can you insert a space before []?
wingo
2013/05/14 10:11:50
Done.
|
| // 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,6 +1782,18 @@ function NewFunction(arg1) { // length == 1 |
| } |
| +function NewFunction(arg1) { // length == 1 |
|
Michael Starzinger
2013/05/13 11:35:39
Since we are at it, can we rename this to Function
wingo
2013/05/14 10:11:50
Done. I renamed the nelper to NewFunction, as it
|
| + var n = %_ArgumentsLength(); |
| + if (n) { |
|
rossberg
2013/05/13 11:33:46
Nit: n > 0
But I'd actually avoid the whole copyi
wingo
2013/05/14 10:11:50
Fixed the nit. We can't copy arguments as-is beca
rossberg
2013/05/14 14:05:46
Yes, but the code not only copies, but also takes
|
| + var formals = new InternalArray(n - 1); |
| + for (var i = 0; i < n - 1; i++) formals[i] = %_Arguments(i); |
| + return NewFunctionHelper(formals, ToString(%_Arguments(n - 1)), false); |
| + } else { |
| + return NewFunctionHelper(new InternalArray(0), '', false); |
| + } |
| +} |
| + |
| + |
| // ---------------------------------------------------------------------------- |
| function SetUpFunction() { |