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 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); | 581 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); |
582 for (int i = 0; i < argument_count; i++) { | 582 for (int i = 0; i < argument_count; i++) { |
583 array->set(i, parameters[i], mode); | 583 array->set(i, parameters[i], mode); |
584 } | 584 } |
585 result->set_elements(*array); | 585 result->set_elements(*array); |
586 } | 586 } |
587 return result; | 587 return result; |
588 } | 588 } |
589 | 589 |
590 | 590 |
591 template <typename T> | |
592 Handle<JSObject> NewRestArguments(Isolate* isolate, Handle<JSFunction> callee, | |
593 T parameters, int argument_count, | |
594 int start_index) { | |
595 int num_elements = std::max(0, argument_count - start_index); | |
596 Handle<JSObject> result = isolate->factory()->NewJSArray( | |
597 FAST_ELEMENTS, num_elements, num_elements, Strength::WEAK, | |
598 DONT_INITIALIZE_ARRAY_ELEMENTS); | |
599 { | |
600 DisallowHeapAllocation no_gc; | |
601 FixedArray* elements = FixedArray::cast(result->elements()); | |
602 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); | |
603 for (int i = 0; i < num_elements; i++) { | |
604 elements->set(i, parameters[i + start_index], mode); | |
605 } | |
606 } | |
607 return result; | |
608 } | |
609 | |
610 | |
611 class HandleArguments BASE_EMBEDDED { | 591 class HandleArguments BASE_EMBEDDED { |
612 public: | 592 public: |
613 explicit HandleArguments(Handle<Object>* array) : array_(array) {} | 593 explicit HandleArguments(Handle<Object>* array) : array_(array) {} |
614 Object* operator[](int index) { return *array_[index]; } | 594 Object* operator[](int index) { return *array_[index]; } |
615 | 595 |
616 private: | 596 private: |
617 Handle<Object>* array_; | 597 Handle<Object>* array_; |
618 }; | 598 }; |
619 | 599 |
620 | 600 |
(...skipping 30 matching lines...) Expand all Loading... |
651 // This generic runtime function can also be used when the caller has been | 631 // This generic runtime function can also be used when the caller has been |
652 // inlined, we use the slow but accurate {GetCallerArguments}. | 632 // inlined, we use the slow but accurate {GetCallerArguments}. |
653 int argument_count = 0; | 633 int argument_count = 0; |
654 base::SmartArrayPointer<Handle<Object>> arguments = | 634 base::SmartArrayPointer<Handle<Object>> arguments = |
655 GetCallerArguments(isolate, &argument_count); | 635 GetCallerArguments(isolate, &argument_count); |
656 HandleArguments argument_getter(arguments.get()); | 636 HandleArguments argument_getter(arguments.get()); |
657 return *NewStrictArguments(isolate, callee, argument_getter, argument_count); | 637 return *NewStrictArguments(isolate, callee, argument_getter, argument_count); |
658 } | 638 } |
659 | 639 |
660 | 640 |
661 RUNTIME_FUNCTION(Runtime_NewRestArguments_Generic) { | 641 RUNTIME_FUNCTION(Runtime_NewRestParameter) { |
662 HandleScope scope(isolate); | 642 HandleScope scope(isolate); |
663 DCHECK(args.length() == 2); | 643 DCHECK_EQ(1, args.length()); |
664 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0) | 644 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0) |
665 CONVERT_SMI_ARG_CHECKED(start_index, 1); | 645 int start_index = callee->shared()->internal_formal_parameter_count(); |
666 // This generic runtime function can also be used when the caller has been | 646 // This generic runtime function can also be used when the caller has been |
667 // inlined, we use the slow but accurate {GetCallerArguments}. | 647 // inlined, we use the slow but accurate {GetCallerArguments}. |
668 int argument_count = 0; | 648 int argument_count = 0; |
669 base::SmartArrayPointer<Handle<Object>> arguments = | 649 base::SmartArrayPointer<Handle<Object>> arguments = |
670 GetCallerArguments(isolate, &argument_count); | 650 GetCallerArguments(isolate, &argument_count); |
671 HandleArguments argument_getter(arguments.get()); | 651 int num_elements = std::max(0, argument_count - start_index); |
672 return *NewRestArguments(isolate, callee, argument_getter, argument_count, | 652 Handle<JSObject> result = isolate->factory()->NewJSArray( |
673 start_index); | 653 FAST_ELEMENTS, num_elements, num_elements, Strength::WEAK, |
| 654 DONT_INITIALIZE_ARRAY_ELEMENTS); |
| 655 { |
| 656 DisallowHeapAllocation no_gc; |
| 657 FixedArray* elements = FixedArray::cast(result->elements()); |
| 658 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); |
| 659 for (int i = 0; i < num_elements; i++) { |
| 660 elements->set(i, *arguments[i + start_index], mode); |
| 661 } |
| 662 } |
| 663 return *result; |
674 } | 664 } |
675 | 665 |
676 | 666 |
677 RUNTIME_FUNCTION(Runtime_NewSloppyArguments) { | 667 RUNTIME_FUNCTION(Runtime_NewSloppyArguments) { |
678 HandleScope scope(isolate); | 668 HandleScope scope(isolate); |
679 DCHECK(args.length() == 3); | 669 DCHECK(args.length() == 3); |
680 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); | 670 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); |
681 Object** parameters = reinterpret_cast<Object**>(args[1]); | 671 Object** parameters = reinterpret_cast<Object**>(args[1]); |
682 CONVERT_SMI_ARG_CHECKED(argument_count, 2); | 672 CONVERT_SMI_ARG_CHECKED(argument_count, 2); |
683 #ifdef DEBUG | 673 #ifdef DEBUG |
(...skipping 17 matching lines...) Expand all Loading... |
701 // This runtime function does not materialize the correct arguments when the | 691 // This runtime function does not materialize the correct arguments when the |
702 // caller has been inlined, better make sure we are not hitting that case. | 692 // caller has been inlined, better make sure we are not hitting that case. |
703 JavaScriptFrameIterator it(isolate); | 693 JavaScriptFrameIterator it(isolate); |
704 DCHECK(!it.frame()->HasInlinedFrames()); | 694 DCHECK(!it.frame()->HasInlinedFrames()); |
705 #endif // DEBUG | 695 #endif // DEBUG |
706 ParameterArguments argument_getter(parameters); | 696 ParameterArguments argument_getter(parameters); |
707 return *NewStrictArguments(isolate, callee, argument_getter, argument_count); | 697 return *NewStrictArguments(isolate, callee, argument_getter, argument_count); |
708 } | 698 } |
709 | 699 |
710 | 700 |
711 RUNTIME_FUNCTION(Runtime_NewRestParam) { | |
712 HandleScope scope(isolate); | |
713 DCHECK(args.length() == 3); | |
714 CONVERT_SMI_ARG_CHECKED(num_params, 0); | |
715 Object** parameters = reinterpret_cast<Object**>(args[1]); | |
716 CONVERT_SMI_ARG_CHECKED(rest_index, 2); | |
717 #ifdef DEBUG | |
718 // This runtime function does not materialize the correct arguments when the | |
719 // caller has been inlined, better make sure we are not hitting that case. | |
720 JavaScriptFrameIterator it(isolate); | |
721 DCHECK(!it.frame()->HasInlinedFrames()); | |
722 #endif // DEBUG | |
723 Handle<JSFunction> callee; | |
724 ParameterArguments argument_getter(parameters); | |
725 return *NewRestArguments(isolate, callee, argument_getter, num_params, | |
726 rest_index); | |
727 } | |
728 | |
729 | |
730 RUNTIME_FUNCTION(Runtime_NewClosure) { | 701 RUNTIME_FUNCTION(Runtime_NewClosure) { |
731 HandleScope scope(isolate); | 702 HandleScope scope(isolate); |
732 DCHECK_EQ(1, args.length()); | 703 DCHECK_EQ(1, args.length()); |
733 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0); | 704 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0); |
734 Handle<Context> context(isolate->context(), isolate); | 705 Handle<Context> context(isolate->context(), isolate); |
735 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, | 706 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, |
736 NOT_TENURED); | 707 NOT_TENURED); |
737 } | 708 } |
738 | 709 |
739 | 710 |
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1252 | 1223 |
1253 // Lookup in the initial Object.prototype object. | 1224 // Lookup in the initial Object.prototype object. |
1254 Handle<Object> result; | 1225 Handle<Object> result; |
1255 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1226 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1256 isolate, result, | 1227 isolate, result, |
1257 Object::GetProperty(isolate->initial_object_prototype(), key)); | 1228 Object::GetProperty(isolate->initial_object_prototype(), key)); |
1258 return *result; | 1229 return *result; |
1259 } | 1230 } |
1260 } // namespace internal | 1231 } // namespace internal |
1261 } // namespace v8 | 1232 } // namespace v8 |
OLD | NEW |