Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 9f824fbf482bd73fb0769625fec091a2d78b6019..57f01d4784f4558a47388208d969303b84d7f682 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -139,7 +139,8 @@ MaybeHandle<JSReceiver> Object::ConvertReceiver(Isolate* isolate, |
} |
// static |
-MaybeHandle<Object> Object::ToNumber(Handle<Object> input) { |
+MaybeHandle<Object> Object::ConvertToNumber(Isolate* isolate, |
+ Handle<Object> input) { |
while (true) { |
if (input->IsNumber()) { |
return input; |
@@ -150,7 +151,6 @@ MaybeHandle<Object> Object::ToNumber(Handle<Object> input) { |
if (input->IsOddball()) { |
return Oddball::ToNumber(Handle<Oddball>::cast(input)); |
} |
- Isolate* const isolate = Handle<HeapObject>::cast(input)->GetIsolate(); |
if (input->IsSymbol()) { |
THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSymbolToNumber), |
Object); |
@@ -166,28 +166,33 @@ MaybeHandle<Object> Object::ToNumber(Handle<Object> input) { |
} |
} |
- |
// static |
-MaybeHandle<Object> Object::ToInteger(Isolate* isolate, Handle<Object> input) { |
- ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ToNumber(input), Object); |
+MaybeHandle<Object> Object::ConvertToInteger(Isolate* isolate, |
+ Handle<Object> input) { |
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ConvertToNumber(isolate, input), |
+ Object); |
+ if (input->IsSmi()) return input; |
return isolate->factory()->NewNumber(DoubleToInteger(input->Number())); |
} |
- |
// static |
-MaybeHandle<Object> Object::ToInt32(Isolate* isolate, Handle<Object> input) { |
- ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ToNumber(input), Object); |
+MaybeHandle<Object> Object::ConvertToInt32(Isolate* isolate, |
+ Handle<Object> input) { |
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ConvertToNumber(isolate, input), |
+ Object); |
+ if (input->IsSmi()) return input; |
return isolate->factory()->NewNumberFromInt(DoubleToInt32(input->Number())); |
} |
- |
// static |
-MaybeHandle<Object> Object::ToUint32(Isolate* isolate, Handle<Object> input) { |
- ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ToNumber(input), Object); |
+MaybeHandle<Object> Object::ConvertToUint32(Isolate* isolate, |
+ Handle<Object> input) { |
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ConvertToNumber(isolate, input), |
+ Object); |
+ if (input->IsSmi()) return handle(Smi::cast(*input)->ToUint32Smi(), isolate); |
return isolate->factory()->NewNumberFromUint(DoubleToUint32(input->Number())); |
} |
- |
// static |
MaybeHandle<Name> Object::ConvertToName(Isolate* isolate, |
Handle<Object> input) { |
@@ -199,11 +204,9 @@ MaybeHandle<Name> Object::ConvertToName(Isolate* isolate, |
} |
// static |
-MaybeHandle<String> Object::ToString(Isolate* isolate, Handle<Object> input) { |
+MaybeHandle<String> Object::ConvertToString(Isolate* isolate, |
+ Handle<Object> input) { |
while (true) { |
- if (input->IsString()) { |
- return Handle<String>::cast(input); |
- } |
if (input->IsOddball()) { |
return handle(Handle<Oddball>::cast(input)->to_string(), isolate); |
} |
@@ -221,6 +224,11 @@ MaybeHandle<String> Object::ToString(Isolate* isolate, Handle<Object> input) { |
isolate, input, JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(input), |
ToPrimitiveHint::kString), |
String); |
+ // The previous isString() check happened in Object::ToString and thus we |
+ // put it at the end of the loop in this helper. |
+ if (input->IsString()) { |
+ return Handle<String>::cast(input); |
+ } |
} |
} |