Reviewed by Maciej.
[WebKit-https.git] / JavaScriptCore / kjs / property_map.cpp
index f13182156e15543ba35d8c898c8b657fef2d9b59..9b032c57faec506bc67ef2a65922441edf655c82 100644 (file)
@@ -50,7 +50,11 @@ namespace KJS {
 
 // Choose a number for the following so that most property maps are smaller,
 // but it's not going to blow out the stack to allocate this number of pointers.
-const int smallMapThreshold = 1024;
+static const int smallMapThreshold = 1024;
+
+// The point at which the function call overhead of the qsort implementation
+// becomes small compared to the inefficiency of insertion sort.
+static const int tinyMapThreshold = 20;
 
 #if DUMP_PROPERTYMAP_STATS
 
@@ -680,6 +684,25 @@ void PropertyMap::getEnumerablePropertyNames(PropertyNameArray& propertyNames) c
         return;
     }
 
+    if (m_u.table->keyCount < tinyMapThreshold) {
+        Entry* a[tinyMapThreshold];
+        int i = 0;
+        unsigned entryCount = m_u.table->keyCount + m_u.table->deletedSentinelCount;
+        for (unsigned k = 1; k <= entryCount; k++) {
+            if (m_u.table->entries()[k].key && !(m_u.table->entries()[k].attributes & DontEnum)) {
+                Entry* value = &m_u.table->entries()[k];
+                int j;
+                for (j = i - 1; j >= 0 && a[j]->index > value->index; --j)
+                    a[j + 1] = a[j];
+                a[j + 1] = value;
+                ++i;
+            }
+        }
+        for (int k = 0; k < i; ++k)
+            propertyNames.add(Identifier(a[k]->key));
+        return;
+    }
+
     // Allocate a buffer to use to sort the keys.
     Vector<Entry*, smallMapThreshold> sortedEnumerables(m_u.table->keyCount);