Index: src/runtime/runtime-function.cc |
diff --git a/src/runtime/runtime-function.cc b/src/runtime/runtime-function.cc |
index 51befeedbb6d7ebcfea2f1a13cb38d5f696704ee..9b335444e1f67bf15eaf6e13957a55005a92398c 100644 |
--- a/src/runtime/runtime-function.cc |
+++ b/src/runtime/runtime-function.cc |
@@ -16,27 +16,6 @@ |
namespace v8 { |
namespace internal { |
-// TODO(bmeurer): This is an awful hack resulting from our inability to decide |
-// who's responsible for doing the receiver patching. By any means, we really |
-// need to kill this runtime function and just do things right instead!! |
-RUNTIME_FUNCTION(Runtime_IsSloppyModeFunction) { |
- SealHandleScope shs(isolate); |
- DCHECK(args.length() == 1); |
- CONVERT_ARG_CHECKED(JSReceiver, callable, 0); |
- if (!callable->IsJSFunction()) { |
- HandleScope scope(isolate); |
- Handle<JSFunction> delegate; |
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
- isolate, delegate, |
- Execution::GetFunctionDelegate(isolate, Handle<JSReceiver>(callable))); |
- callable = JSFunction::cast(*delegate); |
- } |
- JSFunction* function = JSFunction::cast(callable); |
- SharedFunctionInfo* shared = function->shared(); |
- return isolate->heap()->ToBoolean(is_sloppy(shared->language_mode())); |
-} |
- |
- |
RUNTIME_FUNCTION(Runtime_FunctionGetName) { |
SealHandleScope shs(isolate); |
DCHECK(args.length() == 1); |
@@ -532,32 +511,18 @@ RUNTIME_FUNCTION(Runtime_NewObjectFromBound) { |
RUNTIME_FUNCTION(Runtime_Call) { |
HandleScope scope(isolate); |
- DCHECK(args.length() >= 2); |
- int argc = args.length() - 2; |
- CONVERT_ARG_CHECKED(JSReceiver, fun, argc + 1); |
- Object* receiver = args[0]; |
- |
- // If there are too many arguments, allocate argv via malloc. |
- const int argv_small_size = 10; |
- Handle<Object> argv_small_buffer[argv_small_size]; |
- base::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 = base::SmartArrayPointer<Handle<Object> >(argv); |
- } |
- |
+ DCHECK_LE(2, args.length()); |
+ int const argc = args.length() - 2; |
+ CONVERT_ARG_HANDLE_CHECKED(JSReceiver, target, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1); |
+ ScopedVector<Handle<Object>> argv(argc); |
for (int i = 0; i < argc; ++i) { |
- argv[i] = Handle<Object>(args[1 + i], isolate); |
+ argv[i] = args.at<Object>(2 + i); |
} |
- |
- Handle<JSReceiver> hfun(fun); |
- Handle<Object> hreceiver(receiver, isolate); |
Handle<Object> result; |
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
isolate, result, |
- Execution::Call(isolate, hfun, hreceiver, argc, argv, true)); |
+ Execution::Call(isolate, target, receiver, argc, argv.start(), true)); |
return *result; |
} |
@@ -634,9 +599,37 @@ RUNTIME_FUNCTION(Runtime_GetOriginalConstructor) { |
} |
+// TODO(bmeurer): Kill %_CallFunction ASAP as it is almost never used |
+// correctly because of the weird semantics underneath. |
RUNTIME_FUNCTION(Runtime_CallFunction) { |
- SealHandleScope shs(isolate); |
- return __RT_impl_Runtime_Call(args, isolate); |
+ HandleScope scope(isolate); |
+ DCHECK(args.length() >= 2); |
+ int argc = args.length() - 2; |
+ CONVERT_ARG_CHECKED(JSReceiver, fun, argc + 1); |
+ Object* receiver = args[0]; |
+ |
+ // If there are too many arguments, allocate argv via malloc. |
+ const int argv_small_size = 10; |
+ Handle<Object> argv_small_buffer[argv_small_size]; |
+ base::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 = base::SmartArrayPointer<Handle<Object>>(argv); |
+ } |
+ |
+ for (int i = 0; i < argc; ++i) { |
+ argv[i] = Handle<Object>(args[1 + i], isolate); |
+ } |
+ |
+ Handle<JSReceiver> hfun(fun); |
+ Handle<Object> hreceiver(receiver, isolate); |
+ Handle<Object> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, |
+ Execution::Call(isolate, hfun, hreceiver, argc, argv, true)); |
+ return *result; |
} |