summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore')
-rw-r--r--Source/JavaScriptCore/ChangeLog321
-rw-r--r--Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig3
-rw-r--r--Source/JavaScriptCore/JavaScriptCore.order13
-rw-r--r--Source/JavaScriptCore/JavaScriptCore.pri6
-rwxr-xr-xSource/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def18
-rw-r--r--Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj2
-rw-r--r--Source/JavaScriptCore/assembler/ARMAssembler.h22
-rw-r--r--Source/JavaScriptCore/assembler/MacroAssemblerARM.h14
-rw-r--r--Source/JavaScriptCore/dfg/DFGRepatch.cpp4
-rw-r--r--Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp4
-rw-r--r--Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h3
-rw-r--r--Source/JavaScriptCore/heap/Heap.h8
-rw-r--r--Source/JavaScriptCore/heap/MachineStackMarker.cpp14
-rw-r--r--Source/JavaScriptCore/heap/MachineStackMarker.h4
-rw-r--r--Source/JavaScriptCore/heap/MarkStack.cpp26
-rw-r--r--Source/JavaScriptCore/heap/MarkStack.h7
-rw-r--r--Source/JavaScriptCore/heap/MarkedAllocator.cpp17
-rw-r--r--Source/JavaScriptCore/heap/MarkedAllocator.h14
-rw-r--r--Source/JavaScriptCore/heap/MarkedBlock.cpp7
-rw-r--r--Source/JavaScriptCore/heap/MarkedBlock.h11
-rw-r--r--Source/JavaScriptCore/heap/MarkedSpace.cpp17
-rw-r--r--Source/JavaScriptCore/heap/MarkedSpace.h15
-rw-r--r--Source/JavaScriptCore/heap/SlotVisitor.h16
-rw-r--r--Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h61
-rw-r--r--Source/JavaScriptCore/jit/JITInlineMethods.h3
-rw-r--r--Source/JavaScriptCore/llint/LowLevelInterpreter.asm3
-rw-r--r--Source/JavaScriptCore/profiler/Profile.cpp2
-rw-r--r--Source/JavaScriptCore/runtime/DateConstructor.cpp4
-rw-r--r--Source/JavaScriptCore/runtime/DateConversion.cpp4
-rw-r--r--Source/JavaScriptCore/runtime/DatePrototype.cpp20
-rw-r--r--Source/JavaScriptCore/runtime/JSArray.h4
-rw-r--r--Source/JavaScriptCore/runtime/JSDateMath.cpp4
-rw-r--r--Source/JavaScriptCore/runtime/JSGlobalData.h3
-rw-r--r--Source/JavaScriptCore/runtime/JSGlobalThis.cpp2
-rw-r--r--Source/JavaScriptCore/runtime/JSObject.cpp66
-rw-r--r--Source/JavaScriptCore/runtime/JSObject.h24
-rw-r--r--Source/JavaScriptCore/runtime/PropertyNameArray.h5
-rw-r--r--Source/JavaScriptCore/runtime/PropertyOffset.h2
-rw-r--r--Source/JavaScriptCore/runtime/Structure.h61
-rw-r--r--Source/JavaScriptCore/tools/ProfileTreeNode.h2
40 files changed, 667 insertions, 169 deletions
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index 2fcbec387..dc002d41c 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,20 +1,315 @@
-2012-06-13 Patrick Gansterer <paroga@webkit.org>
+2012-07-29 Filip Pizlo <fpizlo@apple.com>
- [WIN] Remove dependency on pthread from MachineStackMarker
- https://bugs.webkit.org/show_bug.cgi?id=68429
+ PropertyNameArray::m_shouldCache is only assigned and never used
+ https://bugs.webkit.org/show_bug.cgi?id=92598
- Reviewed by NOBODY (OOPS!).
+ Reviewed by Dan Bernstein.
- Implement pthread TLS functionality with native windows functions.
+ * runtime/PropertyNameArray.h:
+ (JSC::PropertyNameArray::PropertyNameArray):
+ (PropertyNameArray):
- * heap/MachineStackMarker.cpp: Use the new functions instead of pthread directly.
- * heap/MachineStackMarker.h:
- * wtf/ThreadSpecific.h:
- (WTF::ThreadSpecificKeyCreate): Added wrapper around pthread_key_create.
- (WTF::ThreadSpecificKeyDelete): Added wrapper around pthread_key_delete.
- (WTF::ThreadSpecificSet): Added wrapper around pthread_setspecific.
- (WTF::ThreadSpecificGet): Added wrapper around pthread_getspecific.
- * wtf/ThreadSpecificWin.cpp:
+2012-07-29 Rik Cabanier <cabanier@adobe.com>
+
+ Add ENABLE_CSS_COMPOSITING flag
+ https://bugs.webkit.org/show_bug.cgi?id=92553
+
+ Reviewed by Dirk Schulze.
+
+ Adds compiler flag CSS_COMPOSITING to build systems to enable CSS blending and compositing. See spec https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html
+
+ * Configurations/FeatureDefines.xcconfig:
+
+2012-07-27 Mark Hahnenberg <mhahnenberg@apple.com>
+
+ Split functionality of MarkedAllocator::m_currentBlock
+ https://bugs.webkit.org/show_bug.cgi?id=92550
+
+ Reviewed by Filip Pizlo.
+
+ MarkedAllocator::m_currentBlock serves two purposes right now; it indicates the block that is currently
+ being used for allocation and the beginning of the list of blocks that need to be swept. We should split
+ these two functionalities into two separate fields.
+
+ * heap/MarkedAllocator.cpp:
+ (JSC::MarkedAllocator::tryAllocateHelper): Use m_blocksToSweep instead of m_currentBlock as the
+ initializer/reference of the loop. Only change m_currentBlock when we know what the result will be.
+ (JSC::MarkedAllocator::addBlock): When we add a new block we know that both m_blocksToSweep and
+ m_currentBlock are null. In order to preserve the invariant that m_currentBlock <= m_blocksToSweep,
+ we assign both of them to point to the new block.
+ (JSC::MarkedAllocator::removeBlock): We need a separate check to see if the block we're removing is
+ m_blocksToSweep and if so, advance it to the next block in the list.
+ * heap/MarkedAllocator.h:
+ (MarkedAllocator): Initialize m_blocksToSweep.
+ (JSC::MarkedAllocator::MarkedAllocator):
+ (JSC::MarkedAllocator::reset): We set m_blocksToSweep to be the head of our list. This function is called
+ at the end of a collection, so all of the blocks in our allocator need to be swept. We need to sweep a
+ block before we can start allocating, so m_currentBlock is set to null. We also set the freeList to
+ the empty FreeList to emphasize the fact that we can't start allocating until we do some sweeping.
+
+2012-07-27 Mark Hahnenberg <mhahnenberg@apple.com>
+
+ Increase inline storage for JSFinalObjects by one
+ https://bugs.webkit.org/show_bug.cgi?id=92526
+
+ Reviewed by Geoffrey Garen.
+
+ Now that we've removed the inheritorID from objects, we can increase our inline storage for JSFinalObjects on
+ 64-bit platforms by 1.
+
+ * llint/LowLevelInterpreter.asm: Change the constant.
+ * runtime/PropertyOffset.h: Change the constant.
+ (JSC):
+
+2012-07-27 Jer Noble <jer.noble@apple.com>
+
+ Support a rational time class for use by media elements.
+ https://bugs.webkit.org/show_bug.cgi?id=88787
+
+ Re-export WTF::MediaTime from JavaScriptCore.
+
+ Reviewed by Eric Carlson.
+
+ * JavaScriptCore.order:
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+
+2012-07-26 Filip Pizlo <fpizlo@apple.com>
+
+ JSObject::reallocateStorageIfNecessary is neither used nor defined
+ https://bugs.webkit.org/show_bug.cgi?id=92417
+
+ Reviewed by Mark Rowe.
+
+ * runtime/JSObject.h:
+ (JSObject):
+
+2012-07-26 Mark Hahnenberg <mhahnenberg@apple.com>
+
+ Allocate Structures in a separate part of the Heap
+ https://bugs.webkit.org/show_bug.cgi?id=92420
+
+ Reviewed by Filip Pizlo.
+
+ To fix our issue with destruction/finalization of Structures before their objects, we can move Structures to a separate
+ part of the Heap that will be swept after all other objects. This first patch will just be separating Structures
+ out into their own separate MarkedAllocator. Everything else will behave identically.
+
+ * heap/Heap.h: New function to allocate Structures in the Heap.
+ (Heap):
+ (JSC):
+ (JSC::Heap::allocateStructure):
+ * heap/MarkedAllocator.cpp: Pass whether or not we're allocated Structures to the MarkedBlock.
+ (JSC::MarkedAllocator::allocateBlock):
+ * heap/MarkedAllocator.h: Add tracking for whether or not we're allocating only Structures.
+ (JSC::MarkedAllocator::onlyContainsStructures):
+ (MarkedAllocator):
+ (JSC::MarkedAllocator::MarkedAllocator):
+ (JSC::MarkedAllocator::init):
+ * heap/MarkedBlock.cpp: Add tracking for whether or not we're allocating only Structures. We need this to be able to
+ distinguish the various MarkedBlock types in MarkedSpace::allocatorFor(MarkedBlock*).
+ (JSC::MarkedBlock::create):
+ (JSC::MarkedBlock::MarkedBlock):
+ * heap/MarkedBlock.h:
+ (MarkedBlock):
+ (JSC::MarkedBlock::onlyContainsStructures):
+ (JSC):
+ * heap/MarkedSpace.cpp: Include the new Structure allocator in all the places that all the other allocators are used/modified.
+ (JSC::MarkedSpace::MarkedSpace):
+ (JSC::MarkedSpace::resetAllocators):
+ (JSC::MarkedSpace::canonicalizeCellLivenessData):
+ (JSC::MarkedSpace::isPagedOut):
+ * heap/MarkedSpace.h: Add new MarkedAllocator just for Structures.
+ (MarkedSpace):
+ (JSC::MarkedSpace::allocatorFor):
+ (JSC::MarkedSpace::allocateStructure):
+ (JSC):
+ (JSC::MarkedSpace::forEachBlock):
+ * runtime/Structure.h: Move all of the functions that call allocateCell<Structure> down below the explicit template specialization
+ for allocateCell<Structure>. The new inline specialization for allocateCell directly calls the allocateStructure() function in the
+ Heap.
+ (Structure):
+ (JSC::Structure):
+ (JSC):
+ (JSC::Structure::create):
+ (JSC::Structure::createStructure):
+
+2012-07-26 Filip Pizlo <fpizlo@apple.com>
+
+ JSArray has methods that are neither used nor defined
+ https://bugs.webkit.org/show_bug.cgi?id=92416
+
+ Reviewed by Simon Fraser.
+
+ * runtime/JSArray.h:
+ (JSArray):
+
+2012-07-26 Zoltan Herczeg <zherczeg@webkit.org>
+
+ [Qt][ARM]ARMAssembler needs buildfix afert r123417
+ https://bugs.webkit.org/show_bug.cgi?id=92086
+
+ Reviewed by Csaba Osztrogonác.
+
+ The ARM implementation of this should be optimized code path
+ is covered by a non-optimized code path. This patch fixes this,
+ and adds a new function which returns with the offset range.
+
+ * assembler/ARMAssembler.h:
+ (JSC::ARMAssembler::readPointer):
+ (ARMAssembler):
+ (JSC::ARMAssembler::repatchInt32):
+ (JSC::ARMAssembler::repatchCompact):
+ * assembler/MacroAssemblerARM.h:
+ (MacroAssemblerARM):
+ (JSC::MacroAssemblerARM::isCompactPtrAlignedAddressOffset):
+ (JSC::MacroAssemblerARM::load32WithCompactAddressOffsetPatch):
+
+2012-07-25 Mark Hahnenberg <mhahnenberg@apple.com>
+
+ Build fix for 32-bit after r123682
+
+ * runtime/JSObject.h: Need to pad out JSObjects on 32-bit so that they're the correct size since
+ we only removed one 4-byte word and we need to be 8-byte aligned.
+ (JSObject):
+
+2012-07-25 Filip Pizlo <fpizlo@apple.com>
+
+ JSC GC object copying APIs should allow for greater flexibility
+ https://bugs.webkit.org/show_bug.cgi?id=92316
+
+ Reviewed by Mark Hahnenberg.
+
+ It's now the case that visitChildren() methods can directly pin and allocate in new space during copying.
+ They can also do the copying and marking themselves. This new API is only used for JSObjects for now.
+
+ * JavaScriptCore.xcodeproj/project.pbxproj:
+ * heap/MarkStack.cpp:
+ (JSC::SlotVisitor::allocateNewSpaceSlow):
+ (JSC::SlotVisitor::allocateNewSpaceOrPin):
+ (JSC):
+ (JSC::SlotVisitor::copyAndAppend):
+ * heap/MarkStack.h:
+ (MarkStack):
+ (JSC::MarkStack::appendUnbarrieredValue):
+ (JSC):
+ * heap/SlotVisitor.h:
+ * heap/SlotVisitorInlineMethods.h: Added.
+ (JSC):
+ (JSC::SlotVisitor::checkIfShouldCopyAndPinOtherwise):
+ (JSC::SlotVisitor::allocateNewSpace):
+ * runtime/JSObject.cpp:
+ (JSC::JSObject::visitOutOfLineStorage):
+ (JSC):
+ (JSC::JSObject::visitChildren):
+ (JSC::JSFinalObject::visitChildren):
+ * runtime/JSObject.h:
+ (JSObject):
+
+2012-07-25 Mark Hahnenberg <mhahnenberg@apple.com>
+
+ Remove JSObject::m_inheritorID
+ https://bugs.webkit.org/show_bug.cgi?id=88378
+
+ Reviewed by Filip Pizlo.
+
+ This is rarely used, and not performance critical (the commonly accessed copy is cached on JSFunction),
+ and most objects don't need an inheritorID (this value is only used if the object is used as a prototype).
+ Instead use a private named value in the object's property storage.
+
+ * dfg/DFGSpeculativeJIT.h:
+ (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): No need m_inheritorID to initialize!
+ * jit/JITInlineMethods.h:
+ (JSC::JIT::emitAllocateBasicJSObject): No need m_inheritorID to initialize!
+ * llint/LowLevelInterpreter.asm: No need m_inheritorID to initialize!
+ * runtime/JSGlobalData.h:
+ (JSGlobalData): Added private name 'm_inheritorIDKey'.
+ * runtime/JSGlobalThis.cpp:
+ (JSC::JSGlobalThis::setUnwrappedObject): resetInheritorID is now passed a JSGlobalData&.
+ * runtime/JSObject.cpp:
+ (JSC::JSObject::visitChildren): No m_inheritorID to be marked.
+ (JSC::JSFinalObject::visitChildren): No m_inheritorID to be marked.
+ (JSC::JSObject::createInheritorID): Store the newly created inheritorID in the property map. Make sure
+ it's got the DontEnum attribute!!
+ * runtime/JSObject.h:
+ (JSObject):
+ (JSC::JSObject::resetInheritorID): Remove the inheritorID from property storage.
+ (JSC):
+ (JSC::JSObject::inheritorID): Read the inheritorID from property storage.
+
+2012-07-25 Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
+
+ Create a specialized pair for use in HashMap iterators
+ https://bugs.webkit.org/show_bug.cgi?id=92137
+
+ Reviewed by Ryosuke Niwa.
+
+ Update a couple of sites that relied on the fact that "contents" of iterators were
+ std::pairs.
+
+ * profiler/Profile.cpp:
+ (JSC): This code kept a vector of the pairs that were the "contents" of the iterators. This
+ is changed to use a KeyValuePair. We make use HashCount's ValueType (which represents only
+ the key) to get the proper key parameter for KeyValuePair.
+ * tools/ProfileTreeNode.h:
+ (ProfileTreeNode): Use HashMap::ValueType to declare the type of the contents of the hash
+ instead of declaring it manually. This will make use of the new KeyValuePair.
+
+2012-07-25 Patrick Gansterer <paroga@webkit.org>
+
+ REGRESSION(r123505): Date.getYear() returns the same as Date.getFullYear()
+ https://bugs.webkit.org/show_bug.cgi?id=92218
+
+ Reviewed by Csaba Osztrogonác.
+
+ * runtime/DatePrototype.cpp:
+ (JSC::dateProtoFuncGetYear): Added the missing offset of 1900 to the return value.
+
+2012-07-24 Filip Pizlo <fpizlo@apple.com>
+
+ REGRESSION(r123417): It made tests assert/crash on 32 bit
+ https://bugs.webkit.org/show_bug.cgi?id=92088
+
+ Reviewed by Mark Hahnenberg.
+
+ The pointer arithmetic was wrong, because negative numbers are hard to think about.
+
+ * dfg/DFGRepatch.cpp:
+ (JSC::DFG::emitPutTransitionStub):
+ * dfg/DFGSpeculativeJIT.cpp:
+ (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
+
+2012-07-24 Patrick Gansterer <paroga@webkit.org>
+
+ Store the full year in GregorianDateTime
+ https://bugs.webkit.org/show_bug.cgi?id=92067
+
+ Reviewed by Geoffrey Garen.
+
+ Use the full year instead of the offset from year 1900
+ for the year member variable of GregorianDateTime.
+
+ * runtime/DateConstructor.cpp:
+ (JSC::constructDate):
+ (JSC::dateUTC):
+ * runtime/DateConversion.cpp:
+ (JSC::formatDate):
+ (JSC::formatDateUTCVariant):
+ * runtime/DatePrototype.cpp:
+ (JSC::formatLocaleDate):
+ (JSC::fillStructuresUsingDateArgs):
+ (JSC::dateProtoFuncToISOString):
+ (JSC::dateProtoFuncGetFullYear):
+ (JSC::dateProtoFuncGetUTCFullYear):
+ (JSC::dateProtoFuncSetYear):
+ * runtime/JSDateMath.cpp:
+ (JSC::gregorianDateTimeToMS):
+ (JSC::msToGregorianDateTime):
+
+2012-07-24 Patrick Gansterer <paroga@webkit.org>
+
+ [WIN] Build fix after r123417.
+
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
2012-07-23 Patrick Gansterer <paroga@webkit.org>
diff --git a/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig b/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig
index 0a26e46ff..b5f24899f 100644
--- a/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig
+++ b/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig
@@ -43,6 +43,7 @@ ENABLE_CSS_IMAGE_ORIENTATION = ;
ENABLE_CSS_IMAGE_RESOLUTION = ;
ENABLE_CSS_REGIONS = ENABLE_CSS_REGIONS;
ENABLE_CSS_SHADERS = ENABLE_CSS_SHADERS;
+ENABLE_CSS_COMPOSITING = ;
ENABLE_CSS_STICKY_POSITION = ENABLE_CSS_STICKY_POSITION;
ENABLE_CSS_VARIABLES = ;
ENABLE_CSS3_FLEXBOX = ENABLE_CSS3_FLEXBOX;
@@ -135,4 +136,4 @@ ENABLE_WEB_TIMING = ;
ENABLE_WORKERS = ENABLE_WORKERS;
ENABLE_XSLT = ENABLE_XSLT;
-FEATURE_DEFINES = $(ENABLE_3D_RENDERING) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ANIMATION_API) $(ENABLE_BLOB) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CSP_NEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_EXCLUSIONS) $(ENABLE_CSS_FILTERS) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_REGIONS) $(ENABLE_CSS_SHADERS) $(ENABLE_CSS_STICKY_POSITION) $(ENABLE_CSS_VARIABLES) $(ENABLE_CSS3_FLEXBOX) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_TRANSFER_ITEMS) $(ENABLE_DETAILS_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DIALOG_ELEMENT) $(ENABLE_DIRECTORY_UPLOAD) $(ENABLE_FILE_SYSTEM) $(ENABLE_FILTERS) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_HIGH_DPI_CANVAS) $(ENABLE_ICONDATABASE) $(ENABLE_IFRAME_SEAMLESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INPUT_SPEECH) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_JAVASCRIPT_DEBUGGER) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_NOTIFICATIONS) $(ENABLE_LINK_PREFETCH) $(ENABLE_LINK_PRERENDER) $(ENABLE_MATHML) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MICRODATA) $(ENABLE_MUTATION_OBSERVERS) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAGE_VISIBILITY_API) $(ENABLE_PROGRESS_ELEMENT) $(ENABLE_QUOTA) $(ENABLE_REGISTER_PROTOCOL_HANDLER) $(ENABLE_REQUEST_ANIMATION_FRAME) $(ENABLE_SCRIPTED_SPEECH) $(ENABLE_SHADOW_DOM) $(ENABLE_SHARED_WORKERS) $(ENABLE_SQL_DATABASE) $(ENABLE_STYLE_SCOPED) $(ENABLE_SVG) $(ENABLE_SVG_DOM_OBJC_BINDINGS) $(ENABLE_SVG_FONTS) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TEXT_NOTIFICATIONS_ONLY) $(ENABLE_TOUCH_ICON_LOADING) $(ENABLE_UNDO_MANAGER) $(ENABLE_VIDEO) $(ENABLE_VIDEO_TRACK) $(ENABLE_WEBGL) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_SOCKETS) $(ENABLE_WEB_TIMING) $(ENABLE_WORKERS) $(ENABLE_XSLT);
+FEATURE_DEFINES = $(ENABLE_3D_RENDERING) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ANIMATION_API) $(ENABLE_BLOB) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CSP_NEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_EXCLUSIONS) $(ENABLE_CSS_FILTERS) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_REGIONS) $(ENABLE_CSS_SHADERS) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_STICKY_POSITION) $(ENABLE_CSS_VARIABLES) $(ENABLE_CSS3_FLEXBOX) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_TRANSFER_ITEMS) $(ENABLE_DETAILS_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DIALOG_ELEMENT) $(ENABLE_DIRECTORY_UPLOAD) $(ENABLE_FILE_SYSTEM) $(ENABLE_FILTERS) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_HIGH_DPI_CANVAS) $(ENABLE_ICONDATABASE) $(ENABLE_IFRAME_SEAMLESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INPUT_SPEECH) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_JAVASCRIPT_DEBUGGER) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_NOTIFICATIONS) $(ENABLE_LINK_PREFETCH) $(ENABLE_LINK_PRERENDER) $(ENABLE_MATHML) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MICRODATA) $(ENABLE_MUTATION_OBSERVERS) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAGE_VISIBILITY_API) $(ENABLE_PROGRESS_ELEMENT) $(ENABLE_QUOTA) $(ENABLE_REGISTER_PROTOCOL_HANDLER) $(ENABLE_REQUEST_ANIMATION_FRAME) $(ENABLE_SCRIPTED_SPEECH) $(ENABLE_SHADOW_DOM) $(ENABLE_SHARED_WORKERS) $(ENABLE_SQL_DATABASE) $(ENABLE_STYLE_SCOPED) $(ENABLE_SVG) $(ENABLE_SVG_DOM_OBJC_BINDINGS) $(ENABLE_SVG_FONTS) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TEXT_NOTIFICATIONS_ONLY) $(ENABLE_TOUCH_ICON_LOADING) $(ENABLE_UNDO_MANAGER) $(ENABLE_VIDEO) $(ENABLE_VIDEO_TRACK) $(ENABLE_WEBGL) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_SOCKETS) $(ENABLE_WEB_TIMING) $(ENABLE_WORKERS) $(ENABLE_XSLT);
diff --git a/Source/JavaScriptCore/JavaScriptCore.order b/Source/JavaScriptCore/JavaScriptCore.order
index 3a450075a..0742a0a0e 100644
--- a/Source/JavaScriptCore/JavaScriptCore.order
+++ b/Source/JavaScriptCore/JavaScriptCore.order
@@ -2494,3 +2494,16 @@ __ZN3WTF6VectorIN3JSC10ASTBuilder14AssignmentInfoELm10EE14expandCapacityEm
_cti_op_put_by_id_direct_generic
__ZN3WTF9HashTableIPN3JSC16FunctionBodyNodeESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E4findIS3_NS_22IdentityHashTranslatorIS3_S5_S9_EEEENS_17HashTableIteratorIS3_S5_S7_S9_SE_SC_EERKT_
__ZN3WTF9HashTableIPN3JSC16FunctionBodyNodeESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E6expandEv
+__ZN3WTF3absERKNS_9MediaTimeE
+__ZN3WTF9MediaTime11invalidTimeEv
+__ZN3WTF9MediaTime14indefiniteTimeEv
+__ZN3WTF9MediaTime15createWithFloatEfi
+__ZN3WTF9MediaTime16createWithDoubleEdi
+__ZN3WTF9MediaTime20negativeInfiniteTimeEv
+__ZN3WTF9MediaTime20positiveInfiniteTimeEv
+__ZN3WTF9MediaTimeD1Ev
+__ZNK3WTF9MediaTimegtERKS0_
+__ZNK3WTF9MediaTimeltERKS0_
+__ZNK3WTF9MediaTimemiERKS0_
+__ZNK3WTF9MediaTimeplERKS0_
+
diff --git a/Source/JavaScriptCore/JavaScriptCore.pri b/Source/JavaScriptCore/JavaScriptCore.pri
index f6580c51f..380bbaf1b 100644
--- a/Source/JavaScriptCore/JavaScriptCore.pri
+++ b/Source/JavaScriptCore/JavaScriptCore.pri
@@ -34,6 +34,12 @@ INCLUDEPATH += \
win32-* {
LIBS += -lwinmm
+
+ win32-g++* {
+ LIBS += -lpthreadGC2
+ } else:win32-msvc* {
+ LIBS += -lpthreadVC2
+ }
}
wince* {
diff --git a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
index d8f838e87..5f27859d8 100755
--- a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
+++ b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
@@ -151,6 +151,7 @@ EXPORTS
?deleteProperty@JSSymbolTableObject@JSC@@SA_NPAVJSCell@2@PAVExecState@2@VPropertyName@2@@Z
?deletePropertyByIndex@JSObject@JSC@@SA_NPAVJSCell@2@PAVExecState@2@I@Z
?deleteTable@HashTable@JSC@@QBEXXZ
+ ?description@JSValue@JSC@@QBEPADXZ
?despecifyDictionaryFunction@Structure@JSC@@QAEXAAVJSGlobalData@2@VPropertyName@2@@Z
?despecifyFunctionTransition@Structure@JSC@@SAPAV12@AAVJSGlobalData@2@PAV12@VPropertyName@2@@Z
?destroy@JSCell@JSC@@KAXPAV12@@Z
@@ -378,6 +379,23 @@ EXPORTS
?writable@PropertyDescriptor@JSC@@QBE_NXZ
?writeBarrier@HandleSet@JSC@@QAEXPAVJSValue@2@ABV32@@Z
?yield@WTF@@YAXXZ
+ ?toDouble@MediaTime@WTF@@QBENXZ
+ ?toFloat@MediaTime@WTF@@QBEMXZ
+ ?createWithDouble@MediaTime@WTF@@SA?AV12@NH@Z
+ ?createWithFloat@MediaTime@WTF@@SA?AV12@MH@Z
+ ?abs@WTF@@YA?AVMediaTime@1@ABV21@@Z
+ ?zeroTime@MediaTime@WTF@@SAABV12@XZ
+ ??GMediaTime@WTF@@QBE?AV01@ABV01@@Z
+ ??HMediaTime@WTF@@QBE?AV01@ABV01@@Z
+ ??1MediaTime@WTF@@QAE@XZ
+ ??0MediaTime@WTF@@QAE@_JHI@Z
+ ?indefiniteTime@MediaTime@WTF@@SAABV12@XZ
+ ?invalidTime@MediaTime@WTF@@SAABV12@XZ
+ ??8MediaTime@WTF@@QBE_NABV01@@Z
+ ??MMediaTime@WTF@@QBE_NABV01@@Z
+ ??OMediaTime@WTF@@QBE_NABV01@@Z
+ ?positiveInfiniteTime@MediaTime@WTF@@SAABV12@XZ
+ ?negativeInfiniteTime@MediaTime@WTF@@SAABV12@XZ
WTFGetBacktrace
WTFInvokeCrashHook
WTFLog
diff --git a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
index a81416659..6caa07e6e 100644
--- a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
+++ b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
@@ -949,6 +949,7 @@
0FC8150914043BD200CFA603 /* WriteBarrierSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WriteBarrierSupport.h; sourceTree = "<group>"; };
0FC815121405118600CFA603 /* VTableSpectrum.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VTableSpectrum.cpp; sourceTree = "<group>"; };
0FC815141405118D00CFA603 /* VTableSpectrum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VTableSpectrum.h; sourceTree = "<group>"; };
+ 0FCB408515C0A3C30048932B /* SlotVisitorInlineMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlotVisitorInlineMethods.h; sourceTree = "<group>"; };
0FD3C82014115CF800FD81CB /* DFGDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGDriver.cpp; path = dfg/DFGDriver.cpp; sourceTree = "<group>"; };
0FD3C82214115D0E00FD81CB /* DFGDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGDriver.h; path = dfg/DFGDriver.h; sourceTree = "<group>"; };
0FD81ACF154FB4EB00983E72 /* DFGDominators.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGDominators.cpp; path = dfg/DFGDominators.cpp; sourceTree = "<group>"; };
@@ -1800,6 +1801,7 @@
142D6F0F13539A4100B02E86 /* MarkStack.h */,
1497209014EB831500FEB1B7 /* PassWeak.h */,
14BA78F013AAB88F005B7C2C /* SlotVisitor.h */,
+ 0FCB408515C0A3C30048932B /* SlotVisitorInlineMethods.h */,
142E3132134FF0A600AFADB5 /* Strong.h */,
145722851437E140005FDE26 /* StrongInlines.h */,
141448CC13A1783700F5BA1A /* TinyBloomFilter.h */,
diff --git a/Source/JavaScriptCore/assembler/ARMAssembler.h b/Source/JavaScriptCore/assembler/ARMAssembler.h
index a0d7d27c3..87aed853e 100644
--- a/Source/JavaScriptCore/assembler/ARMAssembler.h
+++ b/Source/JavaScriptCore/assembler/ARMAssembler.h
@@ -817,11 +817,11 @@ namespace JSC {
// Read pointers
static void* readPointer(void* from)
{
- ARMWord* insn = reinterpret_cast<ARMWord*>(from);
- ARMWord* addr = getLdrImmAddress(insn);
- return *reinterpret_cast<void**>(addr);
+ ARMWord* instruction = reinterpret_cast<ARMWord*>(from);
+ ARMWord* address = getLdrImmAddress(instruction);
+ return *reinterpret_cast<void**>(address);
}
-
+
// Patch pointers
static void linkPointer(void* code, AssemblerLabel from, void* to)
@@ -829,14 +829,20 @@ namespace JSC {
patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to);
}
- static void repatchInt32(void* from, int32_t to)
+ static void repatchInt32(void* where, int32_t to)
{
- patchPointerInternal(reinterpret_cast<intptr_t>(from), reinterpret_cast<void*>(to));
+ patchPointerInternal(reinterpret_cast<intptr_t>(where), reinterpret_cast<void*>(to));
}
-
+
static void repatchCompact(void* where, int32_t value)
{
- repatchInt32(where, value);
+ ARMWord* instruction = reinterpret_cast<ARMWord*>(where);
+ ASSERT((*instruction & 0x0f700000) == LoadUint32);
+ if (value >= 0)
+ *instruction = (*instruction & 0xff7ff000) | DT_UP | value;
+ else
+ *instruction = (*instruction & 0xff7ff000) | -value;
+ cacheFlush(instruction, sizeof(ARMWord));
}
static void repatchPointer(void* from, void* to)
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerARM.h b/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
index 2773b022c..530f62b86 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
@@ -41,7 +41,6 @@ class MacroAssemblerARM : public AbstractMacroAssembler<ARMAssembler> {
COMPILE_ASSERT(!(DoubleConditionBitSpecial & DoubleConditionMask), DoubleConditionBitSpecial_should_not_interfere_with_ARMAssembler_Condition_codes);
public:
typedef ARMRegisters::FPRegisterID FPRegisterID;
- static const int MaximumCompactPtrAlignedAddressOffset = 0x7FFFFFFF;
enum RelationalCondition {
Equal = ARMAssembler::EQ,
@@ -408,11 +407,20 @@ public:
m_assembler.dtr_ur(ARMAssembler::LoadUint32, dest, address.base, ARMRegisters::S0);
return dataLabel;
}
-
+
+ static bool isCompactPtrAlignedAddressOffset(ptrdiff_t value)
+ {
+ return value >= -4095 && value <= 4095;
+ }
+
DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest)
{
DataLabelCompact dataLabel(this);
- load32WithAddressOffsetPatch(address, dest);
+ ASSERT(isCompactPtrAlignedAddressOffset(address.offset));
+ if (address.offset >= 0)
+ m_assembler.dtr_u(ARMAssembler::LoadUint32, dest, address.base, address.offset);
+ else
+ m_assembler.dtr_d(ARMAssembler::LoadUint32, dest, address.base, address.offset);
return dataLabel;
}
diff --git a/Source/JavaScriptCore/dfg/DFGRepatch.cpp b/Source/JavaScriptCore/dfg/DFGRepatch.cpp
index ee0c590a8..23e8db03b 100644
--- a/Source/JavaScriptCore/dfg/DFGRepatch.cpp
+++ b/Source/JavaScriptCore/dfg/DFGRepatch.cpp
@@ -839,8 +839,8 @@ static void emitPutTransitionStub(
stubJit.addPtr(MacroAssembler::TrustedImm32(sizeof(JSValue)), scratchGPR1);
// We have scratchGPR1 = new storage, scratchGPR3 = old storage, scratchGPR2 = available
for (ptrdiff_t offset = 0; offset < static_cast<ptrdiff_t>(oldSize); offset += sizeof(void*)) {
- stubJit.loadPtr(MacroAssembler::Address(scratchGPR3, -(offset + sizeof(JSValue) * 2)), scratchGPR2);
- stubJit.storePtr(scratchGPR2, MacroAssembler::Address(scratchGPR1, -(offset + sizeof(JSValue) * 2)));
+ stubJit.loadPtr(MacroAssembler::Address(scratchGPR3, -(offset + sizeof(JSValue) + sizeof(void*))), scratchGPR2);
+ stubJit.storePtr(scratchGPR2, MacroAssembler::Address(scratchGPR1, -(offset + sizeof(JSValue) + sizeof(void*))));
}
}
diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
index 875ac39f0..179ad45fa 100644
--- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
+++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
@@ -3197,8 +3197,8 @@ void SpeculativeJIT::compileReallocatePropertyStorage(Node& node)
slowPathCall(slowPath, this, operationAllocatePropertyStorage, scratchGPR2, newSize));
// We have scratchGPR2 = new storage, scratchGPR1 = scratch
for (ptrdiff_t offset = 0; offset < static_cast<ptrdiff_t>(oldSize); offset += sizeof(void*)) {
- m_jit.loadPtr(JITCompiler::Address(oldStorageGPR, -(offset + sizeof(JSValue) * 2)), scratchGPR1);
- m_jit.storePtr(scratchGPR1, JITCompiler::Address(scratchGPR2, -(offset + sizeof(JSValue) * 2)));
+ m_jit.loadPtr(JITCompiler::Address(oldStorageGPR, -(offset + sizeof(JSValue) + sizeof(void*))), scratchGPR1);
+ m_jit.storePtr(scratchGPR1, JITCompiler::Address(scratchGPR2, -(offset + sizeof(JSValue) + sizeof(void*))));
}
m_jit.storePtr(scratchGPR2, JITCompiler::Address(baseGPR, JSObject::offsetOfOutOfLineStorage()));
diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
index 0e412a199..f43323afd 100644
--- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
+++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
@@ -2144,9 +2144,6 @@ public:
// Initialize the object's classInfo pointer
m_jit.storePtr(MacroAssembler::TrustedImmPtr(&ClassType::s_info), MacroAssembler::Address(resultGPR, JSCell::classInfoOffset()));
- // Initialize the object's inheritorID.
- m_jit.storePtr(MacroAssembler::TrustedImmPtr(0), MacroAssembler::Address(resultGPR, JSObject::offsetOfInheritorID()));
-
// Initialize the object's property storage pointer.
m_jit.storePtr(MacroAssembler::TrustedImmPtr(0), MacroAssembler::Address(resultGPR, ClassType::offsetOfOutOfLineStorage()));
}
diff --git a/Source/JavaScriptCore/heap/Heap.h b/Source/JavaScriptCore/heap/Heap.h
index a43be3df0..595e937ce 100644
--- a/Source/JavaScriptCore/heap/Heap.h
+++ b/Source/JavaScriptCore/heap/Heap.h
@@ -183,6 +183,7 @@ namespace JSC {
void* allocateWithDestructor(size_t);
void* allocateWithoutDestructor(size_t);
+ void* allocateStructure();
static const size_t minExtraCost = 256;
static const size_t maxExtraCost = 1024 * 1024;
@@ -367,7 +368,12 @@ namespace JSC {
ASSERT(isValidAllocation(bytes));
return m_objectSpace.allocateWithoutDestructor(bytes);
}
-
+
+ inline void* Heap::allocateStructure()
+ {
+ return m_objectSpace.allocateStructure();
+ }
+
inline CheckedBoolean Heap::tryAllocateStorage(size_t bytes, void** outPtr)
{
return m_storageSpace.tryAllocate(bytes, outPtr);
diff --git a/Source/JavaScriptCore/heap/MachineStackMarker.cpp b/Source/JavaScriptCore/heap/MachineStackMarker.cpp
index 8e0c57b6a..7eb57479b 100644
--- a/Source/JavaScriptCore/heap/MachineStackMarker.cpp
+++ b/Source/JavaScriptCore/heap/MachineStackMarker.cpp
@@ -141,8 +141,10 @@ MachineThreads::MachineThreads(Heap* heap)
MachineThreads::~MachineThreads()
{
- if (m_threadSpecific)
- ThreadSpecificKeyDelete(m_threadSpecific);
+ if (m_threadSpecific) {
+ int error = pthread_key_delete(m_threadSpecific);
+ ASSERT_UNUSED(error, !error);
+ }
MutexLocker registeredThreadsLock(m_registeredThreadsMutex);
for (Thread* t = m_registeredThreads; t;) {
@@ -179,17 +181,19 @@ void MachineThreads::makeUsableFromMultipleThreads()
if (m_threadSpecific)
return;
- ThreadSpecificKeyCreate(&m_threadSpecific, removeThread);
+ int error = pthread_key_create(&m_threadSpecific, removeThread);
+ if (error)
+ CRASH();
}
void MachineThreads::addCurrentThread()
{
ASSERT(!m_heap->globalData()->exclusiveThread || m_heap->globalData()->exclusiveThread == currentThread());
- if (!m_threadSpecific || ThreadSpecificGet(m_threadSpecific))
+ if (!m_threadSpecific || pthread_getspecific(m_threadSpecific))
return;
- ThreadSpecificSet(m_threadSpecific, this);
+ pthread_setspecific(m_threadSpecific, this);
Thread* thread = new Thread(getCurrentPlatformThread(), wtfThreadData().stack().origin());
MutexLocker lock(m_registeredThreadsMutex);
diff --git a/Source/JavaScriptCore/heap/MachineStackMarker.h b/Source/JavaScriptCore/heap/MachineStackMarker.h
index 3d4aa22d4..5c7705fcf 100644
--- a/Source/JavaScriptCore/heap/MachineStackMarker.h
+++ b/Source/JavaScriptCore/heap/MachineStackMarker.h
@@ -22,8 +22,8 @@
#ifndef MachineThreads_h
#define MachineThreads_h
+#include <pthread.h>
#include <wtf/Noncopyable.h>
-#include <wtf/ThreadSpecific.h>
#include <wtf/ThreadingPrimitives.h>
namespace JSC {
@@ -55,7 +55,7 @@ namespace JSC {
Heap* m_heap;
Mutex m_registeredThreadsMutex;
Thread* m_registeredThreads;
- WTF::ThreadSpecificKey m_threadSpecific;
+ pthread_key_t m_threadSpecific;
};
} // namespace JSC
diff --git a/Source/JavaScriptCore/heap/MarkStack.cpp b/Source/JavaScriptCore/heap/MarkStack.cpp
index 9c679b0ed..02a13077d 100644
--- a/Source/JavaScriptCore/heap/MarkStack.cpp
+++ b/Source/JavaScriptCore/heap/MarkStack.cpp
@@ -35,6 +35,7 @@
#include "JSCell.h"
#include "JSObject.h"
#include "ScopeChain.h"
+#include "SlotVisitorInlineMethods.h"
#include "Structure.h"
#include "UString.h"
#include "WriteBarrier.h"
@@ -518,28 +519,25 @@ void SlotVisitor::startCopying()
ASSERT(!m_copiedAllocator.isValid());
}
-void* SlotVisitor::allocateNewSpace(void* ptr, size_t bytes)
+void* SlotVisitor::allocateNewSpaceSlow(size_t bytes)
{
- if (CopiedSpace::isOversize(bytes)) {
- m_shared.m_copiedSpace->pin(CopiedSpace::oversizeBlockFor(ptr));
- return 0;
- }
-
- if (m_shared.m_copiedSpace->isPinned(ptr))
- return 0;
-
- void* result = 0; // Compilers don't realize that this will be assigned.
- if (m_copiedAllocator.tryAllocate(bytes, &result))
- return result;
-
m_shared.m_copiedSpace->doneFillingBlock(m_copiedAllocator.resetCurrentBlock());
m_copiedAllocator.setCurrentBlock(m_shared.m_copiedSpace->allocateBlockForCopyingPhase());
+ void* result = 0;
CheckedBoolean didSucceed = m_copiedAllocator.tryAllocate(bytes, &result);
ASSERT(didSucceed);
return result;
}
+void* SlotVisitor::allocateNewSpaceOrPin(void* ptr, size_t bytes)
+{
+ if (!checkIfShouldCopyAndPinOtherwise(ptr, bytes))
+ return 0;
+
+ return allocateNewSpace(bytes);
+}
+
ALWAYS_INLINE bool JSString::tryHashConstLock()
{
#if ENABLE(PARALLEL_GC)
@@ -616,7 +614,7 @@ ALWAYS_INLINE void MarkStack::internalAppend(JSValue* slot)
void SlotVisitor::copyAndAppend(void** ptr, size_t bytes, JSValue* values, unsigned length)
{
void* oldPtr = *ptr;
- void* newPtr = allocateNewSpace(oldPtr, bytes);
+ void* newPtr = allocateNewSpaceOrPin(oldPtr, bytes);
if (newPtr) {
size_t jsValuesOffset = static_cast<size_t>(reinterpret_cast<char*>(values) - static_cast<char*>(oldPtr));
diff --git a/Source/JavaScriptCore/heap/MarkStack.h b/Source/JavaScriptCore/heap/MarkStack.h
index ff25531a4..467a5bf46 100644
--- a/Source/JavaScriptCore/heap/MarkStack.h
+++ b/Source/JavaScriptCore/heap/MarkStack.h
@@ -253,6 +253,7 @@ namespace JSC {
template<typename T>
void appendUnbarrieredPointer(T**);
+ void appendUnbarrieredValue(JSValue*);
void addOpaqueRoot(void*);
bool containsOpaqueRoot(void*);
@@ -453,6 +454,12 @@ namespace JSC {
internalAppend(*slot);
}
+ ALWAYS_INLINE void MarkStack::appendUnbarrieredValue(JSValue* slot)
+ {
+ ASSERT(slot);
+ internalAppend(*slot);
+ }
+
ALWAYS_INLINE void MarkStack::append(JSCell** slot)
{
ASSERT(slot);
diff --git a/Source/JavaScriptCore/heap/MarkedAllocator.cpp b/Source/JavaScriptCore/heap/MarkedAllocator.cpp
index 972728637..465e3a72a 100644
--- a/Source/JavaScriptCore/heap/MarkedAllocator.cpp
+++ b/Source/JavaScriptCore/heap/MarkedAllocator.cpp
@@ -29,15 +29,19 @@ bool MarkedAllocator::isPagedOut(double deadline)
inline void* MarkedAllocator::tryAllocateHelper()
{
if (!m_freeList.head) {
- for (MarkedBlock*& block = m_currentBlock; block; block = static_cast<MarkedBlock*>(block->next())) {
+ for (MarkedBlock*& block = m_blocksToSweep; block; block = static_cast<MarkedBlock*>(block->next())) {
m_freeList = block->sweep(MarkedBlock::SweepToFreeList);
- if (m_freeList.head)
+ if (m_freeList.head) {
+ m_currentBlock = block;
break;
+ }
block->didConsumeFreeList();
}
- if (!m_freeList.head)
+ if (!m_freeList.head) {
+ m_currentBlock = 0;
return 0;
+ }
}
MarkedBlock::FreeCell* head = m_freeList.head;
@@ -92,7 +96,7 @@ void* MarkedAllocator::allocateSlowCase()
MarkedBlock* MarkedAllocator::allocateBlock()
{
- MarkedBlock* block = MarkedBlock::create(m_heap->blockAllocator().allocate(), m_heap, m_cellSize, m_cellsNeedDestruction);
+ MarkedBlock* block = MarkedBlock::create(m_heap->blockAllocator().allocate(), m_heap, m_cellSize, m_cellsNeedDestruction, m_onlyContainsStructures);
m_markedSpace->didAddBlock(block);
return block;
}
@@ -100,10 +104,11 @@ MarkedBlock* MarkedAllocator::allocateBlock()
void MarkedAllocator::addBlock(MarkedBlock* block)
{
ASSERT(!m_currentBlock);
+ ASSERT(!m_blocksToSweep);
ASSERT(!m_freeList.head);
m_blockList.append(block);
- m_currentBlock = block;
+ m_blocksToSweep = m_currentBlock = block;
m_freeList = block->sweep(MarkedBlock::SweepToFreeList);
}
@@ -113,6 +118,8 @@ void MarkedAllocator::removeBlock(MarkedBlock* block)
m_currentBlock = static_cast<MarkedBlock*>(m_currentBlock->next());
m_freeList = MarkedBlock::FreeList();
}
+ if (m_blocksToSweep == block)
+ m_blocksToSweep = static_cast<MarkedBlock*>(m_blocksToSweep->next());
m_blockList.remove(block);
}
diff --git a/Source/JavaScriptCore/heap/MarkedAllocator.h b/Source/JavaScriptCore/heap/MarkedAllocator.h
index 8b3620f08..47bae9451 100644
--- a/Source/JavaScriptCore/heap/MarkedAllocator.h
+++ b/Source/JavaScriptCore/heap/MarkedAllocator.h
@@ -24,6 +24,7 @@ public:
void zapFreeList();
size_t cellSize() { return m_cellSize; }
bool cellsNeedDestruction() { return m_cellsNeedDestruction; }
+ bool onlyContainsStructures() { return m_onlyContainsStructures; }
void* allocate();
Heap* heap() { return m_heap; }
@@ -31,7 +32,7 @@ public:
void addBlock(MarkedBlock*);
void removeBlock(MarkedBlock*);
- void init(Heap*, MarkedSpace*, size_t cellSize, bool cellsNeedDestruction);
+ void init(Heap*, MarkedSpace*, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures);
bool isPagedOut(double deadline);
@@ -45,28 +46,33 @@ private:
MarkedBlock::FreeList m_freeList;
MarkedBlock* m_currentBlock;
+ MarkedBlock* m_blocksToSweep;
DoublyLinkedList<HeapBlock> m_blockList;
size_t m_cellSize;
bool m_cellsNeedDestruction;
+ bool m_onlyContainsStructures;
Heap* m_heap;
MarkedSpace* m_markedSpace;
};
inline MarkedAllocator::MarkedAllocator()
: m_currentBlock(0)
+ , m_blocksToSweep(0)
, m_cellSize(0)
, m_cellsNeedDestruction(true)
+ , m_onlyContainsStructures(false)
, m_heap(0)
, m_markedSpace(0)
{
}
-inline void MarkedAllocator::init(Heap* heap, MarkedSpace* markedSpace, size_t cellSize, bool cellsNeedDestruction)
+inline void MarkedAllocator::init(Heap* heap, MarkedSpace* markedSpace, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures)
{
m_heap = heap;
m_markedSpace = markedSpace;
m_cellSize = cellSize;
m_cellsNeedDestruction = cellsNeedDestruction;
+ m_onlyContainsStructures = onlyContainsStructures;
}
inline void* MarkedAllocator::allocate()
@@ -82,7 +88,9 @@ inline void* MarkedAllocator::allocate()
inline void MarkedAllocator::reset()
{
- m_currentBlock = static_cast<MarkedBlock*>(m_blockList.head());
+ m_currentBlock = 0;
+ m_freeList = MarkedBlock::FreeList();
+ m_blocksToSweep = static_cast<MarkedBlock*>(m_blockList.head());
}
inline void MarkedAllocator::zapFreeList()
diff --git a/Source/JavaScriptCore/heap/MarkedBlock.cpp b/Source/JavaScriptCore/heap/MarkedBlock.cpp
index 01e4237cb..8ede87927 100644
--- a/Source/JavaScriptCore/heap/MarkedBlock.cpp
+++ b/Source/JavaScriptCore/heap/MarkedBlock.cpp
@@ -32,9 +32,9 @@
namespace JSC {
-MarkedBlock* MarkedBlock::create(const PageAllocationAligned& allocation, Heap* heap, size_t cellSize, bool cellsNeedDestruction)
+MarkedBlock* MarkedBlock::create(const PageAllocationAligned& allocation, Heap* heap, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures)
{
- return new (NotNull, allocation.base()) MarkedBlock(allocation, heap, cellSize, cellsNeedDestruction);
+ return new (NotNull, allocation.base()) MarkedBlock(allocation, heap, cellSize, cellsNeedDestruction, onlyContainsStructures);
}
PageAllocationAligned MarkedBlock::destroy(MarkedBlock* block)
@@ -46,11 +46,12 @@ PageAllocationAligned MarkedBlock::destroy(MarkedBlock* block)
return allocation;
}
-MarkedBlock::MarkedBlock(const PageAllocationAligned& allocation, Heap* heap, size_t cellSize, bool cellsNeedDestruction)
+MarkedBlock::MarkedBlock(const PageAllocationAligned& allocation, Heap* heap, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures)
: HeapBlock(allocation)
, m_atomsPerCell((cellSize + atomSize - 1) / atomSize)
, m_endAtom(atomsPerBlock - m_atomsPerCell + 1)
, m_cellsNeedDestruction(cellsNeedDestruction)
+ , m_onlyContainsStructures(onlyContainsStructures)
, m_state(New) // All cells start out unmarked.
, m_weakSet(heap)
{
diff --git a/Source/JavaScriptCore/heap/MarkedBlock.h b/Source/JavaScriptCore/heap/MarkedBlock.h
index c3c43752b..ff7840632 100644
--- a/Source/JavaScriptCore/heap/MarkedBlock.h
+++ b/Source/JavaScriptCore/heap/MarkedBlock.h
@@ -113,7 +113,7 @@ namespace JSC {
ReturnType m_count;
};
- static MarkedBlock* create(const PageAllocationAligned&, Heap*, size_t cellSize, bool cellsNeedDestruction);
+ static MarkedBlock* create(const PageAllocationAligned&, Heap*, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures);
static PageAllocationAligned destroy(MarkedBlock*);
static bool isAtomAligned(const void*);
@@ -145,6 +145,7 @@ namespace JSC {
size_t cellSize();
bool cellsNeedDestruction();
+ bool onlyContainsStructures();
size_t size();
size_t capacity();
@@ -195,7 +196,7 @@ namespace JSC {
typedef char Atom[atomSize];
- MarkedBlock(const PageAllocationAligned&, Heap*, size_t cellSize, bool cellsNeedDestruction);
+ MarkedBlock(const PageAllocationAligned&, Heap*, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures);
Atom* atoms();
size_t atomNumber(const void*);
void callDestructor(JSCell*);
@@ -213,6 +214,7 @@ namespace JSC {
WTF::Bitmap<atomsPerBlock, WTF::BitmapNotAtomic> m_marks;
#endif
bool m_cellsNeedDestruction;
+ bool m_onlyContainsStructures;
BlockState m_state;
WeakSet m_weakSet;
};
@@ -322,6 +324,11 @@ namespace JSC {
return m_cellsNeedDestruction;
}
+ inline bool MarkedBlock::onlyContainsStructures()
+ {
+ return m_onlyContainsStructures;
+ }
+
inline size_t MarkedBlock::size()
{
return markCount() * cellSize();
diff --git a/Source/JavaScriptCore/heap/MarkedSpace.cpp b/Source/JavaScriptCore/heap/MarkedSpace.cpp
index a742d8d9a..a9e9ef64d 100644
--- a/Source/JavaScriptCore/heap/MarkedSpace.cpp
+++ b/Source/JavaScriptCore/heap/MarkedSpace.cpp
@@ -80,14 +80,16 @@ MarkedSpace::MarkedSpace(Heap* heap)
: m_heap(heap)
{
for (size_t cellSize = preciseStep; cellSize <= preciseCutoff; cellSize += preciseStep) {
- allocatorFor(cellSize).init(heap, this, cellSize, false);
- destructorAllocatorFor(cellSize).init(heap, this, cellSize, true);
+ allocatorFor(cellSize).init(heap, this, cellSize, false, false);
+ destructorAllocatorFor(cellSize).init(heap, this, cellSize, true, false);
}
for (size_t cellSize = impreciseStep; cellSize <= impreciseCutoff; cellSize += impreciseStep) {
- allocatorFor(cellSize).init(heap, this, cellSize, false);
- destructorAllocatorFor(cellSize).init(heap, this, cellSize, true);
+ allocatorFor(cellSize).init(heap, this, cellSize, false, false);
+ destructorAllocatorFor(cellSize).init(heap, this, cellSize, true, false);
}
+
+ m_structureAllocator.init(heap, this, WTF::roundUpToMultipleOf(32, sizeof(Structure)), true, true);
}
MarkedSpace::~MarkedSpace()
@@ -117,6 +119,8 @@ void MarkedSpace::resetAllocators()
allocatorFor(cellSize).reset();
destructorAllocatorFor(cellSize).reset();
}
+
+ m_structureAllocator.reset();
}
void MarkedSpace::visitWeakSets(HeapRootVisitor& heapRootVisitor)
@@ -141,6 +145,8 @@ void MarkedSpace::canonicalizeCellLivenessData()
allocatorFor(cellSize).zapFreeList();
destructorAllocatorFor(cellSize).zapFreeList();
}
+
+ m_structureAllocator.zapFreeList();
}
bool MarkedSpace::isPagedOut(double deadline)
@@ -155,6 +161,9 @@ bool MarkedSpace::isPagedOut(double deadline)
return true;
}
+ if (m_structureAllocator.isPagedOut(deadline))
+ return true;
+
return false;
}
diff --git a/Source/JavaScriptCore/heap/MarkedSpace.h b/Source/JavaScriptCore/heap/MarkedSpace.h
index 62d4e5d9e..d2a0688f1 100644
--- a/Source/JavaScriptCore/heap/MarkedSpace.h
+++ b/Source/JavaScriptCore/heap/MarkedSpace.h
@@ -80,7 +80,8 @@ public:
MarkedAllocator& destructorAllocatorFor(size_t);
void* allocateWithDestructor(size_t);
void* allocateWithoutDestructor(size_t);
-
+ void* allocateStructure();
+
void resetAllocators();
void visitWeakSets(HeapRootVisitor&);
@@ -132,6 +133,7 @@ private:
Subspace m_destructorSpace;
Subspace m_normalSpace;
+ MarkedAllocator m_structureAllocator;
Heap* m_heap;
MarkedBlockSet m_blocks;
@@ -168,8 +170,12 @@ inline MarkedAllocator& MarkedSpace::allocatorFor(size_t bytes)
inline MarkedAllocator& MarkedSpace::allocatorFor(MarkedBlock* block)
{
+ if (block->onlyContainsStructures())
+ return m_structureAllocator;
+
if (block->cellsNeedDestruction())
return destructorAllocatorFor(block->cellSize());
+
return allocatorFor(block->cellSize());
}
@@ -191,6 +197,11 @@ inline void* MarkedSpace::allocateWithDestructor(size_t bytes)
return destructorAllocatorFor(bytes).allocate();
}
+inline void* MarkedSpace::allocateStructure()
+{
+ return m_structureAllocator.allocate();
+}
+
template <typename Functor> inline typename Functor::ReturnType MarkedSpace::forEachBlock(Functor& functor)
{
for (size_t i = 0; i < preciseCount; ++i) {
@@ -203,6 +214,8 @@ template <typename Functor> inline typename Functor::ReturnType MarkedSpace::for
m_destructorSpace.impreciseAllocators[i].forEachBlock(functor);
}
+ m_structureAllocator.forEachBlock(functor);
+
return functor.returnValue();
}
diff --git a/Source/JavaScriptCore/heap/SlotVisitor.h b/Source/JavaScriptCore/heap/SlotVisitor.h
index d16602f15..a31e88c08 100644
--- a/Source/JavaScriptCore/heap/SlotVisitor.h
+++ b/Source/JavaScriptCore/heap/SlotVisitor.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -62,11 +62,23 @@ public:
void finalizeUnconditionalFinalizers();
void startCopying();
+
+ // High-level API for copying, appropriate for cases where the object's heap references
+ // fall into a contiguous region of the storage chunk and if the object for which you're
+ // doing copying does not occur frequently.
void copyAndAppend(void**, size_t, JSValue*, unsigned);
+
+ // Low-level API for copying, appropriate for cases where the object's heap references
+ // are discontiguous or if the object occurs frequently enough that you need to focus on
+ // performance. Use this with care as it is easy to shoot yourself in the foot.
+ bool checkIfShouldCopyAndPinOtherwise(void* oldPtr, size_t);
+ void* allocateNewSpace(size_t);
+
void doneCopying();
private:
- void* allocateNewSpace(void*, size_t);
+ void* allocateNewSpaceOrPin(void*, size_t);
+ void* allocateNewSpaceSlow(size_t);
void donateKnownParallel();
diff --git a/Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h b/Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h
new file mode 100644
index 000000000..f02564e10
--- /dev/null
+++ b/Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SlotVisitorInlineMethods_h
+#define SlotVisitorInlineMethods_h
+
+#include "CopiedSpaceInlineMethods.h"
+#include "SlotVisitor.h"
+
+namespace JSC {
+
+ALWAYS_INLINE bool SlotVisitor::checkIfShouldCopyAndPinOtherwise(void* oldPtr, size_t bytes)
+{
+ if (CopiedSpace::isOversize(bytes)) {
+ m_shared.m_copiedSpace->pin(CopiedSpace::oversizeBlockFor(oldPtr));
+ return false;
+ }
+
+ if (m_shared.m_copiedSpace->isPinned(oldPtr))
+ return false;
+
+ return true;
+}
+
+ALWAYS_INLINE void* SlotVisitor::allocateNewSpace(size_t bytes)
+{
+ void* result = 0; // Compilers don't realize that this will be assigned.
+ if (LIKELY(m_copiedAllocator.tryAllocate(bytes, &result)))
+ return result;
+
+ result = allocateNewSpaceSlow(bytes);
+ ASSERT(result);
+ return result;
+}
+
+} // namespace JSC
+
+#endif // SlotVisitorInlineMethods_h
+
diff --git a/Source/JavaScriptCore/jit/JITInlineMethods.h b/Source/JavaScriptCore/jit/JITInlineMethods.h
index 42a61ecdb..32bc1837d 100644
--- a/Source/JavaScriptCore/jit/JITInlineMethods.h
+++ b/Source/JavaScriptCore/jit/JITInlineMethods.h
@@ -425,9 +425,6 @@ template <typename ClassType, bool destructor, typename StructureType> inline vo
// initialize the object's classInfo pointer
storePtr(TrustedImmPtr(&ClassType::s_info), Address(result, JSCell::classInfoOffset()));
- // initialize the inheritor ID
- storePtr(TrustedImmPtr(0), Address(result, JSObject::offsetOfInheritorID()));
-
// initialize the object's property storage pointer
storePtr(TrustedImmPtr(0), Address(result, ClassType::offsetOfOutOfLineStorage()));
}
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
index 492535bb2..2ae3e0cb2 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
@@ -86,7 +86,7 @@ const HashFlags8BitBuffer = 64
# Property storage constants
if JSVALUE64
- const InlineStorageCapacity = 4
+ const InlineStorageCapacity = 5
else
const InlineStorageCapacity = 6
end
@@ -318,7 +318,6 @@ macro allocateBasicJSObject(sizeClassIndex, classInfoOffset, structure, result,
loadp classInfoOffset[scratch1], scratch2
storep scratch2, [result]
storep structure, JSCell::m_structure[result]
- storep 0, JSObject::m_inheritorID[result]
storep 0, JSObject::m_outOfLineStorage[result]
end
end
diff --git a/Source/JavaScriptCore/profiler/Profile.cpp b/Source/JavaScriptCore/profiler/Profile.cpp
index 49d6de97a..92e32c4ba 100644
--- a/Source/JavaScriptCore/profiler/Profile.cpp
+++ b/Source/JavaScriptCore/profiler/Profile.cpp
@@ -107,7 +107,7 @@ void Profile::debugPrintData() const
m_head->debugPrintData(0);
}
-typedef pair<StringImpl*, unsigned> NameCountPair;
+typedef WTF::KeyValuePair<FunctionCallHashCount::ValueType, unsigned> NameCountPair;
static inline bool functionNameCountPairComparator(const NameCountPair& a, const NameCountPair& b)
{
diff --git a/Source/JavaScriptCore/runtime/DateConstructor.cpp b/Source/JavaScriptCore/runtime/DateConstructor.cpp
index 0325080f6..5984bbf97 100644
--- a/Source/JavaScriptCore/runtime/DateConstructor.cpp
+++ b/Source/JavaScriptCore/runtime/DateConstructor.cpp
@@ -136,7 +136,7 @@ JSObject* constructDate(ExecState* exec, JSGlobalObject* globalObject, const Arg
else {
GregorianDateTime t;
int year = JSC::toInt32(doubleArguments[0]);
- t.setYear((year >= 0 && year <= 99) ? year : year - 1900);
+ t.setYear((year >= 0 && year <= 99) ? (year + 1900) : year);
t.setMonth(JSC::toInt32(doubleArguments[1]));
t.setMonthDay((numArgs >= 3) ? JSC::toInt32(doubleArguments[2]) : 1);
t.setHour(JSC::toInt32(doubleArguments[3]));
@@ -214,7 +214,7 @@ static EncodedJSValue JSC_HOST_CALL dateUTC(ExecState* exec)
GregorianDateTime t;
int year = JSC::toInt32(doubleArguments[0]);
- t.setYear((year >= 0 && year <= 99) ? year : year - 1900);
+ t.setYear((year >= 0 && year <= 99) ? (year + 1900) : year);
t.setMonth(JSC::toInt32(doubleArguments[1]));
t.setMonthDay((n >= 3) ? JSC::toInt32(doubleArguments[2]) : 1);
t.setHour(JSC::toInt32(doubleArguments[3]));
diff --git a/Source/JavaScriptCore/runtime/DateConversion.cpp b/Source/JavaScriptCore/runtime/DateConversion.cpp
index e8714c14c..706ffe9a2 100644
--- a/Source/JavaScriptCore/runtime/DateConversion.cpp
+++ b/Source/JavaScriptCore/runtime/DateConversion.cpp
@@ -59,14 +59,14 @@ void formatDate(const GregorianDateTime &t, DateConversionBuffer& buffer)
{
snprintf(buffer, DateConversionBufferSize, "%s %s %02d %04d",
weekdayName[(t.weekDay() + 6) % 7],
- monthName[t.month()], t.monthDay(), t.year() + 1900);
+ monthName[t.month()], t.monthDay(), t.year());
}
void formatDateUTCVariant(const GregorianDateTime &t, DateConversionBuffer& buffer)
{
snprintf(buffer, DateConversionBufferSize, "%s, %02d %s %04d",
weekdayName[(t.weekDay() + 6) % 7],
- t.monthDay(), monthName[t.month()], t.year() + 1900);
+ t.monthDay(), monthName[t.month()], t.year());
}
void formatTime(const GregorianDateTime &t, DateConversionBuffer& buffer)
diff --git a/Source/JavaScriptCore/runtime/DatePrototype.cpp b/Source/JavaScriptCore/runtime/DatePrototype.cpp
index aa65acd05..7cbab0497 100644
--- a/Source/JavaScriptCore/runtime/DatePrototype.cpp
+++ b/Source/JavaScriptCore/runtime/DatePrototype.cpp
@@ -222,7 +222,7 @@ static JSCell* formatLocaleDate(ExecState* exec, const GregorianDateTime& gdt, L
#if OS(WINDOWS)
SYSTEMTIME systemTime;
memset(&systemTime, 0, sizeof(systemTime));
- systemTime.wYear = gdt.year() + 1900;
+ systemTime.wYear = gdt.year();
systemTime.wMonth = gdt.month() + 1;
systemTime.wDay = gdt.monthDay();
systemTime.wDayOfWeek = gdt.weekDay();
@@ -265,7 +265,7 @@ static JSCell* formatLocaleDate(ExecState* exec, const GregorianDateTime& gdt, L
// Offset year if needed
struct tm localTM = gdt;
- int year = gdt.year() + 1900;
+ int year = gdt.year();
bool yearNeedsOffset = year < 1900 || year > 2038;
if (yearNeedsOffset)
localTM.tm_year = equivalentYearForDST(year) - 1900;
@@ -412,7 +412,7 @@ static bool fillStructuresUsingDateArgs(ExecState *exec, int maxArgs, double *ms
if (maxArgs >= 3 && idx < numArgs) {
double years = exec->argument(idx++).toIntegerPreserveNaN(exec);
ok = isfinite(years);
- t->setYear(toInt32(years - 1900));
+ t->setYear(toInt32(years));
}
// months
if (maxArgs >= 2 && idx < numArgs && ok) {
@@ -567,10 +567,10 @@ EncodedJSValue JSC_HOST_CALL dateProtoFuncToISOString(ExecState* exec)
int ms = static_cast<int>(fmod(thisDateObj->internalNumber(), msPerSecond));
if (ms < 0)
ms += msPerSecond;
- if (gregorianDateTime->year() > 8099 || gregorianDateTime->year() < -1900)
- snprintf(buffer, sizeof(buffer) - 1, "%+07d-%02d-%02dT%02d:%02d:%02d.%03dZ", 1900 + gregorianDateTime->year(), gregorianDateTime->month() + 1, gregorianDateTime->monthDay(), gregorianDateTime->hour(), gregorianDateTime->minute(), gregorianDateTime->second(), ms);
+ if (gregorianDateTime->year() > 9999 || gregorianDateTime->year() < 0)
+ snprintf(buffer, sizeof(buffer) - 1, "%+07d-%02d-%02dT%02d:%02d:%02d.%03dZ", gregorianDateTime->year(), gregorianDateTime->month() + 1, gregorianDateTime->monthDay(), gregorianDateTime->hour(), gregorianDateTime->minute(), gregorianDateTime->second(), ms);
else
- snprintf(buffer, sizeof(buffer) - 1, "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", 1900 + gregorianDateTime->year(), gregorianDateTime->month() + 1, gregorianDateTime->monthDay(), gregorianDateTime->hour(), gregorianDateTime->minute(), gregorianDateTime->second(), ms);
+ snprintf(buffer, sizeof(buffer) - 1, "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", gregorianDateTime->year(), gregorianDateTime->month() + 1, gregorianDateTime->monthDay(), gregorianDateTime->hour(), gregorianDateTime->minute(), gregorianDateTime->second(), ms);
buffer[sizeof(buffer) - 1] = 0;
return JSValue::encode(jsNontrivialString(exec, buffer));
}
@@ -657,7 +657,7 @@ EncodedJSValue JSC_HOST_CALL dateProtoFuncGetFullYear(ExecState* exec)
const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTime(exec);
if (!gregorianDateTime)
return JSValue::encode(jsNaN());
- return JSValue::encode(jsNumber(1900 + gregorianDateTime->year()));
+ return JSValue::encode(jsNumber(gregorianDateTime->year()));
}
EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCFullYear(ExecState* exec)
@@ -671,7 +671,7 @@ EncodedJSValue JSC_HOST_CALL dateProtoFuncGetUTCFullYear(ExecState* exec)
const GregorianDateTime* gregorianDateTime = thisDateObj->gregorianDateTimeUTC(exec);
if (!gregorianDateTime)
return JSValue::encode(jsNaN());
- return JSValue::encode(jsNumber(1900 + gregorianDateTime->year()));
+ return JSValue::encode(jsNumber(gregorianDateTime->year()));
}
EncodedJSValue JSC_HOST_CALL dateProtoFuncToGMTString(ExecState* exec)
@@ -1116,7 +1116,7 @@ EncodedJSValue JSC_HOST_CALL dateProtoFuncSetYear(ExecState* exec)
return JSValue::encode(result);
}
- gregorianDateTime.setYear(toInt32((year > 99 || year < 0) ? year - 1900 : year));
+ gregorianDateTime.setYear(toInt32((year >= 0 && year <= 99) ? (year + 1900) : year));
JSValue result = jsNumber(gregorianDateTimeToMS(exec, gregorianDateTime, ms, false));
thisDateObj->setInternalValue(exec->globalData(), result);
return JSValue::encode(result);
@@ -1135,7 +1135,7 @@ EncodedJSValue JSC_HOST_CALL dateProtoFuncGetYear(ExecState* exec)
return JSValue::encode(jsNaN());
// NOTE: IE returns the full year even in getYear.
- return JSValue::encode(jsNumber(gregorianDateTime->year()));
+ return JSValue::encode(jsNumber(gregorianDateTime->year() - 1900));
}
EncodedJSValue JSC_HOST_CALL dateProtoFuncToJSON(ExecState* exec)
diff --git a/Source/JavaScriptCore/runtime/JSArray.h b/Source/JavaScriptCore/runtime/JSArray.h
index 52c591324..c0b9916d1 100644
--- a/Source/JavaScriptCore/runtime/JSArray.h
+++ b/Source/JavaScriptCore/runtime/JSArray.h
@@ -287,9 +287,6 @@ namespace JSC {
static bool deletePropertyByIndex(JSCell*, ExecState*, unsigned propertyName);
static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
- JS_EXPORT_PRIVATE void* subclassData() const;
- JS_EXPORT_PRIVATE void setSubclassData(void*);
-
private:
static size_t storageSize(unsigned vectorLength);
bool isLengthWritable()
@@ -304,7 +301,6 @@ namespace JSC {
void allocateSparseMap(JSGlobalData&);
void deallocateSparseMap();
- bool getOwnPropertySlotSlowCase(ExecState*, unsigned propertyName, PropertySlot&);
void putByIndexBeyondVectorLength(ExecState*, unsigned propertyName, JSValue, bool shouldThrow);
JS_EXPORT_PRIVATE bool putDirectIndexBeyondVectorLength(ExecState*, unsigned propertyName, JSValue, bool shouldThrow);
diff --git a/Source/JavaScriptCore/runtime/JSDateMath.cpp b/Source/JavaScriptCore/runtime/JSDateMath.cpp
index a7840938c..fcf1c4345 100644
--- a/Source/JavaScriptCore/runtime/JSDateMath.cpp
+++ b/Source/JavaScriptCore/runtime/JSDateMath.cpp
@@ -203,7 +203,7 @@ double getUTCOffset(ExecState* exec)
double gregorianDateTimeToMS(ExecState* exec, const GregorianDateTime& t, double milliSeconds, bool inputIsUTC)
{
- double day = dateToDaysFrom1970(t.year() + 1900, t.month(), t.monthDay());
+ double day = dateToDaysFrom1970(t.year(), t.month(), t.monthDay());
double ms = timeToMS(t.hour(), t.minute(), t.second(), milliSeconds);
double result = (day * WTF::msPerDay) + ms;
@@ -235,7 +235,7 @@ void msToGregorianDateTime(ExecState* exec, double ms, bool outputIsUTC, Gregori
tm.setYearDay(dayInYear(ms, year));
tm.setMonthDay(dayInMonthFromDayInYear(tm.yearDay(), isLeapYear(year)));
tm.setMonth(monthFromDayInYear(tm.yearDay(), isLeapYear(year)));
- tm.setYear(year - 1900);
+ tm.setYear(year);
tm.setIsDST(dstOff != 0.0);
tm.setUtcOffset(static_cast<long>((dstOff + utcOff) / WTF::msPerSecond));
}
diff --git a/Source/JavaScriptCore/runtime/JSGlobalData.h b/Source/JavaScriptCore/runtime/JSGlobalData.h
index 59a672f67..4604737d2 100644
--- a/Source/JavaScriptCore/runtime/JSGlobalData.h
+++ b/Source/JavaScriptCore/runtime/JSGlobalData.h
@@ -39,6 +39,7 @@
#include "JSValue.h"
#include "LLIntData.h"
#include "NumericStrings.h"
+#include "PrivateName.h"
#include "SmallStrings.h"
#include "Strong.h"
#include "Terminator.h"
@@ -293,6 +294,8 @@ namespace JSC {
bool canUseRegExpJIT() { return m_canUseAssembler; }
#endif
+ PrivateName m_inheritorIDKey;
+
OwnPtr<ParserArena> parserArena;
OwnPtr<Keywords> keywords;
Interpreter* interpreter;
diff --git a/Source/JavaScriptCore/runtime/JSGlobalThis.cpp b/Source/JavaScriptCore/runtime/JSGlobalThis.cpp
index abd31ac14..b2bbae5d7 100644
--- a/Source/JavaScriptCore/runtime/JSGlobalThis.cpp
+++ b/Source/JavaScriptCore/runtime/JSGlobalThis.cpp
@@ -53,7 +53,7 @@ void JSGlobalThis::setUnwrappedObject(JSGlobalData& globalData, JSGlobalObject*
ASSERT_ARG(globalObject, globalObject);
m_unwrappedObject.set(globalData, this, globalObject);
setPrototype(globalData, globalObject->prototype());
- resetInheritorID();
+ resetInheritorID(globalData);
}
} // namespace JSC
diff --git a/Source/JavaScriptCore/runtime/JSObject.cpp b/Source/JavaScriptCore/runtime/JSObject.cpp
index a84597f8b..c40c625e1 100644
--- a/Source/JavaScriptCore/runtime/JSObject.cpp
+++ b/Source/JavaScriptCore/runtime/JSObject.cpp
@@ -38,6 +38,7 @@
#include "Operations.h"
#include "PropertyDescriptor.h"
#include "PropertyNameArray.h"
+#include "SlotVisitorInlineMethods.h"
#include <math.h>
#include <wtf/Assertions.h>
@@ -85,6 +86,31 @@ static inline void getClassPropertyNames(ExecState* exec, const ClassInfo* class
}
}
+ALWAYS_INLINE void JSObject::visitOutOfLineStorage(SlotVisitor& visitor, PropertyStorage storage, size_t storageSize)
+{
+ ASSERT(storage);
+ ASSERT(storageSize);
+
+ size_t capacity = structure()->outOfLineCapacity();
+ ASSERT(capacity);
+ size_t capacityInBytes = capacity * sizeof(WriteBarrierBase<Unknown>);
+ PropertyStorage baseOfStorage = storage - capacity - 1;
+ if (visitor.checkIfShouldCopyAndPinOtherwise(baseOfStorage, capacityInBytes)) {
+ PropertyStorage newBaseOfStorage = static_cast<PropertyStorage>(visitor.allocateNewSpace(capacityInBytes));
+ PropertyStorage currentTarget = newBaseOfStorage + capacity;
+ PropertyStorage newStorage = currentTarget + 1;
+ PropertyStorage currentSource = storage - 1;
+ for (size_t count = storageSize; count--;) {
+ JSValue value = (--currentSource)->get();
+ ASSERT(value);
+ visitor.appendUnbarrieredValue(&value);
+ (--currentTarget)->setWithoutWriteBarrier(value);
+ }
+ m_outOfLineStorage.set(newStorage, StorageBarrier::Unchecked);
+ } else
+ visitor.appendValues(storage - storageSize - 1, storageSize);
+}
+
void JSObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSObject* thisObject = jsCast<JSObject*>(cell);
@@ -97,18 +123,8 @@ void JSObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
JSCell::visitChildren(thisObject, visitor);
PropertyStorage storage = thisObject->outOfLineStorage();
- if (storage) {
- size_t storageSize = thisObject->structure()->outOfLineSizeForKnownNonFinalObject();
- size_t capacity = thisObject->structure()->outOfLineCapacity();
- // We have this extra temp here to slake GCC's thirst for the blood of those who dereference type-punned pointers.
- void* temp = storage - capacity - 1;
- visitor.copyAndAppend(&temp, capacity * sizeof(WriteBarrierBase<Unknown>), (storage - storageSize - 1)->slot(), storageSize);
- storage = static_cast<PropertyStorage>(temp) + capacity + 1;
- thisObject->m_outOfLineStorage.set(storage, StorageBarrier::Unchecked);
- }
-
- if (thisObject->m_inheritorID)
- visitor.append(&thisObject->m_inheritorID);
+ if (storage)
+ thisObject->visitOutOfLineStorage(visitor, storage, thisObject->structure()->outOfLineSizeForKnownNonFinalObject());
#if !ASSERT_DISABLED
visitor.m_isCheckingForDefaultMarkViolation = wasCheckingForDefaultMarkViolation;
@@ -127,18 +143,8 @@ void JSFinalObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
JSCell::visitChildren(thisObject, visitor);
PropertyStorage storage = thisObject->outOfLineStorage();
- if (storage) {
- size_t storageSize = thisObject->structure()->outOfLineSizeForKnownFinalObject();
- size_t capacity = thisObject->structure()->outOfLineCapacity();
- // We have this extra temp here to slake GCC's thirst for the blood of those who dereference type-punned pointers.
- void* temp = storage - capacity - 1;
- visitor.copyAndAppend(&temp, thisObject->structure()->outOfLineCapacity() * sizeof(WriteBarrierBase<Unknown>), (storage - storageSize - 1)->slot(), storageSize);
- storage = static_cast<PropertyStorage>(temp) + capacity + 1;
- thisObject->m_outOfLineStorage.set(storage, StorageBarrier::Unchecked);
- }
-
- if (thisObject->m_inheritorID)
- visitor.append(&thisObject->m_inheritorID);
+ if (storage)
+ thisObject->visitOutOfLineStorage(visitor, storage, thisObject->structure()->outOfLineSizeForKnownFinalObject());
size_t storageSize = thisObject->structure()->inlineSizeForKnownFinalObject();
visitor.appendValues(thisObject->inlineStorage(), storageSize);
@@ -580,15 +586,21 @@ NEVER_INLINE void JSObject::fillGetterPropertySlot(PropertySlot& slot, WriteBarr
Structure* JSObject::createInheritorID(JSGlobalData& globalData)
{
+ ASSERT(!getDirectLocation(globalData, globalData.m_inheritorIDKey));
+
JSGlobalObject* globalObject;
if (isGlobalThis())
globalObject = static_cast<JSGlobalThis*>(this)->unwrappedObject();
else
globalObject = structure()->globalObject();
ASSERT(globalObject);
- m_inheritorID.set(globalData, this, createEmptyObjectStructure(globalData, globalObject, this));
- ASSERT(m_inheritorID->isEmpty());
- return m_inheritorID.get();
+
+ Structure* inheritorID = createEmptyObjectStructure(globalData, globalObject, this);
+ ASSERT(inheritorID->isEmpty());
+
+ PutPropertySlot slot;
+ putDirectInternal<PutModeDefineOwnProperty>(globalData, globalData.m_inheritorIDKey, inheritorID, DontEnum, slot, 0);
+ return inheritorID;
}
PropertyStorage JSObject::growOutOfLineStorage(JSGlobalData& globalData, size_t oldSize, size_t newSize)
diff --git a/Source/JavaScriptCore/runtime/JSObject.h b/Source/JavaScriptCore/runtime/JSObject.h
index cc43440ab..82da5eef9 100644
--- a/Source/JavaScriptCore/runtime/JSObject.h
+++ b/Source/JavaScriptCore/runtime/JSObject.h
@@ -272,7 +272,6 @@ namespace JSC {
JS_EXPORT_PRIVATE PropertyStorage growOutOfLineStorage(JSGlobalData&, size_t oldSize, size_t newSize);
void setOutOfLineStorage(JSGlobalData&, PropertyStorage, Structure*);
- bool reallocateStorageIfNecessary(JSGlobalData&, unsigned oldCapacity, Structure*);
void setStructureAndReallocateStorageIfNecessary(JSGlobalData&, unsigned oldCapacity, Structure*);
void setStructureAndReallocateStorageIfNecessary(JSGlobalData&, Structure*);
@@ -295,7 +294,6 @@ namespace JSC {
static size_t offsetOfInlineStorage();
static size_t offsetOfOutOfLineStorage();
- static size_t offsetOfInheritorID();
static JS_EXPORTDATA const ClassInfo s_info;
@@ -322,10 +320,12 @@ namespace JSC {
// To create derived types you likely want JSNonFinalObject, below.
JSObject(JSGlobalData&, Structure*);
- void resetInheritorID()
+ void resetInheritorID(JSGlobalData& globalData)
{
- m_inheritorID.clear();
+ removeDirect(globalData, globalData.m_inheritorIDKey);
}
+
+ void visitOutOfLineStorage(SlotVisitor&, PropertyStorage, size_t storageSize);
private:
friend class LLIntOffsetsExtractor;
@@ -348,7 +348,9 @@ namespace JSC {
Structure* createInheritorID(JSGlobalData&);
StorageBarrier m_outOfLineStorage;
- WriteBarrier<Structure> m_inheritorID;
+#if USE(JSVALUE32_64)
+ void* m_padding;
+#endif
};
@@ -461,11 +463,6 @@ inline size_t JSObject::offsetOfOutOfLineStorage()
return OBJECT_OFFSETOF(JSObject, m_outOfLineStorage);
}
-inline size_t JSObject::offsetOfInheritorID()
-{
- return OBJECT_OFFSETOF(JSObject, m_inheritorID);
-}
-
inline bool JSObject::isGlobalObject() const
{
return structure()->typeInfo().type() == GlobalObjectType;
@@ -564,9 +561,10 @@ inline void JSObject::setPrototype(JSGlobalData& globalData, JSValue prototype)
inline Structure* JSObject::inheritorID(JSGlobalData& globalData)
{
- if (m_inheritorID) {
- ASSERT(m_inheritorID->isEmpty());
- return m_inheritorID.get();
+ if (WriteBarrierBase<Unknown>* location = getDirectLocation(globalData, globalData.m_inheritorIDKey)) {
+ Structure* inheritorID = jsCast<Structure*>(location->get());
+ ASSERT(inheritorID->isEmpty());
+ return inheritorID;
}
return createInheritorID(globalData);
}
diff --git a/Source/JavaScriptCore/runtime/PropertyNameArray.h b/Source/JavaScriptCore/runtime/PropertyNameArray.h
index dabda945b..89b1af00b 100644
--- a/Source/JavaScriptCore/runtime/PropertyNameArray.h
+++ b/Source/JavaScriptCore/runtime/PropertyNameArray.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2008, 2012 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -55,14 +55,12 @@ namespace JSC {
PropertyNameArray(JSGlobalData* globalData)
: m_data(PropertyNameArrayData::create())
, m_globalData(globalData)
- , m_shouldCache(true)
{
}
PropertyNameArray(ExecState* exec)
: m_data(PropertyNameArrayData::create())
, m_globalData(&exec->globalData())
- , m_shouldCache(true)
{
}
@@ -91,7 +89,6 @@ namespace JSC {
RefPtr<PropertyNameArrayData> m_data;
IdentifierSet m_set;
JSGlobalData* m_globalData;
- bool m_shouldCache;
};
} // namespace JSC
diff --git a/Source/JavaScriptCore/runtime/PropertyOffset.h b/Source/JavaScriptCore/runtime/PropertyOffset.h
index 3883d910f..511c5e334 100644
--- a/Source/JavaScriptCore/runtime/PropertyOffset.h
+++ b/Source/JavaScriptCore/runtime/PropertyOffset.h
@@ -36,7 +36,7 @@ namespace JSC {
#if USE(JSVALUE32_64)
#define INLINE_STORAGE_CAPACITY 6
#else
-#define INLINE_STORAGE_CAPACITY 4
+#define INLINE_STORAGE_CAPACITY 5
#endif
typedef int PropertyOffset;
diff --git a/Source/JavaScriptCore/runtime/Structure.h b/Source/JavaScriptCore/runtime/Structure.h
index 712ea6bb5..8e41781e2 100644
--- a/Source/JavaScriptCore/runtime/Structure.h
+++ b/Source/JavaScriptCore/runtime/Structure.h
@@ -68,14 +68,7 @@ namespace JSC {
typedef JSCell Base;
- static Structure* create(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype, const TypeInfo& typeInfo, const ClassInfo* classInfo)
- {
- ASSERT(globalData.structureStructure);
- ASSERT(classInfo);
- Structure* structure = new (NotNull, allocateCell<Structure>(globalData.heap)) Structure(globalData, globalObject, prototype, typeInfo, classInfo);
- structure->finishCreation(globalData);
- return structure;
- }
+ static Structure* create(JSGlobalData&, JSGlobalObject*, JSValue prototype, const TypeInfo&, const ClassInfo*);
protected:
void finishCreation(JSGlobalData& globalData)
@@ -330,13 +323,7 @@ namespace JSC {
return OBJECT_OFFSETOF(Structure, m_typeInfo) + TypeInfo::typeOffset();
}
- static Structure* createStructure(JSGlobalData& globalData)
- {
- ASSERT(!globalData.structureStructure);
- Structure* structure = new (NotNull, allocateCell<Structure>(globalData.heap)) Structure(globalData);
- structure->finishCreation(globalData, CreatingEarlyCell);
- return structure;
- }
+ static Structure* createStructure(JSGlobalData&);
bool transitionWatchpointSetHasBeenInvalidated() const
{
@@ -368,13 +355,7 @@ namespace JSC {
Structure(JSGlobalData&);
Structure(JSGlobalData&, const Structure*);
- static Structure* create(JSGlobalData& globalData, const Structure* structure)
- {
- ASSERT(globalData.structureStructure);
- Structure* newStructure = new (NotNull, allocateCell<Structure>(globalData.heap)) Structure(globalData, structure);
- newStructure->finishCreation(globalData);
- return newStructure;
- }
+ static Structure* create(JSGlobalData&, const Structure*);
typedef enum {
NoneDictionaryKind = 0,
@@ -461,6 +442,42 @@ namespace JSC {
unsigned m_staticFunctionReified;
};
+ template <> inline void* allocateCell<Structure>(Heap& heap)
+ {
+#if ENABLE(GC_VALIDATION)
+ ASSERT(!heap.globalData()->isInitializingObject());
+ heap.globalData()->setInitializingObjectClass(&Structure::s_info);
+#endif
+ JSCell* result = static_cast<JSCell*>(heap.allocateStructure());
+ result->clearStructure();
+ return result;
+ }
+
+ inline Structure* Structure::create(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype, const TypeInfo& typeInfo, const ClassInfo* classInfo)
+ {
+ ASSERT(globalData.structureStructure);
+ ASSERT(classInfo);
+ Structure* structure = new (NotNull, allocateCell<Structure>(globalData.heap)) Structure(globalData, globalObject, prototype, typeInfo, classInfo);
+ structure->finishCreation(globalData);
+ return structure;
+ }
+
+ inline Structure* Structure::createStructure(JSGlobalData& globalData)
+ {
+ ASSERT(!globalData.structureStructure);
+ Structure* structure = new (NotNull, allocateCell<Structure>(globalData.heap)) Structure(globalData);
+ structure->finishCreation(globalData, CreatingEarlyCell);
+ return structure;
+ }
+
+ inline Structure* Structure::create(JSGlobalData& globalData, const Structure* structure)
+ {
+ ASSERT(globalData.structureStructure);
+ Structure* newStructure = new (NotNull, allocateCell<Structure>(globalData.heap)) Structure(globalData, structure);
+ newStructure->finishCreation(globalData);
+ return newStructure;
+ }
+
inline PropertyOffset Structure::get(JSGlobalData& globalData, PropertyName propertyName)
{
ASSERT(structure()->classInfo() == &s_info);
diff --git a/Source/JavaScriptCore/tools/ProfileTreeNode.h b/Source/JavaScriptCore/tools/ProfileTreeNode.h
index 9de39ad8a..7b51efb85 100644
--- a/Source/JavaScriptCore/tools/ProfileTreeNode.h
+++ b/Source/JavaScriptCore/tools/ProfileTreeNode.h
@@ -30,7 +30,7 @@ namespace JSC {
class ProfileTreeNode {
typedef HashMap<String, ProfileTreeNode> Map;
- typedef std::pair<String, ProfileTreeNode> MapEntry;
+ typedef Map::ValueType MapEntry;
public:
ProfileTreeNode()