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); |