Chromium Code Reviews| Index: src/api.cc |
| diff --git a/src/api.cc b/src/api.cc |
| index 0c78b5f27058f923fc02ccd2b9b6dc6e53c8bca7..a0286cefc68bac78baac63c6219440d6e56d9b57 100644 |
| --- a/src/api.cc |
| +++ b/src/api.cc |
| @@ -3379,6 +3379,7 @@ Local<String> v8::Object::ObjectProtoToString() { |
| i::Handle<i::JSObject> self = Utils::OpenHandle(this); |
| i::Handle<i::Object> name(self->class_name(), i_isolate); |
| + i::Handle<i::Object> tag; |
| // Native implementation of Object.prototype.toString (v8natives.js): |
| // var c = %_ClassOf(this); |
| @@ -3393,6 +3394,53 @@ Local<String> v8::Object::ObjectProtoToString() { |
| i_isolate->factory()->Arguments_string())) { |
| return v8::String::NewFromUtf8(isolate, "[object Object]"); |
| } else { |
| + if (internal::FLAG_harmony_tostring) { |
| + i::Handle<i::Symbol> toStringTag = Utils::OpenHandle( |
| + *Symbol::GetToStringTag(isolate)); |
| + tag = i::Runtime::GetObjectProperty( |
|
Dmitry Lomov (no reviews)
2014/10/18 15:16:48
This calls into Javascript, so needs EXCEPTION_PRE
|
| + i_isolate, self, toStringTag).ToHandleChecked(); |
| + |
| + if (!tag->IsUndefined()) { |
| + if (!tag->IsString()) { |
| + return v8::String::NewFromUtf8(isolate, "[object ???]"); |
| + } else { |
| + i::Handle<i::String> tag_name = i::Handle<i::String>::cast(tag); |
| + using namespace internal; |
|
Dmitry Lomov (no reviews)
2014/10/18 15:16:48
Nit: remove 'using namespace internal' here, we us
|
| + if (!i::String::Equals(class_name, tag_name)) { |
| + if (i::String::Equals( |
| + tag_name, i_isolate->factory()->Arguments_string())) { |
|
Dmitry Lomov (no reviews)
2014/10/18 15:16:48
Nit: introduce variable for i_isolate->factory()
|
| + return v8::String::NewFromUtf8(isolate, "[object ~Arguments]"); |
| + } else if (i::String::Equals( |
| + tag_name, i_isolate->factory()->Array_string())) { |
| + return v8::String::NewFromUtf8(isolate, "[object ~Array]"); |
| + } else if (i::String::Equals( |
| + tag_name, i_isolate->factory()->Boolean_string())) { |
| + return v8::String::NewFromUtf8(isolate, "[object ~Boolean]"); |
| + } else if (i::String::Equals( |
| + tag_name, i_isolate->factory()->Date_string())) { |
| + return v8::String::NewFromUtf8(isolate, "[object ~Date]"); |
| + } else if (i::String::Equals( |
| + tag_name, i_isolate->factory()->Error_string())) { |
| + return v8::String::NewFromUtf8(isolate, "[object ~Error]"); |
| + } else if (i::String::Equals( |
| + tag_name, i_isolate->factory()->Function_string())) { |
| + return v8::String::NewFromUtf8(isolate, "[object ~Function]"); |
| + } else if (i::String::Equals( |
| + tag_name, i_isolate->factory()->Number_string())) { |
| + return v8::String::NewFromUtf8(isolate, "[object ~Number]"); |
| + } else if (i::String::Equals( |
| + tag_name, i_isolate->factory()->RegExp_string())) { |
| + return v8::String::NewFromUtf8(isolate, "[object ~RegExp]"); |
| + } else if (i::String::Equals( |
| + tag_name, i_isolate->factory()->String_string())) { |
| + return v8::String::NewFromUtf8(isolate, "[object ~String]"); |
| + } else { |
| + class_name = tag_name; |
| + } |
| + } |
| + } |
| + } |
| + } |
| const char* prefix = "[object "; |
| Local<String> str = Utils::ToLocal(class_name); |
| const char* postfix = "]"; |
| @@ -6199,6 +6247,11 @@ Local<Symbol> v8::Symbol::GetUnscopables(Isolate* isolate) { |
| } |
| +Local<Symbol> v8::Symbol::GetToStringTag(Isolate* isolate) { |
| + return GetWellKnownSymbol(isolate, "Symbol.toStringTag"); |
| +} |
| + |
| + |
| Local<Private> v8::Private::New(Isolate* isolate, Local<String> name) { |
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| LOG_API(i_isolate, "Private::New()"); |