| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index e614103b4d4a8695666e6f78e470703ac0454f31..c9bcfcd2b204a8037dc70f5bd61b632bbefc8895 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -8521,6 +8521,42 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckIsBootstrapping) {
|
| }
|
|
|
|
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_Call) {
|
| + HandleScope scope(isolate);
|
| + ASSERT(args.length() >= 2);
|
| + CONVERT_CHECKED(JSReceiver, fun, args[args.length() - 1]);
|
| + Object* receiver = args[0];
|
| + int argc = args.length() - 2;
|
| +
|
| + // If there are too many arguments, allocate argv via malloc.
|
| + const int argv_small_size = 10;
|
| + Handle<Object> argv_small_buffer[argv_small_size];
|
| + SmartArrayPointer<Handle<Object> > argv_large_buffer;
|
| + Handle<Object>* argv = argv_small_buffer;
|
| + if (argc > argv_small_size) {
|
| + argv = new Handle<Object>[argc];
|
| + if (argv == NULL) return isolate->StackOverflow();
|
| + argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv);
|
| + }
|
| +
|
| + for (int i = 0; i < argc; ++i) {
|
| + MaybeObject* maybe = args[1 + i];
|
| + Object* object;
|
| + if (!maybe->To<Object>(&object)) return maybe;
|
| + argv[i] = Handle<Object>(object);
|
| + }
|
| +
|
| + bool threw;
|
| + Handle<JSReceiver> hfun(fun);
|
| + Handle<Object> hreceiver(receiver);
|
| + Handle<Object> result =
|
| + Execution::Call(hfun, hreceiver, argc, argv, &threw, true);
|
| +
|
| + if (threw) return Failure::Exception();
|
| + return *result;
|
| +}
|
| +
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 5);
|
|
|