Chromium Code Reviews| 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); |