From: caitpotter88 Date: Tue, 3 Feb 2015 21:05:04 +0000 (-0800) Subject: Update harmony ObjectProtoToString() to 2/2/2015 spec X-Git-Tag: upstream/4.7.83~4625 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b5c43674f998e5660f110271fe19fc953aee9dcb;p=platform%2Fupstream%2Fv8.git Update harmony ObjectProtoToString() to 2/2/2015 spec Applies to API implementation of O.p.toString - Removes special handling of non-string @@toStringTag values (use builtinTag) - Removes special handling of @@toStringTags which match [[Class]] names (remove ~ prefix) - Add tests for non-string @@toStringTag values in test-api.cc BUG=v8:3502 R=arv@chromium.org LOG=N Review URL: https://codereview.chromium.org/892393003 Cr-Commit-Position: refs/heads/master@{#26415} --- diff --git a/src/api.cc b/src/api.cc index 6caa82a..d5168cd 100644 --- a/src/api.cc +++ b/src/api.cc @@ -3290,37 +3290,6 @@ Local v8::Object::GetOwnPropertyNames() { } -static bool GetPredefinedToString(i::Handle tag, - Local* result) { - i::Isolate* i_isolate = tag->GetIsolate(); - Isolate* isolate = reinterpret_cast(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 v8::Object::ObjectProtoToString() { i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate(); Isolate* isolate = reinterpret_cast(i_isolate); @@ -3354,16 +3323,8 @@ Local v8::Object::ObjectProtoToString() { .ToHandle(&tag); EXCEPTION_BAILOUT_CHECK(i_isolate, Local()); - if (!tag->IsUndefined()) { - if (!tag->IsString()) - return v8::String::NewFromUtf8(isolate, "[object ???]"); - i::Handle tag_name = i::Handle::cast(tag); - if (!i::String::Equals(class_name, tag_name)) { - Local result; - if (GetPredefinedToString(tag_name, &result)) return result; - - class_name = tag_name; - } + if (tag->IsString()) { + class_name = i::Handle::cast(tag); } } const char* prefix = "[object "; diff --git a/test/cctest/cctest.h b/test/cctest/cctest.h index 2f33d13..1d70c0e 100644 --- a/test/cctest/cctest.h +++ b/test/cctest/cctest.h @@ -347,6 +347,11 @@ static inline v8::Local v8_str(const char* x) { } +static inline v8::Local v8_symbol(const char* name) { + return v8::Symbol::New(v8::Isolate::GetCurrent(), v8_str(name)); +} + + static inline v8::Local v8_compile(const char* x) { return v8::Script::Compile(v8_str(x)); } diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index 0009253..b8cf20d 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -14002,19 +14002,58 @@ TEST(ObjectProtoToStringES6) { } while (0) TEST_TOSTRINGTAG(Array, Object, Object); - TEST_TOSTRINGTAG(Object, Arguments, ~Arguments); - TEST_TOSTRINGTAG(Object, Array, ~Array); - TEST_TOSTRINGTAG(Object, Boolean, ~Boolean); - TEST_TOSTRINGTAG(Object, Date, ~Date); - TEST_TOSTRINGTAG(Object, Error, ~Error); - TEST_TOSTRINGTAG(Object, Function, ~Function); - TEST_TOSTRINGTAG(Object, Number, ~Number); - TEST_TOSTRINGTAG(Object, RegExp, ~RegExp); - TEST_TOSTRINGTAG(Object, String, ~String); + TEST_TOSTRINGTAG(Object, Arguments, Arguments); + TEST_TOSTRINGTAG(Object, Array, Array); + TEST_TOSTRINGTAG(Object, Boolean, Boolean); + TEST_TOSTRINGTAG(Object, Date, Date); + TEST_TOSTRINGTAG(Object, Error, Error); + TEST_TOSTRINGTAG(Object, Function, Function); + TEST_TOSTRINGTAG(Object, Number, Number); + TEST_TOSTRINGTAG(Object, RegExp, RegExp); + TEST_TOSTRINGTAG(Object, String, String); TEST_TOSTRINGTAG(Object, Foo, Foo); #undef TEST_TOSTRINGTAG + Local valueRegExp = v8::RegExp::New(v8_str("^$"), + v8::RegExp::kNone); + Local valueNumber = v8_num(123); + Local valueSymbol = v8_symbol("TestSymbol"); + Local valueFunction = + CompileRun("function fn() {}").As(); + Local valueObject = v8::Object::New(v8::Isolate::GetCurrent()); + Local valueNull = v8::Null(v8::Isolate::GetCurrent()); + Local valueUndef = v8::Undefined(v8::Isolate::GetCurrent()); + +#define TEST_TOSTRINGTAG(type, tagValue, expected) \ + do { \ + object = CompileRun("new " #type "()"); \ + object.As()->Set(toStringTag, tagValue); \ + value = object.As()->ObjectProtoToString(); \ + CHECK(value->IsString() && \ + value->Equals(v8_str("[object " #expected "]"))); \ + } while (0) + +#define TEST_TOSTRINGTAG_TYPES(tagValue) \ + TEST_TOSTRINGTAG(Array, tagValue, Array); \ + TEST_TOSTRINGTAG(Object, tagValue, Object); \ + TEST_TOSTRINGTAG(Function, tagValue, Function); \ + TEST_TOSTRINGTAG(Date, tagValue, Date); \ + TEST_TOSTRINGTAG(RegExp, tagValue, RegExp); \ + TEST_TOSTRINGTAG(Error, tagValue, Error); \ + + // Test non-String-valued @@toStringTag + TEST_TOSTRINGTAG_TYPES(valueRegExp); + TEST_TOSTRINGTAG_TYPES(valueNumber); + TEST_TOSTRINGTAG_TYPES(valueSymbol); + TEST_TOSTRINGTAG_TYPES(valueFunction); + TEST_TOSTRINGTAG_TYPES(valueObject); + TEST_TOSTRINGTAG_TYPES(valueNull); + TEST_TOSTRINGTAG_TYPES(valueUndef); + +#undef TEST_TOSTRINGTAG +#undef TEST_TOSTRINGTAG_TYPES + // @@toStringTag getter throws Local obj = v8::Object::New(isolate); obj.As()->SetAccessor(toStringTag, ThrowingSymbolAccessorGetter); diff --git a/test/mjsunit/es6/object-tostring.js b/test/mjsunit/es6/object-tostring.js index 064f2af..c73a768 100644 --- a/test/mjsunit/es6/object-tostring.js +++ b/test/mjsunit/es6/object-tostring.js @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Flags: --harmony-tostring --allow-natives-syntax +// Flags: --harmony-tostring var global = this;