Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index ed61bcc5ccd039f3d9850aa6477105d3229a5915..73d2d8388ebcf790444a855e64538927698cdddc 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -203,6 +203,31 @@ MaybeHandle<Name> Object::ConvertToName(Isolate* isolate, |
return ToString(isolate, input); |
} |
+// ES6 7.1.14 |
+// static |
+MaybeHandle<Object> Object::ConvertToPropertyKey(Isolate* isolate, |
+ Handle<Object> value) { |
+ // 1. Let key be ToPrimitive(argument, hint String). |
+ MaybeHandle<Object> maybe_key = |
+ Object::ToPrimitive(value, ToPrimitiveHint::kString); |
+ // 2. ReturnIfAbrupt(key). |
+ Handle<Object> key; |
+ if (!maybe_key.ToHandle(&key)) return key; |
+ // 3. If Type(key) is Symbol, then return key. |
+ if (key->IsSymbol()) return key; |
+ // 4. Return ToString(key). |
+ // Extending spec'ed behavior, we'd be happy to return an element index. |
+ if (key->IsSmi()) return key; |
+ if (key->IsHeapNumber()) { |
+ uint32_t uint_value; |
+ if (value->ToArrayLength(&uint_value) && |
+ uint_value <= static_cast<uint32_t>(Smi::kMaxValue)) { |
+ return handle(Smi::FromInt(static_cast<int>(uint_value)), isolate); |
+ } |
+ } |
+ return Object::ToString(isolate, key); |
+} |
+ |
// static |
MaybeHandle<String> Object::ConvertToString(Isolate* isolate, |
Handle<Object> input) { |
@@ -383,11 +408,16 @@ Handle<String> Object::NoSideEffectsToString(Isolate* isolate, |
} |
// static |
-MaybeHandle<Object> Object::ToLength(Isolate* isolate, Handle<Object> input) { |
+MaybeHandle<Object> Object::ConvertToLength(Isolate* isolate, |
+ Handle<Object> input) { |
ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ToNumber(input), Object); |
+ if (input->IsSmi()) { |
+ int value = std::max(Smi::cast(*input)->value(), 0); |
+ return handle(Smi::FromInt(value), isolate); |
+ } |
double len = DoubleToInteger(input->Number()); |
if (len <= 0.0) { |
- len = 0.0; |
+ return handle(Smi::kZero, isolate); |
} else if (len >= kMaxSafeInteger) { |
len = kMaxSafeInteger; |
} |
@@ -395,10 +425,12 @@ MaybeHandle<Object> Object::ToLength(Isolate* isolate, Handle<Object> input) { |
} |
// static |
-MaybeHandle<Object> Object::ToIndex(Isolate* isolate, Handle<Object> input, |
- MessageTemplate::Template error_index) { |
- if (input->IsUndefined(isolate)) return isolate->factory()->NewNumber(0.0); |
+MaybeHandle<Object> Object::ConvertToIndex( |
+ Isolate* isolate, Handle<Object> input, |
+ MessageTemplate::Template error_index) { |
+ if (input->IsUndefined(isolate)) return handle(Smi::kZero, isolate); |
ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ToNumber(input), Object); |
+ if (input->IsSmi() && Smi::cast(*input)->value() >= 0) return input; |
double len = DoubleToInteger(input->Number()) + 0.0; |
auto js_len = isolate->factory()->NewNumber(len); |
if (len < 0.0 || len > kMaxSafeInteger) { |
@@ -6493,33 +6525,6 @@ Maybe<bool> JSReceiver::DeletePropertyOrElement(Handle<JSReceiver> object, |
return DeleteProperty(&it, language_mode); |
} |
- |
-// ES6 7.1.14 |
-// static |
-MaybeHandle<Object> Object::ToPropertyKey(Isolate* isolate, |
- Handle<Object> value) { |
- // 1. Let key be ToPrimitive(argument, hint String). |
- MaybeHandle<Object> maybe_key = |
- Object::ToPrimitive(value, ToPrimitiveHint::kString); |
- // 2. ReturnIfAbrupt(key). |
- Handle<Object> key; |
- if (!maybe_key.ToHandle(&key)) return key; |
- // 3. If Type(key) is Symbol, then return key. |
- if (key->IsSymbol()) return key; |
- // 4. Return ToString(key). |
- // Extending spec'ed behavior, we'd be happy to return an element index. |
- if (key->IsSmi()) return key; |
- if (key->IsHeapNumber()) { |
- uint32_t uint_value; |
- if (value->ToArrayLength(&uint_value) && |
- uint_value <= static_cast<uint32_t>(Smi::kMaxValue)) { |
- return handle(Smi::FromInt(static_cast<int>(uint_value)), isolate); |
- } |
- } |
- return Object::ToString(isolate, key); |
-} |
- |
- |
// ES6 19.1.2.4 |
// static |
Object* JSReceiver::DefineProperty(Isolate* isolate, Handle<Object> object, |