Changeset 47022 in webkit


Ignore:
Timestamp:
Aug 10, 2009 9:35:02 PM (15 years ago)
Author:
oliver@apple.com
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
Files:
4 added
103 edited
3 copied

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r47010 r47022  
     12009-08-07  Oliver Hunt  <oliver@apple.com>
     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  <mrowe@apple.com>
    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 (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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 (cwzwarich@uwaterloo.ca)
    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 (porten@kde.org)
    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 (cwzwarich@uwaterloo.ca)
    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 <eric@webkit.org>
    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 (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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 (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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 (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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 (cwzwarich@uwaterloo.ca)
    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 (porten@kde.org)
    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 (cwzwarich@uwaterloo.ca)
    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 (porten@kde.org)
    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 (pmk@post.com)
    55 *  Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
     
    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 (porten@kde.org)
    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 (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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 (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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 (cwzwarich@uwaterloo.ca)
    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 <eric@webkit.org>
    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 (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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 (eric@webkit.org)
    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 (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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 (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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
  • trunk/JavaScriptGlue/ChangeLog

    r46876 r47022  
     12009-08-07  Oliver Hunt  <oliver@apple.com>
     2
     3        Reviewed by Sam Weinig.
     4
     5        Stack overflow crash in JavaScript garbage collector mark pass
     6        https://bugs.webkit.org/show_bug.cgi?id=12216
     7
     8        Make JSGlue interact with the new iterative mark logic.
     9
     10        * JSValueWrapper.cpp:
     11        (JSValueWrapper::JSObjectMark):
     12          Unfortunately JSGlue exposes recursive marking so we can only flatten
     13          the recursion.  We just create a local mark stack if necessary and mark
     14          the given object iteratively from this point.
     15        * UserObjectImp.cpp:
     16        (UserObjectImp::markChildren):
     17        * UserObjectImp.h:
     18
    1192009-08-06  Mark Rowe  <mrowe@apple.com>
    220
  • trunk/JavaScriptGlue/JSValueWrapper.cpp

    r46431 r47022  
    11/*
    2  * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
     2 * Copyright (C) 2005, 2009 Apple Computer, Inc.  All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    195195{
    196196    JSValueWrapper* ptr = (JSValueWrapper*)data;
    197     if (ptr)
    198     {
    199         ptr->fValue.get().mark();
    200     }
    201 }
     197    if (ptr && !ptr->fValue.get().marked())
     198    {
     199        // This results in recursive marking but will be otherwise safe and correct.
     200        MarkStack markStack;
     201        markStack.append(ptr->fValue.get());
     202        markStack.drain();
     203    }
     204}
  • trunk/JavaScriptGlue/UserObjectImp.cpp

    r45657 r47022  
    11/*
    2  * Copyright (C) 2005, 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2005, 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    410410}
    411411
    412 void UserObjectImp::mark()
    413 {
    414     JSObject::mark();
     412void UserObjectImp::markChildren(MarkStack& markStack)
     413{
     414    JSObject::markChildren(markStack);
    415415    if (fJSUserObject)
    416416        fJSUserObject->Mark();
  • trunk/JavaScriptGlue/UserObjectImp.h

    r45657 r47022  
    11/*
    2  * Copyright (C) 2005, 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2005, 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5656    virtual UString toString(ExecState *exec) const;
    5757
    58     virtual void mark();
     58    virtual void markChildren(MarkStack&);
    5959
    6060    JSUserObject *GetJSUserObject() const;
  • trunk/LayoutTests/ChangeLog

    r47020 r47022  
     12009-08-07  Oliver Hunt  <oliver@apple.com>
     2
     3        Reviewed by Sam Weinig.
     4
     5        Stack overflow crash in JavaScript garbage collector mark pass
     6        https://bugs.webkit.org/show_bug.cgi?id=12216
     7
     8        Add a testcase that requires marking of a deeply nested object.
     9
     10        * fast/js/nested-object-gc-expected.txt: Added.
     11        * fast/js/nested-object-gc.html: Added.
     12        * fast/js/resources/js-test-pre.js:
     13            Add a gc() function that triggers a gc or calls the gc controller if it's present
     14        * fast/js/resources/nested-object-gc.js: Added.
     15
    1162009-08-10  Jeremy Orlow  <jorlow@chromium.org>
    217
  • trunk/LayoutTests/fast/js/resources/js-test-pre.js

    r41672 r47022  
    187187    testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was " + _av + ".");
    188188}
     189
     190function gc() {
     191    if (typeof GCController !== "undefined")
     192        GCController.collect();
     193    else {
     194        function gcRec(n) {
     195            if (n < 1)
     196                return {};
     197            var temp = {i: "ab" + i + (i / 100000)};
     198            temp += "foo";
     199            gcRec(n-1);
     200        }
     201        for (var i = 0; i < 1000; i++)
     202            gcRec(10)
     203    }
     204}
  • trunk/WebCore/ChangeLog

    r47021 r47022  
     12009-08-07  Oliver Hunt  <oliver@apple.com>
     2
     3        Reviewed by Sam Weinig
     4
     5        Stack overflow crash in JavaScript garbage collector mark pass
     6        https://bugs.webkit.org/show_bug.cgi?id=12216
     7
     8        Make WebCore use the new iterative marking logic.
     9
     10        Tests: fast/js/nested-object-gc.html
     11
     12        * bindings/js/JSAbstractWorkerCustom.cpp:
     13        (WebCore::JSAbstractWorker::markChildren):
     14        * bindings/js/JSDOMApplicationCacheCustom.cpp:
     15        (WebCore::JSDOMApplicationCache::markChildren):
     16        * bindings/js/JSDOMBinding.cpp:
     17        (WebCore::markDOMNodesForDocument):
     18        (WebCore::markActiveObjectsForContext):
     19        (WebCore::markDOMObjectWrapper):
     20        * bindings/js/JSDOMBinding.h:
     21        (WebCore::DOMObjectWithGlobalPointer::markChildren):
     22        * bindings/js/JSDOMGlobalObject.cpp:
     23        (WebCore::JSDOMGlobalObject::markChildren):
     24        * bindings/js/JSDOMGlobalObject.h:
     25        * bindings/js/JSDOMWindowCustom.cpp:
     26        (WebCore::JSDOMWindow::markChildren):
     27        * bindings/js/JSDOMWindowShell.cpp:
     28        (WebCore::JSDOMWindowShell::markChildren):
     29        * bindings/js/JSDOMWindowShell.h:
     30        * bindings/js/JSDedicatedWorkerContextCustom.cpp:
     31        (WebCore::JSDedicatedWorkerContext::markChildren):
     32        * bindings/js/JSDocumentCustom.cpp:
     33        (WebCore::JSDocument::markChildren):
     34        * bindings/js/JSEventListener.cpp:
     35        (WebCore::JSEventListener::markJSFunction):
     36        * bindings/js/JSEventListener.h:
     37        * bindings/js/JSMessageChannelCustom.cpp:
     38        (WebCore::JSMessageChannel::markChildren):
     39        * bindings/js/JSMessagePortCustom.cpp:
     40        (WebCore::JSMessagePort::markChildren):
     41        * bindings/js/JSNavigatorCustom.cpp:
     42        (WebCore::JSNavigator::markChildren):
     43        * bindings/js/JSNodeCustom.cpp:
     44        (WebCore::JSNode::markChildren):
     45        * bindings/js/JSNodeFilterCondition.cpp:
     46        (WebCore::JSNodeFilterCondition::markAggregate):
     47        * bindings/js/JSNodeFilterCondition.h:
     48        * bindings/js/JSNodeFilterCustom.cpp:
     49        (WebCore::JSNodeFilter::markChildren):
     50        * bindings/js/JSNodeIteratorCustom.cpp:
     51        (WebCore::JSNodeIterator::markChildren):
     52        * bindings/js/JSQuarantinedObjectWrapper.cpp:
     53        (WebCore::JSQuarantinedObjectWrapper::markChildren):
     54        * bindings/js/JSQuarantinedObjectWrapper.h:
     55        * bindings/js/JSSVGElementInstanceCustom.cpp:
     56        (WebCore::JSSVGElementInstance::markChildren):
     57        * bindings/js/JSSharedWorkerCustom.cpp:
     58        (WebCore::JSSharedWorker::markChildren):
     59        * bindings/js/JSStyleSheetCustom.cpp:
     60        (WebCore::JSStyleSheet::markChildren):
     61        * bindings/js/JSTreeWalkerCustom.cpp:
     62        (WebCore::JSTreeWalker::markChildren):
     63        * bindings/js/JSWebSocketCustom.cpp:
     64        (WebCore::JSWebSocket::markChildren):
     65        * bindings/js/JSWorkerContextCustom.cpp:
     66        (WebCore::JSWorkerContext::markChildren):
     67        * bindings/js/JSWorkerCustom.cpp:
     68        (WebCore::JSWorker::markChildren):
     69        * bindings/js/JSXMLHttpRequestCustom.cpp:
     70        (WebCore::JSXMLHttpRequest::markChildren):
     71        * bindings/js/JSXMLHttpRequestUploadCustom.cpp:
     72        (WebCore::JSXMLHttpRequestUpload::markChildren):
     73        * bindings/scripts/CodeGeneratorJS.pm:
     74        * dom/EventListener.h:
     75        (WebCore::EventListener::markJSFunction):
     76        (WebCore::markIfNotNull):
     77        * dom/NodeFilter.h:
     78        (WebCore::NodeFilter::markAggregate):
     79        * dom/NodeFilterCondition.h:
     80        (WebCore::NodeFilterCondition::markAggregate):
     81        * dom/RegisteredEventListener.h:
     82        (WebCore::markEventListeners):
     83        * page/DOMWindow.h:
     84        * workers/WorkerContext.h:
     85
    1862009-08-10  Jeremy Orlow  <jorlow@chromium.org>
    287
  • trunk/WebCore/bindings/js/JSAbstractWorkerCustom.cpp

    r46358 r47022  
    11/*
    22 * Copyright (C) 2009 Google Inc. All rights reserved.
     3 * Copyright (C) 2009 Apple, Inc. All rights reserved.
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    4445namespace WebCore {
    4546
    46 void JSAbstractWorker::mark()
     47void JSAbstractWorker::markChildren(MarkStack& markStack)
    4748{
    48     Base::mark();
     49    Base::markChildren(markStack);
    4950
    50     markIfNotNull(m_impl->onerror());
     51    markIfNotNull(markStack, m_impl->onerror());
    5152
    5253    typedef AbstractWorker::EventListenersMap EventListenersMap;
     
    5556    for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) {
    5657        for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter)
    57             (*vecIter)->markJSFunction();
     58            (*vecIter)->markJSFunction(markStack);
    5859    }
    5960}
  • trunk/WebCore/bindings/js/JSDOMApplicationCacheCustom.cpp

    r46322 r47022  
    4343namespace WebCore {
    4444
    45 void JSDOMApplicationCache::mark()
     45void JSDOMApplicationCache::markChildren(MarkStack& markStack)
    4646{
    47     Base::mark();
     47    Base::markChildren(markStack);
    4848
    49     markIfNotNull(m_impl->onchecking());
    50     markIfNotNull(m_impl->onerror());
    51     markIfNotNull(m_impl->onnoupdate());
    52     markIfNotNull(m_impl->ondownloading());
    53     markIfNotNull(m_impl->onprogress());
    54     markIfNotNull(m_impl->onupdateready());
    55     markIfNotNull(m_impl->oncached());
    56     markIfNotNull(m_impl->onobsolete());
     49    markIfNotNull(markStack, m_impl->onchecking());
     50    markIfNotNull(markStack, m_impl->onerror());
     51    markIfNotNull(markStack, m_impl->onnoupdate());
     52    markIfNotNull(markStack, m_impl->ondownloading());
     53    markIfNotNull(markStack, m_impl->onprogress());
     54    markIfNotNull(markStack, m_impl->onupdateready());
     55    markIfNotNull(markStack, m_impl->oncached());
     56    markIfNotNull(markStack, m_impl->onobsolete());
    5757
    5858    typedef DOMApplicationCache::EventListenersMap EventListenersMap;
     
    6161    for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) {
    6262        for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter)
    63             (*vecIter)->markJSFunction();
     63            (*vecIter)->markJSFunction(markStack);
    6464    }
    6565}
  • trunk/WebCore/bindings/js/JSDOMBinding.cpp

    r46994 r47022  
    294294}
    295295
    296 void markDOMNodesForDocument(Document* doc)
     296void markDOMNodesForDocument(MarkStack& markStack, Document* doc)
    297297{
    298298    JSWrapperCache& nodeDict = doc->wrapperCache();
     
    300300    for (JSWrapperCache::iterator nodeIt = nodeDict.begin(); nodeIt != nodeEnd; ++nodeIt) {
    301301        JSNode* jsNode = nodeIt->second;
    302         if (!jsNode->marked() && isObservableThroughDOM(jsNode))
    303             jsNode->mark();
    304     }
    305 }
    306 
    307 void markActiveObjectsForContext(JSGlobalData& globalData, ScriptExecutionContext* scriptExecutionContext)
     302        if (isObservableThroughDOM(jsNode))
     303            markStack.append(jsNode);
     304    }
     305}
     306
     307void markActiveObjectsForContext(MarkStack& markStack, JSGlobalData& globalData, ScriptExecutionContext* scriptExecutionContext)
    308308{
    309309    // If an element has pending activity that may result in event listeners being called
     
    318318            // However, some ActiveDOMObjects don't have JS wrappers (timers created by setTimeout is one example).
    319319            // FIXME: perhaps need to make sure even timers have a markable 'wrapper'.
    320             if (wrapper && !wrapper->marked())
    321                 wrapper->mark();
     320            if (wrapper)
     321                markStack.append(wrapper);
    322322        }
    323323    }
     
    329329        if (!(*iter)->locallyEntangledPort() || (*iter)->hasPendingActivity()) {
    330330            DOMObject* wrapper = getCachedDOMObjectWrapper(globalData, *iter);
    331             if (wrapper && !wrapper->marked())
    332                 wrapper->mark();
     331            if (wrapper)
     332                markStack.append(wrapper);
    333333        }
    334334    }
     
    347347}
    348348
    349 void markDOMObjectWrapper(JSGlobalData& globalData, void* object)
     349void markDOMObjectWrapper(MarkStack& markStack, JSGlobalData& globalData, void* object)
    350350{
    351351    if (!object)
    352352        return;
    353353    DOMObject* wrapper = getCachedDOMObjectWrapper(globalData, object);
    354     if (!wrapper || wrapper->marked())
    355         return;
    356     wrapper->mark();
     354    if (!wrapper)
     355        return;
     356    markStack.append(wrapper);
    357357}
    358358
  • trunk/WebCore/bindings/js/JSDOMBinding.h

    r46348 r47022  
    11/*
    22 *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
    3  *  Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
     3 *  Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Apple Inc. All rights reserved.
    44 *  Copyright (C) 2007 Samuel Weinig <sam@webkit.org>
    55 *  Copyright (C) 2009 Google, Inc. All rights reserved.
     
    8686        virtual ~DOMObjectWithGlobalPointer() {}
    8787
    88         void mark()
    89         {
    90             DOMObject::mark();
    91             if (!m_globalObject->marked())
    92                 m_globalObject->mark();
     88        void markChildren(JSC::MarkStack& markStack)
     89        {
     90            DOMObject::markChildren(markStack);
     91            markStack.append(m_globalObject);
    9392        }
    9493
     
    138137    void forgetAllDOMNodesForDocument(Document*);
    139138    void updateDOMNodeDocument(Node*, Document* oldDocument, Document* newDocument);
    140     void markDOMNodesForDocument(Document*);
    141     void markActiveObjectsForContext(JSC::JSGlobalData&, ScriptExecutionContext*);
    142     void markDOMObjectWrapper(JSC::JSGlobalData& globalData, void* object);
     139    void markDOMNodesForDocument(JSC::MarkStack&, Document*);
     140    void markActiveObjectsForContext(JSC::MarkStack&, JSC::JSGlobalData&, ScriptExecutionContext*);
     141    void markDOMObjectWrapper(JSC::MarkStack&, JSC::JSGlobalData& globalData, void* object);
    143142
    144143    JSC::Structure* getCachedDOMStructure(JSDOMGlobalObject*, const JSC::ClassInfo*);
  • trunk/WebCore/bindings/js/JSDOMGlobalObject.cpp

    r46710 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
     
    5959}
    6060
    61 void JSDOMGlobalObject::mark()
     61void JSDOMGlobalObject::markChildren(MarkStack& markStack)
    6262{
    63     Base::mark();
     63    Base::markChildren(markStack);
    6464
    6565    JSDOMStructureMap::iterator end = structures().end();
    6666    for (JSDOMStructureMap::iterator it = structures().begin(); it != end; ++it)
    67         it->second->mark();
     67        it->second->markAggregate(markStack);
    6868
    6969    JSDOMConstructorMap::iterator end2 = constructors().end();
    70     for (JSDOMConstructorMap::iterator it2 = constructors().begin(); it2 != end2; ++it2) {
    71         if (!it2->second->marked())
    72             it2->second->mark();
    73     }
     70    for (JSDOMConstructorMap::iterator it2 = constructors().begin(); it2 != end2; ++it2)
     71        markStack.append(it2->second);
    7472}
    7573
  • trunk/WebCore/bindings/js/JSDOMGlobalObject.h

    r46710 r47022  
    7575        Event* currentEvent() const;
    7676
    77         virtual void mark();
     77        virtual void markChildren(JSC::MarkStack&);
    7878
    7979    protected:
  • trunk/WebCore/bindings/js/JSDOMWindowCustom.cpp

    r46320 r47022  
    6969namespace WebCore {
    7070
    71 void JSDOMWindow::mark()
    72 {
    73     Base::mark();
    74 
    75     markEventListeners(impl()->eventListeners());
     71void JSDOMWindow::markChildren(MarkStack& markStack)
     72{
     73    Base::markChildren(markStack);
     74
     75    markEventListeners(markStack, impl()->eventListeners());
    7676
    7777    JSGlobalData& globalData = *Heap::heap(this)->globalData();
    7878
    79     markDOMObjectWrapper(globalData, impl()->optionalConsole());
    80     markDOMObjectWrapper(globalData, impl()->optionalHistory());
    81     markDOMObjectWrapper(globalData, impl()->optionalLocationbar());
    82     markDOMObjectWrapper(globalData, impl()->optionalMenubar());
    83     markDOMObjectWrapper(globalData, impl()->optionalNavigator());
    84     markDOMObjectWrapper(globalData, impl()->optionalPersonalbar());
    85     markDOMObjectWrapper(globalData, impl()->optionalScreen());
    86     markDOMObjectWrapper(globalData, impl()->optionalScrollbars());
    87     markDOMObjectWrapper(globalData, impl()->optionalSelection());
    88     markDOMObjectWrapper(globalData, impl()->optionalStatusbar());
    89     markDOMObjectWrapper(globalData, impl()->optionalToolbar());
    90     markDOMObjectWrapper(globalData, impl()->optionalLocation());
     79    markDOMObjectWrapper(markStack, globalData, impl()->optionalConsole());
     80    markDOMObjectWrapper(markStack, globalData, impl()->optionalHistory());
     81    markDOMObjectWrapper(markStack, globalData, impl()->optionalLocationbar());
     82    markDOMObjectWrapper(markStack, globalData, impl()->optionalMenubar());
     83    markDOMObjectWrapper(markStack, globalData, impl()->optionalNavigator());
     84    markDOMObjectWrapper(markStack, globalData, impl()->optionalPersonalbar());
     85    markDOMObjectWrapper(markStack, globalData, impl()->optionalScreen());
     86    markDOMObjectWrapper(markStack, globalData, impl()->optionalScrollbars());
     87    markDOMObjectWrapper(markStack, globalData, impl()->optionalSelection());
     88    markDOMObjectWrapper(markStack, globalData, impl()->optionalStatusbar());
     89    markDOMObjectWrapper(markStack, globalData, impl()->optionalToolbar());
     90    markDOMObjectWrapper(markStack, globalData, impl()->optionalLocation());
    9191#if ENABLE(DOM_STORAGE)
    92     markDOMObjectWrapper(globalData, impl()->optionalSessionStorage());
    93     markDOMObjectWrapper(globalData, impl()->optionalLocalStorage());
     92    markDOMObjectWrapper(markStack, globalData, impl()->optionalSessionStorage());
     93    markDOMObjectWrapper(markStack, globalData, impl()->optionalLocalStorage());
    9494#endif
    9595#if ENABLE(OFFLINE_WEB_APPLICATIONS)
    96     markDOMObjectWrapper(globalData, impl()->optionalApplicationCache());
     96    markDOMObjectWrapper(markStack, globalData, impl()->optionalApplicationCache());
    9797#endif
    9898}
  • trunk/WebCore/bindings/js/JSDOMWindowShell.cpp

    r44217 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
     
    7272// ----
    7373
    74 void JSDOMWindowShell::mark()
     74void JSDOMWindowShell::markChildren(MarkStack& markStack)
    7575{
    76     Base::mark();
    77     if (m_window && !m_window->marked())
    78         m_window->mark();
     76    Base::markChildren(markStack);
     77    if (m_window)
     78        markStack.append(m_window);
    7979}
    8080
  • trunk/WebCore/bindings/js/JSDOMWindowShell.h

    r44217 r47022  
    6565
    6666    private:
    67         virtual void mark();
     67        virtual void markChildren(JSC::MarkStack&);
    6868        virtual JSC::UString className() const;
    6969        virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&);
  • trunk/WebCore/bindings/js/JSDedicatedWorkerContextCustom.cpp

    r46369 r47022  
    11/*
    22 * Copyright (C) 2009 Google Inc. All rights reserved.
     3 * Copyright (C) 2009 Apple, Inc. All rights reserved.
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    3940namespace WebCore {
    4041
    41 void JSDedicatedWorkerContext::mark()
     42void JSDedicatedWorkerContext::markChildren(MarkStack& markStack)
    4243{
    43     Base::mark();
     44    Base::markChildren(markStack);
    4445
    45     markIfNotNull(impl()->onmessage());
     46    markIfNotNull(markStack, impl()->onmessage());
    4647}
    4748
  • trunk/WebCore/bindings/js/JSDocumentCustom.cpp

    r46348 r47022  
    11/*
    2  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * This library is free software; you can redistribute it and/or
     
    4040namespace WebCore {
    4141
    42 void JSDocument::mark()
     42void JSDocument::markChildren(MarkStack& markStack)
    4343{
    44     JSNode::mark();
    45     markDOMNodesForDocument(impl());
    46     markActiveObjectsForContext(*Heap::heap(this)->globalData(), impl());
     44    JSNode::markChildren(markStack);
     45    markDOMNodesForDocument(markStack, impl());
     46    markActiveObjectsForContext(markStack, *Heap::heap(this)->globalData(), impl());
    4747}
    4848
  • trunk/WebCore/bindings/js/JSEventListener.cpp

    r46444 r47022  
    5252}
    5353
    54 void JSEventListener::markJSFunction()
    55 {
    56     if (m_jsFunction && !m_jsFunction->marked())
    57         m_jsFunction->mark();
    58     if (m_globalObject && !m_globalObject->marked())
    59         m_globalObject->mark();
     54void JSEventListener::markJSFunction(MarkStack& markStack)
     55{
     56    if (m_jsFunction)
     57        markStack.append(m_jsFunction);
     58    if (m_globalObject)
     59        markStack.append(m_globalObject);
    6060}
    6161
  • trunk/WebCore/bindings/js/JSEventListener.h

    r46419 r47022  
    4444
    4545    private:
    46         virtual void markJSFunction();
     46        virtual void markJSFunction(JSC::MarkStack&);
    4747        virtual void handleEvent(Event*, bool isWindowEvent);
    4848        virtual bool reportError(const String& message, const String& url, int lineNumber);
  • trunk/WebCore/bindings/js/JSMessageChannelCustom.cpp

    r46322 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
     
    3333namespace WebCore {
    3434   
    35 void JSMessageChannel::mark()
     35void JSMessageChannel::markChildren(MarkStack& markStack)
    3636{
    37     Base::mark();
     37    Base::markChildren(markStack);
    3838
    3939    if (MessagePort* port = m_impl->port1()) {
    4040        DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), port);
    41         if (wrapper && !wrapper->marked())
    42             wrapper->mark();
     41        if (wrapper)
     42            markStack.append(wrapper);
    4343    }
    4444
    4545    if (MessagePort* port = m_impl->port2()) {
    4646        DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), port);
    47         if (wrapper && !wrapper->marked())
    48             wrapper->mark();
     47        if (wrapper)
     48            markStack.append(wrapper);
    4949    }
    5050}
  • trunk/WebCore/bindings/js/JSMessagePortCustom.cpp

    r46322 r47022  
    3939namespace WebCore {
    4040
    41 void JSMessagePort::mark()
     41void JSMessagePort::markChildren(MarkStack& markStack)
    4242{
    43     Base::mark();
     43    Base::markChildren(markStack);
    4444
    45     markIfNotNull(m_impl->onmessage());
     45    markIfNotNull(markStack, m_impl->onmessage());
    4646
    4747    // If we have a locally entangled port, we can directly mark it as reachable. Ports that are remotely entangled are marked in-use by markActiveObjectsForContext().
    4848    if (MessagePort* entangledPort = m_impl->locallyEntangledPort()) {
    4949        DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), entangledPort);
    50         if (wrapper && !wrapper->marked())
    51             wrapper->mark();
     50        if (wrapper)
     51            markStack.append(wrapper);
    5252    }
    5353
     
    5757    for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) {
    5858        for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter)
    59             (*vecIter)->markJSFunction();
     59            (*vecIter)->markJSFunction(markStack);
    6060    }
    6161}
  • trunk/WebCore/bindings/js/JSNavigatorCustom.cpp

    r43780 r47022  
    3030using namespace JSC;
    3131
    32 void JSNavigator::mark()
     32void JSNavigator::markChildren(MarkStack& markStack)
    3333{
    34     Base::mark();
     34    Base::markChildren(markStack);
    3535
    3636    JSGlobalData& globalData = *Heap::heap(this)->globalData();
    3737
    38     markDOMObjectWrapper(globalData, impl()->optionalGeolocation());
     38    markDOMObjectWrapper(markStack, globalData, impl()->optionalGeolocation());
    3939}
    4040
  • trunk/WebCore/bindings/js/JSNodeCustom.cpp

    r46710 r47022  
    11/*
    2  * Copyright (C) 2007 Apple Inc. All rights reserved.
     2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    137137}
    138138
    139 void JSNode::mark()
    140 {
    141     ASSERT(!marked());
    142 
     139void JSNode::markChildren(MarkStack& markStack)
     140{
    143141    Node* node = m_impl.get();
     142
     143    Base::markChildren(markStack);
     144    markEventListeners(markStack, node->eventListeners());
    144145
    145146    // Nodes in the document are kept alive by JSDocument::mark, so, if we're in
     
    147148    // mark any other nodes.
    148149    if (node->inDocument()) {
    149         Base::mark();
    150         markEventListeners(node->eventListeners());
    151         if (Document* doc = node->ownerDocument())
     150        if (Document* doc = node->ownerDocument()) {
    152151            if (DOMObject* docWrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), doc))
    153                 if (!docWrapper->marked())
    154                     docWrapper->mark();
     152                markStack.append(docWrapper);
     153        }
    155154        return;
    156155    }
     
    164163    // Nodes in a subtree are marked by the tree's root, so, if the root is already
    165164    // marking the tree, we don't need to explicitly mark any other nodes.
    166     if (root->inSubtreeMark()) {
    167         Base::mark();
    168         markEventListeners(node->eventListeners());
     165    if (root->inSubtreeMark())
    169166        return;
    170     }
    171167
    172168    // Mark the whole tree subtree.
     
    174170    for (Node* nodeToMark = root; nodeToMark; nodeToMark = nodeToMark->traverseNextNode()) {
    175171        JSNode* wrapper = getCachedDOMNodeWrapper(m_impl->document(), nodeToMark);
    176         if (wrapper) {
    177             if (!wrapper->marked())
    178                 wrapper->mark();
    179         } else if (nodeToMark == node) {
    180             // This is the case where the map from the document to wrappers has
    181             // been cleared out, but a wrapper is being marked. For now, we'll
    182             // let the rest of the tree of wrappers get collected, because we have
    183             // no good way of finding them. Later we should test behavior of other
    184             // browsers and see if we need to preserve other wrappers in this case.
    185             if (!marked())
    186                 mark();
    187         }
     172        if (wrapper)
     173            markStack.append(wrapper);
    188174    }
    189175    root->setInSubtreeMark(false);
    190 
    191     // Double check that we actually ended up marked. This assert caught problems in the past.
    192     ASSERT(marked());
    193176}
    194177
  • trunk/WebCore/bindings/js/JSNodeFilterCondition.cpp

    r46431 r47022  
    11/*
    22 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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
     
    3737}
    3838
    39 void JSNodeFilterCondition::mark()
     39void JSNodeFilterCondition::markAggregate(MarkStack& markStack)
    4040{
    41     if (!m_filter.marked())
    42         m_filter.mark();
     41    markStack.append(m_filter);
    4342}
    4443
  • trunk/WebCore/bindings/js/JSNodeFilterCondition.h

    r43122 r47022  
    11/*
    22 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    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
     
    4040
    4141        virtual short acceptNode(ScriptState*, Node*) const;
    42         virtual void mark();
     42        virtual void markAggregate(JSC::MarkStack&);
    4343
    4444        mutable JSC::JSValue m_filter;
  • trunk/WebCore/bindings/js/JSNodeFilterCustom.cpp

    r46322 r47022  
    11/*
    2  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3636namespace WebCore {
    3737
    38 void JSNodeFilter::mark()
     38void JSNodeFilter::markChildren(MarkStack& markStack)
    3939{
    40     impl()->mark();
    41     Base::mark();
     40    Base::markChildren(markStack);
     41    impl()->markAggregate(markStack);
    4242}
    4343
  • trunk/WebCore/bindings/js/JSNodeIteratorCustom.cpp

    r46322 r47022  
    11/*
    2  * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2006, 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * This library is free software; you can redistribute it and/or
     
    3030namespace WebCore {
    3131
    32 void JSNodeIterator::mark()
     32void JSNodeIterator::markChildren(MarkStack& markStack)
    3333{
     34    Base::markChildren(markStack);
     35
    3436    if (NodeFilter* filter = m_impl->filter())
    35         filter->mark();
    36    
    37     Base::mark();
     37        filter->markAggregate(markStack);
    3838}
    3939
  • trunk/WebCore/bindings/js/JSQuarantinedObjectWrapper.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
     
    9393}
    9494
    95 void JSQuarantinedObjectWrapper::mark()
    96 {
    97     JSObject::mark();
    98 
    99     if (!m_unwrappedObject->marked())
    100         m_unwrappedObject->mark();
    101     if (!m_unwrappedGlobalObject->marked())
    102         m_unwrappedGlobalObject->mark();
     95void JSQuarantinedObjectWrapper::markChildren(MarkStack& markStack)
     96{
     97    JSObject::markChildren(markStack);
     98
     99    markStack.append(m_unwrappedObject);
     100    markStack.append(m_unwrappedGlobalObject);
    103101}
    104102
  • trunk/WebCore/bindings/js/JSQuarantinedObjectWrapper.h

    r43372 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
     
    5454        JSQuarantinedObjectWrapper(JSC::ExecState* unwrappedExec, JSC::JSObject* unwrappedObject, PassRefPtr<JSC::Structure>);
    5555
    56         virtual void mark();
     56        virtual void markChildren(JSC::MarkStack&);
    5757
    5858    private:
  • trunk/WebCore/bindings/js/JSSVGElementInstanceCustom.cpp

    r46346 r47022  
    11/*
    22 * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org>
     3 * Copyright (C) 2009 Apple, Inc. All rights reserved.
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    3839namespace WebCore {
    3940
    40 void JSSVGElementInstance::mark()
     41void JSSVGElementInstance::markChildren(MarkStack& markStack)
    4142{
    42     Base::mark();
     43    Base::markChildren(markStack);
    4344
    4445    // Mark the wrapper for our corresponding element, so it can mark its event handlers.
    4546    JSNode* correspondingWrapper = getCachedDOMNodeWrapper(impl()->correspondingElement()->document(), impl()->correspondingElement());
    46     if (correspondingWrapper && !correspondingWrapper->marked())
    47         correspondingWrapper->mark();
     47    if (correspondingWrapper)
     48        markStack.append(correspondingWrapper);
    4849}
    4950
  • trunk/WebCore/bindings/js/JSSharedWorkerContextCustom.cpp

    r46845 r47022  
    3939namespace WebCore {
    4040
    41 void JSSharedWorkerContext::mark()
     41void JSSharedWorkerContext::markChildren(MarkStack& markStack)
    4242{
    43     Base::mark();
     43    Base::markChildren(markStack);
    4444
    45     markIfNotNull(impl()->onconnect());
     45    markIfNotNull(markStack, impl()->onconnect());
    4646}
    4747
  • trunk/WebCore/bindings/js/JSSharedWorkerCustom.cpp

    r45795 r47022  
    4242namespace WebCore {
    4343
    44 void JSSharedWorker::mark()
     44void JSSharedWorker::markChildren(MarkStack& markStack)
    4545{
    46     Base::mark();
     46    Base::markChildren(markStack);
    4747
    4848    if (MessagePort* port = impl()->port()) {
    4949        DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), port);
    50         if (wrapper && !wrapper->marked())
    51             wrapper->mark();
     50        if (wrapper)
     51            markStack.append(wrapper);
    5252    }
    5353}
  • trunk/WebCore/bindings/js/JSStyleSheetCustom.cpp

    r46348 r47022  
    11/*
    2  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5353}
    5454
    55 void JSStyleSheet::mark()
     55void JSStyleSheet::markChildren(MarkStack& markStack)
    5656{
    57     Base::mark();
     57    Base::markChildren(markStack);
    5858
    5959    // This prevents us from having a style sheet with a dangling ownerNode pointer.
     
    6363    // a lot of disentangling of the CSS DOM objects that would need to happen first.
    6464    if (Node* ownerNode = impl()->ownerNode()) {
    65         if (JSNode* ownerNodeWrapper = getCachedDOMNodeWrapper(ownerNode->document(), ownerNode)) {
    66             if (!ownerNodeWrapper->marked())
    67                 ownerNodeWrapper->mark();
    68         }
     65        if (JSNode* ownerNodeWrapper = getCachedDOMNodeWrapper(ownerNode->document(), ownerNode))
     66            markStack.append(ownerNodeWrapper);
    6967    }
    7068}
  • trunk/WebCore/bindings/js/JSTreeWalkerCustom.cpp

    r46322 r47022  
    11/*
    2  * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
     2 * Copyright (C) 2006, 2008, 2009 Apple Inc. All rights reserved.
    33 *
    44 * This library is free software; you can redistribute it and/or
     
    3030namespace WebCore {
    3131   
    32 void JSTreeWalker::mark()
     32void JSTreeWalker::markChildren(MarkStack& markStack)
    3333{
     34    Base::markChildren(markStack);
     35
    3436    if (NodeFilter* filter = m_impl->filter())
    35         filter->mark();
    36    
    37     Base::mark();
     37        filter->markAggregate(markStack);
    3838}
    3939   
  • trunk/WebCore/bindings/js/JSWebSocketCustom.cpp

    r46863 r47022  
    11/*
    22 * Copyright (C) 2009 Google Inc.  All rights reserved.
     3 * Copyright (C) 2009 Apple, Inc.  All rights reserved.
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    4344namespace WebCore {
    4445
    45 void JSWebSocket::mark()
     46void JSWebSocket::markChildren(MarkStack& markStack)
    4647{
    47     Base::mark();
     48    Base::markChildren(markStack);
    4849    if (m_impl->readyState() != WebSocket::CLOSED)
    49         markIfNotNull(m_impl->onmessage());
     50        markIfNotNull(markStack, m_impl->onmessage());
    5051    // FIXME: mark if EventListeners is registered.
    5152}
  • trunk/WebCore/bindings/js/JSWorkerContextCustom.cpp

    r46369 r47022  
    4848namespace WebCore {
    4949
    50 void JSWorkerContext::mark()
     50void JSWorkerContext::markChildren(MarkStack& markStack)
    5151{
    52     Base::mark();
     52    Base::markChildren(markStack);
    5353
    5454    JSGlobalData& globalData = *this->globalData();
    5555
    56     markActiveObjectsForContext(globalData, scriptExecutionContext());
     56    markActiveObjectsForContext(markStack, globalData, scriptExecutionContext());
    5757
    58     markDOMObjectWrapper(globalData, impl()->optionalLocation());
    59     markDOMObjectWrapper(globalData, impl()->optionalNavigator());
     58    markDOMObjectWrapper(markStack, globalData, impl()->optionalLocation());
     59    markDOMObjectWrapper(markStack, globalData, impl()->optionalNavigator());
    6060
    61     markIfNotNull(impl()->onerror());
     61    markIfNotNull(markStack, impl()->onerror());
    6262
    6363    typedef WorkerContext::EventListenersMap EventListenersMap;
     
    6666    for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) {
    6767        for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter)
    68             (*vecIter)->markJSFunction();
     68            (*vecIter)->markJSFunction(markStack);
    6969    }
    7070}
  • trunk/WebCore/bindings/js/JSWorkerCustom.cpp

    r46048 r47022  
    3737namespace WebCore {
    3838   
    39 void JSWorker::mark()
     39void JSWorker::markChildren(MarkStack& markStack)
    4040{
    41     Base::mark();
     41    Base::markChildren(markStack);
    4242
    43     markIfNotNull(static_cast<Worker*>(impl())->onmessage());
     43    markIfNotNull(markStack, static_cast<Worker*>(impl())->onmessage());
    4444}
    4545
  • trunk/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp

    r43122 r47022  
    5050namespace WebCore {
    5151
    52 void JSXMLHttpRequest::mark()
     52void JSXMLHttpRequest::markChildren(MarkStack& markStack)
    5353{
    54     Base::mark();
     54    Base::markChildren(markStack);
    5555
    5656    if (XMLHttpRequestUpload* upload = m_impl->optionalUpload()) {
    5757        DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), upload);
    58         if (wrapper && !wrapper->marked())
    59             wrapper->mark();
     58        if (wrapper)
     59            markStack.append(wrapper);
    6060    }
    6161
    62     markIfNotNull(m_impl->onreadystatechange());
    63     markIfNotNull(m_impl->onabort());
    64     markIfNotNull(m_impl->onerror());
    65     markIfNotNull(m_impl->onload());
    66     markIfNotNull(m_impl->onloadstart());
    67     markIfNotNull(m_impl->onprogress());
     62    markIfNotNull(markStack, m_impl->onreadystatechange());
     63    markIfNotNull(markStack, m_impl->onabort());
     64    markIfNotNull(markStack, m_impl->onerror());
     65    markIfNotNull(markStack, m_impl->onload());
     66    markIfNotNull(markStack, m_impl->onloadstart());
     67    markIfNotNull(markStack, m_impl->onprogress());
    6868   
    6969    typedef XMLHttpRequest::EventListenersMap EventListenersMap;
     
    7272    for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) {
    7373        for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter)
    74             (*vecIter)->markJSFunction();
     74            (*vecIter)->markJSFunction(markStack);
    7575    }
    7676}
  • trunk/WebCore/bindings/js/JSXMLHttpRequestUploadCustom.cpp

    r43122 r47022  
    4242namespace WebCore {
    4343
    44 void JSXMLHttpRequestUpload::mark()
     44void JSXMLHttpRequestUpload::markChildren(MarkStack& markStack)
    4545{
    46     Base::mark();
     46    Base::markChildren(markStack);
    4747
    4848    if (XMLHttpRequest* xmlHttpRequest = m_impl->associatedXMLHttpRequest()) {
    4949        DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), xmlHttpRequest);
    50         if (wrapper && !wrapper->marked())
    51             wrapper->mark();
     50        if (wrapper)
     51            markStack.append(wrapper);
    5252    }
    5353
    54     markIfNotNull(m_impl->onabort());
    55     markIfNotNull(m_impl->onerror());
    56     markIfNotNull(m_impl->onload());
    57     markIfNotNull(m_impl->onloadstart());
    58     markIfNotNull(m_impl->onprogress());
     54    markIfNotNull(markStack, m_impl->onabort());
     55    markIfNotNull(markStack, m_impl->onerror());
     56    markIfNotNull(markStack, m_impl->onload());
     57    markIfNotNull(markStack, m_impl->onloadstart());
     58    markIfNotNull(markStack, m_impl->onprogress());
    5959   
    6060    typedef XMLHttpRequestUpload::EventListenersMap EventListenersMap;
     
    6363    for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) {
    6464        for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter)
    65             (*vecIter)->markJSFunction();
     65            (*vecIter)->markJSFunction(markStack);
    6666    }
    6767}
  • trunk/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r46371 r47022  
    505505
    506506    # Custom mark function
    507     push(@headerContent, "    virtual void mark();\n\n") if $dataNode->extendedAttributes->{"CustomMarkFunction"};
     507    push(@headerContent, "    virtual void markChildren(JSC::MarkStack&);\n\n") if $dataNode->extendedAttributes->{"CustomMarkFunction"};
    508508
    509509    # Custom pushEventHandlerScope function
  • trunk/WebCore/dom/EventListener.h

    r46419 r47022  
    2727namespace JSC {
    2828    class JSObject;
     29    class MarkStack;
    2930}
    3031
     
    4344#if USE(JSC)
    4445        virtual JSC::JSObject* jsFunction() const { return 0; }
    45         virtual void markJSFunction() { }
     46        virtual void markJSFunction(JSC::MarkStack&) { }
    4647#endif
    4748
     
    5354
    5455#if USE(JSC)
    55     inline void markIfNotNull(EventListener* listener) { if (listener) listener->markJSFunction(); }
     56    inline void markIfNotNull(JSC::MarkStack& markStack, EventListener* listener) { if (listener) listener->markJSFunction(markStack); }
    5657#endif
    5758
  • trunk/WebCore/dom/NodeFilter.h

    r42901 r47022  
    44 * Copyright (C) 2001 Peter Kelly (pmk@post.com)
    55 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
    6  * Copyright (C) 2004, 2008 Apple Inc. All rights reserved.
     6 * Copyright (C) 2004, 2008, 2009 Apple Inc. All rights reserved.
    77 *
    88 * This library is free software; you can redistribute it and/or
     
    7272
    7373        short acceptNode(ScriptState*, Node*) const;
    74         void mark() { m_condition->mark(); };
     74        void markAggregate(JSC::MarkStack& markStack) { m_condition->markAggregate(markStack); };
    7575
    7676        // For non-JS bindings. Silently ignores the JavaScript exception if any.
  • trunk/WebCore/dom/NodeFilterCondition.h

    r39003 r47022  
    44 * Copyright (C) 2001 Peter Kelly (pmk@post.com)
    55 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
    6  * Copyright (C) 2004, 2008 Apple Inc. All rights reserved.
     6 * Copyright (C) 2004, 2008, 2009 Apple Inc. All rights reserved.
    77 *
    88 * This library is free software; you can redistribute it and/or
     
    2929#include <wtf/RefCounted.h>
    3030
     31namespace JSC {
     32    class MarkStack;
     33}
     34
    3135namespace WebCore {
    3236
     
    3741        virtual ~NodeFilterCondition() { }
    3842        virtual short acceptNode(ScriptState*, Node*) const = 0;
    39         virtual void mark() { }
     43        virtual void markAggregate(JSC::MarkStack&) { }
    4044    };
    4145
  • trunk/WebCore/dom/RegisteredEventListener.h

    r42645 r47022  
    33 * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de)
    44 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
    5  * Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
     5 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Apple Inc. All rights reserved.
    66 *
    77 * This library is free software; you can redistribute it and/or
     
    5656
    5757#if USE(JSC)
    58     inline void markEventListeners(const RegisteredEventListenerVector& listeners)
     58    inline void markEventListeners(JSC::MarkStack& markStack, const RegisteredEventListenerVector& listeners)
    5959    {
    6060        for (size_t i = 0; i < listeners.size(); ++i)
    61             listeners[i]->listener()->markJSFunction();
     61            listeners[i]->listener()->markJSFunction(markStack);
    6262    }
    6363
  • trunk/WebCore/page/DOMWindow.h

    r46874 r47022  
    372372        void releaseEvents();
    373373
    374         // These methods are used for GC marking. See JSDOMWindow::mark() in
     374        // These methods are used for GC marking. See JSDOMWindow::markChildren(MarkStack&) in
    375375        // JSDOMWindowCustom.cpp.
    376376        Screen* optionalScreen() const { return m_screen.get(); }
  • trunk/WebCore/workers/WorkerContext.h

    r46845 r47022  
    107107        virtual void forwardException(const String& errorMessage, int lineNumber, const String& sourceURL) = 0;
    108108
    109         // These methods are used for GC marking. See JSWorkerContext::mark() in
     109        // These methods are used for GC marking. See JSWorkerContext::markChildren(MarkStack&) in
    110110        // JSWorkerContextCustom.cpp.
    111111        WorkerNavigator* optionalNavigator() const { return m_navigator.get(); }
Note: See TracChangeset for help on using the changeset viewer.