<!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>[182747] 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/182747">182747</a></dd>
<dt>Author</dt> <dd>akling@apple.com</dd>
<dt>Date</dt> <dd>2015-04-13 12:12:48 -0700 (Mon, 13 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Don't segregate heap objects based on Structure immortality.
&lt;https://webkit.org/b/143638&gt;

Reviewed by Darin Adler.

Source/JavaScriptCore:

Put all objects that need a destructor call into the same MarkedBlock.
This reduces memory consumption in many situations, while improving locality,
since much more of the MarkedBlock space can be shared.

Instead of branching on the MarkedBlock type, we now check a bit in the
JSCell's inline type flags (StructureIsImmortal) to see whether it's safe
to access the cell's Structure during destruction or not.

Performance benchmarks look mostly neutral. Maybe a small regression on
SunSpider's date objects.

On the amazon.com landing page, this saves us 50 MarkedBlocks (3200kB) along
with a bunch of WeakBlocks that were hanging off of them. That's on the higher
end of savings we can get from this, but still a very real improvement.

Most of this patch is removing the &quot;hasImmortalStructure&quot; constant from JSCell
derived classes and passing that responsibility to the StructureIsImmortal flag.
StructureFlags is made public so that it's accessible from non-member functions.
I made sure to declare it everywhere and make classes final to try to make it
explicit what each class is doing to its inherited flags.

* API/JSCallbackConstructor.h:
* API/JSCallbackObject.h:
* bytecode/UnlinkedCodeBlock.h:
* debugger/DebuggerScope.h:
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileMakeRope):
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::LowerDFGToLLVM::compileMakeRope):
* heap/Heap.h:
(JSC::Heap::subspaceForObjectDestructor):
(JSC::Heap::allocatorForObjectWithDestructor):
(JSC::Heap::subspaceForObjectNormalDestructor): Deleted.
(JSC::Heap::subspaceForObjectsWithImmortalStructure): Deleted.
(JSC::Heap::allocatorForObjectWithNormalDestructor): Deleted.
(JSC::Heap::allocatorForObjectWithImmortalStructureDestructor): Deleted.
* heap/HeapInlines.h:
(JSC::Heap::allocateWithDestructor):
(JSC::Heap::allocateObjectOfType):
(JSC::Heap::subspaceForObjectOfType):
(JSC::Heap::allocatorForObjectOfType):
(JSC::Heap::allocateWithNormalDestructor): Deleted.
(JSC::Heap::allocateWithImmortalStructureDestructor): Deleted.
* heap/MarkedAllocator.cpp:
(JSC::MarkedAllocator::allocateBlock):
* heap/MarkedAllocator.h:
(JSC::MarkedAllocator::needsDestruction):
(JSC::MarkedAllocator::MarkedAllocator):
(JSC::MarkedAllocator::init):
(JSC::MarkedAllocator::destructorType): Deleted.
* heap/MarkedBlock.cpp:
(JSC::MarkedBlock::create):
(JSC::MarkedBlock::MarkedBlock):
(JSC::MarkedBlock::callDestructor):
(JSC::MarkedBlock::specializedSweep):
(JSC::MarkedBlock::sweep):
(JSC::MarkedBlock::sweepHelper):
* heap/MarkedBlock.h:
(JSC::MarkedBlock::needsDestruction):
(JSC::MarkedBlock::destructorType): Deleted.
* heap/MarkedSpace.cpp:
(JSC::MarkedSpace::MarkedSpace):
(JSC::MarkedSpace::resetAllocators):
(JSC::MarkedSpace::forEachAllocator):
(JSC::MarkedSpace::isPagedOut):
(JSC::MarkedSpace::clearNewlyAllocated):
* heap/MarkedSpace.h:
(JSC::MarkedSpace::subspaceForObjectsWithDestructor):
(JSC::MarkedSpace::destructorAllocatorFor):
(JSC::MarkedSpace::allocateWithDestructor):
(JSC::MarkedSpace::forEachBlock):
(JSC::MarkedSpace::subspaceForObjectsWithNormalDestructor): Deleted.
(JSC::MarkedSpace::subspaceForObjectsWithImmortalStructure): Deleted.
(JSC::MarkedSpace::immortalStructureDestructorAllocatorFor): Deleted.
(JSC::MarkedSpace::normalDestructorAllocatorFor): Deleted.
(JSC::MarkedSpace::allocateWithImmortalStructureDestructor): Deleted.
(JSC::MarkedSpace::allocateWithNormalDestructor): Deleted.
* inspector/JSInjectedScriptHost.h:
* inspector/JSInjectedScriptHostPrototype.h:
* inspector/JSJavaScriptCallFrame.h:
* inspector/JSJavaScriptCallFramePrototype.h:
* jsc.cpp:
* runtime/ArrayBufferNeuteringWatchpoint.h:
* runtime/ArrayConstructor.h:
* runtime/ArrayIteratorPrototype.h:
* runtime/BooleanPrototype.h:
* runtime/ClonedArguments.h:
* runtime/CustomGetterSetter.h:
* runtime/DateConstructor.h:
* runtime/DatePrototype.h:
* runtime/ErrorPrototype.h:
* runtime/ExceptionHelpers.h:
* runtime/Executable.h:
* runtime/GenericArguments.h:
* runtime/GetterSetter.h:
* runtime/InternalFunction.h:
* runtime/JSAPIValueWrapper.h:
* runtime/JSArgumentsIterator.h:
* runtime/JSArray.h:
* runtime/JSArrayBuffer.h:
* runtime/JSArrayBufferView.h:
* runtime/JSBoundFunction.h:
* runtime/JSCallee.h:
* runtime/JSCell.h:
* runtime/JSCellInlines.h:
(JSC::JSCell::classInfo):
* runtime/JSDataViewPrototype.h:
* runtime/JSEnvironmentRecord.h:
* runtime/JSFunction.h:
* runtime/JSGenericTypedArrayView.h:
* runtime/JSGlobalObject.h:
* runtime/JSLexicalEnvironment.h:
* runtime/JSNameScope.h:
* runtime/JSNotAnObject.h:
* runtime/JSONObject.h:
* runtime/JSObject.h:
(JSC::JSFinalObject::JSFinalObject):
* runtime/JSPromiseConstructor.h:
* runtime/JSPromiseDeferred.h:
* runtime/JSPromisePrototype.h:
* runtime/JSPromiseReaction.h:
* runtime/JSPropertyNameEnumerator.h:
* runtime/JSProxy.h:
* runtime/JSScope.h:
* runtime/JSString.h:
* runtime/JSSymbolTableObject.h:
* runtime/JSTypeInfo.h:
(JSC::TypeInfo::structureIsImmortal):
* runtime/MathObject.h:
* runtime/NumberConstructor.h:
* runtime/NumberPrototype.h:
* runtime/ObjectConstructor.h:
* runtime/PropertyMapHashTable.h:
* runtime/RegExp.h:
* runtime/RegExpConstructor.h:
* runtime/RegExpObject.h:
* runtime/RegExpPrototype.h:
* runtime/ScopedArgumentsTable.h:
* runtime/SparseArrayValueMap.h:
* runtime/StrictEvalActivation.h:
* runtime/StringConstructor.h:
* runtime/StringIteratorPrototype.h:
* runtime/StringObject.h:
* runtime/StringPrototype.h:
* runtime/Structure.cpp:
(JSC::Structure::Structure):
* runtime/Structure.h:
* runtime/StructureChain.h:
* runtime/StructureRareData.h:
* runtime/Symbol.h:
* runtime/SymbolPrototype.h:
* runtime/SymbolTable.h:
* runtime/WeakMapData.h:

Source/WebCore:

* bindings/js/JSDOMBinding.h:
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateHeader):
(GeneratePrototypeDeclaration):
* bridge/objc/objc_runtime.h:
* bridge/runtime_array.h:
* bridge/runtime_method.h:
* bridge/runtime_object.h:

Source/WebKit2:

