Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Side by Side Diff: src/runtime/runtime-function.cc

Issue 938443002: [es6] implement spread calls (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Eagerly iterate spread expressions, make parser more complicated, simplify harmony-spread Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/v8.h" 5 #include "src/v8.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/compiler.h" 9 #include "src/compiler.h"
10 #include "src/deoptimizer.h" 10 #include "src/deoptimizer.h"
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 Handle<Object> result; 568 Handle<Object> result;
569 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 569 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
570 isolate, result, 570 isolate, result,
571 Execution::Call(isolate, hfun, hreceiver, argc, argv, true)); 571 Execution::Call(isolate, hfun, hreceiver, argc, argv, true));
572 return *result; 572 return *result;
573 } 573 }
574 574
575 575
576 RUNTIME_FUNCTION(Runtime_Apply) { 576 RUNTIME_FUNCTION(Runtime_Apply) {
577 HandleScope scope(isolate); 577 HandleScope scope(isolate);
578 DCHECK(args.length() == 5); 578 DCHECK(args.length() == 5 || args.length() == 3);
arv (Not doing code reviews) 2015/02/23 17:55:56 I think it would be cleaner to have to functions.
rossberg 2015/02/24 16:22:47 +1
caitp (gmail) 2015/02/25 00:00:24 done
579 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, fun, 0); 579 CONVERT_ARG_HANDLE_CHECKED(Object, fun, 0);
580 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1); 580 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1);
581 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2); 581 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2);
582 CONVERT_INT32_ARG_CHECKED(offset, 3); 582
583 CONVERT_INT32_ARG_CHECKED(argc, 4); 583 int32_t offset = 0;
584 int32_t argc = 0;
585
586 if (args.length() == 5) {
587 RUNTIME_ASSERT(args[3]->IsNumber());
588 RUNTIME_ASSERT(args[3]->ToInt32(&offset));
589 RUNTIME_ASSERT(args[4]->IsNumber());
590 RUNTIME_ASSERT(args[4]->ToInt32(&argc));
591 } else {
592 RUNTIME_ASSERT(arguments->IsJSArray());
593 RUNTIME_ASSERT(Handle<JSArray>::cast(arguments)->length()->ToInt32(&argc));
594 }
595
596 if (!fun->IsJSFunction()) {
597 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
598 isolate, fun, Execution::TryGetFunctionDelegate(isolate, fun));
599 }
600
584 RUNTIME_ASSERT(offset >= 0); 601 RUNTIME_ASSERT(offset >= 0);
585 // Loose upper bound to allow fuzzing. We'll most likely run out of 602 // Loose upper bound to allow fuzzing. We'll most likely run out of
586 // stack space before hitting this limit. 603 // stack space before hitting this limit.
587 static int kMaxArgc = 1000000; 604 static int kMaxArgc = 1000000;
588 RUNTIME_ASSERT(argc >= 0 && argc <= kMaxArgc); 605 RUNTIME_ASSERT(argc >= 0 && argc <= kMaxArgc);
589 606
590 // If there are too many arguments, allocate argv via malloc. 607 // If there are too many arguments, allocate argv via malloc.
591 const int argv_small_size = 10; 608 const int argv_small_size = 10;
592 Handle<Object> argv_small_buffer[argv_small_size]; 609 Handle<Object> argv_small_buffer[argv_small_size];
593 SmartArrayPointer<Handle<Object> > argv_large_buffer; 610 SmartArrayPointer<Handle<Object> > argv_large_buffer;
(...skipping 10 matching lines...) Expand all
604 } 621 }
605 622
606 Handle<Object> result; 623 Handle<Object> result;
607 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 624 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
608 isolate, result, 625 isolate, result,
609 Execution::Call(isolate, fun, receiver, argc, argv, true)); 626 Execution::Call(isolate, fun, receiver, argc, argv, true));
610 return *result; 627 return *result;
611 } 628 }
612 629
613 630
631 RUNTIME_FUNCTION(Runtime_ApplyConstruct) {
632 HandleScope scope(isolate);
633 DCHECK(args.length() == 4 || args.length() == 2);
634 CONVERT_ARG_HANDLE_CHECKED(Object, fun, 0);
635 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 1);
636 int32_t offset = 0;
637 int32_t argc = 0;
638
639
640 if (args.length() == 4) {
641 RUNTIME_ASSERT(args[2]->IsNumber());
642 RUNTIME_ASSERT(args[2]->ToInt32(&offset));
643 RUNTIME_ASSERT(args[3]->IsNumber());
644 RUNTIME_ASSERT(args[3]->ToInt32(&argc));
645 } else {
646 RUNTIME_ASSERT(arguments->IsJSArray());
647 RUNTIME_ASSERT(Handle<JSArray>::cast(arguments)->length()->ToInt32(&argc));
648 }
649
650 if (!fun->IsJSFunction()) {
651 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
652 isolate, fun, Execution::TryGetConstructorDelegate(isolate, fun));
653 }
654
655 RUNTIME_ASSERT(offset >= 0);
656 // Loose upper bound to allow fuzzing. We'll most likely run out of
657 // stack space before hitting this limit.
658 static int kMaxArgc = 1000000;
659 RUNTIME_ASSERT(argc >= 0 && argc <= kMaxArgc);
660
661 // If there are too many arguments, allocate argv via malloc.
662 const int argv_small_size = 10;
663 Handle<Object> argv_small_buffer[argv_small_size];
664 SmartArrayPointer<Handle<Object> > argv_large_buffer;
665 Handle<Object>* argv = argv_small_buffer;
666 if (argc > argv_small_size) {
667 argv = new Handle<Object>[argc];
668 if (argv == NULL) return isolate->StackOverflow();
669 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv);
670 }
671
672 for (int i = 0; i < argc; ++i) {
673 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
674 isolate, argv[i], Object::GetElement(isolate, arguments, offset + i));
675 }
676
677 Handle<Object> result;
678 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
679 Execution::New(fun, argc, argv));
680 return *result;
681 }
682
683
614 RUNTIME_FUNCTION(Runtime_GetFunctionDelegate) { 684 RUNTIME_FUNCTION(Runtime_GetFunctionDelegate) {
615 HandleScope scope(isolate); 685 HandleScope scope(isolate);
616 DCHECK(args.length() == 1); 686 DCHECK(args.length() == 1);
617 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); 687 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
618 RUNTIME_ASSERT(!object->IsJSFunction()); 688 RUNTIME_ASSERT(!object->IsJSFunction());
619 return *Execution::GetFunctionDelegate(isolate, object); 689 return *Execution::GetFunctionDelegate(isolate, object);
620 } 690 }
621 691
622 692
623 RUNTIME_FUNCTION(Runtime_GetConstructorDelegate) { 693 RUNTIME_FUNCTION(Runtime_GetConstructorDelegate) {
(...skipping 21 matching lines...) Expand all
645 715
646 716
647 RUNTIME_FUNCTION(RuntimeReference_IsFunction) { 717 RUNTIME_FUNCTION(RuntimeReference_IsFunction) {
648 SealHandleScope shs(isolate); 718 SealHandleScope shs(isolate);
649 DCHECK(args.length() == 1); 719 DCHECK(args.length() == 1);
650 CONVERT_ARG_CHECKED(Object, obj, 0); 720 CONVERT_ARG_CHECKED(Object, obj, 0);
651 return isolate->heap()->ToBoolean(obj->IsJSFunction()); 721 return isolate->heap()->ToBoolean(obj->IsJSFunction());
652 } 722 }
653 } 723 }
654 } // namespace v8::internal 724 } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698