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

Unified Diff: src/builtins.cc

Issue 1552473002: Revert of [runtime] Introduce dedicated JSBoundFunction to represent bound functions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@FunctionConstructor
Patch Set: Created 5 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/builtins.h ('k') | src/compiler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/builtins.cc
diff --git a/src/builtins.cc b/src/builtins.cc
index c21166cac8cddf26ce4c9ff654f111b6c2aa0076..f24f96d600037e0a9094934d8908ea1b0ecfceef 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -1971,78 +1971,12 @@
}
-// ES6 section 19.2.3.2 Function.prototype.bind ( thisArg, ...args )
-BUILTIN(FunctionPrototypeBind) {
- HandleScope scope(isolate);
- DCHECK_LE(1, args.length());
- if (!args.receiver()->IsCallable()) {
- THROW_NEW_ERROR_RETURN_FAILURE(
- isolate, NewTypeError(MessageTemplate::kFunctionBind));
- }
-
- // Allocate the bound function with the given {this_arg} and {args}.
- Handle<JSReceiver> target = args.at<JSReceiver>(0);
- Handle<Object> this_arg = isolate->factory()->undefined_value();
- ScopedVector<Handle<Object>> argv(std::max(0, args.length() - 2));
- if (args.length() > 1) {
- this_arg = args.at<Object>(1);
- for (int i = 2; i < args.length(); ++i) {
- argv[i - 2] = args.at<Object>(i);
- }
- }
- Handle<JSBoundFunction> function;
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, function,
- isolate->factory()->NewJSBoundFunction(target, this_arg, argv));
-
- // TODO(bmeurer): Optimize the rest for the common cases where {target} is
- // a function with some initial map or even a bound function.
- // Setup the "length" property based on the "length" of the {target}.
- Handle<Object> length(Smi::FromInt(0), isolate);
- Maybe<bool> target_has_length =
- JSReceiver::HasOwnProperty(target, isolate->factory()->length_string());
- if (!target_has_length.IsJust()) {
- return isolate->heap()->exception();
- } else if (target_has_length.FromJust()) {
- Handle<Object> target_length;
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, target_length,
- JSReceiver::GetProperty(target, isolate->factory()->length_string()));
- if (target_length->IsNumber()) {
- length = isolate->factory()->NewNumber(std::max(
- 0.0, DoubleToInteger(target_length->Number()) - argv.length()));
- }
- }
- function->set_length(*length);
-
- // Setup the "name" property based on the "name" of the {target}.
- Handle<Object> target_name;
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, target_name,
- JSReceiver::GetProperty(target, isolate->factory()->name_string()));
- Handle<String> name;
- if (!target_name->IsString()) {
- name = isolate->factory()->bound__string();
- } else {
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, name, Name::ToFunctionName(Handle<String>::cast(target_name)));
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, name, isolate->factory()->NewConsString(
- isolate->factory()->bound__string(), name));
- }
- function->set_name(*name);
- return *function;
-}
-
-
// ES6 section 19.2.3.5 Function.prototype.toString ( )
BUILTIN(FunctionPrototypeToString) {
HandleScope scope(isolate);
Handle<Object> receiver = args.receiver();
- if (receiver->IsJSBoundFunction()) {
- return *JSBoundFunction::ToString(Handle<JSBoundFunction>::cast(receiver));
- } else if (receiver->IsJSFunction()) {
+ if (receiver->IsJSFunction()) {
return *JSFunction::ToString(Handle<JSFunction>::cast(receiver));
}
THROW_NEW_ERROR_RETURN_FAILURE(
« no previous file with comments | « src/builtins.h ('k') | src/compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698