Changeset 47022 in webkit for trunk/JavaScriptCore


Ignore:
Timestamp:
Aug 10, 2009, 9:35:02 PM (16 years ago)
Author:
[email protected]
Message:

Stack overflow crash in JavaScript garbage collector mark pass
https://bugs.webkit.org/show_bug.cgi?id=12216

Reviewed by Gavin Barraclough and Sam Weinig

Make the GC mark phase iterative by using an explicit mark stack.
To do this marking any single object is performed in multiple stages

  • The object is appended to the MarkStack, this sets the marked bit for the object using the new markDirect() function, and then returns
  • When the MarkStack is drain()ed the object is popped off the stack and markChildren(MarkStack&) is called on the object to collect all of its children. drain() then repeats until the stack is empty.

Additionally I renamed a number of methods from 'mark' to 'markAggregate'
in order to make it more clear that marking of those object was not
going to result in an actual recursive mark.

Location:
trunk/JavaScriptCore
Files:
1 added
56 edited
3 copied

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r47010 r47022  
     12009-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
    11552009-08-10  Mark Rowe  <[email protected]>
    2156       
  • trunk/JavaScriptCore/GNUmakefile.am

    r47003 r47022  
    192192        JavaScriptCore/runtime/LiteralParser.cpp \
    193193        JavaScriptCore/runtime/LiteralParser.h \
     194        JavaScriptCore/runtime/MarkStack.cpp \
     195        JavaScriptCore/runtime/MarkStack.h \
     196        JavaScriptCore/runtime/MarkStackPosix.cpp \
    194197        JavaScriptCore/runtime/SmallStrings.cpp \
    195198        JavaScriptCore/runtime/SmallStrings.h \
     
    437440        JavaScriptCore/runtime/Lookup.cpp \
    438441        JavaScriptCore/runtime/Lookup.h \
     442        JavaScriptCore/runtime/MarkStack.cpp \
     443        JavaScriptCore/runtime/MarkStack.h \
     444        JavaScriptCore/runtime/MarkStackWin.cpp \
    439445        JavaScriptCore/runtime/MathObject.cpp \
    440446        JavaScriptCore/runtime/MathObject.h \
  • trunk/JavaScriptCore/JavaScriptCore.exp

    r46598 r47022  
    132132__ZN3JSC14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE
    133133__ZN3JSC14JSGlobalObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE
     134__ZN3JSC14JSGlobalObject12markChildrenERNS_9MarkStackE
    134135__ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj
    135136__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE 
    136137__ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE
    137 __ZN3JSC14JSGlobalObject4markEv
    138138__ZN3JSC14JSGlobalObjectD2Ev
    139139__ZN3JSC14JSGlobalObjectnwEmPNS_12JSGlobalDataE
     
    142142__ZN3JSC14TimeoutChecker5resetEv
    143143__ZN3JSC14constructArrayEPNS_9ExecStateERKNS_7ArgListE
    144 __ZN3JSC15JSWrapperObject4markEv
     144__ZN3JSC15JSWrapperObject12markChildrenERNS_9MarkStackE
    145145__ZN3JSC15toInt32SlowCaseEdRb
    146146__ZN3JSC16FunctionBodyNode13finishParsingEPNS_10IdentifierEm
     
    237237__ZN3JSC8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE
    238238__ZN3JSC8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE
     239__ZN3JSC8JSObject12markChildrenERNS_9MarkStackE
    239240__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
    240241__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateEj
     
    252253__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE
    253254__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE 
    254 __ZN3JSC8JSObject4markEv
    255255__ZN3JSC8Profiler13stopProfilingEPNS_9ExecStateERKNS_7UStringE
    256256__ZN3JSC8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE
     
    260260__ZN3JSC9CodeBlockD1Ev
    261261__ZN3JSC9CodeBlockD2Ev
     262__ZN3JSC9MarkStack10s_pageSizeE
     263__ZN3JSC9MarkStack12releaseStackEPvm
     264__ZN3JSC9MarkStack13allocateStackEm
    262265__ZN3JSC9Structure17stopIgnoringLeaksEv
    263266__ZN3JSC9Structure18startIgnoringLeaksEv
     
    327330__ZNK3JSC12StringObject8toStringEPNS_9ExecStateE
    328331__ZNK3JSC14JSGlobalObject14isDynamicScopeEv
     332
    329333__ZNK3JSC16FunctionBodyNode14isHostFunctionEv
    330334__ZNK3JSC16InternalFunction9classInfoEv
  • trunk/JavaScriptCore/JavaScriptCore.gypi

    r45683 r47022  
    266266            'runtime/Lookup.cpp',
    267267            'runtime/Lookup.h',
     268            'runtime/MarkStack.cpp',
     269            'runtime/MarkStack.h',
     270            'runtime/MarkStackWin.cpp',
    268271            'runtime/MathObject.cpp',
    269272            'runtime/MathObject.h',
  • trunk/JavaScriptCore/JavaScriptCore.pri

    r46706 r47022  
    9999    runtime/JSONObject.cpp \
    100100    runtime/LiteralParser.cpp \
     101    runtime/MarkStack.cpp \
     102    runtime/MarkStackPosix.cpp \
    101103    runtime/TimeoutChecker.cpp \
    102104    bytecode/CodeBlock.cpp \
  • trunk/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj

    r46598 r47022  
    882882                        <File
    883883                                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"
    884896                                >
    885897                        </File>
  • trunk/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r46876 r47022  
    197197                A72701B90DADE94900E548D7 /* ExceptionHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = A72701B30DADE94900E548D7 /* ExceptionHelpers.h */; };
    198198                A727FF6B0DA3092200E548D7 /* JSPropertyNameIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A727FF660DA3053B00E548D7 /* JSPropertyNameIterator.cpp */; };
     199                A74B3499102A5F8E0032AB98 /* MarkStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A74B3498102A5F8E0032AB98 /* MarkStack.cpp */; };
    199200                A766B44F0EE8DCD1009518CA /* ExecutableAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = A7B48DB50EE74CFC00DCBDB6 /* ExecutableAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; };
    200201                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, ); }; };
    201203                A782F1A50EEC9FA20036273F /* ExecutableAllocatorPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A782F1A40EEC9FA20036273F /* ExecutableAllocatorPosix.cpp */; };
    202204                A791EF280F11E07900AE1F68 /* JSByteArray.h in Headers */ = {isa = PBXBuildFile; fileRef = A791EF260F11E07900AE1F68 /* JSByteArray.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    205207                A7A1F7AD0F252B3C00E184E2 /* ByteArray.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A1F7AB0F252B3C00E184E2 /* ByteArray.h */; settings = {ATTRIBUTES = (Private, ); }; };
    206208                A7B48F490EE8936F00DCBDB6 /* ExecutableAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7B48DB60EE74CFC00DCBDB6 /* ExecutableAllocator.cpp */; };
     209                A7C530E4102A3813005BC741 /* MarkStackPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7C530E3102A3813005BC741 /* MarkStackPosix.cpp */; };
    207210                A7E2EA6B0FB460CF00601F06 /* LiteralParser.h in Headers */ = {isa = PBXBuildFile; fileRef = A7E2EA690FB460CF00601F06 /* LiteralParser.h */; };
    208211                A7E2EA6C0FB460CF00601F06 /* LiteralParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7E2EA6A0FB460CF00601F06 /* LiteralParser.cpp */; };
     
    739742                A727FF650DA3053B00E548D7 /* JSPropertyNameIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPropertyNameIterator.h; sourceTree = "<group>"; };
    740743                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>"; };
    741745                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>"; };
    742747                A782F1A40EEC9FA20036273F /* ExecutableAllocatorPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExecutableAllocatorPosix.cpp; sourceTree = "<group>"; };
    743748                A791EF260F11E07900AE1F68 /* JSByteArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSByteArray.h; sourceTree = "<group>"; };
     
    747752                A7B48DB50EE74CFC00DCBDB6 /* ExecutableAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExecutableAllocator.h; sourceTree = "<group>"; };
    748753                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>"; };
    749755                A7E2EA690FB460CF00601F06 /* LiteralParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiteralParser.h; sourceTree = "<group>"; };
    750756                A7E2EA6A0FB460CF00601F06 /* LiteralParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LiteralParser.cpp; sourceTree = "<group>"; };
     
    14911497                                F692A8850255597D01FF60F7 /* UString.cpp */,
    14921498                                F692A8860255597D01FF60F7 /* UString.h */,
     1499                                A779558F101A74D500114E55 /* MarkStack.h */,
     1500                                A7C530E3102A3813005BC741 /* MarkStackPosix.cpp */,
     1501                                A74B3498102A5F8E0032AB98 /* MarkStack.cpp */,
    14931502                        );
    14941503                        path = runtime;
     
    18931902                                1429DABF0ED263E700B89619 /* WRECParser.h in Headers */,
    18941903                                9688CB160ED12B4E001D649F /* X86Assembler.h in Headers */,
     1904                                A7795590101A74D500114E55 /* MarkStack.h in Headers */,
    18951905                        );
    18961906                        runOnlyForDeploymentPostprocessing = 0;
     
    22592269                                1429DAE10ED2645B00B89619 /* WRECGenerator.cpp in Sources */,
    22602270                                1429DAC00ED263E700B89619 /* WRECParser.cpp in Sources */,
     2271                                A7C530E4102A3813005BC741 /* MarkStackPosix.cpp in Sources */,
     2272                                A74B3499102A5F8E0032AB98 /* MarkStack.cpp in Sources */,
    22612273                        );
    22622274                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/JavaScriptCore/bytecode/CodeBlock.cpp

    r46879 r47022  
    14291429}
    14301430
    1431 void CodeBlock::mark()
    1432 {
    1433     for (size_t i = 0; i < m_constantRegisters.size(); ++i)
     1431void CodeBlock::markAggregate(MarkStack& markStack)
     1432{
     1433    for (size_t i = 0; i < m_constantRegisters.size(); ++i) {
    14341434        if (!m_constantRegisters[i].marked())
    1435             m_constantRegisters[i].mark();
     1435            markStack.append(m_constantRegisters[i].jsValue());
     1436    }
    14361437
    14371438    for (size_t i = 0; i < m_functionExpressions.size(); ++i)
    1438         m_functionExpressions[i]->body()->mark();
     1439        m_functionExpressions[i]->body()->markAggregate(markStack);
    14391440
    14401441    if (m_rareData) {
    14411442        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);
    14451446    }
    14461447}
  • trunk/JavaScriptCore/bytecode/CodeBlock.h

    r46879 r47022  
    256256        ~CodeBlock();
    257257
    258         void mark();
     258        void markAggregate(MarkStack&);
    259259        void refStructures(Instruction* vPC) const;
    260260        void derefStructures(Instruction* vPC) const;
  • trunk/JavaScriptCore/bytecode/EvalCodeCache.h

    r44224 r47022  
    6969        bool isEmpty() const { return m_cacheMap.isEmpty(); }
    7070
    71         void mark()
     71        void markAggregate(MarkStack& markStack)
    7272        {
    7373            EvalCacheMap::iterator end = m_cacheMap.end();
    7474            for (EvalCacheMap::iterator ptr = m_cacheMap.begin(); ptr != end; ++ptr)
    75                 ptr->second->mark();
     75                ptr->second->markAggregate(markStack);
    7676        }
    7777    private:
  • trunk/JavaScriptCore/debugger/DebuggerActivation.cpp

    r43122 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3939}
    4040
    41 void DebuggerActivation::mark()
     41void DebuggerActivation::markChildren(MarkStack& markStack)
    4242{
    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);
    4647}
    4748
  • trunk/JavaScriptCore/debugger/DebuggerActivation.h

    r43122 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3737        DebuggerActivation(JSObject*);
    3838
    39         virtual void mark();
     39        virtual void markChildren(MarkStack&);
    4040        virtual UString className() const;
    4141        virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
  • trunk/JavaScriptCore/interpreter/Register.h

    r46598 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5757
    5858        bool marked() const;
    59         void mark();
     59        void markChildren(MarkStack&);
    6060       
    6161        Register(JSActivation*);
     
    121121    }
    122122
    123     ALWAYS_INLINE void Register::mark()
    124     {
    125         jsValue().mark();
    126     }
    127    
    128123    // Interpreter functions
    129124
  • trunk/JavaScriptCore/interpreter/RegisterFile.h

    r46025 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    137137        Register* lastGlobal() const { return m_start - m_numGlobals; }
    138138       
    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); }
    141141
    142142    private:
  • trunk/JavaScriptCore/parser/Nodes.cpp

    r46598 r47022  
    18191819}
    18201820
    1821 void ScopeNodeData::mark()
     1821void ScopeNodeData::markAggregate(MarkStack& markStack)
    18221822{
    18231823    FunctionStack::iterator end = m_functionStack.end();
     
    18261826        if (!body->isGenerated())
    18271827            continue;
    1828         body->generatedBytecode().mark();
     1828        body->generatedBytecode().markAggregate(markStack);
    18291829    }
    18301830}
     
    19731973}
    19741974
    1975 void EvalNode::mark()
     1975void EvalNode::markAggregate(MarkStack& markStack)
    19761976{
    19771977    // We don't need to mark our own CodeBlock as the JSGlobalObject takes care of that
    1978     data()->mark();
     1978    data()->markAggregate(markStack);
    19791979}
    19801980
     
    20312031}
    20322032
    2033 void FunctionBodyNode::mark()
     2033void FunctionBodyNode::markAggregate(MarkStack& markStack)
    20342034{
    20352035    if (m_code)
    2036         m_code->mark();
     2036        m_code->markAggregate(markStack);
    20372037}
    20382038
  • trunk/JavaScriptCore/parser/Nodes.h

    r46837 r47022  
    13911391        StatementVector m_children;
    13921392
    1393         void mark();
     1393        void markAggregate(MarkStack&);
    13941394    };
    13951395
     
    14371437        }
    14381438
    1439         virtual void mark() { }
     1439        virtual void markAggregate(MarkStack&) { }
    14401440
    14411441#if ENABLE(JIT)
     
    15161516        EvalCodeBlock& bytecodeForExceptionInfoReparse(ScopeChainNode*, CodeBlock*);
    15171517
    1518         virtual void mark();
     1518        virtual void markAggregate(MarkStack&);
    15191519
    15201520#if ENABLE(JIT)
     
    15641564        bool isHostFunction() const;
    15651565
    1566         virtual void mark();
     1566        virtual void markAggregate(MarkStack&);
    15671567
    15681568        void finishParsing(const SourceCode&, ParameterNode*);
  • trunk/JavaScriptCore/runtime/ArgList.cpp

    r44224 r47022  
    11/*
    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.
    33 *
    44 *  This library is free software; you can redistribute it and/or
     
    3838}
    3939
    40 void MarkedArgumentBuffer::markLists(ListSet& markSet)
     40void MarkedArgumentBuffer::markLists(MarkStack& markStack, ListSet& markSet)
    4141{
    4242    ListSet::iterator end = markSet.end();
    4343    for (ListSet::iterator it = markSet.begin(); it != end; ++it) {
    4444        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);
    5046    }
    5147}
  • trunk/JavaScriptCore/runtime/ArgList.h

    r46598 r47022  
    136136        const_iterator end() const { return m_buffer + m_size; }
    137137
    138         static void markLists(ListSet&);
     138        static void markLists(MarkStack&, ListSet&);
    139139
    140140    private:
  • trunk/JavaScriptCore/runtime/Arguments.cpp

    r44224 r47022  
    22 *  Copyright (C) 1999-2002 Harri Porten ([email protected])
    33 *  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.
    55 *  Copyright (C) 2007 Cameron Zwarich ([email protected])
    66 *  Copyright (C) 2007 Maks Orlovich
     
    4444}
    4545
    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     }
     46void 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);
    5652
    5753    if (d->extraArguments) {
    5854        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);
    7062}
    7163
  • trunk/JavaScriptCore/runtime/Arguments.h

    r46598 r47022  
    11/*
    22 *  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.
    44 *  Copyright (C) 2007 Cameron Zwarich ([email protected])
    55 *  Copyright (C) 2007 Maks Orlovich
     
    6262        static const ClassInfo info;
    6363
    64         virtual void mark();
     64        virtual void markChildren(MarkStack&);
    6565
    6666        void fillArgList(ExecState*, MarkedArgumentBuffer&);
  • trunk/JavaScriptCore/runtime/Collector.cpp

    r46703 r47022  
    11/*
    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.
    33 *  Copyright (C) 2007 Eric Seidel <[email protected]>
    44 *
     
    3131#include "JSString.h"
    3232#include "JSValue.h"
     33#include "MarkStack.h"
    3334#include "Nodes.h"
    3435#include "Tracing.h"
     
    643644#define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0)
    644645
    645 void Heap::markConservatively(void* start, void* end)
     646void Heap::markConservatively(MarkStack& markStack, void* start, void* end)
    646647{
    647648    if (start > end) {
     
    684685                if ((primaryBlocks[block] == blockAddr) & (offset <= lastCellOffset)) {
    685686                    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();
    689689                    }
    690690                    break;
     
    697697}
    698698
    699 void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal()
     699void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal(MarkStack& markStack)
    700700{
    701701    void* dummy;
    702702    void* stackPointer = &dummy;
    703703    void* stackBase = currentThreadStackBase();
    704     markConservatively(stackPointer, stackBase);
    705 }
    706 
    707 void Heap::markCurrentThreadConservatively()
     704    markConservatively(markStack, stackPointer, stackBase);
     705}
     706
     707void Heap::markCurrentThreadConservatively(MarkStack& markStack)
    708708{
    709709    // setjmp forces volatile registers onto the stack
     
    718718#endif
    719719
    720     markCurrentThreadConservativelyInternal();
     720    markCurrentThreadConservativelyInternal(markStack);
    721721}
    722722
     
    850850}
    851851
    852 void Heap::markOtherThreadConservatively(Thread* thread)
     852void Heap::markOtherThreadConservatively(MarkStack& markStack, Thread* thread)
    853853{
    854854    suspendThread(thread->platformThread);
     
    858858
    859859    // mark the thread's registers
    860     markConservatively(static_cast<void*>(&regs), static_cast<void*>(reinterpret_cast<char*>(&regs) + regSize));
     860    markConservatively(markStack, static_cast<void*>(&regs), static_cast<void*>(reinterpret_cast<char*>(&regs) + regSize));
    861861
    862862    void* stackPointer = otherThreadStackPointer(regs);
    863     markConservatively(stackPointer, thread->stackBase);
     863    markConservatively(markStack, stackPointer, thread->stackBase);
    864864
    865865    resumeThread(thread->platformThread);
     
    868868#endif
    869869
    870 void Heap::markStackObjectsConservatively()
    871 {
    872     markCurrentThreadConservatively();
     870void Heap::markStackObjectsConservatively(MarkStack& markStack)
     871{
     872    markCurrentThreadConservatively(markStack);
    873873
    874874#if ENABLE(JSC_MULTIPLE_THREADS)
     
    880880#ifndef NDEBUG
    881881        // 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 been
     882        // a malloc inside markChildren() would risk a deadlock with a thread that had been
    883883        // suspended while holding the malloc lock.
    884884        fastMallocForbid();
     
    888888        for (Thread* thread = m_registeredThreads; thread; thread = thread->next) {
    889889            if (!pthread_equal(thread->posixThread, pthread_self()))
    890                 markOtherThreadConservatively(thread);
     890                markOtherThreadConservatively(markStack, thread);
    891891        }
    892892#ifndef NDEBUG
     
    948948}
    949949
    950 void Heap::markProtectedObjects()
     950void Heap::markProtectedObjects(MarkStack& markStack)
    951951{
    952952    if (m_protectedValuesMutex)
     
    956956    for (ProtectCountSet::iterator it = m_protectedValues.begin(); it != end; ++it) {
    957957        JSCell* val = it->first;
    958         if (!val->marked())
    959             val->mark();
     958        if (!val->marked()) {
     959            markStack.append(val);
     960            markStack.drain();
     961        }
    960962    }
    961963
     
    10621064    return numLiveObjects;
    10631065}
    1064    
     1066
    10651067bool Heap::collect()
    10661068{
     
    10811083
    10821084    // 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);
    10861088    if (m_markListSet && m_markListSet->size())
    1087         MarkedArgumentBuffer::markLists(*m_markListSet);
     1089        MarkedArgumentBuffer::markLists(markStack, *m_markListSet);
    10881090    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);
    10911093    m_globalData->smallStrings.mark();
    10921094    if (m_globalData->scopeNodeBeingReparsed)
    1093         m_globalData->scopeNodeBeingReparsed->mark();
     1095        m_globalData->scopeNodeBeingReparsed->markAggregate(markStack);
    10941096    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();
    10971101    JAVASCRIPTCORE_GC_MARKED();
    10981102
  • trunk/JavaScriptCore/runtime/Collector.h

    r46598 r47022  
    4040namespace JSC {
    4141
    42     class MarkedArgumentBuffer;
    4342    class CollectorBlock;
    4443    class JSCell;
    4544    class JSGlobalData;
    4645    class JSValue;
     46    class MarkedArgumentBuffer;
     47    class MarkStack;
    4748
    4849    enum OperationInProgress { NoOperation, Allocation, Collection };
     
    112113        static void markCell(JSCell*);
    113114
    114         void markConservatively(void* start, void* end);
     115        void markConservatively(MarkStack&, void* start, void* end);
    115116
    116117        HashSet<MarkedArgumentBuffer*>& markListSet() { if (!m_markListSet) m_markListSet = new HashSet<MarkedArgumentBuffer*>; return *m_markListSet; }
     
    134135
    135136        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&);
    141142
    142143        typedef HashCountedSet<JSCell*> ProtectCountSet;
  • trunk/JavaScriptCore/runtime/GetterSetter.cpp

    r44224 r47022  
    22 *  Copyright (C) 1999-2002 Harri Porten ([email protected])
    33 *  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.
    55 *
    66 *  This library is free software; you can redistribute it and/or
     
    2929namespace JSC {
    3030
    31 void GetterSetter::mark()
     31void GetterSetter::markChildren(MarkStack& markStack)
    3232{
    33     JSCell::mark();
     33    JSCell::markChildren(markStack);
    3434
    3535    if (m_getter && !m_getter->marked())
    36         m_getter->mark();
     36        markStack.append(m_getter);
    3737    if (m_setter && !m_setter->marked())
    38         m_setter->mark();
     38        markStack.append(m_setter);
    3939}
    4040
  • trunk/JavaScriptCore/runtime/GetterSetter.h

    r44224 r47022  
    22 *  Copyright (C) 1999-2001 Harri Porten ([email protected])
    33 *  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.
    55 *
    66 *  This library is free software; you can redistribute it and/or
     
    3434    class GetterSetter : public JSCell {
    3535    public:
    36         GetterSetter()
    37             : JSCell(0)
     36        GetterSetter(ExecState* exec)
     37            : JSCell(exec->globalData().getterSetterStructure.get())
    3838            , m_getter(0)
    3939            , m_setter(0)
     
    4141        }
    4242
    43         virtual void mark();
     43        virtual void markChildren(MarkStack&);
    4444
    4545        JSObject* getter() const { return m_getter; }
     
    4747        JSObject* setter() const { return m_setter; }
    4848        void setSetter(JSObject* setter) { m_setter = setter; }
    49 
     49        static PassRefPtr<Structure> createStructure(JSValue prototype)
     50        {
     51            return Structure::create(prototype, TypeInfo(GetterSetterType));
     52        }
    5053    private:
    5154        virtual bool isGetterSetter() const;
  • trunk/JavaScriptCore/runtime/GlobalEvalFunction.cpp

    r38440 r47022  
    22 *  Copyright (C) 1999-2002 Harri Porten ([email protected])
    33 *  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.
    55 *  Copyright (C) 2007 Cameron Zwarich ([email protected])
    66 *  Copyright (C) 2007 Maks Orlovich
     
    4040}
    4141
    42 void GlobalEvalFunction::mark()
     42void GlobalEvalFunction::markChildren(MarkStack& markStack)
    4343{
    44     PrototypeFunction::mark();
    45     if (!m_cachedGlobalObject->marked())
    46         m_cachedGlobalObject->mark();
     44    PrototypeFunction::markChildren(markStack);
     45    markStack.append(m_cachedGlobalObject);
    4746}
    4847
  • trunk/JavaScriptCore/runtime/GlobalEvalFunction.h

    r38440 r47022  
    11/*
    22 *  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.
    44 *  Copyright (C) 2007 Cameron Zwarich ([email protected])
    55 *  Copyright (C) 2007 Maks Orlovich
     
    3737
    3838    private:
    39         virtual void mark();
     39        virtual void markChildren(MarkStack&);
    4040
    4141        JSGlobalObject* m_cachedGlobalObject;
  • trunk/JavaScriptCore/runtime/JSAPIValueWrapper.h

    r46598 r47022  
    2727
    2828#include "JSCell.h"
     29#include "CallFrame.h"
    2930
    3031namespace JSC {
     
    4344        virtual UString toString(ExecState*) const;
    4445        virtual JSObject* toObject(ExecState*) const;
     46        static PassRefPtr<Structure> createStructure(JSValue prototype)
     47        {
     48            return Structure::create(prototype, TypeInfo(CompoundType));
     49        }
    4550
     51       
    4652    private:
    47         JSAPIValueWrapper(JSValue value)
    48             : JSCell(0)
     53        JSAPIValueWrapper(ExecState* exec, JSValue value)
     54            : JSCell(exec->globalData().apiWrapperStructure.get())
    4955            , m_value(value)
    5056        {
     
    5662    inline JSValue jsAPIValueWrapper(ExecState* exec, JSValue value)
    5763    {
    58         return new (exec) JSAPIValueWrapper(value);
     64        return new (exec) JSAPIValueWrapper(exec, value);
    5965    }
    6066
  • trunk/JavaScriptCore/runtime/JSActivation.cpp

    r45609 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5050}
    5151
    52 void JSActivation::mark()
     52void JSActivation::markChildren(MarkStack& markStack)
    5353{
    54     Base::mark();
     54    Base::markChildren(markStack);
    5555
    5656    Register* registerArray = d()->registerArray.get();
     
    6060    size_t numParametersMinusThis = d()->functionBody->generatedBytecode().m_numParameters - 1;
    6161
    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);
    6964
    7065    size_t numVars = d()->functionBody->generatedBytecode().m_numVars;
    7166
    7267    // 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);
    8169}
    8270
  • trunk/JavaScriptCore/runtime/JSActivation.h

    r44224 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    4747        virtual ~JSActivation();
    4848
    49         virtual void mark();
     49        virtual void markChildren(MarkStack&);
    5050
    5151        virtual bool isDynamicScope() const;
  • trunk/JavaScriptCore/runtime/JSArray.cpp

    r46598 r47022  
    11/*
    22 *  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.
    44 *  Copyright (C) 2003 Peter Kelly ([email protected])
    55 *  Copyright (C) 2006 Alexey Proskuryakov ([email protected])
     
    602602}
    603603
    604 void JSArray::mark()
    605 {
    606     JSObject::mark();
     604void JSArray::markChildren(MarkStack& markStack)
     605{
     606    JSObject::markChildren(markStack);
    607607
    608608    ArrayStorage* storage = m_storage;
    609609
    610610    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);
    616612
    617613    if (SparseArrayValueMap* map = storage->m_sparseValueMap) {
    618614        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);
    624617    }
    625618}
  • trunk/JavaScriptCore/runtime/JSArray.h

    r43122 r47022  
    11/*
    22 *  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.
    44 *
    55 *  This library is free software; you can redistribute it and/or
     
    8989        virtual bool deleteProperty(ExecState*, unsigned propertyName);
    9090        virtual void getPropertyNames(ExecState*, PropertyNameArray&);
    91         virtual void mark();
     91        virtual void markChildren(MarkStack&);
    9292
    9393        void* lazyCreationData();
  • trunk/JavaScriptCore/runtime/JSCell.h

    r46598 r47022  
    22 *  Copyright (C) 1999-2001 Harri Porten ([email protected])
    33 *  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.
    55 *
    66 *  This library is free software; you can redistribute it and/or
     
    8686        void* operator new(size_t, JSGlobalData*);
    8787        void* operator new(size_t, void* placementNewDestination) { return placementNewDestination; }
    88         virtual void mark();
     88
     89        void markCellDirect();
     90        virtual void markChildren(MarkStack&);
    8991        bool marked() const;
    9092
     
    154156    }
    155157
    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());
    159166    }
    160167
     
    225232    }
    226233
    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);
    230244    }
    231245
     
    340354        return JSValue();
    341355    }
     356   
     357    inline bool JSValue::hasChildren() const
     358    {
     359        return asCell()->structure()->typeInfo().type() >= CompoundType;
     360    }
     361   
    342362
    343363    inline JSObject* JSValue::toObject(ExecState* exec) const
     
    351371    }
    352372
     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    }
    353406} // namespace JSC
    354407
  • trunk/JavaScriptCore/runtime/JSFunction.cpp

    r46598 r47022  
    22 *  Copyright (C) 1999-2002 Harri Porten ([email protected])
    33 *  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.
    55 *  Copyright (C) 2007 Cameron Zwarich ([email protected])
    66 *  Copyright (C) 2007 Maks Orlovich
     
    8484}
    8585
    86 void JSFunction::mark()
    87 {
    88     Base::mark();
    89     m_body->mark();
     86void JSFunction::markChildren(MarkStack& markStack)
     87{
     88    Base::markChildren(markStack);
     89    m_body->markAggregate(markStack);
    9090    if (!isHostFunction())
    91         scopeChain().mark();
     91        scopeChain().markAggregate(markStack);
    9292}
    9393
  • trunk/JavaScriptCore/runtime/JSFunction.h

    r46528 r47022  
    6969        FunctionBodyNode* body() const { return m_body.get(); }
    7070
    71         virtual void mark();
     71        virtual void markChildren(MarkStack&);
    7272
    7373        static JS_EXPORTDATA const ClassInfo info;
  • trunk/JavaScriptCore/runtime/JSGlobalData.cpp

    r46598 r47022  
    3434#include "CommonIdentifiers.h"
    3535#include "FunctionConstructor.h"
     36#include "GetterSetter.h"
    3637#include "Interpreter.h"
    3738#include "JSActivation.h"
     39#include "JSAPIValueWrapper.h"
    3840#include "JSArray.h"
    3941#include "JSByteArray.h"
     
    4244#include "JSLock.h"
    4345#include "JSNotAnObject.h"
     46#include "JSPropertyNameIterator.h"
    4447#include "JSStaticScopeObject.h"
    4548#include "Parser.h"
     
    119122    , notAnObjectErrorStubStructure(JSNotAnObjectErrorStub::createStructure(jsNull()))
    120123    , notAnObjectStructure(JSNotAnObject::createStructure(jsNull()))
     124    , propertyNameIteratorStructure(JSPropertyNameIterator::createStructure(jsNull()))
     125    , getterSetterStructure(GetterSetter::createStructure(jsNull()))
     126    , apiWrapperStructure(JSAPIValueWrapper::createStructure(jsNull()))
    121127#if USE(JSVALUE32)
    122128    , numberStructure(JSNumberCell::createStructure(jsNull()))
  • trunk/JavaScriptCore/runtime/JSGlobalData.h

    r46598 r47022  
    3434#include "JITStubs.h"
    3535#include "JSValue.h"
     36#include "MarkStack.h"
    3637#include "SmallStrings.h"
    3738#include "TimeoutChecker.h"
     
    9899        RefPtr<Structure> notAnObjectErrorStubStructure;
    99100        RefPtr<Structure> notAnObjectStructure;
     101        RefPtr<Structure> propertyNameIteratorStructure;
     102        RefPtr<Structure> getterSetterStructure;
     103        RefPtr<Structure> apiWrapperStructure;
     104
    100105#if USE(JSVALUE32)
    101106        RefPtr<Structure> numberStructure;
     
    144149        Stringifier* firstStringifierToMark;
    145150
     151        MarkStack markStack;
    146152    private:
    147153        JSGlobalData(bool isShared, const VPtrSet&);
  • trunk/JavaScriptCore/runtime/JSGlobalObject.cpp

    r46963 r47022  
    8181static const int preferredScriptCheckTimeInterval = 1000;
    8282
    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)
     83static inline void markIfNeeded(MarkStack& markStack, JSValue v)
     84{
     85    if (v)
     86        markStack.append(v);
     87}
     88
     89static inline void markIfNeeded(MarkStack& markStack, const RefPtr<Structure>& s)
    9090{
    9191    if (s)
    92         s->mark();
     92        s->markAggregate(markStack);
    9393}
    9494
     
    358358}
    359359
    360 void JSGlobalObject::mark()
    361 {
    362     JSVariableObject::mark();
     360void JSGlobalObject::markChildren(MarkStack& markStack)
     361{
     362    JSVariableObject::markChildren(markStack);
    363363   
    364364    HashSet<ProgramCodeBlock*>::const_iterator end = codeBlocks().end();
    365365    for (HashSet<ProgramCodeBlock*>::const_iterator it = codeBlocks().begin(); it != end; ++it)
    366         (*it)->mark();
     366        (*it)->markAggregate(markStack);
    367367
    368368    RegisterFile& registerFile = globalData()->interpreter->registerFile();
    369369    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);
    397397
    398398    // No need to mark the other structures, because their prototypes are all
     
    404404
    405405    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);
    411407}
    412408
  • trunk/JavaScriptCore/runtime/JSGlobalObject.h

    r46598 r47022  
    11/*
    22 *  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.
    44 *
    55 *  This library is free software; you can redistribute it and/or
     
    167167        virtual ~JSGlobalObject();
    168168
    169         virtual void mark();
     169        virtual void markChildren(MarkStack&);
    170170
    171171        virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
  • trunk/JavaScriptCore/runtime/JSNotAnObject.cpp

    r43122 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    7575
    7676// Marking
    77 void JSNotAnObject::mark()
     77void JSNotAnObject::markChildren(MarkStack& markStack)
    7878{
    79     JSCell::mark();
    80     if (!m_exception->marked())
    81         m_exception->mark();
     79    JSObject::markChildren(markStack);
     80    markStack.append(m_exception);
    8281}
    8382
  • trunk/JavaScriptCore/runtime/JSNotAnObject.h

    r43122 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    7676
    7777        // Marking
    78         virtual void mark();
     78        virtual void markChildren(MarkStack&);
    7979
    8080        // JSObject methods
  • trunk/JavaScriptCore/runtime/JSONObject.cpp

    r46967 r47022  
    6868    JSValue stringify(JSValue);
    6969
    70     void mark();
     70    void markAggregate(MarkStack&);
    7171
    7272private:
     
    222222}
    223223
    224 void Stringifier::mark()
     224void Stringifier::markAggregate(MarkStack& markStack)
    225225{
    226226    for (Stringifier* stringifier = this; stringifier; stringifier = stringifier->m_nextStringifierToMark) {
    227227        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());
    233230    }
    234231}
     
    585582}
    586583
    587 void JSONObject::markStringifiers(Stringifier* stringifier)
    588 {
    589     stringifier->mark();
     584void JSONObject::markStringifiers(MarkStack& markStack, Stringifier* stringifier)
     585{
     586    stringifier->markAggregate(markStack);
    590587}
    591588
  • trunk/JavaScriptCore/runtime/JSONObject.h

    r44813 r47022  
    4545        }
    4646
    47         static void markStringifiers(Stringifier*);
     47        static void markStringifiers(MarkStack&, Stringifier*);
    4848
    4949    private:
  • trunk/JavaScriptCore/runtime/JSObject.cpp

    r44445 r47022  
    22 *  Copyright (C) 1999-2001 Harri Porten ([email protected])
    33 *  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.
    55 *  Copyright (C) 2007 Eric Seidel ([email protected])
    66 *
     
    6363ASSERT_CLASS_FITS_IN_CELL(JSObject);
    6464
    65 void JSObject::mark()
     65void JSObject::markChildren(MarkStack& markStack)
    6666{
    6767    JSOBJECT_MARK_BEGIN();
    6868
    69     JSCell::mark();
    70     m_structure->mark();
     69    JSCell::markChildren(markStack);
     70    m_structure->markAggregate(markStack);
    7171
    7272    PropertyStorage storage = propertyStorage();
    73 
    7473    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);
    8075
    8176    JSOBJECT_MARK_END();
     
    311306
    312307    PutPropertySlot slot;
    313     GetterSetter* getterSetter = new (exec) GetterSetter;
     308    GetterSetter* getterSetter = new (exec) GetterSetter(exec);
    314309    putDirectInternal(exec->globalData(), propertyName, getterSetter, Getter, true, slot);
    315310
     
    338333
    339334    PutPropertySlot slot;
    340     GetterSetter* getterSetter = new (exec) GetterSetter;
     335    GetterSetter* getterSetter = new (exec) GetterSetter(exec);
    341336    putDirectInternal(exec->globalData(), propertyName, getterSetter, Setter, true, slot);
    342337
  • trunk/JavaScriptCore/runtime/JSObject.h

    r46598 r47022  
    22 *  Copyright (C) 1999-2001 Harri Porten ([email protected])
    33 *  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.
    55 *
    66 *  This library is free software; you can redistribute it and/or
     
    7474        explicit JSObject(PassRefPtr<Structure>);
    7575
    76         virtual void mark();
     76        virtual void markChildren(MarkStack&);
    7777
    7878        // The inline virtual destructor cannot be the first virtual function declared
  • trunk/JavaScriptCore/runtime/JSPropertyNameIterator.cpp

    r44224 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    7474}
    7575
    76 void JSPropertyNameIterator::mark()
     76void JSPropertyNameIterator::markChildren(MarkStack& markStack)
    7777{
    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);
    8181}
    8282
  • trunk/JavaScriptCore/runtime/JSPropertyNameIterator.h

    r44224 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5252        virtual JSObject* toObject(ExecState*) const;
    5353
    54         virtual void mark();
     54        virtual void markChildren(MarkStack&);
    5555
    5656        JSValue next(ExecState*);
    5757        void invalidate();
    58 
     58       
     59        static PassRefPtr<Structure> createStructure(JSValue prototype)
     60        {
     61            return Structure::create(prototype, TypeInfo(CompoundType));
     62        }
    5963    private:
    60         JSPropertyNameIterator();
    61         JSPropertyNameIterator(JSObject*, PassRefPtr<PropertyNameArrayData> propertyNameArrayData);
     64        JSPropertyNameIterator(ExecState*);
     65        JSPropertyNameIterator(ExecState*, JSObject*, PassRefPtr<PropertyNameArrayData> propertyNameArrayData);
    6266
    6367        JSObject* m_object;
     
    6771    };
    6872
    69 inline JSPropertyNameIterator::JSPropertyNameIterator()
    70     : JSCell(0)
     73inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec)
     74    : JSCell(exec->globalData().propertyNameIteratorStructure.get())
    7175    , m_object(0)
    7276    , m_position(0)
     
    7579}
    7680
    77 inline JSPropertyNameIterator::JSPropertyNameIterator(JSObject* object, PassRefPtr<PropertyNameArrayData> propertyNameArrayData)
    78     : JSCell(0)
     81inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec, JSObject* object, PassRefPtr<PropertyNameArrayData> propertyNameArrayData)
     82    : JSCell(exec->globalData().propertyNameIteratorStructure.get())
    7983    , m_object(object)
    8084    , m_data(propertyNameArrayData)
     
    8791{
    8892    if (v.isUndefinedOrNull())
    89         return new (exec) JSPropertyNameIterator;
     93        return new (exec) JSPropertyNameIterator(exec);
    9094
    9195    JSObject* o = v.toObject(exec);
    9296    PropertyNameArray propertyNames(exec);
    9397    o->getPropertyNames(exec, propertyNames);
    94     return new (exec) JSPropertyNameIterator(o, propertyNames.releaseData());
     98    return new (exec) JSPropertyNameIterator(exec, o, propertyNames.releaseData());
    9599}
    96100
  • trunk/JavaScriptCore/runtime/JSStaticScopeObject.cpp

    r44757 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3232ASSERT_CLASS_FITS_IN_CELL(JSStaticScopeObject);
    3333
    34 void JSStaticScopeObject::mark()
     34void JSStaticScopeObject::markChildren(MarkStack& markStack)
    3535{
    36     JSVariableObject::mark();
    37    
    38     if (!d()->registerStore.marked())
    39         d()->registerStore.mark();
     36    JSVariableObject::markChildren(markStack);
     37    markStack.append(d()->registerStore.jsValue());
    4038}
    4139
  • trunk/JavaScriptCore/runtime/JSStaticScopeObject.h

    r44757 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5151        }
    5252        virtual ~JSStaticScopeObject();
    53         virtual void mark();
     53        virtual void markChildren(MarkStack&);
    5454        bool isDynamicScope() const;
    5555        virtual JSObject* toThisObject(ExecState*) const;
  • trunk/JavaScriptCore/runtime/JSType.h

    r44224 r47022  
    3434        NullType          = 4,
    3535        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
    3841    };
    3942
  • trunk/JavaScriptCore/runtime/JSValue.h

    r46598 r47022  
    22 *  Copyright (C) 1999-2001 Harri Porten ([email protected])
    33 *  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.
    55 *
    66 *  This library is free software; you can redistribute it and/or
     
    4343    class JSObject;
    4444    class JSString;
     45    class MarkStack;
    4546    class PropertySlot;
    4647    class PutPropertySlot;
     
    173174
    174175        // Garbage collection.
    175         void mark();
     176        void markChildren(MarkStack&);
     177        bool hasChildren() const;
    176178        bool marked() const;
     179        void markDirect();
    177180
    178181        // Object operations, with the toObject operation included.
  • trunk/JavaScriptCore/runtime/JSWrapperObject.cpp

    r40046 r47022  
    11/*
    22 *  Copyright (C) 2006 Maks Orlovich
    3  *  Copyright (C) 2006 Apple Computer, Inc.
     3 *  Copyright (C) 2006, 2009 Apple, Inc.
    44 *
    55 *  This library is free software; you can redistribute it and/or
     
    2727ASSERT_CLASS_FITS_IN_CELL(JSWrapperObject);
    2828
    29 void JSWrapperObject::mark()
     29void JSWrapperObject::markChildren(MarkStack& markStack)
    3030{
    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);
    3434}
    3535
  • trunk/JavaScriptCore/runtime/JSWrapperObject.h

    r43153 r47022  
    3737        void setInternalValue(JSValue);
    3838       
    39         virtual void mark();
     39        virtual void markChildren(MarkStack&);
    4040       
    4141    private:
  • trunk/JavaScriptCore/runtime/MarkStack.cpp

    r47021 r47022  
    11/*
    2  * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved.
     2 * Copyright (C) 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2525
    2626#include "config.h"
     27#include "MarkStack.h"
    2728
    28 #if ENABLE(WORKERS)
     29namespace JSC
     30{
    2931
    30 #include "JSWorker.h"
     32size_t MarkStack::s_pageSize = 0;
    3133
    32 #include "JSDOMGlobalObject.h"
    33 #include "Worker.h"
    34 
    35 using namespace JSC;
    36 
    37 namespace WebCore {
    38    
    39 void JSWorker::mark()
     34void MarkStack::compact()
    4035{
    41     Base::mark();
    42 
    43     markIfNotNull(static_cast<Worker*>(impl())->onmessage());
     36    ASSERT(s_pageSize);
     37    m_values.shrinkAllocation(s_pageSize);
     38    m_markSets.shrinkAllocation(s_pageSize);
    4439}
    4540
    46 } // namespace WebCore
    47 
    48 #endif // ENABLE(WORKERS)
     41}
  • trunk/JavaScriptCore/runtime/MarkStackPosix.cpp

    r47021 r47022  
    11/*
    2  * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved.
     2 * Copyright (C) 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2626#include "config.h"
    2727
    28 #if ENABLE(WORKERS)
    2928
    30 #include "JSWorker.h"
     29#include "MarkStack.h"
     30#include <sys/mman.h>
    3131
    32 #include "JSDOMGlobalObject.h"
    33 #include "Worker.h"
    34 
    35 using namespace JSC;
    36 
    37 namespace WebCore {
    38    
    39 void JSWorker::mark()
     32namespace JSC {
     33void* MarkStack::allocateStack(size_t size)
    4034{
    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}
     37void MarkStack::releaseStack(void* addr, size_t size)
     38{
     39    munmap(addr, size);
    4440}
    4541
    46 } // namespace WebCore
    47 
    48 #endif // ENABLE(WORKERS)
     42}
  • trunk/JavaScriptCore/runtime/MarkStackWin.cpp

    r47021 r47022  
    11/*
    2  * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved.
     2 * Copyright (C) 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2626#include "config.h"
    2727
    28 #if ENABLE(WORKERS)
    2928
    30 #include "JSWorker.h"
     29#include "MarkStack.h"
    3130
    32 #include "JSDOMGlobalObject.h"
    33 #include "Worker.h"
     31#include "windows.h"
    3432
    35 using namespace JSC;
    36 
    37 namespace WebCore {
    38    
    39 void JSWorker::mark()
     33namespace JSC {
     34void* MarkStack::allocateStack(size_t size)
    4035{
    41     Base::mark();
    42 
    43     markIfNotNull(static_cast<Worker*>(impl())->onmessage());
     36    return VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
     37}
     38void MarkStack::releaseStack(void* addr, size_t size)
     39{
     40    VirtualFree(addr, size, MEM_RELEASE);
    4441}
    4542
    46 } // namespace WebCore
    47 
    48 #endif // ENABLE(WORKERS)
     43}
  • trunk/JavaScriptCore/runtime/ScopeChain.h

    r46679 r47022  
    11/*
    2  *  Copyright (C) 2003, 2008 Apple Inc. All rights reserved.
     2 *  Copyright (C) 2003, 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 *  This library is free software; you can redistribute it and/or
     
    205205        JSGlobalObject* globalObject() const { return m_node->globalObject(); }
    206206
    207         void mark() const;
     207        void markAggregate(MarkStack&) const;
    208208
    209209        // Caution: this should only be used if the codeblock this is being used
  • trunk/JavaScriptCore/runtime/ScopeChainMark.h

    r44224 r47022  
    11/*
    2  *  Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved.
     2 *  Copyright (C) 2003, 2006, 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 *  This library is free software; you can redistribute it and/or
     
    2626namespace JSC {
    2727
    28     inline void ScopeChain::mark() const
     28    inline void ScopeChain::markAggregate(MarkStack& markStack) const
    2929    {
    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);
    3532    }
    3633
  • trunk/JavaScriptCore/runtime/SmallStrings.cpp

    r45891 r47022  
    8686{
    8787    if (m_emptyString && !m_emptyString->marked())
    88         m_emptyString->mark();
     88        m_emptyString->markCellDirect();
    8989    for (unsigned i = 0; i < numCharactersToStore; ++i) {
    9090        if (m_singleCharacterStrings[i] && !m_singleCharacterStrings[i]->marked())
    91             m_singleCharacterStrings[i]->mark();
     91            m_singleCharacterStrings[i]->markCellDirect();
    9292    }
    9393}
  • trunk/JavaScriptCore/runtime/Structure.h

    r44445 r47022  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3030#include "JSType.h"
    3131#include "JSValue.h"
     32#include "MarkStack.h"
    3233#include "PropertyMapHashTable.h"
    3334#include "StructureChain.h"
     
    7374        ~Structure();
    7475
    75         void mark()
    76         {
    77             if (!m_prototype.marked())
    78                 m_prototype.mark();
     76        void markAggregate(MarkStack& markStack)
     77        {
     78            markStack.append(m_prototype);
    7979        }
    8080
Note: See TracChangeset for help on using the changeset viewer.