Revision: 3012 Author: [email protected] Date: Fri Oct 2 06:43:16 2009 Log: Changed Object.keys to return strings for element indices.
Review URL: http://codereview.chromium.org/246077 http://code.google.com/p/v8/source/detail?r=3012 Modified: /branches/bleeding_edge/src/factory.cc /branches/bleeding_edge/src/factory.h /branches/bleeding_edge/src/heap.cc /branches/bleeding_edge/src/heap.h /branches/bleeding_edge/src/runtime.cc /branches/bleeding_edge/test/mjsunit/third_party/object-keys.js ======================================= --- /branches/bleeding_edge/src/factory.cc Wed Sep 9 23:52:46 2009 +++ /branches/bleeding_edge/src/factory.cc Fri Oct 2 06:43:16 2009 @@ -671,6 +671,11 @@ CALL_HEAP_FUNCTION(Heap::AllocateSharedFunctionInfo(*name), SharedFunctionInfo); } + + +Handle<String> Factory::NumberToString(Handle<Object> number) { + CALL_HEAP_FUNCTION(Heap::NumberToString(*number), String); +} Handle<NumberDictionary> Factory::DictionaryAtNumberPut( ======================================= --- /branches/bleeding_edge/src/factory.h Tue Aug 18 00:14:02 2009 +++ /branches/bleeding_edge/src/factory.h Fri Oct 2 06:43:16 2009 @@ -286,6 +286,8 @@ Handle<Object> value, PropertyAttributes attributes); + static Handle<String> NumberToString(Handle<Object> number); + enum ApiInstanceType { JavaScriptObject, InnerGlobalObject, ======================================= --- /branches/bleeding_edge/src/heap.cc Fri Oct 2 06:35:37 2009 +++ /branches/bleeding_edge/src/heap.cc Fri Oct 2 06:43:16 2009 @@ -1585,6 +1585,31 @@ // Materialize the value in the heap. return AllocateHeapNumber(value, pretenure); } + + +Object* Heap::NumberToString(Object* number) { + Object* cached = GetNumberStringCache(number); + if (cached != undefined_value()) { + return cached; + } + + char arr[100]; + Vector<char> buffer(arr, ARRAY_SIZE(arr)); + const char* str; + if (number->IsSmi()) { + int num = Smi::cast(number)->value(); + str = IntToCString(num, buffer); + } else { + double num = HeapNumber::cast(number)->value(); + str = DoubleToCString(num, buffer); + } + Object* result = AllocateStringFromAscii(CStrVector(str)); + + if (!result->IsFailure()) { + SetNumberStringCache(number, String::cast(result)); + } + return result; +} Object* Heap::NewNumberFromDouble(double value, PretenureFlag pretenure) { ======================================= --- /branches/bleeding_edge/src/heap.h Thu Oct 1 08:18:05 2009 +++ /branches/bleeding_edge/src/heap.h Fri Oct 2 06:43:16 2009 @@ -882,6 +882,8 @@ kRootListLength }; + static Object* NumberToString(Object* number); + private: static int semispace_size_; static int initial_semispace_size_; ======================================= --- /branches/bleeding_edge/src/runtime.cc Fri Oct 2 05:47:15 2009 +++ /branches/bleeding_edge/src/runtime.cc Fri Oct 2 06:43:16 2009 @@ -3020,8 +3020,20 @@ // Some fast paths through GetKeysInFixedArrayFor reuse a cached // property array and since the result is mutable we have to create // a fresh clone on each invocation. - Handle<FixedArray> copy = Factory::NewFixedArray(contents->length()); - contents->CopyTo(0, *copy, 0, contents->length()); + int length = contents->length(); + Handle<FixedArray> copy = Factory::NewFixedArray(length); + for (int i = 0; i < length; i++) { + Object* entry = contents->get(i); + if (entry->IsString()) { + copy->set(i, entry); + } else { + ASSERT(entry->IsNumber()); + HandleScope scope; + Handle<Object> entry_handle(entry); + Handle<Object> entry_str = Factory::NumberToString(entry_handle); + copy->set(i, *entry_str); + } + } return *Factory::NewJSArrayWithElements(copy); } @@ -3587,27 +3599,7 @@ Object* number = args[0]; RUNTIME_ASSERT(number->IsNumber()); - Object* cached = Heap::GetNumberStringCache(number); - if (cached != Heap::undefined_value()) { - return cached; - } - - char arr[100]; - Vector<char> buffer(arr, ARRAY_SIZE(arr)); - const char* str; - if (number->IsSmi()) { - int num = Smi::cast(number)->value(); - str = IntToCString(num, buffer); - } else { - double num = HeapNumber::cast(number)->value(); - str = DoubleToCString(num, buffer); - } - Object* result = Heap::AllocateStringFromAscii(CStrVector(str)); - - if (!result->IsFailure()) { - Heap::SetNumberStringCache(number, String::cast(result)); - } - return result; + return Heap::NumberToString(number); } ======================================= --- /branches/bleeding_edge/test/mjsunit/third_party/object-keys.js Wed Sep 16 01:25:54 2009 +++ /branches/bleeding_edge/test/mjsunit/third_party/object-keys.js Fri Oct 2 06:43:16 2009 @@ -51,6 +51,8 @@ assertEquals(Object.keys(x), []); assertEquals(Object.keys(function () {}), []); +assertEquals('string', typeof(Object.keys([1])[0])); + function argsTest(a, b, c) { assertEquals([0, 1, 2], Object.keys(arguments)); } --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
