Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index b2736818f957c96b700bf01311d85a8b057f432d..d23e3ea1454c34df5c9b5a42267f70c05f31a4fd 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -1868,6 +1868,22 @@ void JSObject::JSObjectShortPrint(StringStream* accumulator) { |
accumulator->Add("<JS Array[%u]>", static_cast<uint32_t>(length)); |
break; |
} |
+ case JS_BOUND_FUNCTION_TYPE: { |
+ JSBoundFunction* bound_function = JSBoundFunction::cast(this); |
+ Object* name = bound_function->name(); |
+ accumulator->Add("<JS BoundFunction"); |
+ if (name->IsString()) { |
+ String* str = String::cast(name); |
+ if (str->length() > 0) { |
+ accumulator->Add(" "); |
+ accumulator->Put(str); |
+ } |
+ } |
+ accumulator->Add( |
+ " (BoundTargetFunction %p)>", |
+ reinterpret_cast<void*>(bound_function->bound_target_function())); |
+ break; |
+ } |
case JS_WEAK_MAP_TYPE: { |
accumulator->Add("<JS WeakMap>"); |
break; |
@@ -2407,12 +2423,16 @@ String* JSReceiver::class_name() { |
MaybeHandle<String> JSReceiver::BuiltinStringTag(Handle<JSReceiver> object) { |
Maybe<bool> is_array = Object::IsArray(object); |
MAYBE_RETURN(is_array, MaybeHandle<String>()); |
+ Isolate* const isolate = object->GetIsolate(); |
if (is_array.FromJust()) { |
- return object->GetIsolate()->factory()->Array_string(); |
+ return isolate->factory()->Array_string(); |
+ } |
+ if (object->IsCallable()) { |
+ return isolate->factory()->Function_string(); |
} |
// TODO(adamk): class_name() is expensive, replace with instance type |
// checks where possible. |
- return handle(object->class_name()); |
+ return handle(object->class_name(), isolate); |
} |
@@ -10720,47 +10740,6 @@ Handle<LiteralsArray> LiteralsArray::New(Isolate* isolate, |
} |
-// static |
-Handle<BindingsArray> BindingsArray::New(Isolate* isolate, |
- Handle<TypeFeedbackVector> vector, |
- Handle<JSReceiver> bound_function, |
- Handle<Object> bound_this, |
- int number_of_bindings) { |
- Handle<FixedArray> bindings = isolate->factory()->NewFixedArray( |
- number_of_bindings + kFirstBindingIndex); |
- Handle<BindingsArray> casted_bindings = Handle<BindingsArray>::cast(bindings); |
- casted_bindings->set_feedback_vector(*vector); |
- casted_bindings->set_bound_function(*bound_function); |
- casted_bindings->set_bound_this(*bound_this); |
- return casted_bindings; |
-} |
- |
- |
-// static |
-Handle<JSArray> BindingsArray::CreateBoundArguments( |
- Handle<BindingsArray> bindings) { |
- int bound_argument_count = bindings->bindings_count(); |
- Factory* factory = bindings->GetIsolate()->factory(); |
- Handle<FixedArray> arguments = factory->NewFixedArray(bound_argument_count); |
- bindings->CopyTo(kFirstBindingIndex, *arguments, 0, bound_argument_count); |
- return factory->NewJSArrayWithElements(arguments); |
-} |
- |
- |
-// static |
-Handle<JSArray> BindingsArray::CreateRuntimeBindings( |
- Handle<BindingsArray> bindings) { |
- Factory* factory = bindings->GetIsolate()->factory(); |
- // A runtime bindings array consists of |
- // [bound function, bound this, [arg0, arg1, ...]]. |
- Handle<FixedArray> runtime_bindings = |
- factory->NewFixedArray(2 + bindings->bindings_count()); |
- bindings->CopyTo(kBoundFunctionIndex, *runtime_bindings, 0, |
- 2 + bindings->bindings_count()); |
- return factory->NewJSArrayWithElements(runtime_bindings); |
-} |
- |
- |
int HandlerTable::LookupRange(int pc_offset, int* stack_depth_out, |
CatchPrediction* prediction_out) { |
int innermost_handler = -1, innermost_start = -1; |
@@ -10820,16 +10799,25 @@ bool String::LooksValid() { |
// static |
-MaybeHandle<String> Name::ToFunctionName(Handle<Name> name) { |
- if (name->IsString()) return Handle<String>::cast(name); |
+MaybeHandle<String> Name::ToFunctionName(Handle<Name> name, |
+ Handle<String> prefix) { |
// ES6 section 9.2.11 SetFunctionName, step 4. |
Isolate* const isolate = name->GetIsolate(); |
- Handle<Object> description(Handle<Symbol>::cast(name)->name(), isolate); |
- if (description->IsUndefined()) return isolate->factory()->empty_string(); |
IncrementalStringBuilder builder(isolate); |
- builder.AppendCharacter('['); |
- builder.AppendString(Handle<String>::cast(description)); |
- builder.AppendCharacter(']'); |
+ if (prefix->length() != 0) { |
+ builder.AppendString(prefix); |
+ builder.AppendCharacter(' '); |
+ } |
+ if (name->IsString()) { |
+ builder.AppendString(Handle<String>::cast(name)); |
+ } else { |
+ Handle<Object> description(Handle<Symbol>::cast(name)->name(), isolate); |
+ if (!description->IsUndefined()) { |
+ builder.AppendCharacter('['); |
+ builder.AppendString(Handle<String>::cast(description)); |
+ builder.AppendCharacter(']'); |
+ } |
+ } |
return builder.Finish(); |
} |
@@ -12823,6 +12811,7 @@ bool CanSubclassHaveInobjectProperties(InstanceType instance_type) { |
case JS_FUNCTION_TYPE: |
return true; |
+ case JS_BOUND_FUNCTION_TYPE: |
case JS_PROXY_TYPE: |
case JS_GLOBAL_PROXY_TYPE: |
case JS_GLOBAL_OBJECT_TYPE: |
@@ -13091,6 +13080,13 @@ Handle<String> NativeCodeFunctionSourceString( |
// static |
+Handle<String> JSBoundFunction::ToString(Handle<JSBoundFunction> function) { |
+ Isolate* const isolate = function->GetIsolate(); |
+ return isolate->factory()->NewStringFromAsciiChecked(kNativeCodeSource); |
+} |
+ |
+ |
+// static |
Handle<String> JSFunction::ToString(Handle<JSFunction> function) { |
Isolate* const isolate = function->GetIsolate(); |
Handle<SharedFunctionInfo> shared_info(function->shared(), isolate); |