- Rolled out HashMap implementation of NPRuntime, at least temporarily.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Jul 2006 01:42:14 +0000 (01:42 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Jul 2006 01:42:14 +0000 (01:42 +0000)
        Fixes hang in the bindings section of layout tests seen on the
        buildbot.

        This code was using HashMap<const char*, PrivateIdentifier*>.
        But that hashes based on pointer identity, not string value.
        The default hash for any pointer type is to hash based on the pointer.
        And WTF doesn't currently have a string hash for char*.
        We'll need to fix that before re-landing this patch.

        (Formatting was also incorrect -- extra spaces in parentheses.)

        * bindings/npruntime.cpp: Rolled out last change.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15148 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/bindings/npruntime.cpp

index 827db0c7f1bed68d94f377e677e098b36931cea7..fb4fd656681cf5938b4b3635cfaccd7fb52fb33a 100644 (file)
@@ -1,4 +1,21 @@
-2006-07-02  Justin Haygood <jhaygood@spsu.edu
+2006-07-03  Darin Adler  <darin@apple.com>
+
+        - Rolled out HashMap implementation of NPRuntime, at least temporarily.
+
+        Fixes hang in the bindings section of layout tests seen on the
+        buildbot.
+
+        This code was using HashMap<const char*, PrivateIdentifier*>.
+        But that hashes based on pointer identity, not string value.
+        The default hash for any pointer type is to hash based on the pointer.
+        And WTF doesn't currently have a string hash for char*.
+        We'll need to fix that before re-landing this patch.
+
+        (Formatting was also incorrect -- extra spaces in parentheses.)
+
+        * bindings/npruntime.cpp: Rolled out last change.
+
+2006-07-02  Justin Haygood  <jhaygood@spsu.edu>
 
         Reviewed, tweaked, landed by ggaren.
 
index 0cde43bed4a4bd729fa470a3feef88b3e436a229..7cbc2a7ab6c336af716b71b8339a216b83924fcb 100644 (file)
@@ -1,6 +1,5 @@
 /*
  * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
- * Copyright (C) 2006 Justin Haygood <jhaygood@spsu.edu>.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #include "npruntime_priv.h"
 
 #include "c_utility.h"
+#include <CoreFoundation/CoreFoundation.h>
 
-#include <assert.h>
-#include <wtf/HashMap.h>
+// FIXME: Use HashMap instead of CFDictionary for better performance and portability.
 
 using namespace KJS::Bindings;
 
-typedef HashMap<const char*, PrivateIdentifier*> StringIdentifierDictionary;
-static StringIdentifierDictionary* getStringIdentifierDictionary()
+static Boolean stringIdentifierEqual(const void* value1, const void* value2)
 {
+    return strcmp((const char*)value1, (const char*)value2) == 0;
+}
+
+static CFHashCode stringIdentifierHash(const void* value)
+{
+    const unsigned char* key = (const unsigned char*)value;
+    unsigned len = strlen((const char*)key);
+    unsigned result = len;
+
+    if (len <= 16) {
+        unsigned cnt = len;
+        while (cnt--)
+            result = result * 257 + *key++;
+    } else {
+        unsigned cnt;
+        for (cnt = 8; cnt > 0; cnt--)
+            result = result * 257 + *key++;
+        key += (len - 16);
+        for (cnt = 8; cnt > 0; cnt--)
+            result = result * 257 + *key++;
+    }
+    result += (result << (len & 31));
 
-    static StringIdentifierDictionary* stringIdentifierDictionary;
-    if (!stringIdentifierDictionary)
-        stringIdentifierDictionary = new StringIdentifierDictionary();
+    return result;
+}
+
+static CFMutableDictionaryRef getStringIdentifierDictionary()
+{
+    static CFMutableDictionaryRef stringIdentifierDictionary = 0;
+    if (!stringIdentifierDictionary) {
+        CFDictionaryKeyCallBacks stringIdentifierCallbacks = { 0, NULL, NULL, NULL, stringIdentifierEqual, stringIdentifierHash };
+        stringIdentifierDictionary = CFDictionaryCreateMutable(NULL, 0, &stringIdentifierCallbacks, NULL);
+    }
     return stringIdentifierDictionary;
 }
 
-typedef HashMap<int, PrivateIdentifier*> IntIdentifierDictionary;
-static IntIdentifierDictionary* getIntIdentifierDictionary()
+static CFMutableDictionaryRef getIntIdentifierDictionary()
 {
-    static IntIdentifierDictionary* intIdentifierDictionary;
+    static CFMutableDictionaryRef intIdentifierDictionary = 0;
     if (!intIdentifierDictionary)
-        intIdentifierDictionary = new IntIdentifierDictionary();
+        intIdentifierDictionary = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
     return intIdentifierDictionary;
 }
 
@@ -62,7 +88,7 @@ NPIdentifier _NPN_GetStringIdentifier(const NPUTF8* name)
     if (name) {
         PrivateIdentifier* identifier = 0;
         
-        identifier = getStringIdentifierDictionary()->get( name );
+        identifier = (PrivateIdentifier*)CFDictionaryGetValue(getStringIdentifierDictionary(), name);
         if (identifier == 0) {
             identifier = (PrivateIdentifier*)malloc(sizeof(PrivateIdentifier));
             // We never release identifier names, so this dictionary will grow, as will
@@ -71,7 +97,7 @@ NPIdentifier _NPN_GetStringIdentifier(const NPUTF8* name)
             const char* identifierName = strdup(name);
             identifier->value.string = identifierName;
 
-            getStringIdentifierDictionary()->add(identifierName, identifier);
+            CFDictionaryAddValue(getStringIdentifierDictionary(), identifierName, identifier);
         }
         return (NPIdentifier)identifier;
     }
@@ -93,14 +119,14 @@ NPIdentifier _NPN_GetIntIdentifier(int32_t intid)
 {
     PrivateIdentifier* identifier = 0;
     
-    identifier = getIntIdentifierDictionary()->get( intid );
+    identifier = (PrivateIdentifier*)CFDictionaryGetValue(getIntIdentifierDictionary(), (const void*)intid);
     if (identifier == 0) {
         identifier = (PrivateIdentifier*)malloc(sizeof(PrivateIdentifier));
         // We never release identifier names, so this dictionary will grow.
         identifier->isString = false;
         identifier->value.number = intid;
 
-        getIntIdentifierDictionary()->add( intid, identifier );
+        CFDictionaryAddValue(getIntIdentifierDictionary(), (const void*)intid, identifier);
     }
     return (NPIdentifier)identifier;
 }