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