| 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 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 result->set_elements(*elements); | 561 result->set_elements(*elements); |
| 562 for (int i = 0; i < argument_count; ++i) { | 562 for (int i = 0; i < argument_count; ++i) { |
| 563 elements->set(i, parameters[i]); | 563 elements->set(i, parameters[i]); |
| 564 } | 564 } |
| 565 } | 565 } |
| 566 } | 566 } |
| 567 return result; | 567 return result; |
| 568 } | 568 } |
| 569 | 569 |
| 570 | 570 |
| 571 template <typename T> | |
| 572 Handle<JSObject> NewStrictArguments(Isolate* isolate, Handle<JSFunction> callee, | |
| 573 T parameters, int argument_count) { | |
| 574 Handle<JSObject> result = | |
| 575 isolate->factory()->NewArgumentsObject(callee, argument_count); | |
| 576 | |
| 577 if (argument_count > 0) { | |
| 578 Handle<FixedArray> array = | |
| 579 isolate->factory()->NewUninitializedFixedArray(argument_count); | |
| 580 DisallowHeapAllocation no_gc; | |
| 581 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); | |
| 582 for (int i = 0; i < argument_count; i++) { | |
| 583 array->set(i, parameters[i], mode); | |
| 584 } | |
| 585 result->set_elements(*array); | |
| 586 } | |
| 587 return result; | |
| 588 } | |
| 589 | |
| 590 | |
| 591 class HandleArguments BASE_EMBEDDED { | 571 class HandleArguments BASE_EMBEDDED { |
| 592 public: | 572 public: |
| 593 explicit HandleArguments(Handle<Object>* array) : array_(array) {} | 573 explicit HandleArguments(Handle<Object>* array) : array_(array) {} |
| 594 Object* operator[](int index) { return *array_[index]; } | 574 Object* operator[](int index) { return *array_[index]; } |
| 595 | 575 |
| 596 private: | 576 private: |
| 597 Handle<Object>* array_; | 577 Handle<Object>* array_; |
| 598 }; | 578 }; |
| 599 | 579 |
| 600 | 580 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 617 // This generic runtime function can also be used when the caller has been | 597 // This generic runtime function can also be used when the caller has been |
| 618 // inlined, we use the slow but accurate {GetCallerArguments}. | 598 // inlined, we use the slow but accurate {GetCallerArguments}. |
| 619 int argument_count = 0; | 599 int argument_count = 0; |
| 620 base::SmartArrayPointer<Handle<Object>> arguments = | 600 base::SmartArrayPointer<Handle<Object>> arguments = |
| 621 GetCallerArguments(isolate, &argument_count); | 601 GetCallerArguments(isolate, &argument_count); |
| 622 HandleArguments argument_getter(arguments.get()); | 602 HandleArguments argument_getter(arguments.get()); |
| 623 return *NewSloppyArguments(isolate, callee, argument_getter, argument_count); | 603 return *NewSloppyArguments(isolate, callee, argument_getter, argument_count); |
| 624 } | 604 } |
| 625 | 605 |
| 626 | 606 |
| 627 RUNTIME_FUNCTION(Runtime_NewStrictArguments_Generic) { | 607 RUNTIME_FUNCTION(Runtime_NewStrictArguments) { |
| 628 HandleScope scope(isolate); | 608 HandleScope scope(isolate); |
| 629 DCHECK(args.length() == 1); | 609 DCHECK_EQ(1, args.length()); |
| 630 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); | 610 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); |
| 631 // This generic runtime function can also be used when the caller has been | 611 // This generic runtime function can also be used when the caller has been |
| 632 // inlined, we use the slow but accurate {GetCallerArguments}. | 612 // inlined, we use the slow but accurate {GetCallerArguments}. |
| 633 int argument_count = 0; | 613 int argument_count = 0; |
| 634 base::SmartArrayPointer<Handle<Object>> arguments = | 614 base::SmartArrayPointer<Handle<Object>> arguments = |
| 635 GetCallerArguments(isolate, &argument_count); | 615 GetCallerArguments(isolate, &argument_count); |
| 636 HandleArguments argument_getter(arguments.get()); | 616 Handle<JSObject> result = |
| 637 return *NewStrictArguments(isolate, callee, argument_getter, argument_count); | 617 isolate->factory()->NewArgumentsObject(callee, argument_count); |
| 618 if (argument_count) { |
| 619 Handle<FixedArray> array = |
| 620 isolate->factory()->NewUninitializedFixedArray(argument_count); |
| 621 DisallowHeapAllocation no_gc; |
| 622 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); |
| 623 for (int i = 0; i < argument_count; i++) { |
| 624 array->set(i, *arguments[i], mode); |
| 625 } |
| 626 result->set_elements(*array); |
| 627 } |
| 628 return *result; |
| 638 } | 629 } |
| 639 | 630 |
| 640 | 631 |
| 641 RUNTIME_FUNCTION(Runtime_NewRestParameter) { | 632 RUNTIME_FUNCTION(Runtime_NewRestParameter) { |
| 642 HandleScope scope(isolate); | 633 HandleScope scope(isolate); |
| 643 DCHECK_EQ(1, args.length()); | 634 DCHECK_EQ(1, args.length()); |
| 644 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0) | 635 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0) |
| 645 int start_index = callee->shared()->internal_formal_parameter_count(); | 636 int start_index = callee->shared()->internal_formal_parameter_count(); |
| 646 // This generic runtime function can also be used when the caller has been | 637 // This generic runtime function can also be used when the caller has been |
| 647 // inlined, we use the slow but accurate {GetCallerArguments}. | 638 // inlined, we use the slow but accurate {GetCallerArguments}. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 674 // This runtime function does not materialize the correct arguments when the | 665 // This runtime function does not materialize the correct arguments when the |
| 675 // caller has been inlined, better make sure we are not hitting that case. | 666 // caller has been inlined, better make sure we are not hitting that case. |
| 676 JavaScriptFrameIterator it(isolate); | 667 JavaScriptFrameIterator it(isolate); |
| 677 DCHECK(!it.frame()->HasInlinedFrames()); | 668 DCHECK(!it.frame()->HasInlinedFrames()); |
| 678 #endif // DEBUG | 669 #endif // DEBUG |
| 679 ParameterArguments argument_getter(parameters); | 670 ParameterArguments argument_getter(parameters); |
| 680 return *NewSloppyArguments(isolate, callee, argument_getter, argument_count); | 671 return *NewSloppyArguments(isolate, callee, argument_getter, argument_count); |
| 681 } | 672 } |
| 682 | 673 |
| 683 | 674 |
| 684 RUNTIME_FUNCTION(Runtime_NewStrictArguments) { | |
| 685 HandleScope scope(isolate); | |
| 686 DCHECK(args.length() == 3); | |
| 687 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0) | |
| 688 Object** parameters = reinterpret_cast<Object**>(args[1]); | |
| 689 CONVERT_SMI_ARG_CHECKED(argument_count, 2); | |
| 690 #ifdef DEBUG | |
| 691 // This runtime function does not materialize the correct arguments when the | |
| 692 // caller has been inlined, better make sure we are not hitting that case. | |
| 693 JavaScriptFrameIterator it(isolate); | |
| 694 DCHECK(!it.frame()->HasInlinedFrames()); | |
| 695 #endif // DEBUG | |
| 696 ParameterArguments argument_getter(parameters); | |
| 697 return *NewStrictArguments(isolate, callee, argument_getter, argument_count); | |
| 698 } | |
| 699 | |
| 700 | |
| 701 RUNTIME_FUNCTION(Runtime_NewClosure) { | 675 RUNTIME_FUNCTION(Runtime_NewClosure) { |
| 702 HandleScope scope(isolate); | 676 HandleScope scope(isolate); |
| 703 DCHECK_EQ(1, args.length()); | 677 DCHECK_EQ(1, args.length()); |
| 704 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0); | 678 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0); |
| 705 Handle<Context> context(isolate->context(), isolate); | 679 Handle<Context> context(isolate->context(), isolate); |
| 706 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, | 680 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, |
| 707 NOT_TENURED); | 681 NOT_TENURED); |
| 708 } | 682 } |
| 709 | 683 |
| 710 | 684 |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1241 | 1215 |
| 1242 // Lookup in the initial Object.prototype object. | 1216 // Lookup in the initial Object.prototype object. |
| 1243 Handle<Object> result; | 1217 Handle<Object> result; |
| 1244 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1218 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 1245 isolate, result, | 1219 isolate, result, |
| 1246 Object::GetProperty(isolate->initial_object_prototype(), key)); | 1220 Object::GetProperty(isolate->initial_object_prototype(), key)); |
| 1247 return *result; | 1221 return *result; |
| 1248 } | 1222 } |
| 1249 } // namespace internal | 1223 } // namespace internal |
| 1250 } // namespace v8 | 1224 } // namespace v8 |
| OLD | NEW |