Changeset 48067 in webkit for trunk/JavaScriptCore


Ignore:
Timestamp:
Sep 4, 2009, 11:53:02 AM (16 years ago)
Author:
Darin Adler
Message:

JavaScriptCore: DateInstance object collected on ARM JIT (JSValue: WTF_USE_JSVALUE32)
https://bugs.webkit.org/show_bug.cgi?id=28909

Patch by Darin Adler <Darin Adler> on 2009-09-04
Reviewed by Geoff Garen.

Part one.

Make some improvements to garbage collection code:

1) Fix the two classes that had the default mark bit set but

should not.

2) Remove checks of the mark bit outside the MarkStack::append

function; they are redundant.

3) Make more callers use the checked asCell and asObject

casting functions rather than unchecked casts.

4) Removed some GC-related functions because these operations are

no longer things that code other than the core GC code needs
to do directly. Fixed callers that were calling them.

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::markAggregate): Removed unneeded check of the mark
bit before calling MarkStack::append.

  • interpreter/Register.h: Removed unneeded marked and markChildren

functions.

  • jit/JITStubs.cpp:

(op_eq): Removed unneeded assertions, instead using checked casting
functions such as asObject.

  • runtime/ArgList.h: Added now-needed forward declaration of MarkStack.
  • runtime/GetterSetter.cpp:

(JSC::GetterSetter::markChildren): Remmoved unneeded check of the mark bit.

  • runtime/GlobalEvalFunction.h:

(JSC::GlobalEvalFunction::createStructure): Added. Fixes a bug where the
HasDefaultMark bit was set.

  • runtime/JSCell.cpp:

(JSC::JSCell::getObject): Use asObject to avoid a direct static_cast.

  • runtime/JSObject.h:

(JSC::asObject): Added an overload for JSCell* and changed the JSValue
version to call it.
(JSC::JSValue::get): Use asObject to avoid a direct static_cast.

  • runtime/JSValue.h: Moved some stray includes that were outside the

header guard inside it. Not sure how that happened! Removed the
GC-related member functions markChildren, hasChildren, marked, and
markDirect.

  • runtime/JSWrapperObject.h: Made markChildren private.

(JSC::JSWrapperObject::createStructure): Added. Fixes a bug where the
HasDefaultMark bit was set. Later we may want to optimize this for
wrapper types that never have cells in their internal values, but there
is no measured performance regression in SunSpider or V8 doing this
all the time.

  • runtime/MarkStack.cpp: Tweaked formatting.

JavaScriptGlue: * JSValueWrapper.cpp:
(JSValueWrapper::JSObjectMark): Removed a check of the mark
bit. It's OK to do more work in this case, and there is no
longer a public function to access the mark bit.

Reviewed by Geoff Garen.

