]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - create_hash_table
JavaScriptCore-1097.13.tar.gz
[apple/javascriptcore.git] / create_hash_table
index 3bd9f76e86d5ac2e379b0c16d034a4d231fcea17..cb2809d76de2583f21eeaf085b6cefd6c23732f9 100755 (executable)
@@ -179,7 +179,6 @@ sub calcCompactHashSize()
 
 # Paul Hsieh's SuperFastHash
 # http://www.azillionmonkeys.com/qed/hash.html
-# Ported from UString..
 sub hashValue($) {
   my @chars = split(/ */, $_[0]);
 
@@ -207,7 +206,7 @@ sub hashValue($) {
   }
 
   # Handle end case
-  if ($rem !=0) {
+  if ($rem != 0) {
     $hash += ord($chars[$s]);
     $hash ^= (leftShift($hash, 11)% $EXP2_32);
     $hash += $hash >> 17;
@@ -221,11 +220,15 @@ sub hashValue($) {
   $hash += ($hash >> 15);
   $hash = $hash% $EXP2_32;
   $hash ^= (leftShift($hash, 10)% $EXP2_32);
-  
-  # this avoids ever returning a hash code of 0, since that is used to
-  # signal "hash not computed yet", using a value that is likely to be
-  # effectively the same as 0 when the low bits are masked
-  $hash = 0x80000000  if ($hash == 0);
+
+  # Save 8 bits for StringImpl to use as flags.
+  $hash &= 0xffffff;
+
+  # This avoids ever returning a hash code of 0, since that is used to
+  # signal "hash not computed yet". Setting the high bit maintains
+  # reasonable fidelity to a hash code of 0 because it is likely to yield
+  # exactly 0 when hash lookup masks out the high bits.
+  $hash = (0x80000000 >> 8) if ($hash == 0);
 
   return $hash;
 }
@@ -252,27 +255,52 @@ sub output() {
     foreach my $key (@keys) {
         my $firstValue = "";
         my $secondValue = "";
+        my $castStr = "";
 
         if ($values[$i]{"type"} eq "Function") {
+            $castStr = "static_cast<NativeFunction>";
             $firstValue = $values[$i]{"function"};
             $secondValue = $values[$i]{"params"};
         } elsif ($values[$i]{"type"} eq "Property") {
+            $castStr = "static_cast<PropertySlot::GetValueFunc>";
             $firstValue = $values[$i]{"get"};
             $secondValue = $values[$i]{"put"};
         } elsif ($values[$i]{"type"} eq "Lexer") {
             $firstValue = $values[$i]{"value"};
             $secondValue = "0";
         }
-        print "   { \"$key\", $attrs[$i], (intptr_t)$firstValue, (intptr_t)$secondValue },\n";
+
+        my $intrinsic = "NoIntrinsic";
+        $intrinsic = "CharCodeAtIntrinsic" if ($key eq "charCodeAt");
+        $intrinsic = "CharAtIntrinsic" if ($key eq "charAt");
+        $intrinsic = "FromCharCodeIntrinsic" if ($key eq "fromCharCode");
+        if ($name eq "mathTable") {
+            $intrinsic = "MinIntrinsic" if ($key eq "min");
+            $intrinsic = "MaxIntrinsic" if ($key eq "max");
+            $intrinsic = "SqrtIntrinsic" if ($key eq "sqrt");
+            $intrinsic = "PowIntrinsic" if ($key eq "pow");
+            $intrinsic = "AbsIntrinsic" if ($key eq "abs");
+            $intrinsic = "FloorIntrinsic" if ($key eq "floor");
+            $intrinsic = "CeilIntrinsic" if ($key eq "ceil");
+            $intrinsic = "RoundIntrinsic" if ($key eq "round");
+            $intrinsic = "ExpIntrinsic" if ($key eq "exp");
+            $intrinsic = "LogIntrinsic" if ($key eq "log");
+        }
+        if ($name eq "arrayPrototypeTable") {
+            $intrinsic = "ArrayPushIntrinsic" if ($key eq "push");
+            $intrinsic = "ArrayPopIntrinsic" if ($key eq "pop");
+        }
+        if ($name eq "regExpPrototypeTable") {
+            $intrinsic = "RegExpExecIntrinsic" if ($key eq "exec");
+            $intrinsic = "RegExpTestIntrinsic" if ($key eq "test");
+        }
+
+        print "   { \"$key\", $attrs[$i], (intptr_t)" . $castStr . "($firstValue), (intptr_t)$secondValue, $intrinsic },\n";
         $i++;
     }
-    print "   { 0, 0, 0, 0 }\n";
+    print "   { 0, 0, 0, 0, NoIntrinsic }\n";
     print "};\n\n";
     print "extern const struct HashTable $name =\n";
-    print "#if ENABLE(PERFECT_HASH_SIZE)\n";
-    print "    \{ ", $pefectHashSize - 1, ", $nameEntries, 0 \};\n";
-    print "#else\n";
     print "    \{ $compactSize, $compactHashSizeMask, $nameEntries, 0 \};\n";
-    print "#endif\n\n";
     print "} // namespace\n";
 }