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
-~----------~----~----~----~------~----~------~--~---

Reply via email to