| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
| 9 #include "src/ast/scopeinfo.h" | 9 #include "src/ast/scopeinfo.h" |
| 10 #include "src/ast/scopes.h" | 10 #include "src/ast/scopes.h" |
| (...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 // This runtime function does not materialize the correct arguments when the | 634 // This runtime function does not materialize the correct arguments when the |
| 635 // caller has been inlined, better make sure we are not hitting that case. | 635 // caller has been inlined, better make sure we are not hitting that case. |
| 636 JavaScriptFrameIterator it(isolate); | 636 JavaScriptFrameIterator it(isolate); |
| 637 DCHECK(!it.frame()->HasInlinedFrames()); | 637 DCHECK(!it.frame()->HasInlinedFrames()); |
| 638 #endif // DEBUG | 638 #endif // DEBUG |
| 639 ParameterArguments argument_getter(parameters); | 639 ParameterArguments argument_getter(parameters); |
| 640 return *NewStrictArguments(isolate, callee, argument_getter, argument_count); | 640 return *NewStrictArguments(isolate, callee, argument_getter, argument_count); |
| 641 } | 641 } |
| 642 | 642 |
| 643 | 643 |
| 644 static Handle<JSArray> NewRestParam(Isolate* isolate, Object** parameters, | |
| 645 int num_params, int rest_index) { | |
| 646 parameters -= rest_index; | |
| 647 int num_elements = std::max(0, num_params - rest_index); | |
| 648 Handle<FixedArray> elements = | |
| 649 isolate->factory()->NewUninitializedFixedArray(num_elements); | |
| 650 for (int i = 0; i < num_elements; ++i) { | |
| 651 elements->set(i, *--parameters); | |
| 652 } | |
| 653 return isolate->factory()->NewJSArrayWithElements(elements, FAST_ELEMENTS, | |
| 654 num_elements); | |
| 655 } | |
| 656 | |
| 657 | |
| 658 RUNTIME_FUNCTION(Runtime_NewRestParam) { | 644 RUNTIME_FUNCTION(Runtime_NewRestParam) { |
| 659 HandleScope scope(isolate); | 645 HandleScope scope(isolate); |
| 660 DCHECK(args.length() == 3); | 646 DCHECK(args.length() == 3); |
| 661 CONVERT_SMI_ARG_CHECKED(num_params, 0); | 647 CONVERT_SMI_ARG_CHECKED(num_params, 0); |
| 662 Object** parameters = reinterpret_cast<Object**>(args[1]); | 648 Object** parameters = reinterpret_cast<Object**>(args[1]); |
| 663 CONVERT_SMI_ARG_CHECKED(rest_index, 2); | 649 CONVERT_SMI_ARG_CHECKED(rest_index, 2); |
| 664 | 650 #ifdef DEBUG |
| 665 return *NewRestParam(isolate, parameters, num_params, rest_index); | 651 // This runtime function does not materialize the correct arguments when the |
| 652 // caller has been inlined, better make sure we are not hitting that case. |
| 653 JavaScriptFrameIterator it(isolate); |
| 654 DCHECK(!it.frame()->HasInlinedFrames()); |
| 655 #endif // DEBUG |
| 656 Handle<JSFunction> callee; |
| 657 ParameterArguments argument_getter(parameters); |
| 658 return *NewRestArguments(isolate, callee, argument_getter, num_params, |
| 659 rest_index); |
| 666 } | 660 } |
| 667 | 661 |
| 668 | 662 |
| 669 RUNTIME_FUNCTION(Runtime_NewRestParamSlow) { | |
| 670 HandleScope scope(isolate); | |
| 671 DCHECK(args.length() == 1); | |
| 672 CONVERT_SMI_ARG_CHECKED(rest_index, 0); | |
| 673 | |
| 674 JavaScriptFrameIterator it(isolate); | |
| 675 | |
| 676 // Find the frame that holds the actual arguments passed to the function. | |
| 677 it.AdvanceToArgumentsFrame(); | |
| 678 JavaScriptFrame* frame = it.frame(); | |
| 679 | |
| 680 int argument_count = frame->GetArgumentsLength(); | |
| 681 Object** parameters = reinterpret_cast<Object**>(frame->GetParameterSlot(-1)); | |
| 682 | |
| 683 return *NewRestParam(isolate, parameters, argument_count, rest_index); | |
| 684 } | |
| 685 | |
| 686 | |
| 687 RUNTIME_FUNCTION(Runtime_NewClosure) { | 663 RUNTIME_FUNCTION(Runtime_NewClosure) { |
| 688 HandleScope scope(isolate); | 664 HandleScope scope(isolate); |
| 689 DCHECK_EQ(1, args.length()); | 665 DCHECK_EQ(1, args.length()); |
| 690 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0); | 666 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0); |
| 691 Handle<Context> context(isolate->context(), isolate); | 667 Handle<Context> context(isolate->context(), isolate); |
| 692 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, | 668 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, |
| 693 NOT_TENURED); | 669 NOT_TENURED); |
| 694 } | 670 } |
| 695 | 671 |
| 696 | 672 |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1209 | 1185 |
| 1210 // Lookup in the initial Object.prototype object. | 1186 // Lookup in the initial Object.prototype object. |
| 1211 Handle<Object> result; | 1187 Handle<Object> result; |
| 1212 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1188 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 1213 isolate, result, | 1189 isolate, result, |
| 1214 Object::GetProperty(isolate->initial_object_prototype(), key)); | 1190 Object::GetProperty(isolate->initial_object_prototype(), key)); |
| 1215 return *result; | 1191 return *result; |
| 1216 } | 1192 } |
| 1217 } // namespace internal | 1193 } // namespace internal |
| 1218 } // namespace v8 | 1194 } // namespace v8 |
| OLD | NEW |