Location:
trunk/JavaScriptCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r48066 r48067  
     12009-09-04  Darin Adler  <[email protected]>
     2
     3        Reviewed by Geoff Garen.
     4
     5        DateInstance object collected on ARM JIT (JSValue: WTF_USE_JSVALUE32)
     6        https://bugs.webkit.org/show_bug.cgi?id=28909
     7
     8        Part one.
     9
     10        Make some improvements to garbage collection code:
     11
     12            1) Fix the two classes that had the default mark bit set but
     13               should not.
     14            2) Remove checks of the mark bit outside the MarkStack::append
     15               function; they are redundant.
     16            3) Make more callers use the checked asCell and asObject
     17               casting functions rather than unchecked casts.
     18            4) Removed some GC-related functions because these operations are
     19               no longer things that code other than the core GC code needs
     20               to do directly. Fixed callers that were calling them.
     21
     22        * bytecode/CodeBlock.cpp:
     23        (JSC::CodeBlock::markAggregate): Removed unneeded check of the mark
     24        bit before calling MarkStack::append.
     25
     26        * interpreter/Register.h: Removed unneeded marked and markChildren
     27        functions.
     28
     29        * jit/JITStubs.cpp:
     30        (op_eq): Removed unneeded assertions, instead using checked casting
     31        functions such as asObject.
     32
     33        * runtime/ArgList.h: Added now-needed forward declaration of MarkStack.
     34
     35        * runtime/GetterSetter.cpp:
     36        (JSC::GetterSetter::markChildren): Remmoved unneeded check of the mark bit.
     37
     38        * runtime/GlobalEvalFunction.h:
     39        (JSC::GlobalEvalFunction::createStructure): Added. Fixes a bug where the
     40        HasDefaultMark bit was set.
     41
     42        * runtime/JSCell.cpp:
     43        (JSC::JSCell::getObject): Use asObject to avoid a direct static_cast.
     44
     45        * runtime/JSObject.h:
     46        (JSC::asObject): Added an overload for JSCell* and changed the JSValue
     47        version to call it.
     48        (JSC::JSValue::get): Use asObject to avoid a direct static_cast.
     49
     50        * runtime/JSValue.h: Moved some stray includes that were outside the
     51        header guard inside it. Not sure how that happened! Removed the
     52        GC-related member functions markChildren, hasChildren, marked, and
     53        markDirect.
     54
     55        * runtime/JSWrapperObject.h: Made markChildren private.
     56        (JSC::JSWrapperObject::createStructure): Added. Fixes a bug where the
     57        HasDefaultMark bit was set. Later we may want to optimize this for
     58        wrapper types that never have cells in their internal values, but there
     59        is no measured performance regression in SunSpider or V8 doing this
     60        all the time.
     61
     62        * runtime/MarkStack.cpp: Tweaked formatting.
     63
    1642009-09-04  Kevin Ollivier  <[email protected]>
    265
  • trunk/JavaScriptCore/bytecode/CodeBlock.cpp

    r47641 r48067  
    14101410void CodeBlock::markAggregate(MarkStack& markStack)
    14111411{
    1412     for (size_t i = 0; i < m_constantRegisters.size(); ++i) {
    1413         if (!m_constantRegisters[i].marked())
    1414             markStack.append(m_constantRegisters[i].jsValue());
    1415     }
    1416 
     1412    for (size_t i = 0; i < m_constantRegisters.size(); ++i)
     1413        markStack.append(m_constantRegisters[i].jsValue());
    14171414    for (size_t i = 0; i < m_functionExprs.size(); ++i)
    14181415        m_functionExprs[i]->markAggregate(markStack);
  • trunk/JavaScriptCore/interpreter/Register.h

    r47022 r48067  
    5555
    5656        JSValue jsValue() const;
    57 
    58         bool marked() const;
    59         void markChildren(MarkStack&);
    6057       
    6158        Register(JSActivation*);
     
    115112        return JSValue::decode(u.value);
    116113    }
    117    
    118     ALWAYS_INLINE bool Register::marked() const
    119     {
    120         return jsValue().marked();
    121     }
    122114
    123115    // Interpreter functions
  • trunk/JavaScriptCore/jit/JITStubs.cpp

    r47738 r48067  
    23592359        return src2.isCell() && asCell(src2)->structure()->typeInfo().masqueradesAsUndefined();
    23602360
    2361     ASSERT(src1.isCell());
    2362 
    23632361    JSCell* cell1 = asCell(src1);
    23642362
     
    23762374            return static_cast<JSString*>(cell1)->value().toDouble() == 0.0;
    23772375
    2378         ASSERT(src2.isCell());
    23792376        JSCell* cell2 = asCell(src2);
    23802377        if (cell2->isString())
    23812378            return static_cast<JSString*>(cell1)->value() == static_cast<JSString*>(cell2)->value();
    23822379
    2383         ASSERT(cell2->isObject());
    2384         src2 = static_cast<JSObject*>(cell2)->toPrimitive(stackFrame.callFrame);
     2380        src2 = asObject(cell2)->toPrimitive(stackFrame.callFrame);
    23852381        CHECK_FOR_EXCEPTION();
    23862382        goto start;
    23872383    }
    23882384
    2389     ASSERT(cell1->isObject());
    23902385    if (src2.isObject())
    2391         return static_cast<JSObject*>(cell1) == asObject(src2);
    2392     src1 = static_cast<JSObject*>(cell1)->toPrimitive(stackFrame.callFrame);
     2386        return asObject(cell1) == asObject(src2);
     2387    src1 = asObject(cell1)->toPrimitive(stackFrame.callFrame);
    23932388    CHECK_FOR_EXCEPTION();
    23942389    goto start;
  • trunk/JavaScriptCore/runtime/ArgList.h

    r47022 r48067  
    11/*
    22 *  Copyright (C) 1999-2001 Harri Porten ([email protected])
    3  *  Copyright (C) 2003, 2007, 2008, 2009 Apple Computer, Inc.
     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
     
    2424
    2525#include "Register.h"
    26 
    2726#include <wtf/HashSet.h>
    2827#include <wtf/Noncopyable.h>
     
    3029
    3130namespace JSC {
    32    
     31
     32    class MarkStack;
     33
    3334    class MarkedArgumentBuffer : public Noncopyable {
    3435    private:
  • trunk/JavaScriptCore/runtime/GetterSetter.cpp

    r47799 r48067  
    3333    JSCell::markChildren(markStack);
    3434
    35     if (m_getter && !m_getter->marked())
     35    if (m_getter)
    3636        markStack.append(m_getter);
    37     if (m_setter && !m_setter->marked())
     37    if (m_setter)
    3838        markStack.append(m_setter);
    3939}
  • trunk/JavaScriptCore/runtime/GlobalEvalFunction.h

    r47022 r48067  
    3636        JSGlobalObject* cachedGlobalObject() const { return m_cachedGlobalObject; }
    3737
     38        static PassRefPtr<Structure> createStructure(JSValue prototype)
     39        {
     40            return Structure::create(prototype, TypeInfo(ObjectType, ImplementsHasInstance | HasStandardGetOwnPropertySlot));
     41        }
     42
    3843    private:
    3944        virtual void markChildren(MarkStack&);
  • trunk/JavaScriptCore/runtime/JSCell.cpp

    r47799 r48067  
    106106JSObject* JSCell::getObject()
    107107{
    108     return isObject() ? static_cast<JSObject*>(this) : 0;
     108    return isObject() ? asObject(this) : 0;
    109109}
    110110
  • trunk/JavaScriptCore/runtime/JSObject.h

    r47780 r48067  
    254254JSObject* constructEmptyObject(ExecState*);
    255255
     256inline JSObject* asObject(JSCell* cell)
     257{
     258    ASSERT(cell->isObject());
     259    return static_cast<JSObject*>(cell);
     260}
     261
    256262inline JSObject* asObject(JSValue value)
    257263{
    258     ASSERT(asCell(value)->isObject());
    259     return static_cast<JSObject*>(asCell(value));
     264    return asObject(value.asCell());
    260265}
    261266
     
    583588        if (cell->fastGetOwnPropertySlot(exec, propertyName, slot))
    584589            return slot.getValue(exec, propertyName);
    585         ASSERT(cell->isObject());
    586         JSValue prototype = static_cast<JSObject*>(cell)->prototype();
     590        JSValue prototype = asObject(cell)->prototype();
    587591        if (!prototype.isObject())
    588592            return jsUndefined();
     
    609613        if (cell->getOwnPropertySlot(exec, propertyName, slot))
    610614            return slot.getValue(exec, propertyName);
    611         ASSERT(cell->isObject());
    612         JSValue prototype = static_cast<JSObject*>(cell)->prototype();
     615        JSValue prototype = asObject(cell)->prototype();
    613616        if (!prototype.isObject())
    614617            return jsUndefined();
     
    658661{
    659662    JSCell::markChildren(markStack);
     663
    660664    m_structure->markAggregate(markStack);
    661665   
  • trunk/JavaScriptCore/runtime/JSWrapperObject.h

    r47022 r48067  
    2626
    2727namespace JSC {
    28    
     28
    2929    // This class is used as a base for classes such as String,
    3030    // Number, Boolean and Date which are wrappers for primitive types.
     
    3636        JSValue internalValue() const { return m_internalValue; }
    3737        void setInternalValue(JSValue);
    38        
     38
     39        static PassRefPtr<Structure> createStructure(JSValue prototype)
     40        {
     41            return Structure::create(prototype, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot));
     42        }
     43
     44    private:
    3945        virtual void markChildren(MarkStack&);
    4046       
    41     private:
    4247        JSValue m_internalValue;
    4348    };
    44    
     49
    4550    inline JSWrapperObject::JSWrapperObject(PassRefPtr<Structure> structure)
    4651        : JSObject(structure)
    4752    {
    4853    }
    49    
     54
    5055    inline void JSWrapperObject::setInternalValue(JSValue value)
    5156    {
  • trunk/JavaScriptCore/runtime/MarkStack.cpp

    r47022 r48067  
    2727#include "MarkStack.h"
    2828
    29 namespace JSC
    30 {
     29namespace JSC {
    3130
    3231size_t MarkStack::s_pageSize = 0;
Note: See TracChangeset for help on using the changeset viewer.