コード例 #1
0
void JSEventListener::markJSFunction(MarkStack& markStack)
{
    if (m_jsFunction)
        markStack.append(m_jsFunction);
    if (m_globalObject)
        markStack.append(m_globalObject);
}
コード例 #2
0
void SmallStrings::markChildren(MarkStack& markStack)
{
    /*
       Our hypothesis is that small strings are very common. So, we cache them
       to avoid GC churn. However, in cases where this hypothesis turns out to
       be false -- including the degenerate case where all JavaScript execution
       has terminated -- we don't want to waste memory.

       To test our hypothesis, we check if any small string has been marked. If
       so, it's probably reasonable to mark the rest. If not, we clear the cache.
     */

    bool isAnyStringMarked = isMarked(m_emptyString);
    for (unsigned i = 0; i < numCharactersToStore && !isAnyStringMarked; ++i)
        isAnyStringMarked = isMarked(m_singleCharacterStrings[i]);
    
    if (!isAnyStringMarked) {
        clear();
        return;
    }
    
    if (m_emptyString)
        markStack.append(m_emptyString);
    for (unsigned i = 0; i < numCharactersToStore; ++i) {
        if (m_singleCharacterStrings[i])
            markStack.append(m_singleCharacterStrings[i]);
    }
}
コード例 #3
0
void ScopeChainNode::markChildren(MarkStack& markStack)
{
    if (next)
        markStack.append(&next);
    markStack.append(&object);
    markStack.append(&globalObject);
    markStack.append(&globalThis);
}
コード例 #4
0
void GetterSetter::markChildren(MarkStack& markStack)
{
    AJCell::markChildren(markStack);

    if (m_getter)
        markStack.append(m_getter);
    if (m_setter)
        markStack.append(m_setter);
}
コード例 #5
0
ファイル: SmallStrings.cpp プロジェクト: rseagraves/tijscore
void SmallStrings::markChildren(MarkStack& markStack)
{
    if (m_emptyString)
        markStack.append(m_emptyString);
    for (unsigned i = 0; i < numCharactersToStore; ++i) {
        if (m_singleCharacterStrings[i])
            markStack.append(m_singleCharacterStrings[i]);
    }
}
コード例 #6
0
void JSMessageChannel::markChildren(MarkStack& markStack)
{
    Base::markChildren(markStack);

    if (MessagePort* port = m_impl->port1()) {
        DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), port);
        if (wrapper)
            markStack.append(wrapper);
    }

    if (MessagePort* port = m_impl->port2()) {
        DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), port);
        if (wrapper)
            markStack.append(wrapper);
    }
}
コード例 #7
0
void DebuggerActivation::markChildren(MarkStack& markStack)
{
    AJObject::markChildren(markStack);

    if (m_activation)
        markStack.append(m_activation);
}
コード例 #8
0
void markDOMNodeWrapper(MarkStack& markStack, Document* document, Node* node)
{
    if (document) {
        JSWrapperCacheMap& wrapperCacheMap = document->wrapperCacheMap();
        for (JSWrapperCacheMap::iterator iter = wrapperCacheMap.begin(); iter != wrapperCacheMap.end(); ++iter) {
            if (DeprecatedPtr<JSNode>* wrapperSlot = iter->second->uncheckedGetSlot(node))
                markStack.append(wrapperSlot);
        }
        return;
    }

    for (JSGlobalDataWorldIterator worldIter(JSDOMWindow::commonJSGlobalData()); worldIter; ++worldIter) {
        if (DeprecatedPtr<DOMObject>* wrapperSlot = worldIter->m_wrappers.uncheckedGetSlot(node))
            markStack.append(wrapperSlot);
    }
}
コード例 #9
0
void Arguments::markChildren(MarkStack& markStack)
{
    JSObject::markChildren(markStack);

    if (d->registerArray)
        markStack.appendValues(reinterpret_cast<JSValue*>(d->registerArray.get()), d->numParameters);

    if (d->extraArguments) {
        unsigned numExtraArguments = d->numArguments - d->numParameters;
        markStack.appendValues(reinterpret_cast<JSValue*>(d->extraArguments), numExtraArguments);
    }

    markStack.append(d->callee);

    if (d->activation)
        markStack.append(d->activation);
}
コード例 #10
0
void Stringifier::markAggregate(MarkStack& markStack)
{
    for (Stringifier* stringifier = this; stringifier; stringifier = stringifier->m_nextStringifierToMark) {
        size_t size = m_holderStack.size();
        for (size_t i = 0; i < size; ++i)
            markStack.append(m_holderStack[i].object());
    }
}
コード例 #11
0
void Arguments::markChildren(MarkStack& markStack)
{
    JSObject::markChildren(markStack);

    if (d->registerArray)
        markStack.deprecatedAppendValues(d->registerArray.get(), d->numParameters);

    if (d->extraArguments) {
        unsigned numExtraArguments = d->numArguments - d->numParameters;
        markStack.deprecatedAppendValues(d->extraArguments, numExtraArguments);
    }

    markStack.append(&d->callee);

    if (d->activation)
        markStack.append(&d->activation);
}
コード例 #12
0
void JSSVGElementInstance::markChildren(MarkStack& markStack)
{
    Base::markChildren(markStack);

    // Mark the wrapper for our corresponding element, so it can mark its event handlers.
    JSNode* correspondingWrapper = getCachedDOMNodeWrapper(impl()->correspondingElement()->document(), impl()->correspondingElement());
    if (correspondingWrapper)
        markStack.append(correspondingWrapper);
}
コード例 #13
0
void markDOMObjectWrapper(MarkStack& markStack, JSGlobalData& globalData, void* object)
{
    // FIXME: This could be changed to only mark wrappers that are "observable"
    // as markDOMNodesForDocument does, allowing us to collect more wrappers,
    // but doing this correctly would be challenging.
    if (!object)
        return;

    for (JSGlobalDataWorldIterator worldIter(&globalData); worldIter; ++worldIter) {
        if (DeprecatedPtr<DOMObject>* wrapperSlot = worldIter->m_wrappers.uncheckedGetSlot(object))
            markStack.append(wrapperSlot);
    }
}
コード例 #14
0
void markDOMNodesForDocument(MarkStack& markStack, Document* document)
{
    JSWrapperCacheMap& wrapperCacheMap = document->wrapperCacheMap();
    for (JSWrapperCacheMap::iterator wrappersIter = wrapperCacheMap.begin(); wrappersIter != wrapperCacheMap.end(); ++wrappersIter) {
        DOMWrapperWorld* world = wrappersIter->first;
        JSWrapperCache* nodeDict = wrappersIter->second;

        JSWrapperCache::iterator nodeEnd = nodeDict->uncheckedEnd();
        for (JSWrapperCache::iterator nodeIt = nodeDict->uncheckedBegin(); nodeIt != nodeEnd; ++nodeIt) {
            DeprecatedPtr<JSNode>& jsNode = nodeIt->second;
            if (isObservableThroughDOM(jsNode.get(), world))
                markStack.append(&jsNode);
        }
    }
}
コード例 #15
0
void JSActivation::markChildren(MarkStack& markStack)
{
    Base::markChildren(markStack);
    markStack.append(&m_functionExecutable);

    // No need to mark our registers if they're still in the RegisterFile.
    WriteBarrier<Unknown>* registerArray = m_registerArray.get();
    if (!registerArray)
        return;

    size_t numParametersMinusThis = m_functionExecutable->parameterCount();

    size_t count = numParametersMinusThis;
    markStack.appendValues(registerArray, count);

    size_t numVars = m_functionExecutable->capturedVariableCount();

    // Skip the call frame, which sits between the parameters and vars.
    markStack.appendValues(registerArray + count + RegisterFile::CallFrameHeaderSize, numVars, MayContainNullValues);
}
コード例 #16
0
static inline void markIfNeeded(MarkStack& markStack, JSValue v)
{
    if (v)
        markStack.append(v);
}
コード例 #17
0
void JSDOMWindowShell::markChildren(MarkStack& markStack)
{
    Base::markChildren(markStack);
    if (m_window)
        markStack.append(&m_window);
}
コード例 #18
0
void JSNodeFilterCondition::markAggregate(MarkStack& markStack)
{
    markStack.append(m_filter);
}
コード例 #19
0
void JSStaticScopeObject::markChildren(MarkStack& markStack)
{
    JSVariableObject::markChildren(markStack);
    markStack.append(d()->registerStore.jsValue());
}
コード例 #20
0
ファイル: JSNotAnObject.cpp プロジェクト: rseagraves/tijscore
// Marking
void JSNotAnObject::markChildren(MarkStack& markStack)
{
    TiObject::markChildren(markStack);
    markStack.append(m_exception);
}
コード例 #21
0
void GlobalEvalFunction::markChildren(MarkStack& markStack)
{
    PrototypeFunction::markChildren(markStack);
    markStack.append(m_cachedGlobalObject);
}
コード例 #22
0
void NativeErrorConstructor::markChildren(MarkStack& markStack)
{
    InternalFunction::markChildren(markStack);
    if (m_errorStructure)
        markStack.append(&m_errorStructure);
}