<!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>[173188] trunk/Source/JavaScriptCore</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/173188">173188</a></dd>
<dt>Author</dt> <dd>akling@apple.com</dd>
<dt>Date</dt> <dd>2014-09-02 15:29:59 -0700 (Tue, 02 Sep 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>Optimize own property GetByVals with rope string subscripts.
<https://webkit.org/b/136458>
For simple JSObjects that don't override getOwnPropertySlot to implement
custom properties, we have a fast path that grabs directly at the object
property storage.
Make this fast path even faster when the property name is an unresolved
rope string by using JSString::toExistingAtomicString(). This is faster
because it avoids allocating a new StringImpl if the string is already
a known Identifier, which is guaranteed to be the case if it's present
as an own property on the object.)
~10% speed-up on Dromaeo/dom-attr.html
Reviewed by Geoffrey Garen.
* dfg/DFGOperations.cpp:
* jit/JITOperations.cpp:
(JSC::getByVal):
* llint/LLIntSlowPaths.cpp:
(JSC::LLInt::getByVal):
When using the fastGetOwnProperty() optimization, get the String
out of JSString by using toExistingAtomicString(). This avoids
StringImpl allocation and lets us bypass the PropertyTable lookup
entirely if no AtomicString is found.
* runtime/JSCell.h:
* runtime/JSCellInlines.h:
(JSC::JSCell::fastGetOwnProperty):
Make fastGetOwnProperty() take a PropertyName instead of a String.
This avoids churning the ref count, since we don't need to create
a temporary wrapper around the AtomicStringImpl* found in GetByVal.
* runtime/PropertyName.h:
(JSC::PropertyName::PropertyName):
Add constructor: PropertyName(AtomicStringImpl*)
* runtime/PropertyMapHashTable.h:
(JSC::PropertyTable::get):
(JSC::PropertyTable::findWithString): Deleted.
* runtime/Structure.h:
* runtime/StructureInlines.h:
(JSC::Structure::get):
Remove code for querying a PropertyTable with an unhashed string key
since the only client is now gone.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGOperationscpp">trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITOperationscpp">trunk/Source/JavaScriptCore/jit/JITOperations.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLLIntSlowPathscpp">trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCellh">trunk/Source/JavaScriptCore/runtime/JSCell.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCellInlinesh">trunk/Source/JavaScriptCore/runtime/JSCellInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimePropertyMapHashTableh">trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimePropertyNameh">trunk/Source/JavaScriptCore/runtime/PropertyName.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureh">trunk/Source/JavaScriptCore/runtime/Structure.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureInlinesh">trunk/Source/JavaScriptCore/runtime/StructureInlines.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -1,3 +1,56 @@
</span><ins>+2014-09-02 Andreas Kling <akling@apple.com>
+
+ Optimize own property GetByVals with rope string subscripts.
+ <https://webkit.org/b/136458>
+
+ For simple JSObjects that don't override getOwnPropertySlot to implement
+ custom properties, we have a fast path that grabs directly at the object
+ property storage.
+
+ Make this fast path even faster when the property name is an unresolved
+ rope string by using JSString::toExistingAtomicString(). This is faster
+ because it avoids allocating a new StringImpl if the string is already
+ a known Identifier, which is guaranteed to be the case if it's present
+ as an own property on the object.)
+
+ ~10% speed-up on Dromaeo/dom-attr.html
+
+ Reviewed by Geoffrey Garen.
+
+ * dfg/DFGOperations.cpp:
+ * jit/JITOperations.cpp:
+ (JSC::getByVal):
+ * llint/LLIntSlowPaths.cpp:
+ (JSC::LLInt::getByVal):
+
+ When using the fastGetOwnProperty() optimization, get the String
+ out of JSString by using toExistingAtomicString(). This avoids
+ StringImpl allocation and lets us bypass the PropertyTable lookup
+ entirely if no AtomicString is found.
+
+ * runtime/JSCell.h:
+ * runtime/JSCellInlines.h:
+ (JSC::JSCell::fastGetOwnProperty):
+
+ Make fastGetOwnProperty() take a PropertyName instead of a String.
+ This avoids churning the ref count, since we don't need to create
+ a temporary wrapper around the AtomicStringImpl* found in GetByVal.
+
+ * runtime/PropertyName.h:
+ (JSC::PropertyName::PropertyName):
+
+ Add constructor: PropertyName(AtomicStringImpl*)
+
+ * runtime/PropertyMapHashTable.h:
+ (JSC::PropertyTable::get):
+ (JSC::PropertyTable::findWithString): Deleted.
+ * runtime/Structure.h:
+ * runtime/StructureInlines.h:
+ (JSC::Structure::get):
+
+ Remove code for querying a PropertyTable with an unhashed string key
+ since the only client is now gone.
+
</ins><span class="cx"> 2014-09-02 Dániel Bátyai <dbatyai.u-szeged@partner.samsung.com>
</span><span class="cx">
</span><span class="cx"> [ARM] MacroAssembler generating incorrect code on ARM32 Traditional
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOperationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -297,8 +297,10 @@
</span><span class="cx"> } else if (property.isString()) {
</span><span class="cx"> Structure& structure = *base->structure(vm);
</span><span class="cx"> if (JSCell::canUseFastGetOwnProperty(structure)) {
</span><del>- if (JSValue result = base->fastGetOwnProperty(vm, structure, asString(property)->value(exec)))
- return JSValue::encode(result);
</del><ins>+ if (AtomicStringImpl* existingAtomicString = asString(property)->toExistingAtomicString(exec)) {
+ if (JSValue result = base->fastGetOwnProperty(vm, structure, existingAtomicString))
+ return JSValue::encode(result);
+ }
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -327,8 +329,10 @@
</span><span class="cx"> } else if (property.isString()) {
</span><span class="cx"> Structure& structure = *base->structure(vm);
</span><span class="cx"> if (JSCell::canUseFastGetOwnProperty(structure)) {
</span><del>- if (JSValue result = base->fastGetOwnProperty(vm, structure, asString(property)->value(exec)))
- return JSValue::encode(result);
</del><ins>+ if (AtomicStringImpl* existingAtomicString = asString(property)->toExistingAtomicString(exec)) {
+ if (JSValue result = base->fastGetOwnProperty(vm, structure, existingAtomicString))
+ return JSValue::encode(result);
+ }
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITOperationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITOperations.cpp (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -1423,8 +1423,10 @@
</span><span class="cx"> VM& vm = exec->vm();
</span><span class="cx"> Structure& structure = *baseValue.asCell()->structure(vm);
</span><span class="cx"> if (JSCell::canUseFastGetOwnProperty(structure)) {
</span><del>- if (JSValue result = baseValue.asCell()->fastGetOwnProperty(vm, structure, asString(subscript)->value(exec)))
- return result;
</del><ins>+ if (AtomicStringImpl* existingAtomicString = asString(subscript)->toExistingAtomicString(exec)) {
+ if (JSValue result = baseValue.asCell()->fastGetOwnProperty(vm, structure, existingAtomicString))
+ return result;
+ }
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLLIntSlowPathscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -725,8 +725,10 @@
</span><span class="cx"> VM& vm = exec->vm();
</span><span class="cx"> Structure& structure = *baseValue.asCell()->structure(vm);
</span><span class="cx"> if (JSCell::canUseFastGetOwnProperty(structure)) {
</span><del>- if (JSValue result = baseValue.asCell()->fastGetOwnProperty(vm, structure, asString(subscript)->value(exec)))
- return result;
</del><ins>+ if (AtomicStringImpl* existingAtomicString = asString(subscript)->toExistingAtomicString(exec)) {
+ if (JSValue result = baseValue.asCell()->fastGetOwnProperty(vm, structure, existingAtomicString))
+ return result;
+ }
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCell.h (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCell.h        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/runtime/JSCell.h        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx">
</span><span class="cx"> class CopyVisitor;
</span><span class="cx"> class ExecState;
</span><ins>+class Identifier;
</ins><span class="cx"> class JSArrayBufferView;
</span><span class="cx"> class JSDestructibleObject;
</span><span class="cx"> class JSGlobalObject;
</span><span class="lines">@@ -141,7 +142,7 @@
</span><span class="cx"> bool isZapped() const { return !*reinterpret_cast<uintptr_t* const*>(this); }
</span><span class="cx">
</span><span class="cx"> static bool canUseFastGetOwnProperty(const Structure&);
</span><del>- JSValue fastGetOwnProperty(VM&, Structure&, const String&);
</del><ins>+ JSValue fastGetOwnProperty(VM&, Structure&, PropertyName);
</ins><span class="cx">
</span><span class="cx"> enum GCData : uint8_t {
</span><span class="cx"> Marked = 0,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCellInlines.h (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCellInlines.h        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/runtime/JSCellInlines.h        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -209,16 +209,10 @@
</span><span class="cx"> return classInfo()->isSubClassOf(info);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-// Fast call to get a property where we may not yet have converted the string to an
-// identifier. The first time we perform a property access with a given string, try
-// performing the property map lookup without forming an identifier. We detect this
-// case by checking whether the hash has yet been set for this string.
-ALWAYS_INLINE JSValue JSCell::fastGetOwnProperty(VM& vm, Structure& structure, const String& name)
</del><ins>+ALWAYS_INLINE JSValue JSCell::fastGetOwnProperty(VM& vm, Structure& structure, PropertyName name)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(canUseFastGetOwnProperty(structure));
</span><del>- PropertyOffset offset = name.impl()->hasHash()
- ? structure.get(vm, Identifier(&vm, name))
- : structure.get(vm, name);
</del><ins>+ PropertyOffset offset = structure.get(vm, name);
</ins><span class="cx"> if (offset != invalidOffset)
</span><span class="cx"> return asObject(this)->locationForOffset(offset)->get();
</span><span class="cx"> return JSValue();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimePropertyMapHashTableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -171,7 +171,6 @@
</span><span class="cx">
</span><span class="cx"> // Find a value in the table.
</span><span class="cx"> find_iterator find(const KeyType&);
</span><del>- find_iterator findWithString(const KeyType&);
</del><span class="cx"> ValueType* get(const KeyType&);
</span><span class="cx"> // Add a value to the table
</span><span class="cx"> enum EffectOnPropertyOffset { PropertyOffsetMayChange, PropertyOffsetMustNotChange };
</span><span class="lines">@@ -349,35 +348,6 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-inline PropertyTable::find_iterator PropertyTable::findWithString(const KeyType& key)
-{
- ASSERT(key);
- ASSERT(!key->isAtomic() && !key->hasHash());
- unsigned hash = key->hash();
- unsigned step = 0;
-
-#if DUMP_PROPERTYMAP_STATS
- ++propertyMapHashTableStats->numLookups;
-#endif
-
- while (true) {
- unsigned entryIndex = m_index[hash & m_indexMask];
- if (entryIndex == EmptyEntryIndex)
- return std::make_pair((ValueType*)0, hash & m_indexMask);
- const KeyType& keyInMap = table()[entryIndex - 1].key;
- if (equal(key, keyInMap) && keyInMap->isAtomic())
- return std::make_pair(&table()[entryIndex - 1], hash & m_indexMask);
-
-#if DUMP_PROPERTYMAP_STATS
- ++propertyMapHashTableStats->numLookupProbing;
-#endif
-
- if (!step)
- step = WTF::doubleHash(key->existingHash()) | 1;
- hash += step;
- }
-}
-
</del><span class="cx"> inline std::pair<PropertyTable::find_iterator, bool> PropertyTable::add(const ValueType& entry, PropertyOffset& offset, EffectOnPropertyOffset offsetEffect)
</span><span class="cx"> {
</span><span class="cx"> // Look for a value with a matching key already in the array.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimePropertyNameh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/PropertyName.h (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/PropertyName.h        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/runtime/PropertyName.h        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -78,12 +78,17 @@
</span><span class="cx">
</span><span class="cx"> class PropertyName {
</span><span class="cx"> public:
</span><del>- PropertyName(const Identifier& propertyName)
- : m_impl(static_cast<AtomicStringImpl*>(propertyName.impl()))
</del><ins>+ PropertyName(AtomicStringImpl* propertyName)
+ : m_impl(propertyName)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(!m_impl || m_impl->isAtomic());
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ PropertyName(const Identifier& propertyName)
+ : PropertyName(static_cast<AtomicStringImpl*>(propertyName.impl()))
+ {
+ }
+
</ins><span class="cx"> PropertyName(const PrivateName& propertyName)
</span><span class="cx"> : m_impl(static_cast<AtomicStringImpl*>(propertyName.uid()))
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Structure.h (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Structure.h        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/runtime/Structure.h        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -260,7 +260,6 @@
</span><span class="cx"> bool masqueradesAsUndefined(JSGlobalObject* lexicalGlobalObject);
</span><span class="cx">
</span><span class="cx"> PropertyOffset get(VM&, PropertyName);
</span><del>- PropertyOffset get(VM&, const WTF::String& name);
</del><span class="cx"> PropertyOffset get(VM&, PropertyName, unsigned& attributes);
</span><span class="cx">
</span><span class="cx"> PropertyOffset getConcurrently(VM&, StringImpl* uid);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StructureInlines.h (173187 => 173188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StructureInlines.h        2014-09-02 21:33:41 UTC (rev 173187)
+++ trunk/Source/JavaScriptCore/runtime/StructureInlines.h        2014-09-02 22:29:59 UTC (rev 173188)
</span><span class="lines">@@ -85,19 +85,6 @@
</span><span class="cx"> PropertyMapEntry* entry = propertyTable->get(propertyName.uid());
</span><span class="cx"> return entry ? entry->offset : invalidOffset;
</span><span class="cx"> }
</span><del>-
-ALWAYS_INLINE PropertyOffset Structure::get(VM& vm, const WTF::String& name)
-{
- ASSERT(!isCompilationThread());
- ASSERT(structure()->classInfo() == info());
- PropertyTable* propertyTable;
- materializePropertyMapIfNecessary(vm, propertyTable);
- if (!propertyTable)
- return invalidOffset;
-
- PropertyMapEntry* entry = propertyTable->findWithString(name.impl()).first;
- return entry ? entry->offset : invalidOffset;
-}
</del><span class="cx">
</span><span class="cx"> ALWAYS_INLINE PropertyOffset Structure::get(VM& vm, PropertyName propertyName, unsigned& attributes)
</span><span class="cx"> {
</span></span></pre>
</div>
</div>
</body>
</html>