Changeset 47022 in webkit for trunk/JavaScriptCore
- Timestamp:
- Aug 10, 2009, 9:35:02 PM (16 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 1 added
- 56 edited
- 3 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r47010 r47022 1 2009-08-07 Oliver Hunt <[email protected]> 2 3 Reviewed by Gavin Barraclough. 4 5 Stack overflow crash in JavaScript garbage collector mark pass 6 https://bugs.webkit.org/show_bug.cgi?id=12216 7 8 Make the GC mark phase iterative by using an explicit mark stack. 9 To do this marking any single object is performed in multiple stages 10 * The object is appended to the MarkStack, this sets the marked 11 bit for the object using the new markDirect() function, and then 12 returns 13 * When the MarkStack is drain()ed the object is popped off the stack 14 and markChildren(MarkStack&) is called on the object to collect 15 all of its children. drain() then repeats until the stack is empty. 16 17 Additionally I renamed a number of methods from 'mark' to 'markAggregate' 18 in order to make it more clear that marking of those object was not 19 going to result in an actual recursive mark. 20 21 * GNUmakefile.am 22 * JavaScriptCore.exp: 23 * JavaScriptCore.gypi: 24 * JavaScriptCore.pri: 25 * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: 26 * JavaScriptCore.xcodeproj/project.pbxproj: 27 * bytecode/CodeBlock.cpp: 28 (JSC::CodeBlock::markAggregate): 29 * bytecode/CodeBlock.h: 30 * bytecode/EvalCodeCache.h: 31 (JSC::EvalCodeCache::markAggregate): 32 * debugger/DebuggerActivation.cpp: 33 (JSC::DebuggerActivation::markChildren): 34 * debugger/DebuggerActivation.h: 35 * interpreter/Register.h: 36 * interpreter/RegisterFile.h: 37 (JSC::RegisterFile::markGlobals): 38 (JSC::RegisterFile::markCallFrames): 39 * parser/Nodes.cpp: 40 (JSC::ScopeNodeData::markAggregate): 41 (JSC::EvalNode::markAggregate): 42 (JSC::FunctionBodyNode::markAggregate): 43 * parser/Nodes.h: 44 (JSC::ScopeNode::markAggregate): 45 * runtime/ArgList.cpp: 46 (JSC::MarkedArgumentBuffer::markLists): 47 * runtime/ArgList.h: 48 * runtime/Arguments.cpp: 49 (JSC::Arguments::markChildren): 50 * runtime/Arguments.h: 51 * runtime/Collector.cpp: 52 (JSC::Heap::markConservatively): 53 (JSC::Heap::markCurrentThreadConservativelyInternal): 54 (JSC::Heap::markCurrentThreadConservatively): 55 (JSC::Heap::markOtherThreadConservatively): 56 (JSC::Heap::markStackObjectsConservatively): 57 (JSC::Heap::markProtectedObjects): 58 (JSC::Heap::collect): 59 * runtime/Collector.h: 60 * runtime/GetterSetter.cpp: 61 (JSC::GetterSetter::markChildren): 62 * runtime/GetterSetter.h: 63 (JSC::GetterSetter::GetterSetter): 64 (JSC::GetterSetter::createStructure): 65 * runtime/GlobalEvalFunction.cpp: 66 (JSC::GlobalEvalFunction::markChildren): 67 * runtime/GlobalEvalFunction.h: 68 * runtime/JSActivation.cpp: 69 (JSC::JSActivation::markChildren): 70 * runtime/JSActivation.h: 71 * runtime/JSArray.cpp: 72 (JSC::JSArray::markChildren): 73 * runtime/JSArray.h: 74 * runtime/JSCell.h: 75 (JSC::JSCell::markCellDirect): 76 (JSC::JSCell::markChildren): 77 (JSC::JSValue::markDirect): 78 (JSC::JSValue::markChildren): 79 (JSC::JSValue::hasChildren): 80 (JSC::MarkStack::append): 81 (JSC::MarkStack::drain): 82 * runtime/JSFunction.cpp: 83 (JSC::JSFunction::markChildren): 84 * runtime/JSFunction.h: 85 * runtime/JSGlobalData.cpp: 86 (JSC::JSGlobalData::JSGlobalData): 87 * runtime/JSGlobalData.h: 88 * runtime/JSGlobalObject.cpp: 89 (JSC::markIfNeeded): 90 (JSC::JSGlobalObject::markChildren): 91 * runtime/JSGlobalObject.h: 92 * runtime/JSNotAnObject.cpp: 93 (JSC::JSNotAnObject::markChildren): 94 * runtime/JSNotAnObject.h: 95 * runtime/JSONObject.cpp: 96 (JSC::Stringifier::markAggregate): 97 (JSC::JSONObject::markStringifiers): 98 * runtime/JSONObject.h: 99 * runtime/JSObject.cpp: 100 (JSC::JSObject::markChildren): 101 (JSC::JSObject::defineGetter): 102 (JSC::JSObject::defineSetter): 103 * runtime/JSObject.h: 104 * runtime/JSPropertyNameIterator.cpp: 105 (JSC::JSPropertyNameIterator::markChildren): 106 * runtime/JSPropertyNameIterator.h: 107 (JSC::JSPropertyNameIterator::createStructure): 108 (JSC::JSPropertyNameIterator::JSPropertyNameIterator): 109 (JSC::JSPropertyNameIterator::create): 110 * runtime/JSStaticScopeObject.cpp: 111 (JSC::JSStaticScopeObject::markChildren): 112 * runtime/JSStaticScopeObject.h: 113 * runtime/JSType.h: 114 (JSC::): 115 * runtime/JSValue.h: 116 * runtime/JSWrapperObject.cpp: 117 (JSC::JSWrapperObject::markChildren): 118 * runtime/JSWrapperObject.h: 119 * runtime/MarkStack.cpp: Added. 120 (JSC::MarkStack::compact): 121 * runtime/MarkStack.h: Added. 122 (JSC::): 123 (JSC::MarkStack::MarkStack): 124 (JSC::MarkStack::append): 125 (JSC::MarkStack::appendValues): 126 (JSC::MarkStack::~MarkStack): 127 (JSC::MarkStack::MarkSet::MarkSet): 128 (JSC::MarkStack::pageSize): 129 130 MarkStackArray is a non-shrinking, mmap-based vector type 131 used for storing objects to be marked. 132 (JSC::MarkStack::MarkStackArray::MarkStackArray): 133 (JSC::MarkStack::MarkStackArray::~MarkStackArray): 134 (JSC::MarkStack::MarkStackArray::expand): 135 (JSC::MarkStack::MarkStackArray::append): 136 (JSC::MarkStack::MarkStackArray::removeLast): 137 (JSC::MarkStack::MarkStackArray::isEmpty): 138 (JSC::MarkStack::MarkStackArray::size): 139 (JSC::MarkStack::MarkStackArray::shrinkAllocation): 140 * runtime/MarkStackPosix.cpp: Added. 141 (JSC::MarkStack::allocateStack): 142 (JSC::MarkStack::releaseStack): 143 * runtime/MarkStackWin.cpp: Added. 144 (JSC::MarkStack::allocateStack): 145 (JSC::MarkStack::releaseStack): 146 147 * runtime/ScopeChain.h: 148 * runtime/ScopeChainMark.h: 149 (JSC::ScopeChain::markAggregate): 150 * runtime/SmallStrings.cpp: 151 (JSC::SmallStrings::mark): 152 * runtime/Structure.h: 153 (JSC::Structure::markAggregate): 154 1 155 2009-08-10 Mark Rowe <[email protected]> 2 156 -
trunk/JavaScriptCore/GNUmakefile.am
r47003 r47022 192 192 JavaScriptCore/runtime/LiteralParser.cpp \ 193 193 JavaScriptCore/runtime/LiteralParser.h \ 194 JavaScriptCore/runtime/MarkStack.cpp \ 195 JavaScriptCore/runtime/MarkStack.h \ 196 JavaScriptCore/runtime/MarkStackPosix.cpp \ 194 197 JavaScriptCore/runtime/SmallStrings.cpp \ 195 198 JavaScriptCore/runtime/SmallStrings.h \ … … 437 440 JavaScriptCore/runtime/Lookup.cpp \ 438 441 JavaScriptCore/runtime/Lookup.h \ 442 JavaScriptCore/runtime/MarkStack.cpp \ 443 JavaScriptCore/runtime/MarkStack.h \ 444 JavaScriptCore/runtime/MarkStackWin.cpp \ 439 445 JavaScriptCore/runtime/MathObject.cpp \ 440 446 JavaScriptCore/runtime/MathObject.h \ -
trunk/JavaScriptCore/JavaScriptCore.exp
r46598 r47022 132 132 __ZN3JSC14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE 133 133 __ZN3JSC14JSGlobalObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE 134 __ZN3JSC14JSGlobalObject12markChildrenERNS_9MarkStackE 134 135 __ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj 135 136 __ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE 136 137 __ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE 137 __ZN3JSC14JSGlobalObject4markEv138 138 __ZN3JSC14JSGlobalObjectD2Ev 139 139 __ZN3JSC14JSGlobalObjectnwEmPNS_12JSGlobalDataE … … 142 142 __ZN3JSC14TimeoutChecker5resetEv 143 143 __ZN3JSC14constructArrayEPNS_9ExecStateERKNS_7ArgListE 144 __ZN3JSC15JSWrapperObject 4markEv144 __ZN3JSC15JSWrapperObject12markChildrenERNS_9MarkStackE 145 145 __ZN3JSC15toInt32SlowCaseEdRb 146 146 __ZN3JSC16FunctionBodyNode13finishParsingEPNS_10IdentifierEm … … 237 237 __ZN3JSC8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE 238 238 __ZN3JSC8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE 239 __ZN3JSC8JSObject12markChildrenERNS_9MarkStackE 239 240 __ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE 240 241 __ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateEj … … 252 253 __ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE 253 254 __ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE 254 __ZN3JSC8JSObject4markEv255 255 __ZN3JSC8Profiler13stopProfilingEPNS_9ExecStateERKNS_7UStringE 256 256 __ZN3JSC8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE … … 260 260 __ZN3JSC9CodeBlockD1Ev 261 261 __ZN3JSC9CodeBlockD2Ev 262 __ZN3JSC9MarkStack10s_pageSizeE 263 __ZN3JSC9MarkStack12releaseStackEPvm 264 __ZN3JSC9MarkStack13allocateStackEm 262 265 __ZN3JSC9Structure17stopIgnoringLeaksEv 263 266 __ZN3JSC9Structure18startIgnoringLeaksEv … … 327 330 __ZNK3JSC12StringObject8toStringEPNS_9ExecStateE 328 331 __ZNK3JSC14JSGlobalObject14isDynamicScopeEv 332 329 333 __ZNK3JSC16FunctionBodyNode14isHostFunctionEv 330 334 __ZNK3JSC16InternalFunction9classInfoEv -
trunk/JavaScriptCore/JavaScriptCore.gypi
r45683 r47022 266 266 'runtime/Lookup.cpp', 267 267 'runtime/Lookup.h', 268 'runtime/MarkStack.cpp', 269 'runtime/MarkStack.h', 270 'runtime/MarkStackWin.cpp', 268 271 'runtime/MathObject.cpp', 269 272 'runtime/MathObject.h', -
trunk/JavaScriptCore/JavaScriptCore.pri
r46706 r47022 99 99 runtime/JSONObject.cpp \ 100 100 runtime/LiteralParser.cpp \ 101 runtime/MarkStack.cpp \ 102 runtime/MarkStackPosix.cpp \ 101 103 runtime/TimeoutChecker.cpp \ 102 104 bytecode/CodeBlock.cpp \ -
trunk/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj
r46598 r47022 882 882 <File 883 883 RelativePath="..\..\runtime\Lookup.h" 884 > 885 </File> 886 <File 887 RelativePath="..\..\runtime\MarkStack.h" 888 > 889 </File> 890 <File 891 RelativePath="..\..\runtime\MarkStack.cpp" 892 > 893 </File> 894 <File 895 RelativePath="..\..\runtime\MarkStackWin.cpp" 884 896 > 885 897 </File> -
trunk/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r46876 r47022 197 197 A72701B90DADE94900E548D7 /* ExceptionHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = A72701B30DADE94900E548D7 /* ExceptionHelpers.h */; }; 198 198 A727FF6B0DA3092200E548D7 /* JSPropertyNameIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A727FF660DA3053B00E548D7 /* JSPropertyNameIterator.cpp */; }; 199 A74B3499102A5F8E0032AB98 /* MarkStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A74B3498102A5F8E0032AB98 /* MarkStack.cpp */; }; 199 200 A766B44F0EE8DCD1009518CA /* ExecutableAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = A7B48DB50EE74CFC00DCBDB6 /* ExecutableAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; }; 200 201 A76EE6590FAE59D5003F069A /* NativeFunctionWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A76EE6580FAE59D5003F069A /* NativeFunctionWrapper.h */; settings = {ATTRIBUTES = (Private, ); }; }; 202 A7795590101A74D500114E55 /* MarkStack.h in Headers */ = {isa = PBXBuildFile; fileRef = A779558F101A74D500114E55 /* MarkStack.h */; settings = {ATTRIBUTES = (Private, ); }; }; 201 203 A782F1A50EEC9FA20036273F /* ExecutableAllocatorPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A782F1A40EEC9FA20036273F /* ExecutableAllocatorPosix.cpp */; }; 202 204 A791EF280F11E07900AE1F68 /* JSByteArray.h in Headers */ = {isa = PBXBuildFile; fileRef = A791EF260F11E07900AE1F68 /* JSByteArray.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 205 207 A7A1F7AD0F252B3C00E184E2 /* ByteArray.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A1F7AB0F252B3C00E184E2 /* ByteArray.h */; settings = {ATTRIBUTES = (Private, ); }; }; 206 208 A7B48F490EE8936F00DCBDB6 /* ExecutableAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7B48DB60EE74CFC00DCBDB6 /* ExecutableAllocator.cpp */; }; 209 A7C530E4102A3813005BC741 /* MarkStackPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7C530E3102A3813005BC741 /* MarkStackPosix.cpp */; }; 207 210 A7E2EA6B0FB460CF00601F06 /* LiteralParser.h in Headers */ = {isa = PBXBuildFile; fileRef = A7E2EA690FB460CF00601F06 /* LiteralParser.h */; }; 208 211 A7E2EA6C0FB460CF00601F06 /* LiteralParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7E2EA6A0FB460CF00601F06 /* LiteralParser.cpp */; }; … … 739 742 A727FF650DA3053B00E548D7 /* JSPropertyNameIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPropertyNameIterator.h; sourceTree = "<group>"; }; 740 743 A727FF660DA3053B00E548D7 /* JSPropertyNameIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPropertyNameIterator.cpp; sourceTree = "<group>"; }; 744 A74B3498102A5F8E0032AB98 /* MarkStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkStack.cpp; sourceTree = "<group>"; }; 741 745 A76EE6580FAE59D5003F069A /* NativeFunctionWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeFunctionWrapper.h; sourceTree = "<group>"; }; 746 A779558F101A74D500114E55 /* MarkStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkStack.h; sourceTree = "<group>"; }; 742 747 A782F1A40EEC9FA20036273F /* ExecutableAllocatorPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExecutableAllocatorPosix.cpp; sourceTree = "<group>"; }; 743 748 A791EF260F11E07900AE1F68 /* JSByteArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSByteArray.h; sourceTree = "<group>"; }; … … 747 752 A7B48DB50EE74CFC00DCBDB6 /* ExecutableAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExecutableAllocator.h; sourceTree = "<group>"; }; 748 753 A7B48DB60EE74CFC00DCBDB6 /* ExecutableAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExecutableAllocator.cpp; sourceTree = "<group>"; }; 754 A7C530E3102A3813005BC741 /* MarkStackPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkStackPosix.cpp; sourceTree = "<group>"; }; 749 755 A7E2EA690FB460CF00601F06 /* LiteralParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiteralParser.h; sourceTree = "<group>"; }; 750 756 A7E2EA6A0FB460CF00601F06 /* LiteralParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LiteralParser.cpp; sourceTree = "<group>"; }; … … 1491 1497 F692A8850255597D01FF60F7 /* UString.cpp */, 1492 1498 F692A8860255597D01FF60F7 /* UString.h */, 1499 A779558F101A74D500114E55 /* MarkStack.h */, 1500 A7C530E3102A3813005BC741 /* MarkStackPosix.cpp */, 1501 A74B3498102A5F8E0032AB98 /* MarkStack.cpp */, 1493 1502 ); 1494 1503 path = runtime; … … 1893 1902 1429DABF0ED263E700B89619 /* WRECParser.h in Headers */, 1894 1903 9688CB160ED12B4E001D649F /* X86Assembler.h in Headers */, 1904 A7795590101A74D500114E55 /* MarkStack.h in Headers */, 1895 1905 ); 1896 1906 runOnlyForDeploymentPostprocessing = 0; … … 2259 2269 1429DAE10ED2645B00B89619 /* WRECGenerator.cpp in Sources */, 2260 2270 1429DAC00ED263E700B89619 /* WRECParser.cpp in Sources */, 2271 A7C530E4102A3813005BC741 /* MarkStackPosix.cpp in Sources */, 2272 A74B3499102A5F8E0032AB98 /* MarkStack.cpp in Sources */, 2261 2273 ); 2262 2274 runOnlyForDeploymentPostprocessing = 0; -
trunk/JavaScriptCore/bytecode/CodeBlock.cpp
r46879 r47022 1429 1429 } 1430 1430 1431 void CodeBlock::mark ()1432 { 1433 for (size_t i = 0; i < m_constantRegisters.size(); ++i) 1431 void CodeBlock::markAggregate(MarkStack& markStack) 1432 { 1433 for (size_t i = 0; i < m_constantRegisters.size(); ++i) { 1434 1434 if (!m_constantRegisters[i].marked()) 1435 m_constantRegisters[i].mark(); 1435 markStack.append(m_constantRegisters[i].jsValue()); 1436 } 1436 1437 1437 1438 for (size_t i = 0; i < m_functionExpressions.size(); ++i) 1438 m_functionExpressions[i]->body()->mark ();1439 m_functionExpressions[i]->body()->markAggregate(markStack); 1439 1440 1440 1441 if (m_rareData) { 1441 1442 for (size_t i = 0; i < m_rareData->m_functions.size(); ++i) 1442 m_rareData->m_functions[i]->body()->mark ();1443 1444 m_rareData->m_evalCodeCache.mark ();1443 m_rareData->m_functions[i]->body()->markAggregate(markStack); 1444 1445 m_rareData->m_evalCodeCache.markAggregate(markStack); 1445 1446 } 1446 1447 } -
trunk/JavaScriptCore/bytecode/CodeBlock.h
r46879 r47022 256 256 ~CodeBlock(); 257 257 258 void mark ();258 void markAggregate(MarkStack&); 259 259 void refStructures(Instruction* vPC) const; 260 260 void derefStructures(Instruction* vPC) const; -
trunk/JavaScriptCore/bytecode/EvalCodeCache.h
r44224 r47022 69 69 bool isEmpty() const { return m_cacheMap.isEmpty(); } 70 70 71 void mark ()71 void markAggregate(MarkStack& markStack) 72 72 { 73 73 EvalCacheMap::iterator end = m_cacheMap.end(); 74 74 for (EvalCacheMap::iterator ptr = m_cacheMap.begin(); ptr != end; ++ptr) 75 ptr->second->mark ();75 ptr->second->markAggregate(markStack); 76 76 } 77 77 private: -
trunk/JavaScriptCore/debugger/DebuggerActivation.cpp
r43122 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 39 39 } 40 40 41 void DebuggerActivation::mark ()41 void DebuggerActivation::markChildren(MarkStack& markStack) 42 42 { 43 JSObject::mark(); 44 if (m_activation && !m_activation->marked()) 45 m_activation->mark(); 43 JSObject::markChildren(markStack); 44 45 if (m_activation) 46 markStack.append(m_activation); 46 47 } 47 48 -
trunk/JavaScriptCore/debugger/DebuggerActivation.h
r43122 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 37 37 DebuggerActivation(JSObject*); 38 38 39 virtual void mark ();39 virtual void markChildren(MarkStack&); 40 40 virtual UString className() const; 41 41 virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&); -
trunk/JavaScriptCore/interpreter/Register.h
r46598 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 57 57 58 58 bool marked() const; 59 void mark ();59 void markChildren(MarkStack&); 60 60 61 61 Register(JSActivation*); … … 121 121 } 122 122 123 ALWAYS_INLINE void Register::mark()124 {125 jsValue().mark();126 }127 128 123 // Interpreter functions 129 124 -
trunk/JavaScriptCore/interpreter/RegisterFile.h
r46025 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 137 137 Register* lastGlobal() const { return m_start - m_numGlobals; } 138 138 139 void markGlobals( Heap* heap) { heap->markConservatively(lastGlobal(), m_start); }140 void markCallFrames( Heap* heap) { heap->markConservatively(m_start, m_end); }139 void markGlobals(MarkStack& markStack, Heap* heap) { heap->markConservatively(markStack, lastGlobal(), m_start); } 140 void markCallFrames(MarkStack& markStack, Heap* heap) { heap->markConservatively(markStack, m_start, m_end); } 141 141 142 142 private: -
trunk/JavaScriptCore/parser/Nodes.cpp
r46598 r47022 1819 1819 } 1820 1820 1821 void ScopeNodeData::mark ()1821 void ScopeNodeData::markAggregate(MarkStack& markStack) 1822 1822 { 1823 1823 FunctionStack::iterator end = m_functionStack.end(); … … 1826 1826 if (!body->isGenerated()) 1827 1827 continue; 1828 body->generatedBytecode().mark ();1828 body->generatedBytecode().markAggregate(markStack); 1829 1829 } 1830 1830 } … … 1973 1973 } 1974 1974 1975 void EvalNode::mark ()1975 void EvalNode::markAggregate(MarkStack& markStack) 1976 1976 { 1977 1977 // We don't need to mark our own CodeBlock as the JSGlobalObject takes care of that 1978 data()->mark ();1978 data()->markAggregate(markStack); 1979 1979 } 1980 1980 … … 2031 2031 } 2032 2032 2033 void FunctionBodyNode::mark ()2033 void FunctionBodyNode::markAggregate(MarkStack& markStack) 2034 2034 { 2035 2035 if (m_code) 2036 m_code->mark ();2036 m_code->markAggregate(markStack); 2037 2037 } 2038 2038 -
trunk/JavaScriptCore/parser/Nodes.h
r46837 r47022 1391 1391 StatementVector m_children; 1392 1392 1393 void mark ();1393 void markAggregate(MarkStack&); 1394 1394 }; 1395 1395 … … 1437 1437 } 1438 1438 1439 virtual void mark () { }1439 virtual void markAggregate(MarkStack&) { } 1440 1440 1441 1441 #if ENABLE(JIT) … … 1516 1516 EvalCodeBlock& bytecodeForExceptionInfoReparse(ScopeChainNode*, CodeBlock*); 1517 1517 1518 virtual void mark ();1518 virtual void markAggregate(MarkStack&); 1519 1519 1520 1520 #if ENABLE(JIT) … … 1564 1564 bool isHostFunction() const; 1565 1565 1566 virtual void mark ();1566 virtual void markAggregate(MarkStack&); 1567 1567 1568 1568 void finishParsing(const SourceCode&, ParameterNode*); -
trunk/JavaScriptCore/runtime/ArgList.cpp
r44224 r47022 1 1 /* 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * This library is free software; you can redistribute it and/or … … 38 38 } 39 39 40 void MarkedArgumentBuffer::markLists( ListSet& markSet)40 void MarkedArgumentBuffer::markLists(MarkStack& markStack, ListSet& markSet) 41 41 { 42 42 ListSet::iterator end = markSet.end(); 43 43 for (ListSet::iterator it = markSet.begin(); it != end; ++it) { 44 44 MarkedArgumentBuffer* list = *it; 45 46 iterator end2 = list->end(); 47 for (iterator it2 = list->begin(); it2 != end2; ++it2) 48 if (!(*it2).marked()) 49 (*it2).mark(); 45 markStack.appendValues(reinterpret_cast<JSValue*>(list->m_buffer), list->m_size); 50 46 } 51 47 } -
trunk/JavaScriptCore/runtime/ArgList.h
r46598 r47022 136 136 const_iterator end() const { return m_buffer + m_size; } 137 137 138 static void markLists( ListSet&);138 static void markLists(MarkStack&, ListSet&); 139 139 140 140 private: -
trunk/JavaScriptCore/runtime/Arguments.cpp
r44224 r47022 2 2 * Copyright (C) 1999-2002 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 5 * Copyright (C) 2007 Cameron Zwarich ([email protected]) 6 6 * Copyright (C) 2007 Maks Orlovich … … 44 44 } 45 45 46 void Arguments::mark() 47 { 48 JSObject::mark(); 49 50 if (d->registerArray) { 51 for (unsigned i = 0; i < d->numParameters; ++i) { 52 if (!d->registerArray[i].marked()) 53 d->registerArray[i].mark(); 54 } 55 } 46 void Arguments::markChildren(MarkStack& markStack) 47 { 48 JSObject::markChildren(markStack); 49 50 if (d->registerArray) 51 markStack.appendValues(reinterpret_cast<JSValue*>(d->registerArray.get()), d->numParameters); 56 52 57 53 if (d->extraArguments) { 58 54 unsigned numExtraArguments = d->numArguments - d->numParameters; 59 for (unsigned i = 0; i < numExtraArguments; ++i) { 60 if (!d->extraArguments[i].marked()) 61 d->extraArguments[i].mark(); 62 } 63 } 64 65 if (!d->callee->marked()) 66 d->callee->mark(); 67 68 if (d->activation && !d->activation->marked()) 69 d->activation->mark(); 55 markStack.appendValues(reinterpret_cast<JSValue*>(d->extraArguments), numExtraArguments); 56 } 57 58 markStack.append(d->callee); 59 60 if (d->activation) 61 markStack.append(d->activation); 70 62 } 71 63 -
trunk/JavaScriptCore/runtime/Arguments.h
r46598 r47022 1 1 /* 2 2 * Copyright (C) 1999-2000 Harri Porten ([email protected]) 3 * Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved.3 * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 4 4 * Copyright (C) 2007 Cameron Zwarich ([email protected]) 5 5 * Copyright (C) 2007 Maks Orlovich … … 62 62 static const ClassInfo info; 63 63 64 virtual void mark ();64 virtual void markChildren(MarkStack&); 65 65 66 66 void fillArgList(ExecState*, MarkedArgumentBuffer&); -
trunk/JavaScriptCore/runtime/Collector.cpp
r46703 r47022 1 1 /* 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2007 Eric Seidel <[email protected]> 4 4 * … … 31 31 #include "JSString.h" 32 32 #include "JSValue.h" 33 #include "MarkStack.h" 33 34 #include "Nodes.h" 34 35 #include "Tracing.h" … … 643 644 #define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0) 644 645 645 void Heap::markConservatively( void* start, void* end)646 void Heap::markConservatively(MarkStack& markStack, void* start, void* end) 646 647 { 647 648 if (start > end) { … … 684 685 if ((primaryBlocks[block] == blockAddr) & (offset <= lastCellOffset)) { 685 686 if (reinterpret_cast<CollectorCell*>(xAsBits)->u.freeCell.zeroIfFree != 0) { 686 JSCell* imp = reinterpret_cast<JSCell*>(xAsBits); 687 if (!imp->marked()) 688 imp->mark(); 687 markStack.append(reinterpret_cast<JSCell*>(xAsBits)); 688 markStack.drain(); 689 689 } 690 690 break; … … 697 697 } 698 698 699 void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal( )699 void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal(MarkStack& markStack) 700 700 { 701 701 void* dummy; 702 702 void* stackPointer = &dummy; 703 703 void* stackBase = currentThreadStackBase(); 704 markConservatively( stackPointer, stackBase);705 } 706 707 void Heap::markCurrentThreadConservatively( )704 markConservatively(markStack, stackPointer, stackBase); 705 } 706 707 void Heap::markCurrentThreadConservatively(MarkStack& markStack) 708 708 { 709 709 // setjmp forces volatile registers onto the stack … … 718 718 #endif 719 719 720 markCurrentThreadConservativelyInternal( );720 markCurrentThreadConservativelyInternal(markStack); 721 721 } 722 722 … … 850 850 } 851 851 852 void Heap::markOtherThreadConservatively( Thread* thread)852 void Heap::markOtherThreadConservatively(MarkStack& markStack, Thread* thread) 853 853 { 854 854 suspendThread(thread->platformThread); … … 858 858 859 859 // mark the thread's registers 860 markConservatively( static_cast<void*>(®s), static_cast<void*>(reinterpret_cast<char*>(®s) + regSize));860 markConservatively(markStack, static_cast<void*>(®s), static_cast<void*>(reinterpret_cast<char*>(®s) + regSize)); 861 861 862 862 void* stackPointer = otherThreadStackPointer(regs); 863 markConservatively( stackPointer, thread->stackBase);863 markConservatively(markStack, stackPointer, thread->stackBase); 864 864 865 865 resumeThread(thread->platformThread); … … 868 868 #endif 869 869 870 void Heap::markStackObjectsConservatively( )871 { 872 markCurrentThreadConservatively( );870 void Heap::markStackObjectsConservatively(MarkStack& markStack) 871 { 872 markCurrentThreadConservatively(markStack); 873 873 874 874 #if ENABLE(JSC_MULTIPLE_THREADS) … … 880 880 #ifndef NDEBUG 881 881 // Forbid malloc during the mark phase. Marking a thread suspends it, so 882 // a malloc inside mark () would risk a deadlock with a thread that had been882 // a malloc inside markChildren() would risk a deadlock with a thread that had been 883 883 // suspended while holding the malloc lock. 884 884 fastMallocForbid(); … … 888 888 for (Thread* thread = m_registeredThreads; thread; thread = thread->next) { 889 889 if (!pthread_equal(thread->posixThread, pthread_self())) 890 markOtherThreadConservatively( thread);890 markOtherThreadConservatively(markStack, thread); 891 891 } 892 892 #ifndef NDEBUG … … 948 948 } 949 949 950 void Heap::markProtectedObjects( )950 void Heap::markProtectedObjects(MarkStack& markStack) 951 951 { 952 952 if (m_protectedValuesMutex) … … 956 956 for (ProtectCountSet::iterator it = m_protectedValues.begin(); it != end; ++it) { 957 957 JSCell* val = it->first; 958 if (!val->marked()) 959 val->mark(); 958 if (!val->marked()) { 959 markStack.append(val); 960 markStack.drain(); 961 } 960 962 } 961 963 … … 1062 1064 return numLiveObjects; 1063 1065 } 1064 1066 1065 1067 bool Heap::collect() 1066 1068 { … … 1081 1083 1082 1084 // MARK: first mark all referenced objects recursively starting out from the set of root objects 1083 1084 markStackObjectsConservatively( );1085 markProtectedObjects( );1085 MarkStack& markStack = m_globalData->markStack; 1086 markStackObjectsConservatively(markStack); 1087 markProtectedObjects(markStack); 1086 1088 if (m_markListSet && m_markListSet->size()) 1087 MarkedArgumentBuffer::markLists( *m_markListSet);1089 MarkedArgumentBuffer::markLists(markStack, *m_markListSet); 1088 1090 if (m_globalData->exception && !m_globalData->exception.marked()) 1089 m _globalData->exception.mark();1090 m_globalData->interpreter->registerFile().markCallFrames( this);1091 markStack.append(m_globalData->exception); 1092 m_globalData->interpreter->registerFile().markCallFrames(markStack, this); 1091 1093 m_globalData->smallStrings.mark(); 1092 1094 if (m_globalData->scopeNodeBeingReparsed) 1093 m_globalData->scopeNodeBeingReparsed->mark ();1095 m_globalData->scopeNodeBeingReparsed->markAggregate(markStack); 1094 1096 if (m_globalData->firstStringifierToMark) 1095 JSONObject::markStringifiers(m_globalData->firstStringifierToMark); 1096 1097 JSONObject::markStringifiers(markStack, m_globalData->firstStringifierToMark); 1098 1099 markStack.drain(); 1100 markStack.compact(); 1097 1101 JAVASCRIPTCORE_GC_MARKED(); 1098 1102 -
trunk/JavaScriptCore/runtime/Collector.h
r46598 r47022 40 40 namespace JSC { 41 41 42 class MarkedArgumentBuffer;43 42 class CollectorBlock; 44 43 class JSCell; 45 44 class JSGlobalData; 46 45 class JSValue; 46 class MarkedArgumentBuffer; 47 class MarkStack; 47 48 48 49 enum OperationInProgress { NoOperation, Allocation, Collection }; … … 112 113 static void markCell(JSCell*); 113 114 114 void markConservatively( void* start, void* end);115 void markConservatively(MarkStack&, void* start, void* end); 115 116 116 117 HashSet<MarkedArgumentBuffer*>& markListSet() { if (!m_markListSet) m_markListSet = new HashSet<MarkedArgumentBuffer*>; return *m_markListSet; } … … 134 135 135 136 void recordExtraCost(size_t); 136 void markProtectedObjects( );137 void markCurrentThreadConservatively( );138 void markCurrentThreadConservativelyInternal( );139 void markOtherThreadConservatively( Thread*);140 void markStackObjectsConservatively( );137 void markProtectedObjects(MarkStack&); 138 void markCurrentThreadConservatively(MarkStack&); 139 void markCurrentThreadConservativelyInternal(MarkStack&); 140 void markOtherThreadConservatively(MarkStack&, Thread*); 141 void markStackObjectsConservatively(MarkStack&); 141 142 142 143 typedef HashCountedSet<JSCell*> ProtectCountSet; -
trunk/JavaScriptCore/runtime/GetterSetter.cpp
r44224 r47022 2 2 * Copyright (C) 1999-2002 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2004, 2007, 2008 Apple Inc. All rights reserved.4 * Copyright (C) 2004, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 5 * 6 6 * This library is free software; you can redistribute it and/or … … 29 29 namespace JSC { 30 30 31 void GetterSetter::mark ()31 void GetterSetter::markChildren(MarkStack& markStack) 32 32 { 33 JSCell::mark ();33 JSCell::markChildren(markStack); 34 34 35 35 if (m_getter && !m_getter->marked()) 36 m _getter->mark();36 markStack.append(m_getter); 37 37 if (m_setter && !m_setter->marked()) 38 m _setter->mark();38 markStack.append(m_setter); 39 39 } 40 40 -
trunk/JavaScriptCore/runtime/GetterSetter.h
r44224 r47022 2 2 * Copyright (C) 1999-2001 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 5 * 6 6 * This library is free software; you can redistribute it and/or … … 34 34 class GetterSetter : public JSCell { 35 35 public: 36 GetterSetter( )37 : JSCell( 0)36 GetterSetter(ExecState* exec) 37 : JSCell(exec->globalData().getterSetterStructure.get()) 38 38 , m_getter(0) 39 39 , m_setter(0) … … 41 41 } 42 42 43 virtual void mark ();43 virtual void markChildren(MarkStack&); 44 44 45 45 JSObject* getter() const { return m_getter; } … … 47 47 JSObject* setter() const { return m_setter; } 48 48 void setSetter(JSObject* setter) { m_setter = setter; } 49 49 static PassRefPtr<Structure> createStructure(JSValue prototype) 50 { 51 return Structure::create(prototype, TypeInfo(GetterSetterType)); 52 } 50 53 private: 51 54 virtual bool isGetterSetter() const; -
trunk/JavaScriptCore/runtime/GlobalEvalFunction.cpp
r38440 r47022 2 2 * Copyright (C) 1999-2002 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 5 * Copyright (C) 2007 Cameron Zwarich ([email protected]) 6 6 * Copyright (C) 2007 Maks Orlovich … … 40 40 } 41 41 42 void GlobalEvalFunction::mark ()42 void GlobalEvalFunction::markChildren(MarkStack& markStack) 43 43 { 44 PrototypeFunction::mark(); 45 if (!m_cachedGlobalObject->marked()) 46 m_cachedGlobalObject->mark(); 44 PrototypeFunction::markChildren(markStack); 45 markStack.append(m_cachedGlobalObject); 47 46 } 48 47 -
trunk/JavaScriptCore/runtime/GlobalEvalFunction.h
r38440 r47022 1 1 /* 2 2 * Copyright (C) 1999-2000 Harri Porten ([email protected]) 3 * Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved.3 * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 4 4 * Copyright (C) 2007 Cameron Zwarich ([email protected]) 5 5 * Copyright (C) 2007 Maks Orlovich … … 37 37 38 38 private: 39 virtual void mark ();39 virtual void markChildren(MarkStack&); 40 40 41 41 JSGlobalObject* m_cachedGlobalObject; -
trunk/JavaScriptCore/runtime/JSAPIValueWrapper.h
r46598 r47022 27 27 28 28 #include "JSCell.h" 29 #include "CallFrame.h" 29 30 30 31 namespace JSC { … … 43 44 virtual UString toString(ExecState*) const; 44 45 virtual JSObject* toObject(ExecState*) const; 46 static PassRefPtr<Structure> createStructure(JSValue prototype) 47 { 48 return Structure::create(prototype, TypeInfo(CompoundType)); 49 } 45 50 51 46 52 private: 47 JSAPIValueWrapper( JSValue value)48 : JSCell( 0)53 JSAPIValueWrapper(ExecState* exec, JSValue value) 54 : JSCell(exec->globalData().apiWrapperStructure.get()) 49 55 , m_value(value) 50 56 { … … 56 62 inline JSValue jsAPIValueWrapper(ExecState* exec, JSValue value) 57 63 { 58 return new (exec) JSAPIValueWrapper( value);64 return new (exec) JSAPIValueWrapper(exec, value); 59 65 } 60 66 -
trunk/JavaScriptCore/runtime/JSActivation.cpp
r45609 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 50 50 } 51 51 52 void JSActivation::mark ()52 void JSActivation::markChildren(MarkStack& markStack) 53 53 { 54 Base::mark ();54 Base::markChildren(markStack); 55 55 56 56 Register* registerArray = d()->registerArray.get(); … … 60 60 size_t numParametersMinusThis = d()->functionBody->generatedBytecode().m_numParameters - 1; 61 61 62 size_t i = 0; 63 size_t count = numParametersMinusThis; 64 for ( ; i < count; ++i) { 65 Register& r = registerArray[i]; 66 if (!r.marked()) 67 r.mark(); 68 } 62 size_t count = numParametersMinusThis; 63 markStack.appendValues(registerArray, count); 69 64 70 65 size_t numVars = d()->functionBody->generatedBytecode().m_numVars; 71 66 72 67 // Skip the call frame, which sits between the parameters and vars. 73 i += RegisterFile::CallFrameHeaderSize; 74 count += RegisterFile::CallFrameHeaderSize + numVars; 75 76 for ( ; i < count; ++i) { 77 Register& r = registerArray[i]; 78 if (r.jsValue() && !r.marked()) 79 r.mark(); 80 } 68 markStack.appendValues(registerArray + count + RegisterFile::CallFrameHeaderSize, numVars, MayContainNullValues); 81 69 } 82 70 -
trunk/JavaScriptCore/runtime/JSActivation.h
r44224 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 47 47 virtual ~JSActivation(); 48 48 49 virtual void mark ();49 virtual void markChildren(MarkStack&); 50 50 51 51 virtual bool isDynamicScope() const; -
trunk/JavaScriptCore/runtime/JSArray.cpp
r46598 r47022 1 1 /* 2 2 * Copyright (C) 1999-2000 Harri Porten ([email protected]) 3 * Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved.3 * Copyright (C) 2003, 2007, 2008, 2009 Apple Inc. All rights reserved. 4 4 * Copyright (C) 2003 Peter Kelly ([email protected]) 5 5 * Copyright (C) 2006 Alexey Proskuryakov ([email protected]) … … 602 602 } 603 603 604 void JSArray::mark ()605 { 606 JSObject::mark ();604 void JSArray::markChildren(MarkStack& markStack) 605 { 606 JSObject::markChildren(markStack); 607 607 608 608 ArrayStorage* storage = m_storage; 609 609 610 610 unsigned usedVectorLength = min(storage->m_length, storage->m_vectorLength); 611 for (unsigned i = 0; i < usedVectorLength; ++i) { 612 JSValue value = storage->m_vector[i]; 613 if (value && !value.marked()) 614 value.mark(); 615 } 611 markStack.appendValues(storage->m_vector, usedVectorLength, MayContainNullValues); 616 612 617 613 if (SparseArrayValueMap* map = storage->m_sparseValueMap) { 618 614 SparseArrayValueMap::iterator end = map->end(); 619 for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it) { 620 JSValue value = it->second; 621 if (!value.marked()) 622 value.mark(); 623 } 615 for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it) 616 markStack.append(it->second); 624 617 } 625 618 } -
trunk/JavaScriptCore/runtime/JSArray.h
r43122 r47022 1 1 /* 2 2 * Copyright (C) 1999-2000 Harri Porten ([email protected]) 3 * Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved.3 * Copyright (C) 2003, 2007, 2008, 2009 Apple Inc. All rights reserved. 4 4 * 5 5 * This library is free software; you can redistribute it and/or … … 89 89 virtual bool deleteProperty(ExecState*, unsigned propertyName); 90 90 virtual void getPropertyNames(ExecState*, PropertyNameArray&); 91 virtual void mark ();91 virtual void markChildren(MarkStack&); 92 92 93 93 void* lazyCreationData(); -
trunk/JavaScriptCore/runtime/JSCell.h
r46598 r47022 2 2 * Copyright (C) 1999-2001 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2004, 2005, 2007, 2008 Apple Inc. All rights reserved.4 * Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 5 * 6 6 * This library is free software; you can redistribute it and/or … … 86 86 void* operator new(size_t, JSGlobalData*); 87 87 void* operator new(size_t, void* placementNewDestination) { return placementNewDestination; } 88 virtual void mark(); 88 89 void markCellDirect(); 90 virtual void markChildren(MarkStack&); 89 91 bool marked() const; 90 92 … … 154 156 } 155 157 156 inline void JSCell::mark() 157 { 158 return Heap::markCell(this); 158 inline void JSCell::markCellDirect() 159 { 160 Heap::markCell(this); 161 } 162 163 inline void JSCell::markChildren(MarkStack&) 164 { 165 ASSERT(marked()); 159 166 } 160 167 … … 225 232 } 226 233 227 inline void JSValue::mark() 228 { 229 asCell()->mark(); // callers should check !marked() before calling mark(), so this should only be called with cells 234 inline void JSValue::markDirect() 235 { 236 ASSERT(!marked()); 237 asCell()->markCellDirect(); 238 } 239 240 inline void JSValue::markChildren(MarkStack& markStack) 241 { 242 ASSERT(marked()); 243 asCell()->markChildren(markStack); 230 244 } 231 245 … … 340 354 return JSValue(); 341 355 } 356 357 inline bool JSValue::hasChildren() const 358 { 359 return asCell()->structure()->typeInfo().type() >= CompoundType; 360 } 361 342 362 343 363 inline JSObject* JSValue::toObject(ExecState* exec) const … … 351 371 } 352 372 373 ALWAYS_INLINE void MarkStack::append(JSCell* cell) 374 { 375 ASSERT(cell); 376 if (cell->marked()) 377 return; 378 cell->markCellDirect(); 379 if (cell->structure()->typeInfo().type() >= CompoundType) 380 m_values.append(cell); 381 } 382 383 inline void MarkStack::drain() { 384 while (!m_markSets.isEmpty() || !m_values.isEmpty()) { 385 while ((!m_markSets.isEmpty()) && m_values.size() < 50) { 386 const MarkSet& current = m_markSets.removeLast(); 387 JSValue* ptr = current.m_values; 388 JSValue* end = current.m_end; 389 if (current.m_properties == NoNullValues) { 390 while (ptr != end) 391 append(*ptr++); 392 } else { 393 while (ptr != end) { 394 if (JSValue value = *ptr++) 395 append(value); 396 } 397 } 398 } 399 while (!m_values.isEmpty()) { 400 JSCell* current = m_values.removeLast(); 401 ASSERT(current->marked()); 402 current->markChildren(*this); 403 } 404 } 405 } 353 406 } // namespace JSC 354 407 -
trunk/JavaScriptCore/runtime/JSFunction.cpp
r46598 r47022 2 2 * Copyright (C) 1999-2002 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 5 * Copyright (C) 2007 Cameron Zwarich ([email protected]) 6 6 * Copyright (C) 2007 Maks Orlovich … … 84 84 } 85 85 86 void JSFunction::mark ()87 { 88 Base::mark ();89 m_body->mark ();86 void JSFunction::markChildren(MarkStack& markStack) 87 { 88 Base::markChildren(markStack); 89 m_body->markAggregate(markStack); 90 90 if (!isHostFunction()) 91 scopeChain().mark ();91 scopeChain().markAggregate(markStack); 92 92 } 93 93 -
trunk/JavaScriptCore/runtime/JSFunction.h
r46528 r47022 69 69 FunctionBodyNode* body() const { return m_body.get(); } 70 70 71 virtual void mark ();71 virtual void markChildren(MarkStack&); 72 72 73 73 static JS_EXPORTDATA const ClassInfo info; -
trunk/JavaScriptCore/runtime/JSGlobalData.cpp
r46598 r47022 34 34 #include "CommonIdentifiers.h" 35 35 #include "FunctionConstructor.h" 36 #include "GetterSetter.h" 36 37 #include "Interpreter.h" 37 38 #include "JSActivation.h" 39 #include "JSAPIValueWrapper.h" 38 40 #include "JSArray.h" 39 41 #include "JSByteArray.h" … … 42 44 #include "JSLock.h" 43 45 #include "JSNotAnObject.h" 46 #include "JSPropertyNameIterator.h" 44 47 #include "JSStaticScopeObject.h" 45 48 #include "Parser.h" … … 119 122 , notAnObjectErrorStubStructure(JSNotAnObjectErrorStub::createStructure(jsNull())) 120 123 , notAnObjectStructure(JSNotAnObject::createStructure(jsNull())) 124 , propertyNameIteratorStructure(JSPropertyNameIterator::createStructure(jsNull())) 125 , getterSetterStructure(GetterSetter::createStructure(jsNull())) 126 , apiWrapperStructure(JSAPIValueWrapper::createStructure(jsNull())) 121 127 #if USE(JSVALUE32) 122 128 , numberStructure(JSNumberCell::createStructure(jsNull())) -
trunk/JavaScriptCore/runtime/JSGlobalData.h
r46598 r47022 34 34 #include "JITStubs.h" 35 35 #include "JSValue.h" 36 #include "MarkStack.h" 36 37 #include "SmallStrings.h" 37 38 #include "TimeoutChecker.h" … … 98 99 RefPtr<Structure> notAnObjectErrorStubStructure; 99 100 RefPtr<Structure> notAnObjectStructure; 101 RefPtr<Structure> propertyNameIteratorStructure; 102 RefPtr<Structure> getterSetterStructure; 103 RefPtr<Structure> apiWrapperStructure; 104 100 105 #if USE(JSVALUE32) 101 106 RefPtr<Structure> numberStructure; … … 144 149 Stringifier* firstStringifierToMark; 145 150 151 MarkStack markStack; 146 152 private: 147 153 JSGlobalData(bool isShared, const VPtrSet&); -
trunk/JavaScriptCore/runtime/JSGlobalObject.cpp
r46963 r47022 81 81 static const int preferredScriptCheckTimeInterval = 1000; 82 82 83 static inline void markIfNeeded( JSValue v)84 { 85 if (v && !v.marked())86 v.mark();87 } 88 89 static inline void markIfNeeded( const RefPtr<Structure>& s)83 static inline void markIfNeeded(MarkStack& markStack, JSValue v) 84 { 85 if (v) 86 markStack.append(v); 87 } 88 89 static inline void markIfNeeded(MarkStack& markStack, const RefPtr<Structure>& s) 90 90 { 91 91 if (s) 92 s->mark ();92 s->markAggregate(markStack); 93 93 } 94 94 … … 358 358 } 359 359 360 void JSGlobalObject::mark ()361 { 362 JSVariableObject::mark ();360 void JSGlobalObject::markChildren(MarkStack& markStack) 361 { 362 JSVariableObject::markChildren(markStack); 363 363 364 364 HashSet<ProgramCodeBlock*>::const_iterator end = codeBlocks().end(); 365 365 for (HashSet<ProgramCodeBlock*>::const_iterator it = codeBlocks().begin(); it != end; ++it) 366 (*it)->mark ();366 (*it)->markAggregate(markStack); 367 367 368 368 RegisterFile& registerFile = globalData()->interpreter->registerFile(); 369 369 if (registerFile.globalObject() == this) 370 registerFile.markGlobals( &globalData()->heap);371 372 markIfNeeded( d()->regExpConstructor);373 markIfNeeded( d()->errorConstructor);374 markIfNeeded( d()->evalErrorConstructor);375 markIfNeeded( d()->rangeErrorConstructor);376 markIfNeeded( d()->referenceErrorConstructor);377 markIfNeeded( d()->syntaxErrorConstructor);378 markIfNeeded( d()->typeErrorConstructor);379 markIfNeeded( d()->URIErrorConstructor);380 381 markIfNeeded( d()->evalFunction);382 markIfNeeded( d()->callFunction);383 markIfNeeded( d()->applyFunction);384 385 markIfNeeded( d()->objectPrototype);386 markIfNeeded( d()->functionPrototype);387 markIfNeeded( d()->arrayPrototype);388 markIfNeeded( d()->booleanPrototype);389 markIfNeeded( d()->stringPrototype);390 markIfNeeded( d()->numberPrototype);391 markIfNeeded( d()->datePrototype);392 markIfNeeded( d()->regExpPrototype);393 394 markIfNeeded( d()->methodCallDummy);395 396 markIfNeeded( d()->errorStructure);370 registerFile.markGlobals(markStack, &globalData()->heap); 371 372 markIfNeeded(markStack, d()->regExpConstructor); 373 markIfNeeded(markStack, d()->errorConstructor); 374 markIfNeeded(markStack, d()->evalErrorConstructor); 375 markIfNeeded(markStack, d()->rangeErrorConstructor); 376 markIfNeeded(markStack, d()->referenceErrorConstructor); 377 markIfNeeded(markStack, d()->syntaxErrorConstructor); 378 markIfNeeded(markStack, d()->typeErrorConstructor); 379 markIfNeeded(markStack, d()->URIErrorConstructor); 380 381 markIfNeeded(markStack, d()->evalFunction); 382 markIfNeeded(markStack, d()->callFunction); 383 markIfNeeded(markStack, d()->applyFunction); 384 385 markIfNeeded(markStack, d()->objectPrototype); 386 markIfNeeded(markStack, d()->functionPrototype); 387 markIfNeeded(markStack, d()->arrayPrototype); 388 markIfNeeded(markStack, d()->booleanPrototype); 389 markIfNeeded(markStack, d()->stringPrototype); 390 markIfNeeded(markStack, d()->numberPrototype); 391 markIfNeeded(markStack, d()->datePrototype); 392 markIfNeeded(markStack, d()->regExpPrototype); 393 394 markIfNeeded(markStack, d()->methodCallDummy); 395 396 markIfNeeded(markStack, d()->errorStructure); 397 397 398 398 // No need to mark the other structures, because their prototypes are all … … 404 404 405 405 size_t size = d()->registerArraySize; 406 for (size_t i = 0; i < size; ++i) { 407 Register& r = registerArray[i]; 408 if (!r.marked()) 409 r.mark(); 410 } 406 markStack.appendValues(reinterpret_cast<JSValue*>(registerArray), size); 411 407 } 412 408 -
trunk/JavaScriptCore/runtime/JSGlobalObject.h
r46598 r47022 1 1 /* 2 2 * Copyright (C) 2007 Eric Seidel <[email protected]> 3 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.3 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. 4 4 * 5 5 * This library is free software; you can redistribute it and/or … … 167 167 virtual ~JSGlobalObject(); 168 168 169 virtual void mark ();169 virtual void markChildren(MarkStack&); 170 170 171 171 virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); -
trunk/JavaScriptCore/runtime/JSNotAnObject.cpp
r43122 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 75 75 76 76 // Marking 77 void JSNotAnObject::mark ()77 void JSNotAnObject::markChildren(MarkStack& markStack) 78 78 { 79 JSCell::mark(); 80 if (!m_exception->marked()) 81 m_exception->mark(); 79 JSObject::markChildren(markStack); 80 markStack.append(m_exception); 82 81 } 83 82 -
trunk/JavaScriptCore/runtime/JSNotAnObject.h
r43122 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 76 76 77 77 // Marking 78 virtual void mark ();78 virtual void markChildren(MarkStack&); 79 79 80 80 // JSObject methods -
trunk/JavaScriptCore/runtime/JSONObject.cpp
r46967 r47022 68 68 JSValue stringify(JSValue); 69 69 70 void mark ();70 void markAggregate(MarkStack&); 71 71 72 72 private: … … 222 222 } 223 223 224 void Stringifier::mark ()224 void Stringifier::markAggregate(MarkStack& markStack) 225 225 { 226 226 for (Stringifier* stringifier = this; stringifier; stringifier = stringifier->m_nextStringifierToMark) { 227 227 size_t size = m_holderStack.size(); 228 for (size_t i = 0; i < size; ++i) { 229 JSObject* object = m_holderStack[i].object(); 230 if (!object->marked()) 231 object->mark(); 232 } 228 for (size_t i = 0; i < size; ++i) 229 markStack.append(m_holderStack[i].object()); 233 230 } 234 231 } … … 585 582 } 586 583 587 void JSONObject::markStringifiers( Stringifier* stringifier)588 { 589 stringifier->mark ();584 void JSONObject::markStringifiers(MarkStack& markStack, Stringifier* stringifier) 585 { 586 stringifier->markAggregate(markStack); 590 587 } 591 588 -
trunk/JavaScriptCore/runtime/JSONObject.h
r44813 r47022 45 45 } 46 46 47 static void markStringifiers( Stringifier*);47 static void markStringifiers(MarkStack&, Stringifier*); 48 48 49 49 private: -
trunk/JavaScriptCore/runtime/JSObject.cpp
r44445 r47022 2 2 * Copyright (C) 1999-2001 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.4 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Apple Inc. All rights reserved. 5 5 * Copyright (C) 2007 Eric Seidel ([email protected]) 6 6 * … … 63 63 ASSERT_CLASS_FITS_IN_CELL(JSObject); 64 64 65 void JSObject::mark ()65 void JSObject::markChildren(MarkStack& markStack) 66 66 { 67 67 JSOBJECT_MARK_BEGIN(); 68 68 69 JSCell::mark ();70 m_structure->mark ();69 JSCell::markChildren(markStack); 70 m_structure->markAggregate(markStack); 71 71 72 72 PropertyStorage storage = propertyStorage(); 73 74 73 size_t storageSize = m_structure->propertyStorageSize(); 75 for (size_t i = 0; i < storageSize; ++i) { 76 JSValue v = JSValue::decode(storage[i]); 77 if (!v.marked()) 78 v.mark(); 79 } 74 markStack.appendValues(reinterpret_cast<JSValue*>(storage), storageSize); 80 75 81 76 JSOBJECT_MARK_END(); … … 311 306 312 307 PutPropertySlot slot; 313 GetterSetter* getterSetter = new (exec) GetterSetter ;308 GetterSetter* getterSetter = new (exec) GetterSetter(exec); 314 309 putDirectInternal(exec->globalData(), propertyName, getterSetter, Getter, true, slot); 315 310 … … 338 333 339 334 PutPropertySlot slot; 340 GetterSetter* getterSetter = new (exec) GetterSetter ;335 GetterSetter* getterSetter = new (exec) GetterSetter(exec); 341 336 putDirectInternal(exec->globalData(), propertyName, getterSetter, Setter, true, slot); 342 337 -
trunk/JavaScriptCore/runtime/JSObject.h
r46598 r47022 2 2 * Copyright (C) 1999-2001 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 5 * 6 6 * This library is free software; you can redistribute it and/or … … 74 74 explicit JSObject(PassRefPtr<Structure>); 75 75 76 virtual void mark ();76 virtual void markChildren(MarkStack&); 77 77 78 78 // The inline virtual destructor cannot be the first virtual function declared -
trunk/JavaScriptCore/runtime/JSPropertyNameIterator.cpp
r44224 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 74 74 } 75 75 76 void JSPropertyNameIterator::mark ()76 void JSPropertyNameIterator::markChildren(MarkStack& markStack) 77 77 { 78 JSCell::mark ();79 if (m_object && !m_object->marked())80 m _object->mark();78 JSCell::markChildren(markStack); 79 if (m_object) 80 markStack.append(m_object); 81 81 } 82 82 -
trunk/JavaScriptCore/runtime/JSPropertyNameIterator.h
r44224 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 52 52 virtual JSObject* toObject(ExecState*) const; 53 53 54 virtual void mark ();54 virtual void markChildren(MarkStack&); 55 55 56 56 JSValue next(ExecState*); 57 57 void invalidate(); 58 58 59 static PassRefPtr<Structure> createStructure(JSValue prototype) 60 { 61 return Structure::create(prototype, TypeInfo(CompoundType)); 62 } 59 63 private: 60 JSPropertyNameIterator( );61 JSPropertyNameIterator( JSObject*, PassRefPtr<PropertyNameArrayData> propertyNameArrayData);64 JSPropertyNameIterator(ExecState*); 65 JSPropertyNameIterator(ExecState*, JSObject*, PassRefPtr<PropertyNameArrayData> propertyNameArrayData); 62 66 63 67 JSObject* m_object; … … 67 71 }; 68 72 69 inline JSPropertyNameIterator::JSPropertyNameIterator( )70 : JSCell( 0)73 inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec) 74 : JSCell(exec->globalData().propertyNameIteratorStructure.get()) 71 75 , m_object(0) 72 76 , m_position(0) … … 75 79 } 76 80 77 inline JSPropertyNameIterator::JSPropertyNameIterator( JSObject* object, PassRefPtr<PropertyNameArrayData> propertyNameArrayData)78 : JSCell( 0)81 inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec, JSObject* object, PassRefPtr<PropertyNameArrayData> propertyNameArrayData) 82 : JSCell(exec->globalData().propertyNameIteratorStructure.get()) 79 83 , m_object(object) 80 84 , m_data(propertyNameArrayData) … … 87 91 { 88 92 if (v.isUndefinedOrNull()) 89 return new (exec) JSPropertyNameIterator ;93 return new (exec) JSPropertyNameIterator(exec); 90 94 91 95 JSObject* o = v.toObject(exec); 92 96 PropertyNameArray propertyNames(exec); 93 97 o->getPropertyNames(exec, propertyNames); 94 return new (exec) JSPropertyNameIterator( o, propertyNames.releaseData());98 return new (exec) JSPropertyNameIterator(exec, o, propertyNames.releaseData()); 95 99 } 96 100 -
trunk/JavaScriptCore/runtime/JSStaticScopeObject.cpp
r44757 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 32 32 ASSERT_CLASS_FITS_IN_CELL(JSStaticScopeObject); 33 33 34 void JSStaticScopeObject::mark ()34 void JSStaticScopeObject::markChildren(MarkStack& markStack) 35 35 { 36 JSVariableObject::mark(); 37 38 if (!d()->registerStore.marked()) 39 d()->registerStore.mark(); 36 JSVariableObject::markChildren(markStack); 37 markStack.append(d()->registerStore.jsValue()); 40 38 } 41 39 -
trunk/JavaScriptCore/runtime/JSStaticScopeObject.h
r44757 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 51 51 } 52 52 virtual ~JSStaticScopeObject(); 53 virtual void mark ();53 virtual void markChildren(MarkStack&); 54 54 bool isDynamicScope() const; 55 55 virtual JSObject* toThisObject(ExecState*) const; -
trunk/JavaScriptCore/runtime/JSType.h
r44224 r47022 34 34 NullType = 4, 35 35 StringType = 5, 36 ObjectType = 6, 37 GetterSetterType = 7 36 37 // The CompoundType value must come before any JSType that may have children 38 CompoundType = 6, 39 ObjectType = 7, 40 GetterSetterType = 8 38 41 }; 39 42 -
trunk/JavaScriptCore/runtime/JSValue.h
r46598 r47022 2 2 * Copyright (C) 1999-2001 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2004, 2005, 2007, 2008 Apple Inc. All rights reserved.4 * Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 5 * 6 6 * This library is free software; you can redistribute it and/or … … 43 43 class JSObject; 44 44 class JSString; 45 class MarkStack; 45 46 class PropertySlot; 46 47 class PutPropertySlot; … … 173 174 174 175 // Garbage collection. 175 void mark(); 176 void markChildren(MarkStack&); 177 bool hasChildren() const; 176 178 bool marked() const; 179 void markDirect(); 177 180 178 181 // Object operations, with the toObject operation included. -
trunk/JavaScriptCore/runtime/JSWrapperObject.cpp
r40046 r47022 1 1 /* 2 2 * Copyright (C) 2006 Maks Orlovich 3 * Copyright (C) 2006 Apple Computer, Inc.3 * Copyright (C) 2006, 2009 Apple, Inc. 4 4 * 5 5 * This library is free software; you can redistribute it and/or … … 27 27 ASSERT_CLASS_FITS_IN_CELL(JSWrapperObject); 28 28 29 void JSWrapperObject::mark ()29 void JSWrapperObject::markChildren(MarkStack& markStack) 30 30 { 31 JSObject::mark ();32 if (m_internalValue && !m_internalValue.marked())33 m _internalValue.mark();31 JSObject::markChildren(markStack); 32 if (m_internalValue) 33 markStack.append(m_internalValue); 34 34 } 35 35 -
trunk/JavaScriptCore/runtime/JSWrapperObject.h
r43153 r47022 37 37 void setInternalValue(JSValue); 38 38 39 virtual void mark ();39 virtual void markChildren(MarkStack&); 40 40 41 41 private: -
trunk/JavaScriptCore/runtime/MarkStack.cpp
r47021 r47022 1 1 /* 2 * Copyright (C) 200 8, 2009 Apple Inc. All Rights Reserved.2 * Copyright (C) 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 25 25 26 26 #include "config.h" 27 #include "MarkStack.h" 27 28 28 #if ENABLE(WORKERS) 29 namespace JSC 30 { 29 31 30 #include "JSWorker.h" 32 size_t MarkStack::s_pageSize = 0; 31 33 32 #include "JSDOMGlobalObject.h" 33 #include "Worker.h" 34 35 using namespace JSC; 36 37 namespace WebCore { 38 39 void JSWorker::mark() 34 void MarkStack::compact() 40 35 { 41 Base::mark();42 43 m arkIfNotNull(static_cast<Worker*>(impl())->onmessage());36 ASSERT(s_pageSize); 37 m_values.shrinkAllocation(s_pageSize); 38 m_markSets.shrinkAllocation(s_pageSize); 44 39 } 45 40 46 } // namespace WebCore 47 48 #endif // ENABLE(WORKERS) 41 } -
trunk/JavaScriptCore/runtime/MarkStackPosix.cpp
r47021 r47022 1 1 /* 2 * Copyright (C) 200 8, 2009 Apple Inc. All Rights Reserved.2 * Copyright (C) 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 26 26 #include "config.h" 27 27 28 #if ENABLE(WORKERS)29 28 30 #include "JSWorker.h" 29 #include "MarkStack.h" 30 #include <sys/mman.h> 31 31 32 #include "JSDOMGlobalObject.h" 33 #include "Worker.h" 34 35 using namespace JSC; 36 37 namespace WebCore { 38 39 void JSWorker::mark() 32 namespace JSC { 33 void* MarkStack::allocateStack(size_t size) 40 34 { 41 Base::mark(); 42 43 markIfNotNull(static_cast<Worker*>(impl())->onmessage()); 35 return mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); 36 } 37 void MarkStack::releaseStack(void* addr, size_t size) 38 { 39 munmap(addr, size); 44 40 } 45 41 46 } // namespace WebCore 47 48 #endif // ENABLE(WORKERS) 42 } -
trunk/JavaScriptCore/runtime/MarkStackWin.cpp
r47021 r47022 1 1 /* 2 * Copyright (C) 200 8, 2009 Apple Inc. All Rights Reserved.2 * Copyright (C) 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 26 26 #include "config.h" 27 27 28 #if ENABLE(WORKERS)29 28 30 #include " JSWorker.h"29 #include "MarkStack.h" 31 30 32 #include "JSDOMGlobalObject.h" 33 #include "Worker.h" 31 #include "windows.h" 34 32 35 using namespace JSC; 36 37 namespace WebCore { 38 39 void JSWorker::mark() 33 namespace JSC { 34 void* MarkStack::allocateStack(size_t size) 40 35 { 41 Base::mark(); 42 43 markIfNotNull(static_cast<Worker*>(impl())->onmessage()); 36 return VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 37 } 38 void MarkStack::releaseStack(void* addr, size_t size) 39 { 40 VirtualFree(addr, size, MEM_RELEASE); 44 41 } 45 42 46 } // namespace WebCore 47 48 #endif // ENABLE(WORKERS) 43 } -
trunk/JavaScriptCore/runtime/ScopeChain.h
r46679 r47022 1 1 /* 2 * Copyright (C) 2003, 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2003, 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * This library is free software; you can redistribute it and/or … … 205 205 JSGlobalObject* globalObject() const { return m_node->globalObject(); } 206 206 207 void mark () const;207 void markAggregate(MarkStack&) const; 208 208 209 209 // Caution: this should only be used if the codeblock this is being used -
trunk/JavaScriptCore/runtime/ScopeChainMark.h
r44224 r47022 1 1 /* 2 * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2003, 2006, 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * This library is free software; you can redistribute it and/or … … 26 26 namespace JSC { 27 27 28 inline void ScopeChain::mark () const28 inline void ScopeChain::markAggregate(MarkStack& markStack) const 29 29 { 30 for (ScopeChainNode* n = m_node; n; n = n->next) { 31 JSObject* o = n->object; 32 if (!o->marked()) 33 o->mark(); 34 } 30 for (ScopeChainNode* n = m_node; n; n = n->next) 31 markStack.append(n->object); 35 32 } 36 33 -
trunk/JavaScriptCore/runtime/SmallStrings.cpp
r45891 r47022 86 86 { 87 87 if (m_emptyString && !m_emptyString->marked()) 88 m_emptyString->mark ();88 m_emptyString->markCellDirect(); 89 89 for (unsigned i = 0; i < numCharactersToStore; ++i) { 90 90 if (m_singleCharacterStrings[i] && !m_singleCharacterStrings[i]->marked()) 91 m_singleCharacterStrings[i]->mark ();91 m_singleCharacterStrings[i]->markCellDirect(); 92 92 } 93 93 } -
trunk/JavaScriptCore/runtime/Structure.h
r44445 r47022 1 1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 30 30 #include "JSType.h" 31 31 #include "JSValue.h" 32 #include "MarkStack.h" 32 33 #include "PropertyMapHashTable.h" 33 34 #include "StructureChain.h" … … 73 74 ~Structure(); 74 75 75 void mark() 76 { 77 if (!m_prototype.marked()) 78 m_prototype.mark(); 76 void markAggregate(MarkStack& markStack) 77 { 78 markStack.append(m_prototype); 79 79 } 80 80
Note:
See TracChangeset
for help on using the changeset viewer.