Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 0183fb68dad093dc10708067e0113c8380f3fff7..b2736818f957c96b700bf01311d85a8b057f432d 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -13069,6 +13069,78 @@ Handle<String> JSFunction::GetDebugName(Handle<JSFunction> function) { |
} |
+namespace { |
+ |
+char const kNativeCodeSource[] = "function () { [native code] }"; |
+ |
+ |
+Handle<String> NativeCodeFunctionSourceString( |
+ Handle<SharedFunctionInfo> shared_info) { |
+ Isolate* const isolate = shared_info->GetIsolate(); |
+ if (shared_info->name()->IsString()) { |
+ IncrementalStringBuilder builder(isolate); |
+ builder.AppendCString("function "); |
+ builder.AppendString(handle(String::cast(shared_info->name()), isolate)); |
+ builder.AppendCString("() { [native code] }"); |
+ return builder.Finish().ToHandleChecked(); |
+ } |
+ return isolate->factory()->NewStringFromAsciiChecked(kNativeCodeSource); |
+} |
+ |
+} // namespace |
+ |
+ |
+// static |
+Handle<String> JSFunction::ToString(Handle<JSFunction> function) { |
+ Isolate* const isolate = function->GetIsolate(); |
+ Handle<SharedFunctionInfo> shared_info(function->shared(), isolate); |
+ |
+ // Check if {function} should hide its source code. |
+ if (!shared_info->script()->IsScript() || |
+ Script::cast(shared_info->script())->hide_source()) { |
+ return NativeCodeFunctionSourceString(shared_info); |
+ } |
+ |
+ // Check if we should print {function} as a class. |
+ Handle<Object> class_start_position = JSReceiver::GetDataProperty( |
+ function, isolate->factory()->class_start_position_symbol()); |
+ if (class_start_position->IsSmi()) { |
+ Handle<Object> class_end_position = JSReceiver::GetDataProperty( |
+ function, isolate->factory()->class_end_position_symbol()); |
+ Handle<String> script_source( |
+ String::cast(Script::cast(shared_info->script())->source()), isolate); |
+ return isolate->factory()->NewSubString( |
+ script_source, Handle<Smi>::cast(class_start_position)->value(), |
+ Handle<Smi>::cast(class_end_position)->value()); |
+ } |
+ |
+ // Check if we have source code for the {function}. |
+ if (!shared_info->HasSourceCode()) { |
+ return NativeCodeFunctionSourceString(shared_info); |
+ } |
+ |
+ IncrementalStringBuilder builder(isolate); |
+ if (!shared_info->is_arrow()) { |
+ if (shared_info->is_concise_method()) { |
+ if (shared_info->is_generator()) builder.AppendCharacter('*'); |
+ } else { |
+ if (shared_info->is_generator()) { |
+ builder.AppendCString("function* "); |
+ } else { |
+ builder.AppendCString("function "); |
+ } |
+ } |
+ if (shared_info->name_should_print_as_anonymous()) { |
+ builder.AppendCString("anonymous"); |
+ } else { |
+ builder.AppendString(handle(String::cast(shared_info->name()), isolate)); |
+ } |
+ } |
+ builder.AppendString(Handle<String>::cast(shared_info->GetSourceCode())); |
+ return builder.Finish().ToHandleChecked(); |
+} |
+ |
+ |
void Oddball::Initialize(Isolate* isolate, Handle<Oddball> oddball, |
const char* to_string, Handle<Object> to_number, |
const char* type_of, byte kind) { |