* WebProcess/Plugins/Netscape/JSNPObject.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreAPIJSCallbackConstructorh">trunk/Source/JavaScriptCore/API/JSCallbackConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreAPIJSCallbackObjecth">trunk/Source/JavaScriptCore/API/JSCallbackObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh">trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggerScopeh">trunk/Source/JavaScriptCore/debugger/DebuggerScope.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLLowerDFGToLLVMcpp">trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeaph">trunk/Source/JavaScriptCore/heap/Heap.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapInlinesh">trunk/Source/JavaScriptCore/heap/HeapInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedAllocatorcpp">trunk/Source/JavaScriptCore/heap/MarkedAllocator.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedAllocatorh">trunk/Source/JavaScriptCore/heap/MarkedAllocator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedBlockcpp">trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedBlockh">trunk/Source/JavaScriptCore/heap/MarkedBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedSpacecpp">trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedSpaceh">trunk/Source/JavaScriptCore/heap/MarkedSpace.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorJSInjectedScriptHosth">trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHost.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorJSInjectedScriptHostPrototypeh">trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHostPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorJSJavaScriptCallFrameh">trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorJSJavaScriptCallFramePrototypeh">trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFramePrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeArrayBufferNeuteringWatchpointh">trunk/Source/JavaScriptCore/runtime/ArrayBufferNeuteringWatchpoint.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeArrayConstructorh">trunk/Source/JavaScriptCore/runtime/ArrayConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeArrayIteratorPrototypeh">trunk/Source/JavaScriptCore/runtime/ArrayIteratorPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeBooleanPrototypeh">trunk/Source/JavaScriptCore/runtime/BooleanPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeClonedArgumentsh">trunk/Source/JavaScriptCore/runtime/ClonedArguments.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCustomGetterSetterh">trunk/Source/JavaScriptCore/runtime/CustomGetterSetter.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeDateConstructorh">trunk/Source/JavaScriptCore/runtime/DateConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeDatePrototypeh">trunk/Source/JavaScriptCore/runtime/DatePrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeErrorPrototypeh">trunk/Source/JavaScriptCore/runtime/ErrorPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeExceptionHelpersh">trunk/Source/JavaScriptCore/runtime/ExceptionHelpers.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeExecutableh">trunk/Source/JavaScriptCore/runtime/Executable.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeGenericArgumentsh">trunk/Source/JavaScriptCore/runtime/GenericArguments.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeGetterSetterh">trunk/Source/JavaScriptCore/runtime/GetterSetter.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeInternalFunctionh">trunk/Source/JavaScriptCore/runtime/InternalFunction.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSAPIValueWrapperh">trunk/Source/JavaScriptCore/runtime/JSAPIValueWrapper.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSArgumentsIteratorh">trunk/Source/JavaScriptCore/runtime/JSArgumentsIterator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSArrayh">trunk/Source/JavaScriptCore/runtime/JSArray.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSArrayBufferh">trunk/Source/JavaScriptCore/runtime/JSArrayBuffer.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSArrayBufferViewh">trunk/Source/JavaScriptCore/runtime/JSArrayBufferView.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSBoundFunctionh">trunk/Source/JavaScriptCore/runtime/JSBoundFunction.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCalleeh">trunk/Source/JavaScriptCore/runtime/JSCallee.h</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="#trunkSourceJavaScriptCoreruntimeJSDataViewPrototypeh">trunk/Source/JavaScriptCore/runtime/JSDataViewPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSEnvironmentRecordh">trunk/Source/JavaScriptCore/runtime/JSEnvironmentRecord.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSFunctionh">trunk/Source/JavaScriptCore/runtime/JSFunction.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSGenericTypedArrayViewh">trunk/Source/JavaScriptCore/runtime/JSGenericTypedArrayView.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSGlobalObjecth">trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSLexicalEnvironmenth">trunk/Source/JavaScriptCore/runtime/JSLexicalEnvironment.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSNameScopeh">trunk/Source/JavaScriptCore/runtime/JSNameScope.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSNotAnObjecth">trunk/Source/JavaScriptCore/runtime/JSNotAnObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSONObjecth">trunk/Source/JavaScriptCore/runtime/JSONObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSObjecth">trunk/Source/JavaScriptCore/runtime/JSObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseConstructorh">trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseDeferredh">trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromisePrototypeh">trunk/Source/JavaScriptCore/runtime/JSPromisePrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseReactionh">trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPropertyNameEnumeratorh">trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSProxyh">trunk/Source/JavaScriptCore/runtime/JSProxy.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSScopeh">trunk/Source/JavaScriptCore/runtime/JSScope.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSStringh">trunk/Source/JavaScriptCore/runtime/JSString.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSSymbolTableObjecth">trunk/Source/JavaScriptCore/runtime/JSSymbolTableObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSTypeInfoh">trunk/Source/JavaScriptCore/runtime/JSTypeInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeMathObjecth">trunk/Source/JavaScriptCore/runtime/MathObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeNumberConstructorh">trunk/Source/JavaScriptCore/runtime/NumberConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeNumberPrototypeh">trunk/Source/JavaScriptCore/runtime/NumberPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeObjectConstructorh">trunk/Source/JavaScriptCore/runtime/ObjectConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimePropertyMapHashTableh">trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeRegExph">trunk/Source/JavaScriptCore/runtime/RegExp.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeRegExpConstructorh">trunk/Source/JavaScriptCore/runtime/RegExpConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeRegExpObjecth">trunk/Source/JavaScriptCore/runtime/RegExpObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeRegExpPrototypeh">trunk/Source/JavaScriptCore/runtime/RegExpPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeScopedArgumentsTableh">trunk/Source/JavaScriptCore/runtime/ScopedArgumentsTable.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeSparseArrayValueMaph">trunk/Source/JavaScriptCore/runtime/SparseArrayValueMap.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStrictEvalActivationh">trunk/Source/JavaScriptCore/runtime/StrictEvalActivation.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStringConstructorh">trunk/Source/JavaScriptCore/runtime/StringConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStringIteratorPrototypeh">trunk/Source/JavaScriptCore/runtime/StringIteratorPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStringObjecth">trunk/Source/JavaScriptCore/runtime/StringObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStringPrototypeh">trunk/Source/JavaScriptCore/runtime/StringPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructurecpp">trunk/Source/JavaScriptCore/runtime/Structure.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureh">trunk/Source/JavaScriptCore/runtime/Structure.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureChainh">trunk/Source/JavaScriptCore/runtime/StructureChain.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureRareDatah">trunk/Source/JavaScriptCore/runtime/StructureRareData.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeSymbolh">trunk/Source/JavaScriptCore/runtime/Symbol.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeSymbolPrototypeh">trunk/Source/JavaScriptCore/runtime/SymbolPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeSymbolTableh">trunk/Source/JavaScriptCore/runtime/SymbolTable.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeWeakMapDatah">trunk/Source/JavaScriptCore/runtime/WeakMapData.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMBindingh">trunk/Source/WebCore/bindings/js/JSDOMBinding.h</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCorebridgeobjcobjc_runtimeh">trunk/Source/WebCore/bridge/objc/objc_runtime.h</a></li>
<li><a href="#trunkSourceWebCorebridgeruntime_arrayh">trunk/Source/WebCore/bridge/runtime_array.h</a></li>
<li><a href="#trunkSourceWebCorebridgeruntime_methodh">trunk/Source/WebCore/bridge/runtime_method.h</a></li>
<li><a href="#trunkSourceWebCorebridgeruntime_objecth">trunk/Source/WebCore/bridge/runtime_object.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessPluginsNetscapeJSNPObjecth">trunk/Source/WebKit2/WebProcess/Plugins/Netscape/JSNPObject.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreAPIJSCallbackConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/API/JSCallbackConstructor.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/API/JSCallbackConstructor.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/API/JSCallbackConstructor.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> class JSCallbackConstructor : public JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | ImplementsHasInstance;
</ins><span class="cx"> 
</span><span class="cx">     static JSCallbackConstructor* create(ExecState* exec, JSGlobalObject* globalObject, Structure* structure, JSClassRef classRef, JSObjectCallAsConstructorCallback callback) 
</span><span class="cx">     {
</span><span class="lines">@@ -56,7 +57,6 @@
</span><span class="cx"> protected:
</span><span class="cx">     JSCallbackConstructor(JSGlobalObject*, Structure*, JSClassRef, JSObjectCallAsConstructorCallback);
</span><span class="cx">     void finishCreation(JSGlobalObject*, JSClassRef);
</span><del>-    static const unsigned StructureFlags = ImplementsHasInstance | JSObject::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     friend struct APICallbackFunction;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreAPIJSCallbackObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/API/JSCallbackObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/API/JSCallbackObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/API/JSCallbackObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -125,6 +125,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef Parent Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | ProhibitsPropertyCaching | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | ImplementsHasInstance | OverridesHasInstance | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     ~JSCallbackObject();
</span><span class="cx"> 
</span><span class="lines">@@ -170,9 +171,6 @@
</span><span class="cx"> 
</span><span class="cx">     using Parent::methodTable;
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = ProhibitsPropertyCaching | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | ImplementsHasInstance | OverridesHasInstance | OverridesGetPropertyNames | Parent::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     static String className(const JSObject*);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -1,3 +1,164 @@
</span><ins>+2015-04-13  Andreas Kling  &lt;akling@apple.com&gt;
+
+        Don't segregate heap objects based on Structure immortality.
+        &lt;https://webkit.org/b/143638&gt;
+
+        Reviewed by Darin Adler.
+
+        Put all objects that need a destructor call into the same MarkedBlock.
+        This reduces memory consumption in many situations, while improving locality,
+        since much more of the MarkedBlock space can be shared.
+
+        Instead of branching on the MarkedBlock type, we now check a bit in the
+        JSCell's inline type flags (StructureIsImmortal) to see whether it's safe
+        to access the cell's Structure during destruction or not.
+
+        Performance benchmarks look mostly neutral. Maybe a small regression on
+        SunSpider's date objects.
+
+        On the amazon.com landing page, this saves us 50 MarkedBlocks (3200kB) along
+        with a bunch of WeakBlocks that were hanging off of them. That's on the higher
+        end of savings we can get from this, but still a very real improvement.
+
+        Most of this patch is removing the &quot;hasImmortalStructure&quot; constant from JSCell
+        derived classes and passing that responsibility to the StructureIsImmortal flag.
+        StructureFlags is made public so that it's accessible from non-member functions.
+        I made sure to declare it everywhere and make classes final to try to make it
+        explicit what each class is doing to its inherited flags.
+
+        * API/JSCallbackConstructor.h:
+        * API/JSCallbackObject.h:
+        * bytecode/UnlinkedCodeBlock.h:
+        * debugger/DebuggerScope.h:
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::compileMakeRope):
+        * ftl/FTLLowerDFGToLLVM.cpp:
+        (JSC::FTL::LowerDFGToLLVM::compileMakeRope):
+        * heap/Heap.h:
+        (JSC::Heap::subspaceForObjectDestructor):
+        (JSC::Heap::allocatorForObjectWithDestructor):
+        (JSC::Heap::subspaceForObjectNormalDestructor): Deleted.
+        (JSC::Heap::subspaceForObjectsWithImmortalStructure): Deleted.
+        (JSC::Heap::allocatorForObjectWithNormalDestructor): Deleted.
+        (JSC::Heap::allocatorForObjectWithImmortalStructureDestructor): Deleted.
+        * heap/HeapInlines.h:
+        (JSC::Heap::allocateWithDestructor):
+        (JSC::Heap::allocateObjectOfType):
+        (JSC::Heap::subspaceForObjectOfType):
+        (JSC::Heap::allocatorForObjectOfType):
+        (JSC::Heap::allocateWithNormalDestructor): Deleted.
+        (JSC::Heap::allocateWithImmortalStructureDestructor): Deleted.
+        * heap/MarkedAllocator.cpp:
+        (JSC::MarkedAllocator::allocateBlock):
+        * heap/MarkedAllocator.h:
+        (JSC::MarkedAllocator::needsDestruction):
+        (JSC::MarkedAllocator::MarkedAllocator):
+        (JSC::MarkedAllocator::init):
+        (JSC::MarkedAllocator::destructorType): Deleted.
+        * heap/MarkedBlock.cpp:
+        (JSC::MarkedBlock::create):
+        (JSC::MarkedBlock::MarkedBlock):
+        (JSC::MarkedBlock::callDestructor):
+        (JSC::MarkedBlock::specializedSweep):
+        (JSC::MarkedBlock::sweep):
+        (JSC::MarkedBlock::sweepHelper):
+        * heap/MarkedBlock.h:
+        (JSC::MarkedBlock::needsDestruction):
+        (JSC::MarkedBlock::destructorType): Deleted.
+        * heap/MarkedSpace.cpp:
+        (JSC::MarkedSpace::MarkedSpace):
+        (JSC::MarkedSpace::resetAllocators):
+        (JSC::MarkedSpace::forEachAllocator):
+        (JSC::MarkedSpace::isPagedOut):
+        (JSC::MarkedSpace::clearNewlyAllocated):
+        * heap/MarkedSpace.h:
+        (JSC::MarkedSpace::subspaceForObjectsWithDestructor):
+        (JSC::MarkedSpace::destructorAllocatorFor):
+        (JSC::MarkedSpace::allocateWithDestructor):
+        (JSC::MarkedSpace::forEachBlock):
+        (JSC::MarkedSpace::subspaceForObjectsWithNormalDestructor): Deleted.
+        (JSC::MarkedSpace::subspaceForObjectsWithImmortalStructure): Deleted.
+        (JSC::MarkedSpace::immortalStructureDestructorAllocatorFor): Deleted.
+        (JSC::MarkedSpace::normalDestructorAllocatorFor): Deleted.
+        (JSC::MarkedSpace::allocateWithImmortalStructureDestructor): Deleted.
+        (JSC::MarkedSpace::allocateWithNormalDestructor): Deleted.
+        * inspector/JSInjectedScriptHost.h:
+        * inspector/JSInjectedScriptHostPrototype.h:
+        * inspector/JSJavaScriptCallFrame.h:
+        * inspector/JSJavaScriptCallFramePrototype.h:
+        * jsc.cpp:
+        * runtime/ArrayBufferNeuteringWatchpoint.h:
+        * runtime/ArrayConstructor.h:
+        * runtime/ArrayIteratorPrototype.h:
+        * runtime/BooleanPrototype.h:
+        * runtime/ClonedArguments.h:
+        * runtime/CustomGetterSetter.h:
+        * runtime/DateConstructor.h:
+        * runtime/DatePrototype.h:
+        * runtime/ErrorPrototype.h:
+        * runtime/ExceptionHelpers.h:
+        * runtime/Executable.h:
+        * runtime/GenericArguments.h:
+        * runtime/GetterSetter.h:
+        * runtime/InternalFunction.h:
+        * runtime/JSAPIValueWrapper.h:
+        * runtime/JSArgumentsIterator.h:
+        * runtime/JSArray.h:
+        * runtime/JSArrayBuffer.h:
+        * runtime/JSArrayBufferView.h:
+        * runtime/JSBoundFunction.h:
+        * runtime/JSCallee.h:
+        * runtime/JSCell.h:
+        * runtime/JSCellInlines.h:
+        (JSC::JSCell::classInfo):
+        * runtime/JSDataViewPrototype.h:
+        * runtime/JSEnvironmentRecord.h:
+        * runtime/JSFunction.h:
+        * runtime/JSGenericTypedArrayView.h:
+        * runtime/JSGlobalObject.h:
+        * runtime/JSLexicalEnvironment.h:
+        * runtime/JSNameScope.h:
+        * runtime/JSNotAnObject.h:
+        * runtime/JSONObject.h:
+        * runtime/JSObject.h:
+        (JSC::JSFinalObject::JSFinalObject):
+        * runtime/JSPromiseConstructor.h:
+        * runtime/JSPromiseDeferred.h:
+        * runtime/JSPromisePrototype.h:
+        * runtime/JSPromiseReaction.h:
+        * runtime/JSPropertyNameEnumerator.h:
+        * runtime/JSProxy.h:
+        * runtime/JSScope.h:
+        * runtime/JSString.h:
+        * runtime/JSSymbolTableObject.h:
+        * runtime/JSTypeInfo.h:
+        (JSC::TypeInfo::structureIsImmortal):
+        * runtime/MathObject.h:
+        * runtime/NumberConstructor.h:
+        * runtime/NumberPrototype.h:
+        * runtime/ObjectConstructor.h:
+        * runtime/PropertyMapHashTable.h:
+        * runtime/RegExp.h:
+        * runtime/RegExpConstructor.h:
+        * runtime/RegExpObject.h:
+        * runtime/RegExpPrototype.h:
+        * runtime/ScopedArgumentsTable.h:
+        * runtime/SparseArrayValueMap.h:
+        * runtime/StrictEvalActivation.h:
+        * runtime/StringConstructor.h:
+        * runtime/StringIteratorPrototype.h:
+        * runtime/StringObject.h:
+        * runtime/StringPrototype.h:
+        * runtime/Structure.cpp:
+        (JSC::Structure::Structure):
+        * runtime/Structure.h:
+        * runtime/StructureChain.h:
+        * runtime/StructureRareData.h:
+        * runtime/Symbol.h:
+        * runtime/SymbolPrototype.h:
+        * runtime/SymbolTable.h:
+        * runtime/WeakMapData.h:
+
</ins><span class="cx"> 2015-04-13  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         DFG inlining of op_call_varargs should keep the callee alive in case of OSR exit.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -97,12 +97,15 @@
</span><span class="cx">     UnlinkedBuiltinFunction,
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class UnlinkedFunctionExecutable : public JSCell {
</del><ins>+class UnlinkedFunctionExecutable final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     friend class BuiltinExecutables;
</span><span class="cx">     friend class CodeCache;
</span><span class="cx">     friend class VM;
</span><ins>+
</ins><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
+
</ins><span class="cx">     static UnlinkedFunctionExecutable* create(VM* vm, const SourceCode&amp; source, FunctionBodyNode* node, UnlinkedFunctionKind unlinkedFunctionKind, RefPtr&lt;SourceProvider&gt;&amp;&amp; sourceOverride = nullptr)
</span><span class="cx">     {
</span><span class="cx">         UnlinkedFunctionExecutable* instance = new (NotNull, allocateCell&lt;UnlinkedFunctionExecutable&gt;(vm-&gt;heap))
</span><span class="lines">@@ -162,7 +165,6 @@
</span><span class="cx">     bool hasCapturedVariables() const { return m_hasCapturedVariables; }
</span><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     bool isBuiltinFunction() const { return m_isBuiltinFunction; }
</span><span class="lines">@@ -214,8 +216,6 @@
</span><span class="cx">         return Structure::create(vm, globalObject, proto, TypeInfo(UnlinkedFunctionExecutableType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = StructureIsImmortal | JSCell::StructureFlags;
-
</del><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -267,8 +267,9 @@
</span><span class="cx"> class UnlinkedCodeBlock : public JSCell {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
+
</ins><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx"> 
</span><span class="cx">     enum { CallFunction, ApplyFunction };
</span><span class="cx"> 
</span><span class="lines">@@ -604,8 +605,6 @@
</span><span class="cx">     Vector&lt;size_t&gt; m_opProfileControlFlowBytecodeOffsets;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-
-    static const unsigned StructureFlags = StructureIsImmortal | Base::StructureFlags;
</del><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="lines">@@ -625,7 +624,7 @@
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class UnlinkedProgramCodeBlock : public UnlinkedGlobalCodeBlock {
</del><ins>+class UnlinkedProgramCodeBlock final : public UnlinkedGlobalCodeBlock {
</ins><span class="cx"> private:
</span><span class="cx">     friend class CodeCache;
</span><span class="cx">     static UnlinkedProgramCodeBlock* create(VM* vm, const ExecutableInfo&amp; info)
</span><span class="lines">@@ -637,6 +636,8 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef UnlinkedGlobalCodeBlock Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
+
</ins><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     void addFunctionDeclaration(VM&amp; vm, const Identifier&amp; name, UnlinkedFunctionExecutable* functionExecutable)
</span><span class="lines">@@ -675,7 +676,7 @@
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class UnlinkedEvalCodeBlock : public UnlinkedGlobalCodeBlock {
</del><ins>+class UnlinkedEvalCodeBlock final : public UnlinkedGlobalCodeBlock {
</ins><span class="cx"> private:
</span><span class="cx">     friend class CodeCache;
</span><span class="cx"> 
</span><span class="lines">@@ -688,6 +689,8 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef UnlinkedGlobalCodeBlock Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
+
</ins><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     const Identifier&amp; variable(unsigned index) { return m_variables[index]; }
</span><span class="lines">@@ -715,8 +718,11 @@
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class UnlinkedFunctionCodeBlock : public UnlinkedCodeBlock {
</del><ins>+class UnlinkedFunctionCodeBlock final : public UnlinkedCodeBlock {
</ins><span class="cx"> public:
</span><ins>+    typedef UnlinkedCodeBlock Base;
+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
+
</ins><span class="cx">     static UnlinkedFunctionCodeBlock* create(VM* vm, CodeType codeType, const ExecutableInfo&amp; info)
</span><span class="cx">     {
</span><span class="cx">         UnlinkedFunctionCodeBlock* instance = new (NotNull, allocateCell&lt;UnlinkedFunctionCodeBlock&gt;(vm-&gt;heap)) UnlinkedFunctionCodeBlock(vm, vm-&gt;unlinkedFunctionCodeBlockStructure.get(), codeType, info);
</span><span class="lines">@@ -724,7 +730,6 @@
</span><span class="cx">         return instance;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    typedef UnlinkedCodeBlock Base;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggerScopeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/DebuggerScope.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/DebuggerScope.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/debugger/DebuggerScope.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> class DebuggerScope : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static DebuggerScope* create(VM&amp; vm, JSScope* scope)
</span><span class="cx">     {
</span><span class="lines">@@ -98,8 +99,6 @@
</span><span class="cx"> 
</span><span class="cx">     JSScope* jsScope() const { return m_scope.get(); }
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSObject::StructureFlags;
-
</del><span class="cx">     WriteBarrier&lt;JSScope&gt; m_scope;
</span><span class="cx">     WriteBarrier&lt;DebuggerScope&gt; m_next;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -2795,7 +2795,7 @@
</span><span class="cx">     GPRReg scratchGPR = scratch.gpr();
</span><span class="cx">     
</span><span class="cx">     JITCompiler::JumpList slowPath;
</span><del>-    MarkedAllocator&amp; markedAllocator = m_jit.vm()-&gt;heap.allocatorForObjectWithImmortalStructureDestructor(sizeof(JSRopeString));
</del><ins>+    MarkedAllocator&amp; markedAllocator = m_jit.vm()-&gt;heap.allocatorForObjectWithDestructor(sizeof(JSRopeString));
</ins><span class="cx">     m_jit.move(TrustedImmPtr(&amp;markedAllocator), allocatorGPR);
</span><span class="cx">     emitAllocateJSCell(resultGPR, allocatorGPR, TrustedImmPtr(m_jit.vm()-&gt;stringStructure.get()), scratchGPR, slowPath);
</span><span class="cx">         
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLLowerDFGToLLVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -3419,7 +3419,7 @@
</span><span class="cx">         LBasicBlock lastNext = m_out.insertNewBlocksBefore(slowPath);
</span><span class="cx">         
</span><span class="cx">         MarkedAllocator&amp; allocator =
</span><del>-            vm().heap.allocatorForObjectWithImmortalStructureDestructor(sizeof(JSRopeString));
</del><ins>+            vm().heap.allocatorForObjectWithDestructor(sizeof(JSRopeString));
</ins><span class="cx">         
</span><span class="cx">         LValue result = allocateCell(
</span><span class="cx">             m_out.constIntPtr(&amp;allocator),
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/heap/Heap.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -137,12 +137,10 @@
</span><span class="cx">     // true if an allocation or collection is in progress
</span><span class="cx">     bool isBusy();
</span><span class="cx">     MarkedSpace::Subspace&amp; subspaceForObjectWithoutDestructor() { return m_objectSpace.subspaceForObjectsWithoutDestructor(); }
</span><del>-    MarkedSpace::Subspace&amp; subspaceForObjectNormalDestructor() { return m_objectSpace.subspaceForObjectsWithNormalDestructor(); }
-    MarkedSpace::Subspace&amp; subspaceForObjectsWithImmortalStructure() { return m_objectSpace.subspaceForObjectsWithImmortalStructure(); }
</del><ins>+    MarkedSpace::Subspace&amp; subspaceForObjectDestructor() { return m_objectSpace.subspaceForObjectsWithDestructor(); }
</ins><span class="cx">     template&lt;typename ClassType&gt; MarkedSpace::Subspace&amp; subspaceForObjectOfType();
</span><span class="cx">     MarkedAllocator&amp; allocatorForObjectWithoutDestructor(size_t bytes) { return m_objectSpace.allocatorFor(bytes); }
</span><del>-    MarkedAllocator&amp; allocatorForObjectWithNormalDestructor(size_t bytes) { return m_objectSpace.normalDestructorAllocatorFor(bytes); }
-    MarkedAllocator&amp; allocatorForObjectWithImmortalStructureDestructor(size_t bytes) { return m_objectSpace.immortalStructureDestructorAllocatorFor(bytes); }
</del><ins>+    MarkedAllocator&amp; allocatorForObjectWithDestructor(size_t bytes) { return m_objectSpace.destructorAllocatorFor(bytes); }
</ins><span class="cx">     template&lt;typename ClassType&gt; MarkedAllocator&amp; allocatorForObjectOfType(size_t bytes);
</span><span class="cx">     CopiedAllocator&amp; storageAllocator() { return m_storageSpace.allocator(); }
</span><span class="cx">     CheckedBoolean tryAllocateStorage(JSCell* intendedOwner, size_t, void**);
</span><span class="lines">@@ -266,8 +264,7 @@
</span><span class="cx">     template&lt;typename T&gt; friend void* allocateCell(Heap&amp;);
</span><span class="cx">     template&lt;typename T&gt; friend void* allocateCell(Heap&amp;, size_t);
</span><span class="cx"> 
</span><del>-    void* allocateWithImmortalStructureDestructor(size_t); // For use with special objects whose Structures never die.
-    void* allocateWithNormalDestructor(size_t); // For use with objects that inherit directly or indirectly from JSDestructibleObject.
</del><ins>+    void* allocateWithDestructor(size_t); // For use with objects with destructors.
</ins><span class="cx">     void* allocateWithoutDestructor(size_t); // For use with objects without destructors.
</span><span class="cx">     template&lt;typename ClassType&gt; void* allocateObjectOfType(size_t); // Chooses one of the methods above based on type.
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/HeapInlines.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/HeapInlines.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/heap/HeapInlines.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -209,24 +209,15 @@
</span><span class="cx">     return m_codeBlocks.iterate&lt;Functor&gt;(functor);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void* Heap::allocateWithNormalDestructor(size_t bytes)
</del><ins>+inline void* Heap::allocateWithDestructor(size_t bytes)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(ALLOCATION_LOGGING)
</span><span class="cx">     dataLogF(&quot;JSC GC allocating %lu bytes with normal destructor.\n&quot;, bytes);
</span><span class="cx"> #endif
</span><span class="cx">     ASSERT(isValidAllocation(bytes));
</span><del>-    return m_objectSpace.allocateWithNormalDestructor(bytes);
</del><ins>+    return m_objectSpace.allocateWithDestructor(bytes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void* Heap::allocateWithImmortalStructureDestructor(size_t bytes)
-{
-#if ENABLE(ALLOCATION_LOGGING)
-    dataLogF(&quot;JSC GC allocating %lu bytes with immortal structure destructor.\n&quot;, bytes);
-#endif
-    ASSERT(isValidAllocation(bytes));
-    return m_objectSpace.allocateWithImmortalStructureDestructor(bytes);
-}
-
</del><span class="cx"> inline void* Heap::allocateWithoutDestructor(size_t bytes)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(ALLOCATION_LOGGING)
</span><span class="lines">@@ -240,12 +231,10 @@
</span><span class="cx"> void* Heap::allocateObjectOfType(size_t bytes)
</span><span class="cx"> {
</span><span class="cx">     // JSCell::classInfo() expects objects allocated with normal destructor to derive from JSDestructibleObject.
</span><del>-    ASSERT((!ClassType::needsDestruction || ClassType::hasImmortalStructure || std::is_convertible&lt;ClassType, JSDestructibleObject&gt;::value));
</del><ins>+    ASSERT((!ClassType::needsDestruction || (ClassType::StructureFlags &amp; StructureIsImmortal) || std::is_convertible&lt;ClassType, JSDestructibleObject&gt;::value));
</ins><span class="cx"> 
</span><del>-    if (ClassType::needsDestruction &amp;&amp; ClassType::hasImmortalStructure)
-        return allocateWithImmortalStructureDestructor(bytes);
</del><span class="cx">     if (ClassType::needsDestruction)
</span><del>-        return allocateWithNormalDestructor(bytes);
</del><ins>+        return allocateWithDestructor(bytes);
</ins><span class="cx">     return allocateWithoutDestructor(bytes);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -253,12 +242,10 @@
</span><span class="cx"> MarkedSpace::Subspace&amp; Heap::subspaceForObjectOfType()
</span><span class="cx"> {
</span><span class="cx">     // JSCell::classInfo() expects objects allocated with normal destructor to derive from JSDestructibleObject.
</span><del>-    ASSERT((!ClassType::needsDestruction || ClassType::hasImmortalStructure || std::is_convertible&lt;ClassType, JSDestructibleObject&gt;::value));
</del><ins>+    ASSERT((!ClassType::needsDestruction || (ClassType::StructureFlags &amp; StructureIsImmortal) || std::is_convertible&lt;ClassType, JSDestructibleObject&gt;::value));
</ins><span class="cx">     
</span><del>-    if (ClassType::needsDestruction &amp;&amp; ClassType::hasImmortalStructure)
-        return subspaceForObjectsWithImmortalStructure();
</del><span class="cx">     if (ClassType::needsDestruction)
</span><del>-        return subspaceForObjectNormalDestructor();
</del><ins>+        return subspaceForObjectDestructor();
</ins><span class="cx">     return subspaceForObjectWithoutDestructor();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -266,12 +253,10 @@
</span><span class="cx"> MarkedAllocator&amp; Heap::allocatorForObjectOfType(size_t bytes)
</span><span class="cx"> {
</span><span class="cx">     // JSCell::classInfo() expects objects allocated with normal destructor to derive from JSDestructibleObject.
</span><del>-    ASSERT((!ClassType::needsDestruction || ClassType::hasImmortalStructure || std::is_convertible&lt;ClassType, JSDestructibleObject&gt;::value));
</del><ins>+    ASSERT((!ClassType::needsDestruction || (ClassType::StructureFlags &amp; StructureIsImmortal) || std::is_convertible&lt;ClassType, JSDestructibleObject&gt;::value));
</ins><span class="cx">     
</span><del>-    if (ClassType::needsDestruction &amp;&amp; ClassType::hasImmortalStructure)
-        return allocatorForObjectWithImmortalStructureDestructor(bytes);
</del><span class="cx">     if (ClassType::needsDestruction)
</span><del>-        return allocatorForObjectWithNormalDestructor(bytes);
</del><ins>+        return allocatorForObjectWithDestructor(bytes);
</ins><span class="cx">     return allocatorForObjectWithoutDestructor(bytes);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedAllocatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedAllocator.cpp (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedAllocator.cpp        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/heap/MarkedAllocator.cpp        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -180,7 +180,7 @@
</span><span class="cx"> 
</span><span class="cx">     size_t cellSize = m_cellSize ? m_cellSize : WTF::roundUpToMultipleOf&lt;MarkedBlock::atomSize&gt;(bytes);
</span><span class="cx"> 
</span><del>-    return MarkedBlock::create(this, blockSize, cellSize, m_destructorType);
</del><ins>+    return MarkedBlock::create(this, blockSize, cellSize, m_needsDestruction);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MarkedAllocator::addBlock(MarkedBlock* block)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedAllocatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedAllocator.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedAllocator.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/heap/MarkedAllocator.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx">     void stopAllocating();
</span><span class="cx">     void resumeAllocating();
</span><span class="cx">     size_t cellSize() { return m_cellSize; }
</span><del>-    MarkedBlock::DestructorType destructorType() { return m_destructorType; }
</del><ins>+    bool needsDestruction() { return m_needsDestruction; }
</ins><span class="cx">     void* allocate(size_t);
</span><span class="cx">     Heap* heap() { return m_heap; }
</span><span class="cx">     MarkedBlock* takeLastActiveBlock()
</span><span class="lines">@@ -40,7 +40,7 @@
</span><span class="cx">     
</span><span class="cx">     void addBlock(MarkedBlock*);
</span><span class="cx">     void removeBlock(MarkedBlock*);
</span><del>-    void init(Heap*, MarkedSpace*, size_t cellSize, MarkedBlock::DestructorType);
</del><ins>+    void init(Heap*, MarkedSpace*, size_t cellSize, bool needsDestruction);
</ins><span class="cx"> 
</span><span class="cx">     bool isPagedOut(double deadline);
</span><span class="cx">    
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx">     DoublyLinkedList&lt;MarkedBlock&gt; m_blockList;
</span><span class="cx">     DoublyLinkedList&lt;MarkedBlock&gt; m_retiredBlocks;
</span><span class="cx">     size_t m_cellSize;
</span><del>-    MarkedBlock::DestructorType m_destructorType;
</del><ins>+    bool m_needsDestruction { false };
</ins><span class="cx">     Heap* m_heap;
</span><span class="cx">     MarkedSpace* m_markedSpace;
</span><span class="cx"> };
</span><span class="lines">@@ -74,18 +74,17 @@
</span><span class="cx">     , m_lastActiveBlock(0)
</span><span class="cx">     , m_nextBlockToSweep(0)
</span><span class="cx">     , m_cellSize(0)
</span><del>-    , m_destructorType(MarkedBlock::None)
</del><span class="cx">     , m_heap(0)
</span><span class="cx">     , m_markedSpace(0)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void MarkedAllocator::init(Heap* heap, MarkedSpace* markedSpace, size_t cellSize, MarkedBlock::DestructorType destructorType)
</del><ins>+inline void MarkedAllocator::init(Heap* heap, MarkedSpace* markedSpace, size_t cellSize, bool needsDestruction)
</ins><span class="cx"> {
</span><span class="cx">     m_heap = heap;
</span><span class="cx">     m_markedSpace = markedSpace;
</span><span class="cx">     m_cellSize = cellSize;
</span><del>-    m_destructorType = destructorType;
</del><ins>+    m_needsDestruction = needsDestruction;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void* MarkedAllocator::allocate(size_t bytes)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,9 +33,9 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-MarkedBlock* MarkedBlock::create(MarkedAllocator* allocator, size_t capacity, size_t cellSize, DestructorType destructorType)
</del><ins>+MarkedBlock* MarkedBlock::create(MarkedAllocator* allocator, size_t capacity, size_t cellSize, bool needsDestruction)
</ins><span class="cx"> {
</span><del>-    return new (NotNull, fastAlignedMalloc(blockSize, capacity)) MarkedBlock(allocator, capacity, cellSize, destructorType);
</del><ins>+    return new (NotNull, fastAlignedMalloc(blockSize, capacity)) MarkedBlock(allocator, capacity, cellSize, needsDestruction);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MarkedBlock::destroy(MarkedBlock* block)
</span><span class="lines">@@ -44,12 +44,12 @@
</span><span class="cx">     fastAlignedFree(block);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-MarkedBlock::MarkedBlock(MarkedAllocator* allocator, size_t capacity, size_t cellSize, DestructorType destructorType)
</del><ins>+MarkedBlock::MarkedBlock(MarkedAllocator* allocator, size_t capacity, size_t cellSize, bool needsDestruction)
</ins><span class="cx">     : DoublyLinkedListNode&lt;MarkedBlock&gt;()
</span><span class="cx">     , m_atomsPerCell((cellSize + atomSize - 1) / atomSize)
</span><span class="cx">     , m_endAtom((allocator-&gt;cellSize() ? atomsPerBlock : capacity / atomSize) - m_atomsPerCell + 1)
</span><span class="cx">     , m_capacity(capacity)
</span><del>-    , m_destructorType(destructorType)
</del><ins>+    , m_needsDestruction(needsDestruction)
</ins><span class="cx">     , m_allocator(allocator)
</span><span class="cx">     , m_state(New) // All cells start out unmarked.
</span><span class="cx">     , m_weakSet(allocator-&gt;heap()-&gt;vm())
</span><span class="lines">@@ -58,7 +58,6 @@
</span><span class="cx">     HEAP_LOG_BLOCK_STATE_TRANSITION(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;MarkedBlock::DestructorType dtorType&gt;
</del><span class="cx"> inline void MarkedBlock::callDestructor(JSCell* cell)
</span><span class="cx"> {
</span><span class="cx">     // A previous eager sweep may already have run cell's destructor.
</span><span class="lines">@@ -66,20 +65,20 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     ASSERT(cell-&gt;structureID());
</span><del>-    if (dtorType == MarkedBlock::Normal)
-        jsCast&lt;JSDestructibleObject*&gt;(cell)-&gt;classInfo()-&gt;methodTable.destroy(cell);
-    else
</del><ins>+    if (cell-&gt;inlineTypeFlags() &amp; StructureIsImmortal)
</ins><span class="cx">         cell-&gt;structure(*vm())-&gt;classInfo()-&gt;methodTable.destroy(cell);
</span><ins>+    else
+        jsCast&lt;JSDestructibleObject*&gt;(cell)-&gt;classInfo()-&gt;methodTable.destroy(cell);
</ins><span class="cx">     cell-&gt;zap();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;MarkedBlock::BlockState blockState, MarkedBlock::SweepMode sweepMode, MarkedBlock::DestructorType dtorType&gt;
</del><ins>+template&lt;MarkedBlock::BlockState blockState, MarkedBlock::SweepMode sweepMode, bool callDestructors&gt;
</ins><span class="cx"> MarkedBlock::FreeList MarkedBlock::specializedSweep()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(blockState != Allocated &amp;&amp; blockState != FreeListed);
</span><del>-    ASSERT(!(dtorType == MarkedBlock::None &amp;&amp; sweepMode == SweepOnly));
</del><ins>+    ASSERT(!(!callDestructors &amp;&amp; sweepMode == SweepOnly));
</ins><span class="cx"> 
</span><del>-    SamplingRegion samplingRegion((dtorType != MarkedBlock::None &amp;&amp; blockState != New) ? &quot;Calling destructors&quot; : &quot;sweeping&quot;);
</del><ins>+    SamplingRegion samplingRegion((!callDestructors &amp;&amp; blockState != New) ? &quot;Calling destructors&quot; : &quot;sweeping&quot;);
</ins><span class="cx">     
</span><span class="cx">     // This produces a free list that is ordered in reverse through the block.
</span><span class="cx">     // This is fine, since the allocation code makes no assumptions about the
</span><span class="lines">@@ -92,8 +91,8 @@
</span><span class="cx"> 
</span><span class="cx">         JSCell* cell = reinterpret_cast_ptr&lt;JSCell*&gt;(&amp;atoms()[i]);
</span><span class="cx"> 
</span><del>-        if (dtorType != MarkedBlock::None &amp;&amp; blockState != New)
-            callDestructor&lt;dtorType&gt;(cell);
</del><ins>+        if (callDestructors &amp;&amp; blockState != New)
+            callDestructor(cell);
</ins><span class="cx"> 
</span><span class="cx">         if (sweepMode == SweepToFreeList) {
</span><span class="cx">             FreeCell* freeCell = reinterpret_cast&lt;FreeCell*&gt;(cell);
</span><span class="lines">@@ -118,23 +117,21 @@
</span><span class="cx"> 
</span><span class="cx">     m_weakSet.sweep();
</span><span class="cx"> 
</span><del>-    if (sweepMode == SweepOnly &amp;&amp; m_destructorType == MarkedBlock::None)
</del><ins>+    if (sweepMode == SweepOnly &amp;&amp; !m_needsDestruction)
</ins><span class="cx">         return FreeList();
</span><span class="cx"> 
</span><del>-    if (m_destructorType == MarkedBlock::ImmortalStructure)
-        return sweepHelper&lt;MarkedBlock::ImmortalStructure&gt;(sweepMode);
-    if (m_destructorType == MarkedBlock::Normal)
-        return sweepHelper&lt;MarkedBlock::Normal&gt;(sweepMode);
-    return sweepHelper&lt;MarkedBlock::None&gt;(sweepMode);
</del><ins>+    if (m_needsDestruction)
+        return sweepHelper&lt;true&gt;(sweepMode);
+    return sweepHelper&lt;false&gt;(sweepMode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;MarkedBlock::DestructorType dtorType&gt;
</del><ins>+template&lt;bool callDestructors&gt;
</ins><span class="cx"> MarkedBlock::FreeList MarkedBlock::sweepHelper(SweepMode sweepMode)
</span><span class="cx"> {
</span><span class="cx">     switch (m_state) {
</span><span class="cx">     case New:
</span><span class="cx">         ASSERT(sweepMode == SweepToFreeList);
</span><del>-        return specializedSweep&lt;New, SweepToFreeList, dtorType&gt;();
</del><ins>+        return specializedSweep&lt;New, SweepToFreeList, callDestructors&gt;();
</ins><span class="cx">     case FreeListed:
</span><span class="cx">         // Happens when a block transitions to fully allocated.
</span><span class="cx">         ASSERT(sweepMode == SweepToFreeList);
</span><span class="lines">@@ -145,8 +142,8 @@
</span><span class="cx">         return FreeList();
</span><span class="cx">     case Marked:
</span><span class="cx">         return sweepMode == SweepToFreeList
</span><del>-            ? specializedSweep&lt;Marked, SweepToFreeList, dtorType&gt;()
-            : specializedSweep&lt;Marked, SweepOnly, dtorType&gt;();
</del><ins>+            ? specializedSweep&lt;Marked, SweepToFreeList, callDestructors&gt;()
+            : specializedSweep&lt;Marked, SweepOnly, callDestructors&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     RELEASE_ASSERT_NOT_REACHED();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedBlock.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedBlock.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/heap/MarkedBlock.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -111,8 +111,7 @@
</span><span class="cx">             ReturnType m_count;
</span><span class="cx">         };
</span><span class="cx"> 
</span><del>-        enum DestructorType { None, ImmortalStructure, Normal };
-        static MarkedBlock* create(MarkedAllocator*, size_t capacity, size_t cellSize, DestructorType);
</del><ins>+        static MarkedBlock* create(MarkedAllocator*, size_t capacity, size_t cellSize, bool needsDestruction);
</ins><span class="cx">         static void destroy(MarkedBlock*);
</span><span class="cx"> 
</span><span class="cx">         static bool isAtomAligned(const void*);
</span><span class="lines">@@ -155,7 +154,7 @@
</span><span class="cx">         bool isEmpty();
</span><span class="cx"> 
</span><span class="cx">         size_t cellSize();
</span><del>-        DestructorType destructorType();
</del><ins>+        bool needsDestruction() const;
</ins><span class="cx"> 
</span><span class="cx">         size_t size();
</span><span class="cx">         size_t capacity();
</span><span class="lines">@@ -190,15 +189,15 @@
</span><span class="cx">         static const size_t atomAlignmentMask = atomSize - 1; // atomSize must be a power of two.
</span><span class="cx"> 
</span><span class="cx">         enum BlockState { New, FreeListed, Allocated, Marked, Retired };
</span><del>-        template&lt;DestructorType&gt; FreeList sweepHelper(SweepMode = SweepOnly);
</del><ins>+        template&lt;bool callDestructors&gt; FreeList sweepHelper(SweepMode = SweepOnly);
</ins><span class="cx"> 
</span><span class="cx">         typedef char Atom[atomSize];
</span><span class="cx"> 
</span><del>-        MarkedBlock(MarkedAllocator*, size_t capacity, size_t cellSize, DestructorType);
</del><ins>+        MarkedBlock(MarkedAllocator*, size_t capacity, size_t cellSize, bool needsDestruction);
</ins><span class="cx">         Atom* atoms();
</span><span class="cx">         size_t atomNumber(const void*);
</span><del>-        template&lt;DestructorType&gt; void callDestructor(JSCell*);
-        template&lt;BlockState, SweepMode, DestructorType&gt; FreeList specializedSweep();
</del><ins>+        void callDestructor(JSCell*);
+        template&lt;BlockState, SweepMode, bool callDestructors&gt; FreeList specializedSweep();
</ins><span class="cx">         
</span><span class="cx">         MarkedBlock* m_prev;
</span><span class="cx">         MarkedBlock* m_next;
</span><span class="lines">@@ -215,7 +214,7 @@
</span><span class="cx">         std::unique_ptr&lt;WTF::Bitmap&lt;atomsPerBlock&gt;&gt; m_newlyAllocated;
</span><span class="cx"> 
</span><span class="cx">         size_t m_capacity;
</span><del>-        DestructorType m_destructorType;
</del><ins>+        bool m_needsDestruction;
</ins><span class="cx">         MarkedAllocator* m_allocator;
</span><span class="cx">         BlockState m_state;
</span><span class="cx">         WeakSet m_weakSet;
</span><span class="lines">@@ -325,9 +324,9 @@
</span><span class="cx">         return m_atomsPerCell * atomSize;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inline MarkedBlock::DestructorType MarkedBlock::destructorType()
</del><ins>+    inline bool MarkedBlock::needsDestruction() const
</ins><span class="cx">     {
</span><del>-        return m_destructorType; 
</del><ins>+        return m_needsDestruction;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     inline size_t MarkedBlock::size()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedSpacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -83,20 +83,17 @@
</span><span class="cx">     , m_isIterating(false)
</span><span class="cx"> {
</span><span class="cx">     for (size_t cellSize = preciseStep; cellSize &lt;= preciseCutoff; cellSize += preciseStep) {
</span><del>-        allocatorFor(cellSize).init(heap, this, cellSize, MarkedBlock::None);
-        normalDestructorAllocatorFor(cellSize).init(heap, this, cellSize, MarkedBlock::Normal);
-        immortalStructureDestructorAllocatorFor(cellSize).init(heap, this, cellSize, MarkedBlock::ImmortalStructure);
</del><ins>+        allocatorFor(cellSize).init(heap, this, cellSize, false);
+        destructorAllocatorFor(cellSize).init(heap, this, cellSize, true);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (size_t cellSize = impreciseStep; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</span><del>-        allocatorFor(cellSize).init(heap, this, cellSize, MarkedBlock::None);
-        normalDestructorAllocatorFor(cellSize).init(heap, this, cellSize, MarkedBlock::Normal);
-        immortalStructureDestructorAllocatorFor(cellSize).init(heap, this, cellSize, MarkedBlock::ImmortalStructure);
</del><ins>+        allocatorFor(cellSize).init(heap, this, cellSize, false);
+        destructorAllocatorFor(cellSize).init(heap, this, cellSize, true);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_normalSpace.largeAllocator.init(heap, this, 0, MarkedBlock::None);
-    m_normalDestructorSpace.largeAllocator.init(heap, this, 0, MarkedBlock::Normal);
-    m_immortalStructureDestructorSpace.largeAllocator.init(heap, this, 0, MarkedBlock::ImmortalStructure);
</del><ins>+    m_normalSpace.largeAllocator.init(heap, this, 0, false);
+    m_destructorSpace.largeAllocator.init(heap, this, 0, true);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> MarkedSpace::~MarkedSpace()
</span><span class="lines">@@ -134,19 +131,16 @@
</span><span class="cx"> {
</span><span class="cx">     for (size_t cellSize = preciseStep; cellSize &lt;= preciseCutoff; cellSize += preciseStep) {
</span><span class="cx">         allocatorFor(cellSize).reset();
</span><del>-        normalDestructorAllocatorFor(cellSize).reset();
-        immortalStructureDestructorAllocatorFor(cellSize).reset();
</del><ins>+        destructorAllocatorFor(cellSize).reset();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (size_t cellSize = impreciseStep; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</span><span class="cx">         allocatorFor(cellSize).reset();
</span><del>-        normalDestructorAllocatorFor(cellSize).reset();
-        immortalStructureDestructorAllocatorFor(cellSize).reset();
</del><ins>+        destructorAllocatorFor(cellSize).reset();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     m_normalSpace.largeAllocator.reset();
</span><del>-    m_normalDestructorSpace.largeAllocator.reset();
-    m_immortalStructureDestructorSpace.largeAllocator.reset();
</del><ins>+    m_destructorSpace.largeAllocator.reset();
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(GGC)
</span><span class="cx">     m_blocksWithNewObjects.clear();
</span><span class="lines">@@ -184,19 +178,16 @@
</span><span class="cx"> {
</span><span class="cx">     for (size_t cellSize = preciseStep; cellSize &lt;= preciseCutoff; cellSize += preciseStep) {
</span><span class="cx">         functor(allocatorFor(cellSize));
</span><del>-        functor(normalDestructorAllocatorFor(cellSize));
-        functor(immortalStructureDestructorAllocatorFor(cellSize));
</del><ins>+        functor(destructorAllocatorFor(cellSize));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (size_t cellSize = impreciseStep; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</span><span class="cx">         functor(allocatorFor(cellSize));
</span><del>-        functor(normalDestructorAllocatorFor(cellSize));
-        functor(immortalStructureDestructorAllocatorFor(cellSize));
</del><ins>+        functor(destructorAllocatorFor(cellSize));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     functor(m_normalSpace.largeAllocator);
</span><del>-    functor(m_normalDestructorSpace.largeAllocator);
-    functor(m_immortalStructureDestructorSpace.largeAllocator);
</del><ins>+    functor(m_destructorSpace.largeAllocator);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> struct StopAllocatingFunctor {
</span><span class="lines">@@ -223,21 +214,18 @@
</span><span class="cx"> {
</span><span class="cx">     for (size_t cellSize = preciseStep; cellSize &lt;= preciseCutoff; cellSize += preciseStep) {
</span><span class="cx">         if (allocatorFor(cellSize).isPagedOut(deadline) 
</span><del>-            || normalDestructorAllocatorFor(cellSize).isPagedOut(deadline) 
-            || immortalStructureDestructorAllocatorFor(cellSize).isPagedOut(deadline))
</del><ins>+            || destructorAllocatorFor(cellSize).isPagedOut(deadline))
</ins><span class="cx">             return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (size_t cellSize = impreciseStep; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</span><span class="cx">         if (allocatorFor(cellSize).isPagedOut(deadline) 
</span><del>-            || normalDestructorAllocatorFor(cellSize).isPagedOut(deadline) 
-            || immortalStructureDestructorAllocatorFor(cellSize).isPagedOut(deadline))
</del><ins>+            || destructorAllocatorFor(cellSize).isPagedOut(deadline))
</ins><span class="cx">             return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_normalSpace.largeAllocator.isPagedOut(deadline)
</span><del>-        || m_normalDestructorSpace.largeAllocator.isPagedOut(deadline)
-        || m_immortalStructureDestructorSpace.largeAllocator.isPagedOut(deadline))
</del><ins>+        || m_destructorSpace.largeAllocator.isPagedOut(deadline))
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="lines">@@ -292,14 +280,12 @@
</span><span class="cx"> {
</span><span class="cx">     for (size_t i = 0; i &lt; preciseCount; ++i) {
</span><span class="cx">         clearNewlyAllocatedInBlock(m_normalSpace.preciseAllocators[i].takeLastActiveBlock());
</span><del>-        clearNewlyAllocatedInBlock(m_normalDestructorSpace.preciseAllocators[i].takeLastActiveBlock());
-        clearNewlyAllocatedInBlock(m_immortalStructureDestructorSpace.preciseAllocators[i].takeLastActiveBlock());
</del><ins>+        clearNewlyAllocatedInBlock(m_destructorSpace.preciseAllocators[i].takeLastActiveBlock());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (size_t i = 0; i &lt; impreciseCount; ++i) {
</span><span class="cx">         clearNewlyAllocatedInBlock(m_normalSpace.impreciseAllocators[i].takeLastActiveBlock());
</span><del>-        clearNewlyAllocatedInBlock(m_normalDestructorSpace.impreciseAllocators[i].takeLastActiveBlock());
-        clearNewlyAllocatedInBlock(m_immortalStructureDestructorSpace.impreciseAllocators[i].takeLastActiveBlock());
</del><ins>+        clearNewlyAllocatedInBlock(m_destructorSpace.impreciseAllocators[i].takeLastActiveBlock());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // We have to iterate all of the blocks in the large allocators because they are
</span><span class="lines">@@ -307,8 +293,7 @@
</span><span class="cx">     // which creates the m_newlyAllocated bitmap.
</span><span class="cx">     ClearNewlyAllocated functor;
</span><span class="cx">     m_normalSpace.largeAllocator.forEachBlock(functor);
</span><del>-    m_normalDestructorSpace.largeAllocator.forEachBlock(functor);
-    m_immortalStructureDestructorSpace.largeAllocator.forEachBlock(functor);
</del><ins>+    m_destructorSpace.largeAllocator.forEachBlock(functor);
</ins><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG
</span><span class="cx">     VerifyNewlyAllocated verifyFunctor;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedSpaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedSpace.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedSpace.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/heap/MarkedSpace.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -103,14 +103,11 @@
</span><span class="cx"> 
</span><span class="cx">     MarkedAllocator&amp; firstAllocator();
</span><span class="cx">     MarkedAllocator&amp; allocatorFor(size_t);
</span><del>-    MarkedAllocator&amp; immortalStructureDestructorAllocatorFor(size_t);
-    MarkedAllocator&amp; normalDestructorAllocatorFor(size_t);
-    void* allocateWithNormalDestructor(size_t);
-    void* allocateWithImmortalStructureDestructor(size_t);
</del><ins>+    MarkedAllocator&amp; destructorAllocatorFor(size_t);
+    void* allocateWithDestructor(size_t);
</ins><span class="cx">     void* allocateWithoutDestructor(size_t);
</span><span class="cx"> 
</span><del>-    Subspace&amp; subspaceForObjectsWithNormalDestructor() { return m_normalDestructorSpace; }
-    Subspace&amp; subspaceForObjectsWithImmortalStructure() { return m_immortalStructureDestructorSpace; }
</del><ins>+    Subspace&amp; subspaceForObjectsWithDestructor() { return m_destructorSpace; }
</ins><span class="cx">     Subspace&amp; subspaceForObjectsWithoutDestructor() { return m_normalSpace; }
</span><span class="cx"> 
</span><span class="cx">     void resetAllocators();
</span><span class="lines">@@ -168,8 +165,7 @@
</span><span class="cx">     template&lt;typename Functor&gt; void forEachAllocator(Functor&amp;);
</span><span class="cx">     template&lt;typename Functor&gt; void forEachAllocator();
</span><span class="cx"> 
</span><del>-    Subspace m_normalDestructorSpace;
-    Subspace m_immortalStructureDestructorSpace;
</del><ins>+    Subspace m_destructorSpace;
</ins><span class="cx">     Subspace m_normalSpace;
</span><span class="cx"> 
</span><span class="cx">     Heap* m_heap;
</span><span class="lines">@@ -219,41 +215,26 @@
</span><span class="cx">     return m_normalSpace.largeAllocator;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline MarkedAllocator&amp; MarkedSpace::immortalStructureDestructorAllocatorFor(size_t bytes)
</del><ins>+inline MarkedAllocator&amp; MarkedSpace::destructorAllocatorFor(size_t bytes)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(bytes);
</span><span class="cx">     if (bytes &lt;= preciseCutoff)
</span><del>-        return m_immortalStructureDestructorSpace.preciseAllocators[(bytes - 1) / preciseStep];
</del><ins>+        return m_destructorSpace.preciseAllocators[(bytes - 1) / preciseStep];
</ins><span class="cx">     if (bytes &lt;= impreciseCutoff)
</span><del>-        return m_immortalStructureDestructorSpace.impreciseAllocators[(bytes - 1) / impreciseStep];
-    return m_immortalStructureDestructorSpace.largeAllocator;
</del><ins>+        return m_destructorSpace.impreciseAllocators[(bytes - 1) / impreciseStep];
+    return m_destructorSpace.largeAllocator;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline MarkedAllocator&amp; MarkedSpace::normalDestructorAllocatorFor(size_t bytes)
-{
-    ASSERT(bytes);
-    if (bytes &lt;= preciseCutoff)
-        return m_normalDestructorSpace.preciseAllocators[(bytes - 1) / preciseStep];
-    if (bytes &lt;= impreciseCutoff)
-        return m_normalDestructorSpace.impreciseAllocators[(bytes - 1) / impreciseStep];
-    return m_normalDestructorSpace.largeAllocator;
-}
-
</del><span class="cx"> inline void* MarkedSpace::allocateWithoutDestructor(size_t bytes)
</span><span class="cx"> {
</span><span class="cx">     return allocatorFor(bytes).allocate(bytes);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void* MarkedSpace::allocateWithImmortalStructureDestructor(size_t bytes)
</del><ins>+inline void* MarkedSpace::allocateWithDestructor(size_t bytes)
</ins><span class="cx"> {
</span><del>-    return immortalStructureDestructorAllocatorFor(bytes).allocate(bytes);
</del><ins>+    return destructorAllocatorFor(bytes).allocate(bytes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void* MarkedSpace::allocateWithNormalDestructor(size_t bytes)
-{
-    return normalDestructorAllocatorFor(bytes).allocate(bytes);
-}
-
</del><span class="cx"> template &lt;typename Functor&gt; inline typename Functor::ReturnType MarkedSpace::forEachBlock(Functor&amp; functor)
</span><span class="cx"> {
</span><span class="cx">     for (size_t i = 0; i &lt; preciseCount; ++i)
</span><span class="lines">@@ -263,17 +244,11 @@
</span><span class="cx">     m_normalSpace.largeAllocator.forEachBlock(functor);
</span><span class="cx"> 
</span><span class="cx">     for (size_t i = 0; i &lt; preciseCount; ++i)
</span><del>-        m_normalDestructorSpace.preciseAllocators[i].forEachBlock(functor);
</del><ins>+        m_destructorSpace.preciseAllocators[i].forEachBlock(functor);
</ins><span class="cx">     for (size_t i = 0; i &lt; impreciseCount; ++i)
</span><del>-        m_normalDestructorSpace.impreciseAllocators[i].forEachBlock(functor);
-    m_normalDestructorSpace.largeAllocator.forEachBlock(functor);
</del><ins>+        m_destructorSpace.impreciseAllocators[i].forEachBlock(functor);
+    m_destructorSpace.largeAllocator.forEachBlock(functor);
</ins><span class="cx"> 
</span><del>-    for (size_t i = 0; i &lt; preciseCount; ++i)
-        m_immortalStructureDestructorSpace.preciseAllocators[i].forEachBlock(functor);
-    for (size_t i = 0; i &lt; impreciseCount; ++i)
-        m_immortalStructureDestructorSpace.impreciseAllocators[i].forEachBlock(functor);
-    m_immortalStructureDestructorSpace.largeAllocator.forEachBlock(functor);
-
</del><span class="cx">     return functor.returnValue();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorJSInjectedScriptHosth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHost.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHost.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHost.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> class JSInjectedScriptHost : public JSC::JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSC::JSDestructibleObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><span class="lines">@@ -70,8 +71,6 @@
</span><span class="cx">     JSC::JSValue iteratorEntries(JSC::ExecState*);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = Base::StructureFlags;
-
</del><span class="cx">     void finishCreation(JSC::VM&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorJSInjectedScriptHostPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHostPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHostPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHostPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> class JSInjectedScriptHostPrototype : public JSC::JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSC::JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | JSC::OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><span class="lines">@@ -48,9 +49,6 @@
</span><span class="cx">         return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     JSInjectedScriptHostPrototype(JSC::VM&amp; vm, JSC::JSGlobalObject*, JSC::Structure* structure)
</span><span class="cx">         : JSC::JSNonFinalObject(vm, structure)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorJSJavaScriptCallFrameh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> class JSJavaScriptCallFrame : public JSC::JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSC::JSDestructibleObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><span class="lines">@@ -78,8 +79,6 @@
</span><span class="cx">     static const unsigned short FUNCTION_NAME_SCOPE = 5;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = Base::StructureFlags;
-
</del><span class="cx">     void finishCreation(JSC::VM&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorJSJavaScriptCallFramePrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFramePrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFramePrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFramePrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> class JSJavaScriptCallFramePrototype : public JSC::JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSC::JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | JSC::OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><span class="lines">@@ -48,9 +49,6 @@
</span><span class="cx">         return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     JSJavaScriptCallFramePrototype(JSC::VM&amp; vm, JSC::JSGlobalObject*, JSC::Structure* structure)
</span><span class="cx">         : JSC::JSNonFinalObject(vm, structure)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/jsc.cpp        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -181,6 +181,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | JSC::MasqueradesAsUndefined;
</ins><span class="cx"> 
</span><span class="cx">     static Masquerader* create(VM&amp; vm, JSGlobalObject* globalObject)
</span><span class="cx">     {
</span><span class="lines">@@ -197,9 +198,6 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     DECLARE_INFO;
</span><del>-
-protected:
-    static const unsigned StructureFlags = JSC::MasqueradesAsUndefined | Base::StructureFlags;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class Root : public JSDestructibleObject {
</span><span class="lines">@@ -257,6 +255,7 @@
</span><span class="cx"> 
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | JSC::HasImpureGetOwnPropertySlot | JSC::OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static Structure* createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
</span><span class="cx">     {
</span><span class="lines">@@ -277,8 +276,6 @@
</span><span class="cx">             m_delegate.set(vm, this, delegate);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = JSC::HasImpureGetOwnPropertySlot | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
-
</del><span class="cx">     static bool getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName name, PropertySlot&amp; slot)
</span><span class="cx">     {
</span><span class="cx">         ImpureGetter* thisObject = jsCast&lt;ImpureGetter*&gt;(object);
</span><span class="lines">@@ -308,6 +305,7 @@
</span><span class="cx"> class RuntimeArray : public JSArray {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSArray Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static RuntimeArray* create(ExecState* exec)
</span><span class="cx">     {
</span><span class="lines">@@ -391,8 +389,6 @@
</span><span class="cx">             m_vector.append(exec-&gt;argument(i).toInt32(exec));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames | JSArray::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     RuntimeArray(ExecState* exec, Structure* structure)
</span><span class="cx">         : JSArray(exec-&gt;vm(), structure, 0)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeArrayBufferNeuteringWatchpointh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ArrayBufferNeuteringWatchpoint.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ArrayBufferNeuteringWatchpoint.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/ArrayBufferNeuteringWatchpoint.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -31,20 +31,16 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-class ArrayBufferNeuteringWatchpoint : public JSCell {
</del><ins>+class ArrayBufferNeuteringWatchpoint final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><del>-    
-private:
-    ArrayBufferNeuteringWatchpoint(VM&amp;);
-    
-public:
</del><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
+
</ins><span class="cx">     DECLARE_INFO;
</span><span class="cx">     
</span><span class="cx">     static ArrayBufferNeuteringWatchpoint* create(VM&amp;);
</span><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx">     
</span><span class="cx">     static Structure* createStructure(VM&amp;);
</span><span class="lines">@@ -54,6 +50,8 @@
</span><span class="cx">     void fireAll();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    explicit ArrayBufferNeuteringWatchpoint(VM&amp;);
+    
</ins><span class="cx">     RefPtr&lt;WatchpointSet&gt; m_set;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeArrayConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ArrayConstructor.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ArrayConstructor.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/ArrayConstructor.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> class ArrayConstructor : public InternalFunction {
</span><span class="cx"> public:
</span><span class="cx">     typedef InternalFunction Base;
</span><ins>+    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InternalFunction::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     static ArrayConstructor* create(VM&amp; vm, Structure* structure, ArrayPrototype* arrayPrototype)
</span><span class="cx">     {
</span><span class="lines">@@ -49,7 +50,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, ArrayPrototype*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InternalFunction::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     ArrayConstructor(VM&amp;, Structure*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeArrayIteratorPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ArrayIteratorPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ArrayIteratorPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/ArrayIteratorPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> class ArrayIteratorPrototype : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     static ArrayIteratorPrototype* create(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -48,9 +49,6 @@
</span><span class="cx">         return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | Base::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     ArrayIteratorPrototype(VM&amp; vm, Structure* structure)
</span><span class="cx">         : Base(vm, structure)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeBooleanPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/BooleanPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/BooleanPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/BooleanPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> class BooleanPrototype : public BooleanObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef BooleanObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static BooleanPrototype* create(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -45,7 +46,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, JSGlobalObject*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | BooleanObject::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     BooleanPrototype(VM&amp;, Structure*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeClonedArgumentsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ClonedArguments.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ClonedArguments.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/ClonedArguments.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> class ClonedArguments : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
</ins><span class="cx">     
</span><span class="cx"> private:
</span><span class="cx">     ClonedArguments(VM&amp;, Structure*);
</span><span class="lines">@@ -54,8 +55,6 @@
</span><span class="cx">     
</span><span class="cx">     static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue prototype);
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSObject::StructureFlags;
-
</del><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCustomGetterSetterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/CustomGetterSetter.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/CustomGetterSetter.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/CustomGetterSetter.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,9 +33,10 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-class CustomGetterSetter : public JSCell {
</del><ins>+class CustomGetterSetter final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     typedef PropertySlot::GetValueFunc CustomGetter;
</span><span class="cx">     typedef PutPropertySlot::PutValueFunc CustomSetter;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeDateConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/DateConstructor.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/DateConstructor.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/DateConstructor.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> class DateConstructor : public InternalFunction {
</span><span class="cx"> public:
</span><span class="cx">     typedef InternalFunction Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static DateConstructor* create(VM&amp; vm, Structure* structure, DatePrototype* datePrototype)
</span><span class="cx">     {
</span><span class="lines">@@ -47,7 +48,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, DatePrototype*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InternalFunction::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     DateConstructor(VM&amp;, Structure*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeDatePrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/DatePrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/DatePrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/DatePrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef DateInstance Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static DatePrototype* create(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -51,7 +52,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, JSGlobalObject*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | DateInstance::StructureFlags;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeErrorPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ErrorPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ErrorPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/ErrorPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> class ErrorPrototype : public ErrorInstance {
</span><span class="cx"> public:
</span><span class="cx">     typedef ErrorInstance Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static ErrorPrototype* create(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -49,8 +50,6 @@
</span><span class="cx">     ErrorPrototype(VM&amp;, Structure*);
</span><span class="cx">     void finishCreation(VM&amp;, JSGlobalObject*);
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ErrorInstance::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeExceptionHelpersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ExceptionHelpers.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ExceptionHelpers.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/ExceptionHelpers.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -56,17 +56,10 @@
</span><span class="cx"> JS_EXPORT_PRIVATE JSObject* throwTerminatedExecutionException(ExecState*);
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class TerminatedExecutionError : public JSNonFinalObject {
-private:
-    TerminatedExecutionError(VM&amp; vm)
-        : JSNonFinalObject(vm, vm.terminatedExecutionErrorStructure.get())
-    {
-    }
-
-    static JSValue defaultValue(const JSObject*, ExecState*, PreferredPrimitiveType);
-
</del><ins>+class TerminatedExecutionError final : public JSNonFinalObject {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static TerminatedExecutionError* create(VM&amp; vm)
</span><span class="cx">     {
</span><span class="lines">@@ -81,6 +74,15 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><ins>+
+private:
+    explicit TerminatedExecutionError(VM&amp; vm)
+        : JSNonFinalObject(vm, vm.terminatedExecutionErrorStructure.get())
+    {
+    }
+
+    static JSValue defaultValue(const JSObject*, ExecState*, PreferredPrimitiveType);
+
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeExecutableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Executable.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Executable.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/Executable.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -84,9 +84,9 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx">         
</span><span class="cx">     CodeBlockHash hashFor(CodeSpecializationKind) const;
</span><span class="lines">@@ -117,7 +117,6 @@
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = StructureIsImmortal;
</del><span class="cx">     int m_numParametersForCall;
</span><span class="cx">     int m_numParametersForConstruct;
</span><span class="cx"> 
</span><span class="lines">@@ -278,11 +277,12 @@
</span><span class="cx">     MacroAssemblerCodePtr m_jitCodeForConstructWithArityCheckAndPreserveRegs;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class NativeExecutable : public ExecutableBase {
</del><ins>+class NativeExecutable final : public ExecutableBase {
</ins><span class="cx">     friend class JIT;
</span><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx"> public:
</span><span class="cx">     typedef ExecutableBase Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static NativeExecutable* create(VM&amp; vm, PassRefPtr&lt;JITCode&gt; callThunk, NativeFunction function, PassRefPtr&lt;JITCode&gt; constructThunk, NativeFunction constructor, Intrinsic intrinsic)
</span><span class="cx">     {
</span><span class="lines">@@ -347,9 +347,8 @@
</span><span class="cx"> class ScriptExecutable : public ExecutableBase {
</span><span class="cx"> public:
</span><span class="cx">     typedef ExecutableBase Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
</ins><span class="cx"> 
</span><del>-    ScriptExecutable(Structure* structure, VM&amp; vm, const SourceCode&amp; source, bool isInStrictContext);
-
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx">         
</span><span class="cx">     CodeBlockHash hashFor(CodeSpecializationKind) const;
</span><span class="lines">@@ -416,6 +415,8 @@
</span><span class="cx">     JSObject* prepareForExecutionImpl(ExecState*, JSFunction*, JSScope*, CodeSpecializationKind);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><ins>+    ScriptExecutable(Structure* structure, VM&amp; vm, const SourceCode&amp; source, bool isInStrictContext);
+
</ins><span class="cx">     void finishCreation(VM&amp; vm)
</span><span class="cx">     {
</span><span class="cx">         Base::finishCreation(vm);
</span><span class="lines">@@ -441,10 +442,11 @@
</span><span class="cx">     unsigned m_typeProfilingEndOffset;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class EvalExecutable : public ScriptExecutable {
</del><ins>+class EvalExecutable final : public ScriptExecutable {
</ins><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx"> public:
</span><span class="cx">     typedef ScriptExecutable Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="lines">@@ -486,10 +488,11 @@
</span><span class="cx">     WriteBarrier&lt;UnlinkedEvalCodeBlock&gt; m_unlinkedEvalCodeBlock;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class ProgramExecutable : public ScriptExecutable {
</del><ins>+class ProgramExecutable final : public ScriptExecutable {
</ins><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx"> public:
</span><span class="cx">     typedef ScriptExecutable Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static ProgramExecutable* create(ExecState* exec, const SourceCode&amp; source)
</span><span class="cx">     {
</span><span class="lines">@@ -539,11 +542,12 @@
</span><span class="cx">     RefPtr&lt;ProgramCodeBlock&gt; m_programCodeBlock;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class FunctionExecutable : public ScriptExecutable {
</del><ins>+class FunctionExecutable final : public ScriptExecutable {
</ins><span class="cx">     friend class JIT;
</span><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx"> public:
</span><span class="cx">     typedef ScriptExecutable Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static FunctionExecutable* create(
</span><span class="cx">         VM&amp; vm, const SourceCode&amp; source, UnlinkedFunctionExecutable* unlinkedExecutable, 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeGenericArgumentsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/GenericArguments.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/GenericArguments.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/GenericArguments.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -36,9 +36,8 @@
</span><span class="cx"> class GenericArguments : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames | JSObject::StructureFlags;
-
</del><span class="cx"> protected:
</span><span class="cx">     GenericArguments(VM&amp; vm, Structure* structure)
</span><span class="cx">         : Base(vm, structure)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeGetterSetterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/GetterSetter.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/GetterSetter.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/GetterSetter.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> // that if a property holding a GetterSetter reference is constant-inferred and
</span><span class="cx"> // that constant is observed to have a non-null setter (or getter) then we can
</span><span class="cx"> // constant fold that setter (or getter).
</span><del>-class GetterSetter : public JSCell {
</del><ins>+class GetterSetter final : public JSCell {
</ins><span class="cx">     friend class JIT;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -54,6 +54,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static GetterSetter* create(VM&amp; vm, JSGlobalObject* globalObject)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeInternalFunctionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/InternalFunction.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/InternalFunction.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/InternalFunction.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> class InternalFunction : public JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | ImplementsHasInstance;
</ins><span class="cx"> 
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx"> 
</span><span class="lines">@@ -47,8 +48,6 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = ImplementsHasInstance | JSObject::StructureFlags;
-
</del><span class="cx">     JS_EXPORT_PRIVATE InternalFunction(VM&amp;, Structure*);
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE void finishCreation(VM&amp;, const String&amp; name);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSAPIValueWrapperh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSAPIValueWrapper.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSAPIValueWrapper.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSAPIValueWrapper.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx">     friend JSValue jsAPIValueWrapper(ExecState*, JSValue);
</span><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     JSValue value() const { return m_value.get(); }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSArgumentsIteratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSArgumentsIterator.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSArgumentsIterator.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSArgumentsIterator.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> class JSArgumentsIterator : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx"> 
</span><span class="lines">@@ -62,9 +63,6 @@
</span><span class="cx">     JSArgumentsIterator* clone(ExecState*);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-
-    static const unsigned StructureFlags = Base::StructureFlags;
-
</del><span class="cx">     JSArgumentsIterator(VM&amp; vm, Structure* structure)
</span><span class="cx">         : Base(vm, structure)
</span><span class="cx">         , m_nextIndex(0)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSArrayh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSArray.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSArray.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSArray.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static size_t allocationSize(size_t inlineCapacity)
</span><span class="cx">     {
</span><span class="lines">@@ -140,7 +141,6 @@
</span><span class="cx">     }
</span><span class="cx">         
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSObject::StructureFlags;
</del><span class="cx">     static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&amp;);
</span><span class="cx"> 
</span><span class="cx">     static bool deleteProperty(JSCell*, ExecState*, PropertyName);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSArrayBufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSArrayBuffer.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSArrayBuffer.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSArrayBuffer.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> class JSArrayBuffer : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetPropertyNames | OverridesGetOwnPropertySlot;
</ins><span class="cx">     
</span><span class="cx"> protected:
</span><span class="cx">     JSArrayBuffer(VM&amp;, Structure*, PassRefPtr&lt;ArrayBuffer&gt;);
</span><span class="lines">@@ -56,8 +57,6 @@
</span><span class="cx">     
</span><span class="cx">     static void getOwnNonIndexPropertyNames(JSObject*, ExecState*, PropertyNameArray&amp;, EnumerationMode);
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetPropertyNames | OverridesGetOwnPropertySlot | Base::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     ArrayBuffer* m_impl;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSArrayBufferViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSArrayBufferView.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSArrayBufferView.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSArrayBufferView.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -93,6 +93,7 @@
</span><span class="cx"> class JSArrayBufferView : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetPropertyNames | OverridesGetOwnPropertySlot;
</ins><span class="cx">     
</span><span class="cx">     static const unsigned fastSizeLimit = 1000;
</span><span class="cx">     
</span><span class="lines">@@ -174,8 +175,6 @@
</span><span class="cx">     static void finalize(JSCell*);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = OverridesGetPropertyNames | OverridesGetOwnPropertySlot | Base::StructureFlags;
-    
</del><span class="cx">     ArrayBuffer* existingBufferInButterfly();
</span><span class="cx"> 
</span><span class="cx">     void* m_vector;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSBoundFunctionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSBoundFunction.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSBoundFunction.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSBoundFunction.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> class JSBoundFunction : public JSFunction {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSFunction Base;
</span><ins>+    const static unsigned StructureFlags = OverridesHasInstance | Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     static JSBoundFunction* create(VM&amp;, JSGlobalObject*, JSObject* targetFunction, JSValue boundThis, JSValue boundArgs, int, const String&amp;);
</span><span class="cx">     
</span><span class="lines">@@ -56,8 +57,6 @@
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    const static unsigned StructureFlags = OverridesHasInstance | Base::StructureFlags;
-
</del><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCalleeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCallee.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCallee.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSCallee.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -46,6 +46,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><ins>+    const static unsigned StructureFlags = Base::StructureFlags | ImplementsHasInstance;
</ins><span class="cx"> 
</span><span class="cx">     static JSCallee* create(VM&amp; vm, JSGlobalObject* globalObject, JSScope* scope)
</span><span class="cx">     {
</span><span class="lines">@@ -90,8 +91,6 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    const static unsigned StructureFlags = ImplementsHasInstance | JSObject::StructureFlags;
-
</del><span class="cx">     JS_EXPORT_PRIVATE JSCallee(VM&amp;, JSGlobalObject*, Structure*);
</span><span class="cx">     JSCallee(VM&amp;, JSScope*, Structure*);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCell.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCell.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSCell.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -73,7 +73,6 @@
</span><span class="cx">     static const unsigned StructureFlags = 0;
</span><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = false;
</span><del>-    static const bool hasImmortalStructure = false;
</del><span class="cx"> 
</span><span class="cx">     enum CreatingEarlyCellTag { CreatingEarlyCell };
</span><span class="cx">     JSCell(CreatingEarlyCellTag);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCellInlines.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCellInlines.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSCellInlines.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -240,7 +240,7 @@
</span><span class="cx"> inline const ClassInfo* JSCell::classInfo() const
</span><span class="cx"> {
</span><span class="cx">     MarkedBlock* block = MarkedBlock::blockFor(this);
</span><del>-    if (block-&gt;destructorType() == MarkedBlock::Normal)
</del><ins>+    if (block-&gt;needsDestruction() &amp;&amp; !(inlineTypeFlags() &amp; StructureIsImmortal))
</ins><span class="cx">         return static_cast&lt;const JSDestructibleObject*&gt;(this)-&gt;classInfo();
</span><span class="cx">     return structure(*block-&gt;vm())-&gt;classInfo();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSDataViewPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSDataViewPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSDataViewPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSDataViewPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> class JSDataViewPrototype : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     JSDataViewPrototype(VM&amp;, Structure*);
</span><span class="lines">@@ -46,8 +47,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span><del>-    
-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | Base::StructureFlags;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSEnvironmentRecordh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSEnvironmentRecord.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSEnvironmentRecord.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSEnvironmentRecord.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSSymbolTableObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     WriteBarrierBase&lt;Unknown&gt;* variables()
</span><span class="cx">     {
</span><span class="lines">@@ -85,8 +86,6 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = Base::StructureFlags;
-
</del><span class="cx">     JSEnvironmentRecord(
</span><span class="cx">         VM&amp; vm,
</span><span class="cx">         Structure* structure,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSFunctionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSFunction.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSFunction.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSFunction.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -57,6 +57,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSCallee Base;
</span><ins>+    const static unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE static JSFunction* create(VM&amp;, JSGlobalObject*, int length, const String&amp; name, NativeFunction, Intrinsic = NoIntrinsic, NativeFunction nativeConstructor = callHostFunctionAsConstructor);
</span><span class="cx"> 
</span><span class="lines">@@ -128,8 +129,6 @@
</span><span class="cx">     bool isClassConstructorFunction() const;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    const static unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesGetPropertyNames | JSObject::StructureFlags;
-
</del><span class="cx">     JS_EXPORT_PRIVATE JSFunction(VM&amp;, JSGlobalObject*, Structure*);
</span><span class="cx">     JSFunction(VM&amp;, FunctionExecutable*, JSScope*);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSGenericTypedArrayViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSGenericTypedArrayView.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSGenericTypedArrayView.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSGenericTypedArrayView.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -87,6 +87,8 @@
</span><span class="cx"> class JSGenericTypedArrayView : public JSArrayBufferView {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSArrayBufferView Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetPropertyNames | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero;
+
</ins><span class="cx">     static const unsigned elementSize = sizeof(typename Adaptor::Type);
</span><span class="cx">     
</span><span class="cx"> protected:
</span><span class="lines">@@ -228,8 +230,6 @@
</span><span class="cx">     
</span><span class="cx"> protected:
</span><span class="cx">     friend struct TypedArrayClassInfos;
</span><del>-    
-    static const unsigned StructureFlags = OverridesGetPropertyNames | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | Base::StructureFlags;
</del><span class="cx"> 
</span><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span><span class="cx">     static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&amp;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSGlobalObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -296,6 +296,7 @@
</span><span class="cx">         
</span><span class="cx"> public:
</span><span class="cx">     typedef JSSegmentedVariableObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static JSGlobalObject* create(VM&amp; vm, Structure* structure, const GlobalObjectMethodTable* globalObjectMethodTable = nullptr)
</span><span class="cx">     {
</span><span class="lines">@@ -604,9 +605,6 @@
</span><span class="cx">     UnlinkedEvalCodeBlock* createEvalCodeBlock(CallFrame*, EvalExecutable*, ThisTDZMode);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-
-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | Base::StructureFlags;
-
</del><span class="cx">     struct GlobalPropertyInfo {
</span><span class="cx">         GlobalPropertyInfo(const Identifier&amp; i, JSValue v, unsigned a)
</span><span class="cx">             : identifier(i)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSLexicalEnvironmenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSLexicalEnvironment.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSLexicalEnvironment.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSLexicalEnvironment.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -44,6 +44,7 @@
</span><span class="cx">     
</span><span class="cx"> public:
</span><span class="cx">     typedef JSEnvironmentRecord Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static JSLexicalEnvironment* create(
</span><span class="cx">         VM&amp; vm, Structure* structure, JSScope* currentScope, SymbolTable* symbolTable)
</span><span class="lines">@@ -78,9 +79,6 @@
</span><span class="cx"> 
</span><span class="cx">     static Structure* createStructure(VM&amp; vm, JSGlobalObject* globalObject) { return Structure::create(vm, globalObject, jsNull(), TypeInfo(ActivationObjectType, StructureFlags), info()); }
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | Base::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     bool symbolTableGet(PropertyName, PropertySlot&amp;);
</span><span class="cx">     bool symbolTableGet(PropertyName, PropertyDescriptor&amp;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSNameScopeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSNameScope.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSNameScope.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSNameScope.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> class JSNameScope : public JSEnvironmentRecord {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSEnvironmentRecord Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags| OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     enum Type {
</span><span class="cx">         CatchScope,
</span><span class="lines">@@ -68,8 +69,6 @@
</span><span class="cx">         variableAt(ScopeOffset(0)).set(vm, this, value);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | Base::StructureFlags;
-
</del><span class="cx">     JSNameScope(VM&amp; vm, Structure* structure, JSScope* next, SymbolTable* symbolTable)
</span><span class="cx">         : Base(vm, structure, next, symbolTable)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSNotAnObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSNotAnObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSNotAnObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSNotAnObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx"> // This unholy class is used to allow us to avoid multiple exception checks
</span><span class="cx"> // in certain SquirrelFish bytecodes -- effectively it just silently consumes
</span><span class="cx"> // any operations performed on the result of a failed toObject call.
</span><del>-class JSNotAnObject : public JSNonFinalObject {
</del><ins>+class JSNotAnObject final : public JSNonFinalObject {
</ins><span class="cx"> private:
</span><span class="cx">     explicit JSNotAnObject(VM&amp; vm)
</span><span class="cx">         : JSNonFinalObject(vm, vm.notAnObjectStructure.get())
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static JSNotAnObject* create(VM&amp; vm)
</span><span class="cx">     {
</span><span class="lines">@@ -61,9 +62,6 @@
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-
-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames | JSObject::StructureFlags;
-
</del><span class="cx">     // JSValue methods
</span><span class="cx">     static JSValue defaultValue(const JSObject*, ExecState*, PreferredPrimitiveType);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSONObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSONObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSONObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSONObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> class JSONObject : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static JSONObject* create(VM&amp; vm, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -52,7 +53,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     JSONObject(VM&amp;, Structure*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -1031,6 +1031,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     static size_t allocationSize(size_t inlineCapacity)
</span><span class="cx">     {
</span><span class="lines">@@ -1077,8 +1078,6 @@
</span><span class="cx">         : JSObject(vm, structure, butterfly)
</span><span class="cx">     {
</span><span class="cx">     }
</span><del>-
-    static const unsigned StructureFlags = JSObject::StructureFlags;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> inline JSFinalObject* JSFinalObject::create(
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> class JSPromiseConstructor : public InternalFunction {
</span><span class="cx"> public:
</span><span class="cx">     typedef InternalFunction Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static JSPromiseConstructor* create(VM&amp;, Structure*, JSPromisePrototype*);
</span><span class="cx">     static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue);
</span><span class="lines">@@ -46,7 +47,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, JSPromisePrototype*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InternalFunction::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     JSPromiseConstructor(VM&amp;, Structure*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseDeferredh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,9 +33,10 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-class JSPromiseDeferred : public JSCell {
</del><ins>+class JSPromiseDeferred final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE static JSPromiseDeferred* create(ExecState*, JSGlobalObject*);
</span><span class="cx">     JS_EXPORT_PRIVATE static JSPromiseDeferred* create(VM&amp;, JSObject* promise, JSValue resolve, JSValue reject);
</span><span class="lines">@@ -45,8 +46,6 @@
</span><span class="cx">         return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static const bool hasImmortalStructure = true;
-
</del><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx"> 
</span><span class="cx">     JSObject* promise() const { return m_promise.get(); }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromisePrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPromisePrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromisePrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSPromisePrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> class JSPromisePrototype : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static JSPromisePrototype* create(ExecState*, JSGlobalObject*, Structure*);
</span><span class="cx">     static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue);
</span><span class="lines">@@ -43,7 +44,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, Structure*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     JSPromisePrototype(ExecState*, Structure*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseReactionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -36,9 +36,10 @@
</span><span class="cx"> class JSPromiseDeferred;
</span><span class="cx"> class Microtask;
</span><span class="cx"> 
</span><del>-class JSPromiseReaction : public JSCell {
</del><ins>+class JSPromiseReaction final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static JSPromiseReaction* create(VM&amp;, JSPromiseDeferred*, JSValue);
</span><span class="cx">     static Structure* createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
</span><span class="lines">@@ -46,8 +47,6 @@
</span><span class="cx">         return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static const bool hasImmortalStructure = true;
-
</del><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* deferred() const { return m_deferred.get(); }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPropertyNameEnumeratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -35,15 +35,15 @@
</span><span class="cx"> 
</span><span class="cx"> class Identifier;
</span><span class="cx"> 
</span><del>-class JSPropertyNameEnumerator : public JSCell {
</del><ins>+class JSPropertyNameEnumerator final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static JSPropertyNameEnumerator* create(VM&amp;);
</span><span class="cx">     static JSPropertyNameEnumerator* create(VM&amp;, Structure*, uint32_t, uint32_t, PropertyNameArray&amp;);
</span><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     static Structure* createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
</span><span class="lines">@@ -92,8 +92,6 @@
</span><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
-
</del><span class="cx">     JSPropertyNameEnumerator(VM&amp;, StructureID, uint32_t, RefCountedIdentifierSet*);
</span><span class="cx">     void finishCreation(VM&amp;, uint32_t, uint32_t, PassRefPtr&lt;PropertyNameArrayData&gt;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSProxy.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSProxy.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSProxy.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> class JSProxy : public JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero;
</ins><span class="cx"> 
</span><span class="cx">     static JSProxy* create(VM&amp; vm, Structure* structure, JSObject* target)
</span><span class="cx">     {
</span><span class="lines">@@ -68,8 +69,6 @@
</span><span class="cx">         m_target.set(vm, this, target);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | Base::StructureFlags;
-
</del><span class="cx">     JS_EXPORT_PRIVATE static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE void setTarget(VM&amp;, JSGlobalObject*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSScopeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSScope.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSScope.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSScope.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -149,6 +149,7 @@
</span><span class="cx"> class JSScope : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx">     static size_t offsetOfNext();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSStringh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSString.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSString.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSString.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -73,9 +73,9 @@
</span><span class="cx">     friend struct ThunkHelpers;
</span><span class="cx"> 
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -182,8 +182,6 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | StructureIsImmortal;
-
</del><span class="cx">     friend class JSValue;
</span><span class="cx"> 
</span><span class="cx">     bool isRope() const { return m_value.isNull(); }
</span><span class="lines">@@ -219,7 +217,7 @@
</span><span class="cx">     friend JSString* jsSubstring(ExecState*, JSString*, unsigned offset, unsigned length);
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class JSRopeString : public JSString {
</del><ins>+class JSRopeString final : public JSString {
</ins><span class="cx">     friend class JSString;
</span><span class="cx"> 
</span><span class="cx">     friend JSRopeString* jsStringBuilder(VM*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSSymbolTableObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSSymbolTableObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSSymbolTableObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSSymbolTableObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> class JSSymbolTableObject : public JSScope {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSScope Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | IsEnvironmentRecord | OverridesGetPropertyNames;
</ins><span class="cx">     
</span><span class="cx">     SymbolTable* symbolTable() const { return m_symbolTable.get(); }
</span><span class="cx">     
</span><span class="lines">@@ -50,8 +51,6 @@
</span><span class="cx">     static ptrdiff_t offsetOfSymbolTable() { return OBJECT_OFFSETOF(JSSymbolTableObject, m_symbolTable); }
</span><span class="cx">     
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = IsEnvironmentRecord | OverridesGetPropertyNames | Base::StructureFlags;
-    
</del><span class="cx">     JSSymbolTableObject(VM&amp; vm, Structure* structure, JSScope* scope)
</span><span class="cx">         : Base(vm, structure, scope)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSTypeInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSTypeInfo.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSTypeInfo.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/JSTypeInfo.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -43,12 +43,12 @@
</span><span class="cx"> static const unsigned IsEnvironmentRecord = 1 &lt;&lt; 4;
</span><span class="cx"> static const unsigned OverridesGetOwnPropertySlot = 1 &lt;&lt; 5;
</span><span class="cx"> static const unsigned InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero = 1 &lt;&lt; 6;
</span><ins>+static const unsigned StructureIsImmortal = 1 &lt;&lt; 7;
</ins><span class="cx"> 
</span><span class="cx"> static const unsigned OverridesGetPropertyNames = 1 &lt;&lt; 8;
</span><span class="cx"> static const unsigned ProhibitsPropertyCaching = 1 &lt;&lt; 9;
</span><span class="cx"> static const unsigned HasImpureGetOwnPropertySlot = 1 &lt;&lt; 10;
</span><span class="cx"> static const unsigned NewImpurePropertyFiresWatchpoints = 1 &lt;&lt; 11;
</span><del>-static const unsigned StructureIsImmortal = 1 &lt;&lt; 12;
</del><span class="cx"> 
</span><span class="cx"> class TypeInfo {
</span><span class="cx"> public:
</span><span class="lines">@@ -91,7 +91,7 @@
</span><span class="cx">     bool prohibitsPropertyCaching() const { return isSetOnFlags2(ProhibitsPropertyCaching); }
</span><span class="cx">     bool hasImpureGetOwnPropertySlot() const { return isSetOnFlags2(HasImpureGetOwnPropertySlot); }
</span><span class="cx">     bool newImpurePropertyFiresWatchpoints() const { return isSetOnFlags2(NewImpurePropertyFiresWatchpoints); }
</span><del>-    bool structureIsImmortal() const { return isSetOnFlags2(StructureIsImmortal); }
</del><ins>+    bool structureIsImmortal() const { return isSetOnFlags1(StructureIsImmortal); }
</ins><span class="cx"> 
</span><span class="cx">     static ptrdiff_t flagsOffset()
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeMathObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/MathObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/MathObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/MathObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static MathObject* create(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -48,7 +49,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, JSGlobalObject*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeNumberConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/NumberConstructor.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/NumberConstructor.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/NumberConstructor.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> class NumberConstructor : public InternalFunction {
</span><span class="cx"> public:
</span><span class="cx">     typedef InternalFunction Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | ImplementsHasInstance;
</ins><span class="cx"> 
</span><span class="cx">     static NumberConstructor* create(VM&amp; vm, Structure* structure, NumberPrototype* numberPrototype)
</span><span class="cx">     {
</span><span class="lines">@@ -47,7 +48,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, NumberPrototype*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | InternalFunction::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     NumberConstructor(VM&amp;, Structure*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeNumberPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/NumberPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/NumberPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/NumberPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> class NumberPrototype : public NumberObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef NumberObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static NumberPrototype* create(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -45,7 +46,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, JSGlobalObject*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | NumberObject::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     NumberPrototype(VM&amp;, Structure*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeObjectConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ObjectConstructor.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ObjectConstructor.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/ObjectConstructor.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> class ObjectConstructor : public InternalFunction {
</span><span class="cx"> public:
</span><span class="cx">     typedef InternalFunction Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static ObjectConstructor* create(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure, ObjectPrototype* objectPrototype)
</span><span class="cx">     {
</span><span class="lines">@@ -51,7 +52,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, JSGlobalObject*, ObjectPrototype*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InternalFunction::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     ObjectConstructor(VM&amp;, Structure*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimePropertyMapHashTableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx">     return v;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-class PropertyTable : public JSCell {
</del><ins>+class PropertyTable final : public JSCell {
</ins><span class="cx"> 
</span><span class="cx">     // This is the implementation for 'iterator' and 'const_iterator',
</span><span class="cx">     // used for iterating over the table in insertion order.
</span><span class="lines">@@ -120,8 +120,10 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> public:
</span><ins>+    typedef JSCell Base;
+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
+
</ins><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="lines">@@ -190,9 +192,6 @@
</span><span class="cx">     void checkConsistency();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = StructureIsImmortal;
-
</del><span class="cx"> private:
</span><span class="cx">     PropertyTable(VM&amp;, unsigned initialCapacity);
</span><span class="cx">     PropertyTable(VM&amp;, const PropertyTable&amp;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeRegExph"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/RegExp.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/RegExp.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/RegExp.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -42,13 +42,13 @@
</span><span class="cx"> 
</span><span class="cx"> JS_EXPORT_PRIVATE RegExpFlags regExpFlags(const String&amp;);
</span><span class="cx"> 
</span><del>-class RegExp : public JSCell {
</del><ins>+class RegExp final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE static RegExp* create(VM&amp;, const String&amp; pattern, RegExpFlags);
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     bool global() const { return m_flags &amp; FlagGlobal; }
</span><span class="lines">@@ -85,8 +85,6 @@
</span><span class="cx">     RegExpKey key() { return RegExpKey(m_flags, m_patternString); }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = StructureIsImmortal;
-
</del><span class="cx">     void finishCreation(VM&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeRegExpConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/RegExpConstructor.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/RegExpConstructor.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/RegExpConstructor.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> class RegExpConstructor : public InternalFunction {
</span><span class="cx"> public:
</span><span class="cx">     typedef InternalFunction Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static RegExpConstructor* create(VM&amp; vm, Structure* structure, RegExpPrototype* regExpPrototype)
</span><span class="cx">     {
</span><span class="lines">@@ -68,7 +69,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, RegExpPrototype*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | Base::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     RegExpConstructor(VM&amp;, Structure*, RegExpPrototype*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeRegExpObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/RegExpObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/RegExpObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/RegExpObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> class RegExpObject : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static RegExpObject* create(VM&amp; vm, Structure* structure, RegExp* regExp)
</span><span class="cx">     {
</span><span class="lines">@@ -77,8 +78,6 @@
</span><span class="cx">     JS_EXPORT_PRIVATE RegExpObject(VM&amp;, Structure*, RegExp*);
</span><span class="cx">     JS_EXPORT_PRIVATE void finishCreation(VM&amp;);
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | Base::StructureFlags;
-
</del><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, PropertyName);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeRegExpPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/RegExpPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/RegExpPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/RegExpPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> class RegExpPrototype : public RegExpObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef RegExpObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static RegExpPrototype* create(VM&amp; vm, Structure* structure, RegExp* regExp)
</span><span class="cx">     {
</span><span class="lines">@@ -46,7 +47,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     RegExpPrototype(VM&amp;, Structure*, RegExp*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | RegExpObject::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeScopedArgumentsTableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ScopedArgumentsTable.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ScopedArgumentsTable.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/ScopedArgumentsTable.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -38,9 +38,10 @@
</span><span class="cx"> // and aliases one of these and then decides to modify it; in that case we do copy-on-write. This
</span><span class="cx"> // makes sense because such modifications are so uncommon. You'd have to do something crazy like
</span><span class="cx"> // &quot;delete arguments[i]&quot; or some variant of defineOwnProperty.
</span><del>-class ScopedArgumentsTable : public JSCell {
</del><ins>+class ScopedArgumentsTable final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx">     
</span><span class="cx"> private:
</span><span class="cx">     ScopedArgumentsTable(VM&amp;);
</span><span class="lines">@@ -51,7 +52,6 @@
</span><span class="cx">     static ScopedArgumentsTable* create(VM&amp;, uint32_t length);
</span><span class="cx">     
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     ScopedArgumentsTable* clone(VM&amp;);
</span><span class="lines">@@ -79,8 +79,6 @@
</span><span class="cx">     static ptrdiff_t offsetOfArguments() { return OBJECT_OFFSETOF(ScopedArgumentsTable, m_arguments); }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    static const unsigned StructureFlags = StructureIsImmortal | Base::StructureFlags;
-
</del><span class="cx">     ScopeOffset&amp; at(uint32_t i)
</span><span class="cx">     {
</span><span class="cx">         ASSERT_WITH_SECURITY_IMPLICATION(i &lt; m_length);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeSparseArrayValueMaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/SparseArrayValueMap.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/SparseArrayValueMap.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/SparseArrayValueMap.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -51,9 +51,10 @@
</span><span class="cx">     unsigned attributes;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class SparseArrayValueMap : public JSCell {
</del><ins>+class SparseArrayValueMap final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx">     
</span><span class="cx"> private:
</span><span class="cx">     typedef HashMap&lt;uint64_t, SparseArrayEntry, WTF::IntHash&lt;uint64_t&gt;, WTF::UnsignedWithZeroKeyHashTraits&lt;uint64_t&gt;&gt; Map;
</span><span class="lines">@@ -69,8 +70,6 @@
</span><span class="cx">     
</span><span class="cx">     void finishCreation(VM&amp;);
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = StructureIsImmortal | Base::StructureFlags;
-
</del><span class="cx"> public:
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx">     
</span><span class="lines">@@ -81,7 +80,6 @@
</span><span class="cx">     static SparseArrayValueMap* create(VM&amp;);
</span><span class="cx">     
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx">     
</span><span class="cx">     static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue prototype);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStrictEvalActivationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StrictEvalActivation.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StrictEvalActivation.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/StrictEvalActivation.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> class StrictEvalActivation : public JSScope {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSScope Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | IsEnvironmentRecord;
</ins><span class="cx"> 
</span><span class="cx">     static StrictEvalActivation* create(ExecState* exec, JSScope* currentScope)
</span><span class="cx">     {
</span><span class="lines">@@ -51,9 +52,6 @@
</span><span class="cx">     
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = IsEnvironmentRecord | Base::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     StrictEvalActivation(ExecState*, JSScope*);
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStringConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StringConstructor.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StringConstructor.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/StringConstructor.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> class StringConstructor : public InternalFunction {
</span><span class="cx"> public:
</span><span class="cx">     typedef InternalFunction Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static StringConstructor* create(VM&amp; vm, Structure* structure, StringPrototype* stringPrototype)
</span><span class="cx">     {
</span><span class="lines">@@ -45,9 +46,6 @@
</span><span class="cx">         return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InternalFunction::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     StringConstructor(VM&amp;, Structure*);
</span><span class="cx">     void finishCreation(VM&amp;, StringPrototype*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStringIteratorPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StringIteratorPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StringIteratorPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/StringIteratorPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> class StringIteratorPrototype : public JSNonFinalObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSNonFinalObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static StringIteratorPrototype* create(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -49,9 +50,6 @@
</span><span class="cx">         return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | Base::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     StringIteratorPrototype(VM&amp; vm, Structure* structure)
</span><span class="cx">         : Base(vm, structure)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStringObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StringObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StringObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/StringObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> class StringObject : public JSWrapperObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSWrapperObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static StringObject* create(VM&amp; vm, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -67,7 +68,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     JS_EXPORT_PRIVATE void finishCreation(VM&amp;, JSString*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames | JSWrapperObject::StructureFlags;
</del><span class="cx">     JS_EXPORT_PRIVATE StringObject(VM&amp;, Structure*);
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStringPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StringPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StringPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/StringPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef StringObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags;
</ins><span class="cx"> 
</span><span class="cx">     static StringPrototype* create(VM&amp;, JSGlobalObject*, Structure*);
</span><span class="cx"> 
</span><span class="lines">@@ -45,7 +46,6 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, JSGlobalObject*, JSString*);
</span><del>-    static const unsigned StructureFlags = StringObject::StructureFlags;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructurecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Structure.cpp (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Structure.cpp        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/Structure.cpp        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -202,7 +202,7 @@
</span><span class="cx">     setStaticFunctionsReified(false);
</span><span class="cx">     setHasRareData(false);
</span><span class="cx">  
</span><del>-    TypeInfo typeInfo = TypeInfo(CellType, StructureIsImmortal);
</del><ins>+    TypeInfo typeInfo = TypeInfo(CellType, StructureFlags);
</ins><span class="cx">     m_blob = StructureIDBlob(vm.heap.structureIDTable().allocateID(this), 0, typeInfo);
</span><span class="cx">     m_outOfLineTypeFlags = typeInfo.outOfLineTypeFlags();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Structure.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Structure.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/Structure.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -92,11 +92,12 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class Structure : public JSCell {
</del><ins>+class Structure final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     friend class StructureTransitionTable;
</span><span class="cx"> 
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx">     
</span><span class="cx">     static Structure* create(VM&amp;, JSGlobalObject*, JSValue prototype, const TypeInfo&amp;, const ClassInfo*, IndexingType = NonArray, unsigned inlineCapacity = 0);
</span><span class="cx"> 
</span><span class="lines">@@ -153,7 +154,6 @@
</span><span class="cx">     JS_EXPORT_PRIVATE Structure* flattenDictionaryStructure(VM&amp;, JSObject*);
</span><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     // These should be used with caution.  
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureChainh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StructureChain.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StructureChain.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/StructureChain.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -40,11 +40,12 @@
</span><span class="cx"> class LLIntOffsetsExtractor;
</span><span class="cx"> class Structure;
</span><span class="cx"> 
</span><del>-class StructureChain : public JSCell {
</del><ins>+class StructureChain final : public JSCell {
</ins><span class="cx">     friend class JIT;
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static StructureChain* create(VM&amp; vm, Structure* head)
</span><span class="cx">     { 
</span><span class="lines">@@ -63,12 +64,9 @@
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = StructureIsImmortal;
-
</del><span class="cx">     void finishCreation(VM&amp; vm, Structure* head)
</span><span class="cx">     {
</span><span class="cx">         Base::finishCreation(vm);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureRareDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StructureRareData.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StructureRareData.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/StructureRareData.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -36,12 +36,14 @@
</span><span class="cx"> class JSPropertyNameEnumerator;
</span><span class="cx"> class Structure;
</span><span class="cx"> 
</span><del>-class StructureRareData : public JSCell {
</del><ins>+class StructureRareData final : public JSCell {
</ins><span class="cx"> public:
</span><ins>+    typedef JSCell Base;
+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
+
</ins><span class="cx">     static StructureRareData* create(VM&amp;, Structure*);
</span><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="lines">@@ -65,8 +67,6 @@
</span><span class="cx">     
</span><span class="cx">     StructureRareData(VM&amp;, Structure*);
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = JSCell::StructureFlags;
-
</del><span class="cx">     WriteBarrier&lt;Structure&gt; m_previous;
</span><span class="cx">     WriteBarrier&lt;JSString&gt; m_objectToStringValue;
</span><span class="cx">     WriteBarrier&lt;JSPropertyNameEnumerator&gt; m_cachedPropertyNameEnumerator;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeSymbolh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Symbol.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Symbol.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/Symbol.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -34,14 +34,14 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-class Symbol : public JSCell {
</del><ins>+class Symbol final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx"> 
</span><span class="cx">     static Structure* createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
</span><span class="cx">     {
</span><span class="lines">@@ -81,8 +81,6 @@
</span><span class="cx">     double toNumber(ExecState*) const;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | StructureIsImmortal;
-
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     Symbol(VM&amp;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeSymbolPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/SymbolPrototype.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/SymbolPrototype.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/SymbolPrototype.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> class SymbolPrototype : public JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static SymbolPrototype* create(VM&amp; vm, JSGlobalObject*, Structure* structure)
</span><span class="cx">     {
</span><span class="lines">@@ -55,8 +56,6 @@
</span><span class="cx">     SymbolPrototype(VM&amp;, Structure*);
</span><span class="cx">     void finishCreation(VM&amp;);
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | Base::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeSymbolTableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/SymbolTable.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/SymbolTable.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/SymbolTable.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -404,9 +404,10 @@
</span><span class="cx">     static const bool needsDestruction = true;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class SymbolTable : public JSCell {
</del><ins>+class SymbolTable final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     typedef HashMap&lt;RefPtr&lt;StringImpl&gt;, SymbolTableEntry, IdentifierRepHash, HashTraits&lt;RefPtr&lt;StringImpl&gt;&gt;, SymbolTableIndexHashTraits&gt; Map;
</span><span class="cx">     typedef HashMap&lt;RefPtr&lt;StringImpl&gt;, GlobalVariableID&gt; UniqueIDMap;
</span><span class="lines">@@ -429,7 +430,6 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx">     static void destroy(JSCell*);
</span><span class="cx"> 
</span><span class="cx">     static Structure* createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
</span><span class="lines">@@ -642,9 +642,6 @@
</span><span class="cx"> 
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx"> 
</span><del>-protected:
-    static const unsigned StructureFlags = StructureIsImmortal | Base::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     class WatchpointCleanup : public UnconditionalFinalizer {
</span><span class="cx">     public:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeWeakMapDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/WeakMapData.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/WeakMapData.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/JavaScriptCore/runtime/WeakMapData.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -34,9 +34,10 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-class WeakMapData : public JSCell {
</del><ins>+class WeakMapData final : public JSCell {
</ins><span class="cx"> public:
</span><span class="cx">     typedef JSCell Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</ins><span class="cx"> 
</span><span class="cx">     static WeakMapData* create(VM&amp; vm)
</span><span class="cx">     {
</span><span class="lines">@@ -51,7 +52,6 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = true;
</span><del>-    static const bool hasImmortalStructure = true;
</del><span class="cx"> 
</span><span class="cx">     void set(VM&amp;, JSObject*, JSValue);
</span><span class="cx">     JSValue get(JSObject*);
</span><span class="lines">@@ -61,8 +61,6 @@
</span><span class="cx"> 
</span><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = StructureIsImmortal | Base::StructureFlags;
-
</del><span class="cx">     typedef HashMap&lt;JSObject*, WriteBarrier&lt;Unknown&gt;&gt; MapType;
</span><span class="cx">     MapType::const_iterator begin() const { return m_map.begin(); }
</span><span class="cx">     MapType::const_iterator end() const { return m_map.end(); }
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/WebCore/ChangeLog        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2015-04-13  Andreas Kling  &lt;akling@apple.com&gt;
+
+        Don't segregate heap objects based on Structure immortality.
+        &lt;https://webkit.org/b/143638&gt;
+
+        Reviewed by Darin Adler.
+
+        * bindings/js/JSDOMBinding.h:
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateHeader):
+        (GeneratePrototypeDeclaration):
+        * bridge/objc/objc_runtime.h:
+        * bridge/runtime_array.h:
+        * bridge/runtime_method.h:
+        * bridge/runtime_object.h:
+
</ins><span class="cx"> 2015-04-13  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fixed position element is truncated if moved onscreen by a transform
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMBindingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMBinding.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -84,15 +84,16 @@
</span><span class="cx"> 
</span><span class="cx"> // Base class for all constructor objects in the JSC bindings.
</span><span class="cx"> class DOMConstructorObject : public JSDOMWrapper {
</span><ins>+public:
</ins><span class="cx">     typedef JSDOMWrapper Base;
</span><del>-public:
</del><ins>+    static const unsigned StructureFlags = Base::StructureFlags | JSC::ImplementsHasInstance;
+
</ins><span class="cx">     static JSC::Structure* createStructure(JSC::VM&amp; vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
</span><span class="cx">     {
</span><span class="cx">         return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    static const unsigned StructureFlags = JSC::ImplementsHasInstance | JSDOMWrapper::StructureFlags;
</del><span class="cx">     DOMConstructorObject(JSC::Structure* structure, JSDOMGlobalObject* globalObject)
</span><span class="cx">         : JSDOMWrapper(structure, globalObject)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -1103,6 +1103,16 @@
</span><span class="cx">         push(@headerContent, &quot;    }\n&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    # structure flags
+    if (%structureFlags) {
+        push(@headerContent, &quot;public:\n&quot;);
+        push(@headerContent, &quot;    static const unsigned StructureFlags = &quot;);
+        foreach my $structureFlag (sort (keys %structureFlags)) {
+            push(@headerContent, $structureFlag . &quot; | &quot;);
+        }
+        push(@headerContent, &quot;Base::StructureFlags;\n&quot;);
+    }
+
</ins><span class="cx">     push(@headerContent, &quot;protected:\n&quot;);
</span><span class="cx"> 
</span><span class="cx">     # Constructor
</span><span class="lines">@@ -1119,15 +1129,6 @@
</span><span class="cx">         push(@headerContent, &quot;    }\n\n&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    # structure flags
-    if (%structureFlags) {
-        push(@headerContent, &quot;    static const unsigned StructureFlags = &quot;);
-        foreach my $structureFlag (sort (keys %structureFlags)) {
-            push(@headerContent, $structureFlag . &quot; | &quot;);
-        }
-        push(@headerContent, &quot;Base::StructureFlags;\n&quot;);
-    }
-
</del><span class="cx">     # Index setter
</span><span class="cx">     if ($interface-&gt;extendedAttributes-&gt;{&quot;CustomIndexedSetter&quot;}) {
</span><span class="cx">         push(@headerContent, &quot;    void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);\n&quot;);
</span><span class="lines">@@ -4303,7 +4304,7 @@
</span><span class="cx"> 
</span><span class="cx">     # structure flags
</span><span class="cx">     if (%structureFlags) {
</span><del>-        push(@$outputArray, &quot;protected:\n&quot;);
</del><ins>+        push(@$outputArray, &quot;public:\n&quot;);
</ins><span class="cx">         push(@$outputArray, &quot;    static const unsigned StructureFlags = &quot;);
</span><span class="cx">         foreach my $structureFlag (sort (keys %structureFlags)) {
</span><span class="cx">             push(@$outputArray, $structureFlag . &quot; | &quot;);
</span></span></pre></div>
<a id="trunkSourceWebCorebridgeobjcobjc_runtimeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bridge/objc/objc_runtime.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bridge/objc/objc_runtime.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/WebCore/bridge/objc/objc_runtime.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -93,6 +93,7 @@
</span><span class="cx"> class ObjcFallbackObjectImp : public JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static ObjcFallbackObjectImp* create(ExecState* exec, JSGlobalObject* globalObject, ObjcInstance* instance, const String&amp; propertyName)
</span><span class="cx">     {
</span><span class="lines">@@ -123,7 +124,6 @@
</span><span class="cx"> private:
</span><span class="cx">     ObjcFallbackObjectImp(JSGlobalObject*, Structure*, ObjcInstance*, const String&amp; propertyName);
</span><span class="cx">     static void destroy(JSCell*);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags;
</del><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span><span class="cx">     static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&amp;);
</span><span class="cx">     static CallType getCallData(JSCell*, CallData&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCorebridgeruntime_arrayh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bridge/runtime_array.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bridge/runtime_array.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/WebCore/bridge/runtime_array.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> class RuntimeArray : public JSArray {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSArray Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static RuntimeArray* create(ExecState* exec, Bindings::Array* array)
</span><span class="cx">     {
</span><span class="lines">@@ -80,8 +81,6 @@
</span><span class="cx"> protected:
</span><span class="cx">     void finishCreation(VM&amp;, Bindings::Array*);
</span><span class="cx"> 
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames | JSArray::StructureFlags;
-
</del><span class="cx"> private:
</span><span class="cx">     RuntimeArray(ExecState*, Structure*);
</span><span class="cx">     static EncodedJSValue lengthGetter(ExecState*, JSObject*, EncodedJSValue, PropertyName);
</span></span></pre></div>
<a id="trunkSourceWebCorebridgeruntime_methodh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bridge/runtime_method.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bridge/runtime_method.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/WebCore/bridge/runtime_method.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> class WEBCORE_EXPORT RuntimeMethod : public InternalFunction {
</span><span class="cx"> public:
</span><span class="cx">     typedef InternalFunction Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
</ins><span class="cx"> 
</span><span class="cx">     static RuntimeMethod* create(ExecState* exec, JSGlobalObject* globalObject, Structure* structure, const String&amp; name, Bindings::Method* method)
</span><span class="cx">     {
</span><span class="lines">@@ -60,7 +61,6 @@
</span><span class="cx"> protected:
</span><span class="cx">     RuntimeMethod(JSGlobalObject*, Structure*, Bindings::Method*);
</span><span class="cx">     void finishCreation(VM&amp;, const String&amp;);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InternalFunction::StructureFlags;
</del><span class="cx">     static CallType getCallData(JSCell*, CallData&amp;);
</span><span class="cx"> 
</span><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCorebridgeruntime_objecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bridge/runtime_object.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bridge/runtime_object.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/WebCore/bridge/runtime_object.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> class WEBCORE_EXPORT RuntimeObject : public JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static RuntimeObject* create(VM&amp; vm, Structure* structure, PassRefPtr&lt;Instance&gt; instance)
</span><span class="cx">     {
</span><span class="lines">@@ -75,7 +76,6 @@
</span><span class="cx"> protected:
</span><span class="cx">     RuntimeObject(VM&amp;, Structure*, PassRefPtr&lt;Instance&gt;);
</span><span class="cx">     void finishCreation(VM&amp;);
</span><del>-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | Base::StructureFlags;
</del><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     static EncodedJSValue fallbackObjectGetter(ExecState*, JSObject*, EncodedJSValue, PropertyName);
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/WebKit2/ChangeLog        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2015-04-13  Andreas Kling  &lt;akling@apple.com&gt;
+
+        Don't segregate heap objects based on Structure immortality.
+        &lt;https://webkit.org/b/143638&gt;
+
+        Reviewed by Darin Adler.
+
+        * WebProcess/Plugins/Netscape/JSNPObject.h:
+
</ins><span class="cx"> 2015-04-13  Timothy Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         javascript: links in inline PDFs shouldn't execute JavaScript in the context of the host website
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsNetscapeJSNPObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/JSNPObject.h (182746 => 182747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/JSNPObject.h        2015-04-13 18:38:39 UTC (rev 182746)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/JSNPObject.h        2015-04-13 19:12:48 UTC (rev 182747)
</span><span class="lines">@@ -44,6 +44,7 @@
</span><span class="cx"> class JSNPObject : public JSC::JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSC::JSDestructibleObject Base;
</span><ins>+    static const unsigned StructureFlags = Base::StructureFlags | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames;
</ins><span class="cx"> 
</span><span class="cx">     static JSNPObject* create(JSC::JSGlobalObject* globalObject, NPRuntimeObjectMap* objectMap, NPObject* npObject)
</span><span class="cx">     {
</span><span class="lines">@@ -74,8 +75,6 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     JSNPObject(JSC::JSGlobalObject*, JSC::Structure*, NPRuntimeObjectMap*, NPObject*);
</span><del>-
-    static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | JSObject::StructureFlags;
</del><span class="cx">     
</span><span class="cx">     static JSC::Structure* createStructure(JSC::VM&amp; vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
</span><span class="cx">     {
</span></span></pre>
</div>
</div>

</body>
</html>