<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[188824] trunk/Source</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/188824">188824</a></dd>
<dt>Author</dt> <dd>akling@apple.com</dd>
<dt>Date</dt> <dd>2015-08-22 11:05:50 -0700 (Sat, 22 Aug 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>[JSC] Static hash tables should be 100% compile-time constant.
<https://webkit.org/b/148359>
Reviewed by Michael Saboff.
Source/JavaScriptCore:
We were dirtying the memory pages containing static hash tables the
first time they were used, when a dynamically allocated index-to-key
table was built and cached in the HashTable struct.
It turns out that this "optimization" was completely useless, since
we've long since decoupled static hash tables from the JSC::VM and
we can get the key for an index via HashTable::values[index].m_key!
We also get rid of VM::keywords which was a little wrapper around
a VM-specific copy of JSC::mainTable. There was nothing VM-specific
about it at all, so clients now use JSC::mainTable directly.
After this change all fooHashTable structs end up in __DATA __const
and no runtime initialization/allocation takes place.
* create_hash_table:
* jsc.cpp:
* parser/Lexer.cpp:
(JSC::isLexerKeyword):
(JSC::Lexer<LChar>::parseIdentifier):
(JSC::Lexer<UChar>::parseIdentifier):
(JSC::Lexer<CharacterType>::parseIdentifierSlowCase):
(JSC::Keywords::Keywords): Deleted.
* parser/Lexer.h:
(JSC::Keywords::isKeyword): Deleted.
(JSC::Keywords::getKeyword): Deleted.
(JSC::Keywords::~Keywords): Deleted.
* runtime/LiteralParser.cpp:
(JSC::LiteralParser<CharType>::tryJSONPParse):
* runtime/Lookup.cpp:
(JSC::HashTable::createTable): Deleted.
(JSC::HashTable::deleteTable): Deleted.
* runtime/Lookup.h:
(JSC::HashTable::entry):
(JSC::HashTable::ConstIterator::key):
(JSC::HashTable::ConstIterator::skipInvalidKeys):
(JSC::HashTable::copy): Deleted.
(JSC::HashTable::initializeIfNeeded): Deleted.
(JSC::HashTable::begin): Deleted.
(JSC::HashTable::end): Deleted.
* runtime/VM.cpp:
(JSC::VM::VM): Deleted.
* runtime/VM.h:
* testRegExp.cpp:
Source/WebCore:
Adjust WebCore bindings generator for new JSC::HashTable layout
and rebaseline the bindings tests for that change.
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateHashTable):
* bindings/scripts/test/JS/JSTestActiveDOMObject.cpp:
* bindings/scripts/test/JS/JSTestCustomNamedGetter.cpp:
* bindings/scripts/test/JS/JSTestEventTarget.cpp:
* bindings/scripts/test/JS/JSTestException.cpp:
* bindings/scripts/test/JS/JSTestInterface.cpp:
* bindings/scripts/test/JS/JSTestObj.cpp:
* bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp:
* bindings/scripts/test/JS/JSTestTypedefs.cpp:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorecreate_hash_table">trunk/Source/JavaScriptCore/create_hash_table</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserLexercpp">trunk/Source/JavaScriptCore/parser/Lexer.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserLexerh">trunk/Source/JavaScriptCore/parser/Lexer.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeLiteralParsercpp">trunk/Source/JavaScriptCore/runtime/LiteralParser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeLookupcpp">trunk/Source/JavaScriptCore/runtime/Lookup.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeLookuph">trunk/Source/JavaScriptCore/runtime/Lookup.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMcpp">trunk/Source/JavaScriptCore/runtime/VM.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMh">trunk/Source/JavaScriptCore/runtime/VM.h</a></li>
<li><a href="#trunkSourceJavaScriptCoretestRegExpcpp">trunk/Source/JavaScriptCore/testRegExp.cpp</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestActiveDOMObjectcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestCustomNamedGettercpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestCustomNamedGetter.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestEventTargetcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestExceptioncpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestInterfacecpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestOverrideBuiltinscpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestTypedefscpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -1,3 +1,55 @@
</span><ins>+2015-08-22 Andreas Kling <akling@apple.com>
+
+ [JSC] Static hash tables should be 100% compile-time constant.
+ <https://webkit.org/b/148359>
+
+ Reviewed by Michael Saboff.
+
+ We were dirtying the memory pages containing static hash tables the
+ first time they were used, when a dynamically allocated index-to-key
+ table was built and cached in the HashTable struct.
+
+ It turns out that this "optimization" was completely useless, since
+ we've long since decoupled static hash tables from the JSC::VM and
+ we can get the key for an index via HashTable::values[index].m_key!
+
+ We also get rid of VM::keywords which was a little wrapper around
+ a VM-specific copy of JSC::mainTable. There was nothing VM-specific
+ about it at all, so clients now use JSC::mainTable directly.
+
+ After this change all fooHashTable structs end up in __DATA __const
+ and no runtime initialization/allocation takes place.
+
+ * create_hash_table:
+ * jsc.cpp:
+ * parser/Lexer.cpp:
+ (JSC::isLexerKeyword):
+ (JSC::Lexer<LChar>::parseIdentifier):
+ (JSC::Lexer<UChar>::parseIdentifier):
+ (JSC::Lexer<CharacterType>::parseIdentifierSlowCase):
+ (JSC::Keywords::Keywords): Deleted.
+ * parser/Lexer.h:
+ (JSC::Keywords::isKeyword): Deleted.
+ (JSC::Keywords::getKeyword): Deleted.
+ (JSC::Keywords::~Keywords): Deleted.
+ * runtime/LiteralParser.cpp:
+ (JSC::LiteralParser<CharType>::tryJSONPParse):
+ * runtime/Lookup.cpp:
+ (JSC::HashTable::createTable): Deleted.
+ (JSC::HashTable::deleteTable): Deleted.
+ * runtime/Lookup.h:
+ (JSC::HashTable::entry):
+ (JSC::HashTable::ConstIterator::key):
+ (JSC::HashTable::ConstIterator::skipInvalidKeys):
+ (JSC::HashTable::copy): Deleted.
+ (JSC::HashTable::initializeIfNeeded): Deleted.
+ (JSC::HashTable::begin): Deleted.
+ (JSC::HashTable::end): Deleted.
+ * runtime/VM.cpp:
+ (JSC::VM::VM): Deleted.
+ * runtime/VM.h:
+ * testRegExp.cpp:
+
</ins><span class="cx"> 2015-08-21 Commit Queue <commit-queue@webkit.org>
</span><span class="cx">
</span><span class="cx"> Unreviewed, rolling out r188792 and r188803.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorecreate_hash_table"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/create_hash_table (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/create_hash_table        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/create_hash_table        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -330,7 +330,7 @@
</span><span class="cx"> $i++;
</span><span class="cx"> }
</span><span class="cx"> print "};\n\n";
</span><del>- print "JS_EXPORT_PRIVATE extern const struct HashTable $name =\n";
- print " \{ $packedSize, $compactHashSizeMask, $hasSetter, $nameEntries, 0, $nameIndex \};\n";
</del><ins>+ print "static const struct HashTable $name =\n";
+ print " \{ $packedSize, $compactHashSizeMask, $hasSetter, $nameEntries, $nameIndex \};\n";
</ins><span class="cx"> print "} // namespace\n";
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/jsc.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -103,10 +103,6 @@
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> using namespace WTF;
</span><span class="cx">
</span><del>-namespace JSC {
-WTF_IMPORT extern const struct HashTable globalObjectTable;
-}
-
</del><span class="cx"> namespace {
</span><span class="cx">
</span><span class="cx"> NO_RETURN_WITH_VALUE static void jscExit(int status)
</span><span class="lines">@@ -720,7 +716,7 @@
</span><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><del>-const ClassInfo GlobalObject::s_info = { "global", &JSGlobalObject::s_info, &globalObjectTable, CREATE_METHOD_TABLE(GlobalObject) };
</del><ins>+const ClassInfo GlobalObject::s_info = { "global", &JSGlobalObject::s_info, nullptr, CREATE_METHOD_TABLE(GlobalObject) };
</ins><span class="cx"> const GlobalObjectMethodTable GlobalObject::s_globalObjectMethodTable = { &allowsAccessFrom, &supportsProfiling, &supportsRichSourceInfo, &shouldInterruptScript, &javaScriptRuntimeFlags, 0, &shouldInterruptScriptBeforeTimeout, nullptr, &moduleLoaderFetch, nullptr, nullptr };
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserLexercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Lexer.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Lexer.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/parser/Lexer.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -44,10 +44,9 @@
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><del>-Keywords::Keywords(VM& vm)
- : m_vm(vm)
- , m_keywordTable(JSC::mainTable)
</del><ins>+bool isLexerKeyword(const Identifier& identifier)
</ins><span class="cx"> {
</span><ins>+ return JSC::mainTable.entry(identifier);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> enum CharacterType {
</span><span class="lines">@@ -948,7 +947,7 @@
</span><span class="cx"> if (UNLIKELY((remaining < maxTokenLength) && !(lexerFlags & LexerFlagsIgnoreReservedWords)) && !isPrivateName) {
</span><span class="cx"> ASSERT(shouldCreateIdentifier);
</span><span class="cx"> if (remaining < maxTokenLength) {
</span><del>- const HashTableValue* entry = m_vm->keywords->getKeyword(*ident);
</del><ins>+ const HashTableValue* entry = JSC::mainTable.entry(*ident);
</ins><span class="cx"> ASSERT((remaining < maxTokenLength) || !entry);
</span><span class="cx"> if (!entry)
</span><span class="cx"> return IDENT;
</span><span class="lines">@@ -1025,7 +1024,7 @@
</span><span class="cx"> if (UNLIKELY((remaining < maxTokenLength) && !(lexerFlags & LexerFlagsIgnoreReservedWords)) && !isPrivateName) {
</span><span class="cx"> ASSERT(shouldCreateIdentifier);
</span><span class="cx"> if (remaining < maxTokenLength) {
</span><del>- const HashTableValue* entry = m_vm->keywords->getKeyword(*ident);
</del><ins>+ const HashTableValue* entry = JSC::mainTable.entry(*ident);
</ins><span class="cx"> ASSERT((remaining < maxTokenLength) || !entry);
</span><span class="cx"> if (!entry)
</span><span class="cx"> return IDENT;
</span><span class="lines">@@ -1089,7 +1088,7 @@
</span><span class="cx">
</span><span class="cx"> if (LIKELY(!(lexerFlags & LexerFlagsIgnoreReservedWords))) {
</span><span class="cx"> ASSERT(shouldCreateIdentifier);
</span><del>- const HashTableValue* entry = m_vm->keywords->getKeyword(*ident);
</del><ins>+ const HashTableValue* entry = JSC::mainTable.entry(*ident);
</ins><span class="cx"> if (!entry)
</span><span class="cx"> return IDENT;
</span><span class="cx"> JSTokenType token = static_cast<JSTokenType>(entry->lexerValue());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserLexerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Lexer.h (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Lexer.h        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/parser/Lexer.h        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -33,33 +33,6 @@
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><del>-class Keywords {
- WTF_MAKE_FAST_ALLOCATED;
-public:
- bool isKeyword(const Identifier& ident) const
- {
- return m_keywordTable.entry(ident);
- }
-
- const HashTableValue* getKeyword(const Identifier& ident) const
- {
- return m_keywordTable.entry(ident);
- }
-
- explicit Keywords(VM&);
-
- ~Keywords()
- {
- m_keywordTable.deleteTable();
- }
-
-private:
- friend class VM;
-
- VM& m_vm;
- const HashTable m_keywordTable;
-};
-
</del><span class="cx"> enum LexerFlags {
</span><span class="cx"> LexerFlagsIgnoreReservedWords = 1,
</span><span class="cx"> LexerFlagsDontBuildStrings = 2,
</span><span class="lines">@@ -68,6 +41,8 @@
</span><span class="cx">
</span><span class="cx"> struct ParsedUnicodeEscapeValue;
</span><span class="cx">
</span><ins>+bool isLexerKeyword(const Identifier&);
+
</ins><span class="cx"> template <typename T>
</span><span class="cx"> class Lexer {
</span><span class="cx"> WTF_MAKE_NONCOPYABLE(Lexer);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeLiteralParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/LiteralParser.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/LiteralParser.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/runtime/LiteralParser.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx"> entry.m_pathEntryName = Identifier::fromString(&m_exec->vm(), m_lexer.currentToken().start, m_lexer.currentToken().end - m_lexer.currentToken().start);
</span><span class="cx"> path.append(entry);
</span><span class="cx"> }
</span><del>- if (m_exec->vm().keywords->isKeyword(entry.m_pathEntryName))
</del><ins>+ if (isLexerKeyword(entry.m_pathEntryName))
</ins><span class="cx"> return false;
</span><span class="cx"> TokenType tokenType = m_lexer.next();
</span><span class="cx"> if (entry.m_type == JSONPPathEntryTypeDeclare && tokenType != TokAssign)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeLookupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Lookup.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Lookup.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/runtime/Lookup.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -27,27 +27,6 @@
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><del>-void HashTable::createTable() const
-{
- ASSERT(!keys);
- keys = static_cast<const char**>(fastMalloc(sizeof(char*) * numberOfValues));
-
- for (int i = 0; i < numberOfValues; ++i) {
- if (values[i].m_key)
- keys[i] = values[i].m_key;
- else
- keys[i] = 0;
- }
-}
-
-void HashTable::deleteTable() const
-{
- if (keys) {
- fastFree(keys);
- keys = nullptr;
- }
-}
-
</del><span class="cx"> void reifyStaticAccessor(VM& vm, const HashTableValue& value, JSObject& thisObj, PropertyName propertyName)
</span><span class="cx"> {
</span><span class="cx"> JSGlobalObject* globalObject = thisObj.globalObject();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeLookuph"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Lookup.h (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Lookup.h        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/runtime/Lookup.h        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -72,34 +72,16 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> struct HashTable {
</span><del>- mutable int numberOfValues;
</del><ins>+ int numberOfValues;
</ins><span class="cx"> int indexMask;
</span><span class="cx"> bool hasSetterOrReadonlyProperties;
</span><span class="cx">
</span><span class="cx"> const HashTableValue* values; // Fixed values generated by script.
</span><del>- mutable const char** keys; // Table allocated at runtime.
</del><span class="cx"> const CompactHashIndex* index;
</span><span class="cx">
</span><del>- ALWAYS_INLINE HashTable copy() const
- {
- // Don't copy dynamic table since it's thread specific.
- HashTable result = { numberOfValues, indexMask, hasSetterOrReadonlyProperties, values, 0, index };
- return result;
- }
-
- ALWAYS_INLINE void initializeIfNeeded() const
- {
- if (!keys)
- createTable();
- }
-
- JS_EXPORT_PRIVATE void deleteTable() const;
-
</del><span class="cx"> // Find an entry in the table, and return the entry.
</span><span class="cx"> ALWAYS_INLINE const HashTableValue* entry(PropertyName propertyName) const
</span><span class="cx"> {
</span><del>- initializeIfNeeded();
-
</del><span class="cx"> if (propertyName.isSymbol())
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><span class="lines">@@ -107,15 +89,13 @@
</span><span class="cx"> if (!uid)
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><del>- ASSERT(keys);
-
</del><span class="cx"> int indexEntry = IdentifierRepHash::hash(uid) & indexMask;
</span><span class="cx"> int valueIndex = index[indexEntry].value;
</span><span class="cx"> if (valueIndex == -1)
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><span class="cx"> while (true) {
</span><del>- if (WTF::equal(uid, keys[valueIndex]))
</del><ins>+ if (WTF::equal(uid, values[valueIndex].m_key))
</ins><span class="cx"> return &values[valueIndex];
</span><span class="cx">
</span><span class="cx"> indexEntry = index[indexEntry].next;
</span><span class="lines">@@ -142,7 +122,7 @@
</span><span class="cx">
</span><span class="cx"> const char* key()
</span><span class="cx"> {
</span><del>- return m_table->keys[m_position];
</del><ins>+ return m_table->values[m_position].m_key;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const HashTableValue* operator->()
</span><span class="lines">@@ -168,7 +148,7 @@
</span><span class="cx"> void skipInvalidKeys()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(m_position <= m_table->numberOfValues);
</span><del>- while (m_position < m_table->numberOfValues && !m_table->keys[m_position])
</del><ins>+ while (m_position < m_table->numberOfValues && !m_table->values[m_position].m_key)
</ins><span class="cx"> ++m_position;
</span><span class="cx"> ASSERT(m_position <= m_table->numberOfValues);
</span><span class="cx"> }
</span><span class="lines">@@ -179,18 +159,12 @@
</span><span class="cx">
</span><span class="cx"> ConstIterator begin() const
</span><span class="cx"> {
</span><del>- initializeIfNeeded();
</del><span class="cx"> return ConstIterator(this, 0);
</span><span class="cx"> }
</span><span class="cx"> ConstIterator end() const
</span><span class="cx"> {
</span><del>- initializeIfNeeded();
</del><span class="cx"> return ConstIterator(this, numberOfValues);
</span><span class="cx"> }
</span><del>-
-private:
- // Convert the hash table keys to identifiers.
- JS_EXPORT_PRIVATE void createTable() const;
</del><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> JS_EXPORT_PRIVATE bool setUpStaticFunctionSlot(ExecState*, const HashTableValue*, JSObject* thisObject, PropertyName, PropertySlot&);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/runtime/VM.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -154,7 +154,6 @@
</span><span class="cx"> , emptyList(new MarkedArgumentBuffer)
</span><span class="cx"> , stringCache(*this)
</span><span class="cx"> , prototypeMap(*this)
</span><del>- , keywords(std::make_unique<Keywords>(*this))
</del><span class="cx"> , interpreter(0)
</span><span class="cx"> , jsArrayClassInfo(JSArray::info())
</span><span class="cx"> , jsFinalObjectClassInfo(JSFinalObject::info())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.h (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.h        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/runtime/VM.h        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -86,7 +86,6 @@
</span><span class="cx"> class Interpreter;
</span><span class="cx"> class JSGlobalObject;
</span><span class="cx"> class JSObject;
</span><del>-class Keywords;
</del><span class="cx"> class LLIntOffsetsExtractor;
</span><span class="cx"> class LegacyProfiler;
</span><span class="cx"> class NativeExecutable;
</span><span class="lines">@@ -349,7 +348,6 @@
</span><span class="cx">
</span><span class="cx"> typedef HashMap<RefPtr<SourceProvider>, RefPtr<SourceProviderCache>> SourceProviderCacheMap;
</span><span class="cx"> SourceProviderCacheMap sourceProviderCacheMap;
</span><del>- std::unique_ptr<Keywords> keywords;
</del><span class="cx"> Interpreter* interpreter;
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> std::unique_ptr<JITThunks> jitStubs;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretestRegExpcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/testRegExp.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/testRegExp.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/JavaScriptCore/testRegExp.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -45,10 +45,6 @@
</span><span class="cx"> #include <windows.h>
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-namespace JSC {
-WTF_IMPORT extern const struct HashTable globalObjectTable;
-}
-
</del><span class="cx"> const int MaxLineLength = 100 * 1024;
</span><span class="cx">
</span><span class="cx"> using namespace JSC;
</span><span class="lines">@@ -137,7 +133,7 @@
</span><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><del>-const ClassInfo GlobalObject::s_info = { "global", &JSGlobalObject::s_info, &globalObjectTable, CREATE_METHOD_TABLE(GlobalObject) };
</del><ins>+const ClassInfo GlobalObject::s_info = { "global", &JSGlobalObject::s_info, nullptr, CREATE_METHOD_TABLE(GlobalObject) };
</ins><span class="cx">
</span><span class="cx"> GlobalObject::GlobalObject(VM& vm, Structure* structure, const Vector<String>& arguments)
</span><span class="cx"> : JSGlobalObject(vm, structure)
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/ChangeLog        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2015-08-22 Andreas Kling <akling@apple.com>
+
+ [JSC] Static hash tables should be 100% compile-time constant.
+ <https://webkit.org/b/148359>
+
+ Reviewed by Michael Saboff.
+
+ Adjust WebCore bindings generator for new JSC::HashTable layout
+ and rebaseline the bindings tests for that change.
+
+ * bindings/scripts/CodeGeneratorJS.pm:
+ (GenerateHashTable):
+ * bindings/scripts/test/JS/JSTestActiveDOMObject.cpp:
+ * bindings/scripts/test/JS/JSTestCustomNamedGetter.cpp:
+ * bindings/scripts/test/JS/JSTestEventTarget.cpp:
+ * bindings/scripts/test/JS/JSTestException.cpp:
+ * bindings/scripts/test/JS/JSTestInterface.cpp:
+ * bindings/scripts/test/JS/JSTestObj.cpp:
+ * bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp:
+ * bindings/scripts/test/JS/JSTestTypedefs.cpp:
+
</ins><span class="cx"> 2015-08-22 Michael Catanzaro <mcatanzaro@igalia.com>
</span><span class="cx">
</span><span class="cx"> Unreviewed, fix build without ENABLE_CSS_GRID_LAYOUT after r188582
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -4228,7 +4228,7 @@
</span><span class="cx"> my $packedSize = scalar @{$keys};
</span><span class="cx">
</span><span class="cx"> my $compactSizeMask = $numEntries - 1;
</span><del>- push(@implContent, "static const HashTable $name = { $packedSize, $compactSizeMask, $hasSetter, $nameEntries, 0, $nameIndex };\n");
</del><ins>+ push(@implContent, "static const HashTable $name = { $packedSize, $compactSizeMask, $hasSetter, $nameEntries, $nameIndex };\n");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> sub WriteData
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestActiveDOMObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx"> { "excitingAttr", DontDelete | ReadOnly | CustomAccessor, NoIntrinsic, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestActiveDOMObjectExcitingAttr), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) },
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static const HashTable JSTestActiveDOMObjectTable = { 2, 3, true, JSTestActiveDOMObjectTableValues, 0, JSTestActiveDOMObjectTableIndex };
</del><ins>+static const HashTable JSTestActiveDOMObjectTable = { 2, 3, true, JSTestActiveDOMObjectTableValues, JSTestActiveDOMObjectTableIndex };
</ins><span class="cx"> const ClassInfo JSTestActiveDOMObjectConstructor::s_info = { "TestActiveDOMObjectConstructor", &Base::s_info, 0, CREATE_METHOD_TABLE(JSTestActiveDOMObjectConstructor) };
</span><span class="cx">
</span><span class="cx"> JSTestActiveDOMObjectConstructor::JSTestActiveDOMObjectConstructor(Structure* structure, JSDOMGlobalObject* globalObject)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestCustomNamedGettercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestCustomNamedGetter.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestCustomNamedGetter.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestCustomNamedGetter.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -99,7 +99,7 @@
</span><span class="cx"> { "constructor", DontEnum | ReadOnly, NoIntrinsic, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestCustomNamedGetterConstructor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) },
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static const HashTable JSTestCustomNamedGetterTable = { 1, 1, true, JSTestCustomNamedGetterTableValues, 0, JSTestCustomNamedGetterTableIndex };
</del><ins>+static const HashTable JSTestCustomNamedGetterTable = { 1, 1, true, JSTestCustomNamedGetterTableValues, JSTestCustomNamedGetterTableIndex };
</ins><span class="cx"> const ClassInfo JSTestCustomNamedGetterConstructor::s_info = { "TestCustomNamedGetterConstructor", &Base::s_info, 0, CREATE_METHOD_TABLE(JSTestCustomNamedGetterConstructor) };
</span><span class="cx">
</span><span class="cx"> JSTestCustomNamedGetterConstructor::JSTestCustomNamedGetterConstructor(Structure* structure, JSDOMGlobalObject* globalObject)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestEventTargetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -108,7 +108,7 @@
</span><span class="cx"> { "constructor", DontEnum | ReadOnly, NoIntrinsic, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestEventTargetConstructor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) },
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static const HashTable JSTestEventTargetTable = { 1, 1, true, JSTestEventTargetTableValues, 0, JSTestEventTargetTableIndex };
</del><ins>+static const HashTable JSTestEventTargetTable = { 1, 1, true, JSTestEventTargetTableValues, JSTestEventTargetTableIndex };
</ins><span class="cx"> const ClassInfo JSTestEventTargetConstructor::s_info = { "TestEventTargetConstructor", &Base::s_info, 0, CREATE_METHOD_TABLE(JSTestEventTargetConstructor) };
</span><span class="cx">
</span><span class="cx"> JSTestEventTargetConstructor::JSTestEventTargetConstructor(Structure* structure, JSDOMGlobalObject* globalObject)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestExceptioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -95,7 +95,7 @@
</span><span class="cx"> { "name", DontDelete | ReadOnly | CustomAccessor, NoIntrinsic, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestExceptionName), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) },
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static const HashTable JSTestExceptionTable = { 1, 1, true, JSTestExceptionTableValues, 0, JSTestExceptionTableIndex };
</del><ins>+static const HashTable JSTestExceptionTable = { 1, 1, true, JSTestExceptionTableValues, JSTestExceptionTableIndex };
</ins><span class="cx"> const ClassInfo JSTestExceptionConstructor::s_info = { "TestExceptionConstructor", &Base::s_info, 0, CREATE_METHOD_TABLE(JSTestExceptionConstructor) };
</span><span class="cx">
</span><span class="cx"> JSTestExceptionConstructor::JSTestExceptionConstructor(Structure* structure, JSDOMGlobalObject* globalObject)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestInterfacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -194,7 +194,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static const HashTable JSTestInterfaceTable = { 2, 3, true, JSTestInterfaceTableValues, 0, JSTestInterfaceTableIndex };
</del><ins>+static const HashTable JSTestInterfaceTable = { 2, 3, true, JSTestInterfaceTableValues, JSTestInterfaceTableIndex };
</ins><span class="cx"> /* Hash table for constructor */
</span><span class="cx">
</span><span class="cx"> static const HashTableValue JSTestInterfaceConstructorTableValues[] =
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -394,7 +394,7 @@
</span><span class="cx"> { "contentDocument", DontDelete | ReadOnly | CustomAccessor, NoIntrinsic, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjContentDocument), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) },
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static const HashTable JSTestObjTable = { 6, 15, true, JSTestObjTableValues, 0, JSTestObjTableIndex };
</del><ins>+static const HashTable JSTestObjTable = { 6, 15, true, JSTestObjTableValues, JSTestObjTableIndex };
</ins><span class="cx"> /* Hash table for constructor */
</span><span class="cx">
</span><span class="cx"> static const HashTableValue JSTestObjConstructorTableValues[] =
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestOverrideBuiltinscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx"> { "constructor", DontEnum | ReadOnly, NoIntrinsic, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestOverrideBuiltinsConstructor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) },
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static const HashTable JSTestOverrideBuiltinsTable = { 1, 1, true, JSTestOverrideBuiltinsTableValues, 0, JSTestOverrideBuiltinsTableIndex };
</del><ins>+static const HashTable JSTestOverrideBuiltinsTable = { 1, 1, true, JSTestOverrideBuiltinsTableValues, JSTestOverrideBuiltinsTableIndex };
</ins><span class="cx"> const ClassInfo JSTestOverrideBuiltinsConstructor::s_info = { "TestOverrideBuiltinsConstructor", &Base::s_info, 0, CREATE_METHOD_TABLE(JSTestOverrideBuiltinsConstructor) };
</span><span class="cx">
</span><span class="cx"> JSTestOverrideBuiltinsConstructor::JSTestOverrideBuiltinsConstructor(Structure* structure, JSDOMGlobalObject* globalObject)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestTypedefscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp (188823 => 188824)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp        2015-08-22 17:42:46 UTC (rev 188823)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp        2015-08-22 18:05:50 UTC (rev 188824)
</span><span class="lines">@@ -135,7 +135,7 @@
</span><span class="cx"> { 0, 0, NoIntrinsic, 0, 0 }
</span><span class="cx"> };
</span><span class="cx">
</span><del>-static const HashTable JSTestTypedefsTable = { 0, 1, false, JSTestTypedefsTableValues, 0, JSTestTypedefsTableIndex };
</del><ins>+static const HashTable JSTestTypedefsTable = { 0, 1, false, JSTestTypedefsTableValues, JSTestTypedefsTableIndex };
</ins><span class="cx"> /* Hash table for constructor */
</span><span class="cx">
</span><span class="cx"> static const HashTableValue JSTestTypedefsConstructorTableValues[] =
</span></span></pre>
</div>
</div>
</body>
</html>