| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index 0c78b5f27058f923fc02ccd2b9b6dc6e53c8bca7..64720a2f194061ebf70df678e308130bc715acb1 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -3370,6 +3370,37 @@ Local<Array> v8::Object::GetOwnPropertyNames() {
|
| }
|
|
|
|
|
| +static bool GetPredefinedToString(
|
| + i::Handle<i::String> tag, Local<String>* result) {
|
| + i::Isolate* i_isolate = tag->GetIsolate();
|
| + Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate);
|
| + i::Factory* factory = i_isolate->factory();
|
| +
|
| + if (i::String::Equals(tag, factory->Arguments_string())) {
|
| + *result = v8::String::NewFromUtf8(isolate, "[object ~Arguments]");
|
| + } else if (i::String::Equals(tag, factory->Array_string())) {
|
| + *result = v8::String::NewFromUtf8(isolate, "[object ~Array]");
|
| + } else if (i::String::Equals(tag, factory->Boolean_string())) {
|
| + *result = v8::String::NewFromUtf8(isolate, "[object ~Boolean]");
|
| + } else if (i::String::Equals(tag, factory->Date_string())) {
|
| + *result = v8::String::NewFromUtf8(isolate, "[object ~Date]");
|
| + } else if (i::String::Equals(tag, factory->Error_string())) {
|
| + *result = v8::String::NewFromUtf8(isolate, "[object ~Error]");
|
| + } else if (i::String::Equals(tag, factory->Function_string())) {
|
| + *result = v8::String::NewFromUtf8(isolate, "[object ~Function]");
|
| + } else if (i::String::Equals(tag, factory->Number_string())) {
|
| + *result = v8::String::NewFromUtf8(isolate, "[object ~Number]");
|
| + } else if (i::String::Equals(tag, factory->RegExp_string())) {
|
| + *result = v8::String::NewFromUtf8(isolate, "[object ~RegExp]");
|
| + } else if (i::String::Equals(tag, factory->String_string())) {
|
| + *result = v8::String::NewFromUtf8(isolate, "[object ~String]");
|
| + } else {
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +
|
| Local<String> v8::Object::ObjectProtoToString() {
|
| i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate();
|
| Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate);
|
| @@ -3379,6 +3410,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 +3425,27 @@ 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));
|
| + EXCEPTION_PREAMBLE(i_isolate);
|
| + has_pending_exception = !i::Runtime::GetObjectProperty(
|
| + i_isolate, self, toStringTag).ToHandle(&tag);
|
| + EXCEPTION_BAILOUT_CHECK(i_isolate, Local<v8::String>());
|
| +
|
| + if (!tag->IsUndefined()) {
|
| + if (!tag->IsString())
|
| + return v8::String::NewFromUtf8(isolate, "[object ???]");
|
| + i::Handle<i::String> tag_name = i::Handle<i::String>::cast(tag);
|
| + if (!i::String::Equals(class_name, tag_name)) {
|
| + Local<String> result;
|
| + if (GetPredefinedToString(tag_name, &result))
|
| + return result;
|
| +
|
| + class_name = tag_name;
|
| + }
|
| + }
|
| + }
|
| const char* prefix = "[object ";
|
| Local<String> str = Utils::ToLocal(class_name);
|
| const char* postfix = "]";
|
| @@ -6199,6 +6252,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()");
|
|
|