[webkit-dev] New marking model for GC collected objects

Oliver Hunt oliver at apple.com
Wed Sep 2 12:26:32 PDT 2009


In WTF_USE_JSVALUE32 DateInstance needs to override createStrucutre to  
remove the HasDefaultMark bit

--Oliver

On Sep 2, 2009, at 6:54 AM, Zoltan Herczeg wrote:

> Hi Geoff,
>
> That function is not called.
>
> I have opened a bug report for this issue (a simple failed example  
> included)
> https://bugs.webkit.org/show_bug.cgi?id=28909
>
> Zoltan
>
>> Hi Zoltan.
>>
>> JSWrapperObject::markChildren is responsible for marking the
>> internalValue of a DateInstance. Is that function not being called?
>>
>> Geoff
>>
>> On Sep 1, 2009, at 6:16 AM, Zoltan Herczeg wrote:
>>
>>> Hi Oliver,
>>>
>>> it seems on ARM using WTF_USE_JSVALUE32, the internal value of a  
>>> date
>>> object is sometimes freed by the garbage collector.
>>>
>>> More specifically:
>>> The double (millisecond) representation of a date object (returned
>>> by a
>>> "new Date" expression) is stored in JSWrapperObject:
>>> m_internalValue. This
>>> m_internalValue points to a JSNumberCell, which stores the double
>>> value.
>>> Although this JSNumberCell is referenced by m_internalValue, the GC
>>> still
>>> collects its memory space.
>>>
>>> How can I fix this bug with the new mark() model?
>>>
>>> Zoltan
>>>
>>>> Last night I landed a patch that replaces the old recursive marking
>>>> functions with a new iterative model that uses an explicit mark
>>>> stack.  This means that any custom mark methods that you need to
>>>> write
>>>> now need to be slightly different from what they were previously,
>>>> i'll
>>>> attempt to summarise here.
>>>>
>>>> The most obvious change is that an object is no longer responsible
>>>> for
>>>> marking itself instead the recursive mark methods have been  
>>>> replaced
>>>> by a new virtual markChildren(MarkStack&) which is responsible for
>>>> appending an objects children to the stack.
>>>>
>>>> The MarkStack is a very simple class, and the only method you  
>>>> really
>>>> need to know about is MarkStack::append which adds a new object to
>>>> the
>>>> stack.
>>>>
>>>> The changes to how your custom marking functions are implemented  
>>>> are
>>>> trivial, but here's a simple example
>>>> void MyAwesomeObject::mark()
>>>> {
>>>>    Base::mark();
>>>>    if (!m_child.marked())
>>>>        m_child.mark();
>>>> }
>>>>
>>>> Becomes
>>>> void MyAwesomeObject::markChildren(MarkStack& markStack)
>>>> {
>>>>    Base::markChildren(markStack);
>>>>    markStack.append(m_child);
>>>> }
>>>>
>>>> And that's it, you're done.
>>>>
>>>> It's important to note that you will never be in a position where  
>>>> you
>>>> call markChildren yourself, if you are that is an error.
>>>>
>>>> --Oliver
>>>>
>>>> _______________________________________________
>>>> webkit-dev mailing list
>>>> webkit-dev at lists.webkit.org
>>>> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev
>>>>
>>>
>>> _______________________________________________
>>> webkit-dev mailing list
>>> webkit-dev at lists.webkit.org
>>> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev
>>
>>
>
> _______________________________________________
> webkit-dev mailing list
> webkit-dev at lists.webkit.org
> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev



More information about the webkit-dev mailing list