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

Unified Diff: src/profiler/heap-snapshot-generator.cc

Issue 1542963002: [runtime] Introduce dedicated JSBoundFunction to represent bound functions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@FunctionConstructor
Patch Set: [arm64] Poke does not preserve flags with --debug-code. 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/profiler/heap-snapshot-generator.h ('k') | src/runtime/runtime.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/profiler/heap-snapshot-generator.cc
diff --git a/src/profiler/heap-snapshot-generator.cc b/src/profiler/heap-snapshot-generator.cc
index 5d1a711af67beaeed1cdf4a4107b4ff0702744b5..69ed5e6f293163f577a43df86ff4194fb113ea99 100644
--- a/src/profiler/heap-snapshot-generator.cc
+++ b/src/profiler/heap-snapshot-generator.cc
@@ -805,9 +805,10 @@ HeapEntry* V8HeapExplorer::AddEntry(HeapObject* object) {
if (object->IsJSFunction()) {
JSFunction* func = JSFunction::cast(object);
SharedFunctionInfo* shared = func->shared();
- const char* name = shared->bound() ? "native_bind" :
- names_->GetName(String::cast(shared->name()));
+ const char* name = names_->GetName(String::cast(shared->name()));
return AddEntry(object, HeapEntry::kClosure, name);
+ } else if (object->IsJSBoundFunction()) {
+ return AddEntry(object, HeapEntry::kClosure, "native_bind");
} else if (object->IsJSRegExp()) {
JSRegExp* re = JSRegExp::cast(object);
return AddEntry(object,
@@ -1098,13 +1099,29 @@ void V8HeapExplorer::ExtractJSGlobalProxyReferences(
void V8HeapExplorer::ExtractJSObjectReferences(
int entry, JSObject* js_obj) {
HeapObject* obj = js_obj;
- ExtractClosureReferences(js_obj, entry);
ExtractPropertyReferences(js_obj, entry);
ExtractElementReferences(js_obj, entry);
ExtractInternalReferences(js_obj, entry);
PrototypeIterator iter(heap_->isolate(), js_obj);
SetPropertyReference(obj, entry, heap_->proto_string(), iter.GetCurrent());
- if (obj->IsJSFunction()) {
+ if (obj->IsJSBoundFunction()) {
+ JSBoundFunction* js_fun = JSBoundFunction::cast(obj);
+ TagObject(js_fun->bound_arguments(), "(bound arguments)");
+ SetInternalReference(js_fun, entry, "bindings", js_fun->bound_arguments(),
+ JSBoundFunction::kBoundArgumentsOffset);
+ TagObject(js_fun->creation_context(), "(creation context)");
+ SetInternalReference(js_fun, entry, "creation_context",
+ js_fun->creation_context(),
+ JSBoundFunction::kCreationContextOffset);
+ SetNativeBindReference(js_obj, entry, "bound_this", js_fun->bound_this());
+ SetNativeBindReference(js_obj, entry, "bound_function",
+ js_fun->bound_target_function());
+ FixedArray* bindings = js_fun->bound_arguments();
+ for (int i = 0; i < bindings->length(); i++) {
+ const char* reference_name = names_->GetFormatted("bound_argument_%d", i);
+ SetNativeBindReference(js_obj, entry, reference_name, bindings->get(i));
+ }
+ } else if (obj->IsJSFunction()) {
JSFunction* js_fun = JSFunction::cast(js_obj);
Object* proto_or_map = js_fun->prototype_or_initial_map();
if (!proto_or_map->IsTheHole()) {
@@ -1124,13 +1141,8 @@ void V8HeapExplorer::ExtractJSObjectReferences(
}
}
SharedFunctionInfo* shared_info = js_fun->shared();
- // JSFunction has either bindings or literals and never both.
- bool bound = shared_info->bound();
- TagObject(js_fun->literals_or_bindings(),
- bound ? "(function bindings)" : "(function literals)");
- SetInternalReference(js_fun, entry,
- bound ? "bindings" : "literals",
- js_fun->literals_or_bindings(),
+ TagObject(js_fun->literals(), "(function literals)");
+ SetInternalReference(js_fun, entry, "literals", js_fun->literals(),
JSFunction::kLiteralsOffset);
TagObject(shared_info, "(shared function info)");
SetInternalReference(js_fun, entry,
@@ -1575,24 +1587,6 @@ void V8HeapExplorer::ExtractFixedArrayReferences(int entry, FixedArray* array) {
}
-void V8HeapExplorer::ExtractClosureReferences(JSObject* js_obj, int entry) {
- if (!js_obj->IsJSFunction()) return;
-
- JSFunction* func = JSFunction::cast(js_obj);
- if (func->shared()->bound()) {
- BindingsArray* bindings = func->function_bindings();
- SetNativeBindReference(js_obj, entry, "bound_this", bindings->bound_this());
- SetNativeBindReference(js_obj, entry, "bound_function",
- bindings->bound_function());
- for (int i = 0; i < bindings->bindings_count(); i++) {
- const char* reference_name = names_->GetFormatted("bound_argument_%d", i);
- SetNativeBindReference(js_obj, entry, reference_name,
- bindings->binding(i));
- }
- }
-}
-
-
void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj, int entry) {
if (js_obj->HasFastProperties()) {
DescriptorArray* descs = js_obj->map()->instance_descriptors();
« no previous file with comments | « src/profiler/heap-snapshot-generator.h ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698