]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - create_hash_table
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / create_hash_table
index 1bd531ae1c4f4613c7bd20d240e7d828d08d4e91..b26eed0cf8404cd88c4f0c1a56d402f3b38677cc 100755 (executable)
@@ -41,6 +41,10 @@ my @keys = ();
 my @attrs = ();
 my @values = ();
 my @hashes = ();
+my @table = ();
+my @links = ();
+
+my $hasSetter = "false";
 
 my $inside = 0;
 my $name;
@@ -74,6 +78,8 @@ while (<IN>) {
         @attrs = ();
         @values = ();
         @hashes = ();
+        @table = ();
+        @links = ();
 
         $inside = 0;
     } elsif (/^(\S+)\s*(\S+)\s*([\w\|]*)\s*(\w*)\s*$/ && $inside) {
@@ -88,9 +94,18 @@ while (<IN>) {
         if ($att =~ m/Function/) {
             push(@values, { "type" => "Function", "function" => $val, "params" => (length($param) ? $param : "") });
             #printf STDERR "WARNING: Number of arguments missing for $key/$val\n" if (length($param) == 0);
+        } elsif ($att =~ m/Accessor/) {
+            my $get = $val;
+            my $put = "nullptr";
+            $hasSetter = "true";
+            push(@values, { "type" => "Accessor", "get" => $get, "put" => $put });
         } elsif (length($att)) {
             my $get = $val;
-            my $put = !($att =~ m/ReadOnly/) ? "set" . jsc_ucfirst($val) : "0";
+            my $put = "0";
+            if (!($att =~ m/ReadOnly/)) {
+                $put = "set" . jsc_ucfirst($val);
+            }
+            $hasSetter = "true";
             push(@values, { "type" => "Property", "get" => $get, "put" => $put });
         } else {
             push(@values, { "type" => "Lexer", "value" => $val });        
@@ -149,8 +164,6 @@ sub leftShift($$) {
 
 sub calcCompactHashSize()
 {
-    my @table = ();
-    my @links = ();
     my $compactHashSize = ceilingToPowerOf2(2 * @keys);
     $compactHashSizeMask = $compactHashSize - 1;
     $compactSize = $compactHashSize;
@@ -241,28 +254,50 @@ sub output() {
 
     my $nameEntries = "${name}Values";
     $nameEntries =~ s/:/_/g;
+    my $nameIndex = "${name}Index";
+    $nameIndex =~ s/:/_/g;
 
+    print "\n#include \"JSCBuiltins.h\"\n";
     print "\n#include \"Lookup.h\"\n" if ($includelookup);
+
     if ($useNameSpace) {
         print "\nnamespace ${useNameSpace} {\n";
         print "\nusing namespace JSC;\n";
     } else {
         print "\nnamespace JSC {\n";
     }
-    my $count = scalar @keys + 1;
-    print "\nstatic const struct HashTableValue ${nameEntries}\[$count\] = {\n";
+
+    print "\nstatic const struct CompactHashIndex ${nameIndex}\[$compactSize\] = {\n";
+    for (my $i = 0; $i < $compactSize; $i++) {
+        my $T = -1;
+        if (defined($table[$i])) { $T = $table[$i]; }
+        my $L = -1;
+        if (defined($links[$i])) { $L = $links[$i]; }
+        print "    { $T, $L },\n";
+    }
+    print "};\n\n";
+
+    my $packedSize = scalar @keys;
+    print "\nstatic const struct HashTableValue ${nameEntries}\[$packedSize\] = {\n";
     my $i = 0;
     foreach my $key (@keys) {
         my $firstValue = "";
         my $secondValue = "";
-        my $castStr = "";
+        my $firstCastStr = "";
+        my $secondCastStr = "";
 
         if ($values[$i]{"type"} eq "Function") {
-            $castStr = "static_cast<NativeFunction>";
+            $firstCastStr = "static_cast<NativeFunction>";
             $firstValue = $values[$i]{"function"};
             $secondValue = $values[$i]{"params"};
+        } elsif ($values[$i]{"type"} eq "Accessor") {
+            $firstCastStr = "static_cast<NativeFunction>";
+            $secondCastStr = "static_cast<NativeFunction>";
+            $firstValue = $values[$i]{"get"};
+            $secondValue = $values[$i]{"put"};
         } elsif ($values[$i]{"type"} eq "Property") {
-            $castStr = "static_cast<PropertySlot::GetValueFunc>";
+            $firstCastStr = "static_cast<PropertySlot::GetValueFunc>";
+            $secondCastStr = "static_cast<PutPropertySlot::PutValueFunc>";
             $firstValue = $values[$i]{"get"};
             $secondValue = $values[$i]{"put"};
         } elsif ($values[$i]{"type"} eq "Lexer") {
@@ -272,19 +307,6 @@ sub output() {
 
         my $intrinsic = "NoIntrinsic";
         $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");
-            $intrinsic = "IMulIntrinsic" if ($key eq "imul");
-        }
         if ($name eq "arrayPrototypeTable") {
             $intrinsic = "ArrayPushIntrinsic" if ($key eq "push");
             $intrinsic = "ArrayPopIntrinsic" if ($key eq "pop");
@@ -294,12 +316,21 @@ sub output() {
             $intrinsic = "RegExpTestIntrinsic" if ($key eq "test");
         }
 
-        print "   { \"$key\", $attrs[$i], (intptr_t)" . $castStr . "($firstValue), (intptr_t)$secondValue, $intrinsic },\n";
+        if ($values[$i]{"type"} eq "Function")  {
+            my $tableHead = $name;
+            $tableHead =~ s/Table$//;
+            print " #if JSC_BUILTIN_EXISTS(" . uc($tableHead . $key) .")\n";
+            print "   { \"$key\", (($attrs[$i]) & ~Function) | Builtin, $intrinsic, (intptr_t)static_cast<BuiltinGenerator>(" . $tableHead . ucfirst($key) . "CodeGenerator), (intptr_t)$secondValue },\n";
+            print " #else\n"
+        }
+        print "   { \"$key\", $attrs[$i], $intrinsic, (intptr_t)" . $firstCastStr . "($firstValue), (intptr_t)" . $secondCastStr . "($secondValue) },\n";
+        if ($values[$i]{"type"} eq "Function")  {
+            print " #endif\n"
+        }
         $i++;
     }
-    print "   { 0, 0, 0, 0, NoIntrinsic }\n";
     print "};\n\n";
-    print "extern const struct HashTable $name =\n";
-    print "    \{ $compactSize, $compactHashSizeMask, $nameEntries, 0 \};\n";
+    print "JS_EXPORT_PRIVATE extern const struct HashTable $name =\n";
+    print "    \{ $packedSize, $compactHashSizeMask, $hasSetter, $nameEntries, 0, $nameIndex \};\n";
     print "} // namespace\n";
 }