| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index d53b13d07fca9363e9913429ded8cb084576a4c4..80e67cc87585ce206e5ff200e0ea3a53c1240534 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -1638,22 +1638,6 @@ static Object* Runtime_SetCode(Arguments args) {
|
| }
|
|
|
|
|
| -static Object* CharCodeAt(String* subject, Object* index) {
|
| - uint32_t i = 0;
|
| - if (!index->ToArrayIndex(&i)) return Heap::nan_value();
|
| - // Flatten the string. If someone wants to get a char at an index
|
| - // in a cons string, it is likely that more indices will be
|
| - // accessed.
|
| - Object* flat = subject->TryFlatten();
|
| - if (flat->IsFailure()) return flat;
|
| - subject = String::cast(flat);
|
| - if (i >= static_cast<uint32_t>(subject->length())) {
|
| - return Heap::nan_value();
|
| - }
|
| - return Smi::FromInt(subject->Get(i));
|
| -}
|
| -
|
| -
|
| static Object* CharFromCode(Object* char_code) {
|
| uint32_t code;
|
| if (char_code->ToArrayIndex(&code)) {
|
| @@ -1671,21 +1655,31 @@ static Object* Runtime_StringCharCodeAt(Arguments args) {
|
|
|
| CONVERT_CHECKED(String, subject, args[0]);
|
| Object* index = args[1];
|
| - return CharCodeAt(subject, index);
|
| -}
|
| + RUNTIME_ASSERT(index->IsNumber());
|
|
|
| + uint32_t i = 0;
|
| + if (index->IsSmi()) {
|
| + int value = Smi::cast(index)->value();
|
| + if (value < 0) return Heap::nan_value();
|
| + i = value;
|
| + } else {
|
| + ASSERT(index->IsHeapNumber());
|
| + double value = HeapNumber::cast(index)->value();
|
| + i = static_cast<uint32_t>(value);
|
| + }
|
|
|
| -static Object* Runtime_StringCharAt(Arguments args) {
|
| - NoHandleAllocation ha;
|
| - ASSERT(args.length() == 2);
|
| + // Flatten the string. If someone wants to get a char at an index
|
| + // in a cons string, it is likely that more indices will be
|
| + // accessed.
|
| + Object* flat = subject->TryFlatten();
|
| + if (flat->IsFailure()) return flat;
|
| + subject = String::cast(flat);
|
|
|
| - CONVERT_CHECKED(String, subject, args[0]);
|
| - Object* index = args[1];
|
| - Object* code = CharCodeAt(subject, index);
|
| - if (code == Heap::nan_value()) {
|
| - return Heap::undefined_value();
|
| + if (i >= static_cast<uint32_t>(subject->length())) {
|
| + return Heap::nan_value();
|
| }
|
| - return CharFromCode(code);
|
| +
|
| + return Smi::FromInt(subject->Get(i));
|
| }
|
|
|
|
|
| @@ -5344,6 +5338,9 @@ static Object* Runtime_NumberToInteger(Arguments args) {
|
| }
|
|
|
|
|
| +
|
| +
|
| +
|
| static Object* Runtime_NumberToIntegerMapMinusZero(Arguments args) {
|
| NoHandleAllocation ha;
|
| ASSERT(args.length() == 1);
|
|
|