 Chromium Code Reviews
 Chromium Code Reviews Issue 1324713002:
  [es6] Implement Date.prototype[@@toPrimitive] as C++ builtin.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1324713002:
  [es6] Implement Date.prototype[@@toPrimitive] as C++ builtin.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| Index: src/objects.cc | 
| diff --git a/src/objects.cc b/src/objects.cc | 
| index 260a64b91d2b436c796b61493770445f6e9b154f..f1a25ce2f9cee3a8f3a6e0698ffbddf366461c54 100644 | 
| --- a/src/objects.cc | 
| +++ b/src/objects.cc | 
| @@ -6041,25 +6041,26 @@ MaybeHandle<Object> JSReceiver::ToPrimitive(Handle<JSReceiver> receiver, | 
| NewTypeError(MessageTemplate::kCannotConvertToPrimitive), | 
| Object); | 
| } | 
| - return OrdinaryToPrimitive(receiver, | 
| - (hint == ToPrimitiveHint::kString) | 
| - ? isolate->factory()->string_string() | 
| - : isolate->factory()->number_string()); | 
| + return OrdinaryToPrimitive(receiver, (hint == ToPrimitiveHint::kString) | 
| + ? OrdinaryToPrimitiveHint::kString | 
| + : OrdinaryToPrimitiveHint::kNumber); | 
| } | 
| // static | 
| -MaybeHandle<Object> JSReceiver::OrdinaryToPrimitive(Handle<JSReceiver> receiver, | 
| - Handle<String> hint) { | 
| +MaybeHandle<Object> JSReceiver::OrdinaryToPrimitive( | 
| + Handle<JSReceiver> receiver, OrdinaryToPrimitiveHint hint) { | 
| Isolate* const isolate = receiver->GetIsolate(); | 
| Handle<String> method_names[2]; | 
| - if (hint.is_identical_to(isolate->factory()->number_string())) { | 
| - method_names[0] = isolate->factory()->valueOf_string(); | 
| - method_names[1] = isolate->factory()->toString_string(); | 
| - } else { | 
| - DCHECK(hint.is_identical_to(isolate->factory()->string_string())); | 
| - method_names[0] = isolate->factory()->toString_string(); | 
| - method_names[1] = isolate->factory()->valueOf_string(); | 
| + switch (hint) { | 
| + case OrdinaryToPrimitiveHint::kNumber: | 
| + method_names[0] = isolate->factory()->valueOf_string(); | 
| + method_names[1] = isolate->factory()->toString_string(); | 
| + break; | 
| + case OrdinaryToPrimitiveHint::kString: | 
| + method_names[0] = isolate->factory()->toString_string(); | 
| + method_names[1] = isolate->factory()->valueOf_string(); | 
| + break; | 
| } | 
| for (Handle<String> name : method_names) { | 
| Handle<Object> method; | 
| @@ -8350,6 +8351,29 @@ bool String::LooksValid() { | 
| } | 
| +// static | 
| +Handle<String> Name::ToFunctionName(Handle<Name> name) { | 
| + if (name->IsString()) return Handle<String>::cast(name); | 
| + // 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(); | 
| + int description_length = 0; | 
| + base::SmartArrayPointer<char> description_bytes = | 
| + Handle<String>::cast(description) | 
| + ->ToCString(ALLOW_NULLS, FAST_STRING_TRAVERSAL, 0, -1, | 
| + &description_length); | 
| + ScopedVector<char> name_string(description_length + 2); | 
| + name_string[0] = '['; | 
| + for (int i = 0; i < description_length; ++i) { | 
| + name_string[i + 1] = description_bytes[i]; | 
| + } | 
| + name_string[description_length + 1] = ']'; | 
| 
Michael Starzinger
2015/08/31 12:12:57
This string construction looks scarry if {name} we
 
Benedikt Meurer
2015/08/31 12:26:48
Changed this to MaybeHandle and use IncrementalStr
 | 
| + return isolate->factory()->InternalizeUtf8String( | 
| + Vector<const char>(name_string.start(), name_string.length())); | 
| +} | 
| + | 
| + | 
| namespace { | 
| bool AreDigits(const uint8_t* s, int from, int to) { | 
| @@ -15866,6 +15890,27 @@ void JSDate::SetValue(Object* value, bool is_value_nan) { | 
| } | 
| +// static | 
| +MaybeHandle<Object> JSDate::ToPrimitive(Handle<JSReceiver> receiver, | 
| + Handle<Object> hint) { | 
| + Isolate* const isolate = receiver->GetIsolate(); | 
| + if (hint->IsString()) { | 
| + Handle<String> hint_string = Handle<String>::cast(hint); | 
| + if (hint_string->Equals(isolate->heap()->number_string())) { | 
| + return JSReceiver::OrdinaryToPrimitive(receiver, | 
| + OrdinaryToPrimitiveHint::kNumber); | 
| + } | 
| + if (hint_string->Equals(isolate->heap()->default_string()) || | 
| + hint_string->Equals(isolate->heap()->string_string())) { | 
| + return JSReceiver::OrdinaryToPrimitive(receiver, | 
| + OrdinaryToPrimitiveHint::kString); | 
| + } | 
| + } | 
| + THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kInvalidHint, hint), | 
| + Object); | 
| +} | 
| + | 
| + | 
| void JSDate::SetCachedFields(int64_t local_time_ms, DateCache* date_cache) { | 
| int days = DateCache::DaysFromTime(local_time_ms); | 
| int time_in_day_ms = DateCache::TimeInDay(local_time_ms, days); |