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

Unified Diff: src/runtime/runtime-function.cc

Issue 1369293003: Wrap JSFunction bindings in a helper object (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: comments. Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | src/runtime/runtime-object.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime/runtime-function.cc
diff --git a/src/runtime/runtime-function.cc b/src/runtime/runtime-function.cc
index 966d50c9490eb9e6578bf7766bc0c8b29a8ce390..c0a64425d4136331e64b0164207d133f254c234e 100644
--- a/src/runtime/runtime-function.cc
+++ b/src/runtime/runtime-function.cc
@@ -357,7 +357,7 @@ RUNTIME_FUNCTION(Runtime_FunctionBindArguments) {
HandleScope scope(isolate);
DCHECK(args.length() == 4);
CONVERT_ARG_HANDLE_CHECKED(JSFunction, bound_function, 0);
- CONVERT_ARG_HANDLE_CHECKED(Object, bindee, 1);
+ CONVERT_ARG_HANDLE_CHECKED(JSReceiver, bindee, 1);
CONVERT_ARG_HANDLE_CHECKED(Object, this_object, 2);
CONVERT_NUMBER_ARG_HANDLE_CHECKED(new_length, 3);
@@ -378,30 +378,28 @@ RUNTIME_FUNCTION(Runtime_FunctionBindArguments) {
}
// Initialize array of bindings (function, this, and any existing arguments
// if the function was already bound).
- Handle<FixedArray> new_bindings;
- int i;
+ Handle<BindingsArray> new_bindings;
+ int out_index = 0;
+ Handle<TypeFeedbackVector> vector(
+ bound_function->shared()->feedback_vector());
if (bindee->IsJSFunction() && JSFunction::cast(*bindee)->shared()->bound()) {
- Handle<FixedArray> old_bindings(
+ Handle<BindingsArray> old_bindings(
JSFunction::cast(*bindee)->function_bindings());
- RUNTIME_ASSERT(old_bindings->length() > JSFunction::kBoundFunctionIndex);
- new_bindings =
- isolate->factory()->NewFixedArray(old_bindings->length() + argc);
- bindee = Handle<Object>(old_bindings->get(JSFunction::kBoundFunctionIndex),
- isolate);
- i = 0;
- for (int n = old_bindings->length(); i < n; i++) {
- new_bindings->set(i, old_bindings->get(i));
+ RUNTIME_ASSERT(old_bindings->bindings_count() >= 0);
+ bindee = handle(old_bindings->bound_function(), isolate);
+ Handle<Object> old_bound_this(old_bindings->bound_this(), isolate);
+ new_bindings = BindingsArray::New(isolate, vector, bindee, old_bound_this,
+ old_bindings->bindings_count() + argc);
+ for (int n = old_bindings->bindings_count(); out_index < n; out_index++) {
+ new_bindings->set_binding(out_index, old_bindings->binding(out_index));
}
} else {
- int array_size = JSFunction::kBoundArgumentsStartIndex + argc;
- new_bindings = isolate->factory()->NewFixedArray(array_size);
- new_bindings->set(JSFunction::kBoundFunctionIndex, *bindee);
- new_bindings->set(JSFunction::kBoundThisIndex, *this_object);
- i = 2;
+ new_bindings =
+ BindingsArray::New(isolate, vector, bindee, this_object, argc);
}
// Copy arguments, skipping the first which is "this_arg".
- for (int j = 0; j < argc; j++, i++) {
- new_bindings->set(i, *arguments[j + 1]);
+ for (int j = 0; j < argc; j++, out_index++) {
+ new_bindings->set_binding(out_index, *arguments[j + 1]);
}
new_bindings->set_map_no_write_barrier(isolate->heap()->fixed_array_map());
bound_function->set_function_bindings(*new_bindings);
@@ -445,9 +443,9 @@ RUNTIME_FUNCTION(Runtime_BoundFunctionGetBindings) {
if (callable->IsJSFunction()) {
Handle<JSFunction> function = Handle<JSFunction>::cast(callable);
if (function->shared()->bound()) {
- RUNTIME_ASSERT(function->function_bindings()->IsFixedArray());
- Handle<FixedArray> bindings(function->function_bindings());
- return *isolate->factory()->NewJSArrayWithElements(bindings);
+ RUNTIME_ASSERT(function->function_bindings()->IsBindingsArray());
+ Handle<BindingsArray> bindings(function->function_bindings());
+ return *BindingsArray::CreateRuntimeBindings(bindings);
}
}
return isolate->heap()->undefined_value();
@@ -463,12 +461,10 @@ RUNTIME_FUNCTION(Runtime_NewObjectFromBound) {
// The argument is a bound function. Extract its bound arguments
// and callable.
- Handle<FixedArray> bound_args =
- Handle<FixedArray>(FixedArray::cast(function->function_bindings()));
- int bound_argc = bound_args->length() - JSFunction::kBoundArgumentsStartIndex;
- Handle<Object> bound_function(
- JSReceiver::cast(bound_args->get(JSFunction::kBoundFunctionIndex)),
- isolate);
+ Handle<BindingsArray> bound_args =
+ handle(BindingsArray::cast(function->function_bindings()));
+ int bound_argc = bound_args->bindings_count();
+ Handle<Object> bound_function(bound_args->bound_function(), isolate);
DCHECK(!bound_function->IsJSFunction() ||
!Handle<JSFunction>::cast(bound_function)->shared()->bound());
@@ -476,8 +472,7 @@ RUNTIME_FUNCTION(Runtime_NewObjectFromBound) {
base::SmartArrayPointer<Handle<Object>> param_data =
Runtime::GetCallerArguments(isolate, bound_argc, &total_argc);
for (int i = 0; i < bound_argc; i++) {
- param_data[i] = Handle<Object>(
- bound_args->get(JSFunction::kBoundArgumentsStartIndex + i), isolate);
+ param_data[i] = handle(bound_args->binding(i), isolate);
}
Handle<Object> result;
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | src/runtime/runtime-object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698