| Index: src/runtime/runtime-scopes.cc
|
| diff --git a/src/runtime/runtime-scopes.cc b/src/runtime/runtime-scopes.cc
|
| index 3d9b149cb20cf22ac5c3d2cf29adb905f826776e..6b7db028690c810a19cf3ea150d181bf2aa7dd83 100644
|
| --- a/src/runtime/runtime-scopes.cc
|
| +++ b/src/runtime/runtime-scopes.cc
|
| @@ -1046,35 +1046,32 @@ RUNTIME_FUNCTION(Runtime_StoreLookupSlot) {
|
|
|
|
|
| RUNTIME_FUNCTION(Runtime_ArgumentsLength) {
|
| - SealHandleScope shs(isolate);
|
| + HandleScope scope(isolate);
|
| DCHECK(args.length() == 0);
|
| - JavaScriptFrameIterator it(isolate);
|
| - JavaScriptFrame* frame = it.frame();
|
| - return Smi::FromInt(frame->GetArgumentsLength());
|
| + int argument_count = 0;
|
| + Runtime::GetCallerArguments(isolate, 0, &argument_count);
|
| + return Smi::FromInt(argument_count);
|
| }
|
|
|
|
|
| RUNTIME_FUNCTION(Runtime_Arguments) {
|
| - SealHandleScope shs(isolate);
|
| + HandleScope scope(isolate);
|
| DCHECK(args.length() == 1);
|
| CONVERT_ARG_HANDLE_CHECKED(Object, raw_key, 0);
|
|
|
| - // Compute the frame holding the arguments.
|
| - JavaScriptFrameIterator it(isolate);
|
| - it.AdvanceToArgumentsFrame();
|
| - JavaScriptFrame* frame = it.frame();
|
| -
|
| - // Get the actual number of provided arguments.
|
| - const uint32_t n = frame->ComputeParametersCount();
|
| + // Determine the actual arguments passed to the function.
|
| + int argument_count_signed = 0;
|
| + base::SmartArrayPointer<Handle<Object>> arguments =
|
| + Runtime::GetCallerArguments(isolate, 0, &argument_count_signed);
|
| + const uint32_t argument_count = argument_count_signed;
|
|
|
| // Try to convert the key to an index. If successful and within
|
| // index return the the argument from the frame.
|
| uint32_t index = 0;
|
| - if (raw_key->ToArrayIndex(&index) && index < n) {
|
| - return frame->GetParameter(index);
|
| + if (raw_key->ToArrayIndex(&index) && index < argument_count) {
|
| + return *arguments[index];
|
| }
|
|
|
| - HandleScope scope(isolate);
|
| if (raw_key->IsSymbol()) {
|
| Handle<Symbol> symbol = Handle<Symbol>::cast(raw_key);
|
| if (Name::Equals(symbol, isolate->factory()->iterator_symbol())) {
|
| @@ -1097,8 +1094,8 @@ RUNTIME_FUNCTION(Runtime_Arguments) {
|
|
|
| // Try to convert the string key into an array index.
|
| if (key->AsArrayIndex(&index)) {
|
| - if (index < n) {
|
| - return frame->GetParameter(index);
|
| + if (index < argument_count) {
|
| + return *arguments[index];
|
| } else {
|
| Handle<Object> initial_prototype(isolate->initial_object_prototype());
|
| Handle<Object> result;
|
| @@ -1111,10 +1108,11 @@ RUNTIME_FUNCTION(Runtime_Arguments) {
|
|
|
| // Handle special arguments properties.
|
| if (String::Equals(isolate->factory()->length_string(), key)) {
|
| - return Smi::FromInt(n);
|
| + return Smi::FromInt(argument_count);
|
| }
|
| if (String::Equals(isolate->factory()->callee_string(), key)) {
|
| - JSFunction* function = frame->function();
|
| + JavaScriptFrameIterator it(isolate);
|
| + JSFunction* function = it.frame()->function();
|
| if (is_strict(function->shared()->language_mode())) {
|
| THROW_NEW_ERROR_RETURN_FAILURE(
|
| isolate, NewTypeError(MessageTemplate::kStrictPoisonPill));
|
|
|