Changeset 77151 in webkit for trunk/Source/JavaScriptCore/runtime


Ignore:
Timestamp:
Jan 31, 2011, 12:07:21 PM (14 years ago)
Author:
[email protected]
Message:

2011-01-31 Oliver Hunt <[email protected]>

Convert markstack to a slot visitor API
https://bugs.webkit.org/show_bug.cgi?id=53219

rolling r77098, r77099, r77100, r77109, and
r77111 back in, along with a few more Qt fix attempts.

Location:
trunk/Source/JavaScriptCore/runtime
Files:
1 added
71 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/ArgList.cpp

    r77113 r77151  
    4343    for (ListSet::iterator it = markSet.begin(); it != end; ++it) {
    4444        MarkedArgumentBuffer* list = *it;
    45         markStack.appendValues(reinterpret_cast<JSValue*>(list->m_buffer), list->m_size);
     45        markStack.deprecatedAppendValues(list->m_buffer, list->m_size);
    4646    }
    4747}
  • trunk/Source/JavaScriptCore/runtime/Arguments.cpp

    r77113 r77151  
    4949
    5050    if (d->registerArray)
    51         markStack.appendValues(reinterpret_cast<JSValue*>(d->registerArray.get()), d->numParameters);
     51        markStack.deprecatedAppendValues(d->registerArray.get(), d->numParameters);
    5252
    5353    if (d->extraArguments) {
    5454        unsigned numExtraArguments = d->numArguments - d->numParameters;
    55         markStack.appendValues(reinterpret_cast<JSValue*>(d->extraArguments), numExtraArguments);
    56     }
    57 
    58     markStack.append(d->callee);
     55        markStack.deprecatedAppendValues(d->extraArguments, numExtraArguments);
     56    }
     57
     58    markStack.append(&d->callee);
    5959
    6060    if (d->activation)
    61         markStack.append(d->activation);
     61        markStack.append(&d->activation);
    6262}
    6363
     
    198198    if (propertyName == exec->propertyNames().callee && LIKELY(!d->overrodeCallee)) {
    199199        if (!d->isStrictMode) {
    200             slot.setValue(d->callee);
     200            slot.setValue(d->callee.get());
    201201            return true;
    202202        }
     
    229229    if (propertyName == exec->propertyNames().callee && LIKELY(!d->overrodeCallee)) {
    230230        if (!d->isStrictMode) {
    231             descriptor.setDescriptor(d->callee, DontEnum);
     231            descriptor.setDescriptor(d->callee.get(), DontEnum);
    232232            return true;
    233233        }
     
    281281    if (propertyName == exec->propertyNames().length && !d->overrodeLength) {
    282282        d->overrodeLength = true;
    283         putDirect(propertyName, value, DontEnum);
     283        putDirect(exec->globalData(), propertyName, value, DontEnum);
    284284        return;
    285285    }
     
    288288        if (!d->isStrictMode) {
    289289            d->overrodeCallee = true;
    290             putDirect(propertyName, value, DontEnum);
     290            putDirect(exec->globalData(), propertyName, value, DontEnum);
    291291            return;
    292292        }
  • trunk/Source/JavaScriptCore/runtime/Arguments.h

    r77113 r77151  
    3838    public:
    3939        ArgumentsData() { }
    40         JSActivation* activation;
     40        WriteBarrier<JSActivation> activation;
    4141
    4242        unsigned numParameters;
     
    5151        Register extraArgumentsFixedBuffer[4];
    5252
    53         JSFunction* callee;
     53        WriteBarrier<JSFunction> callee;
    5454        bool overrodeLength : 1;
    5555        bool overrodeCallee : 1;
     
    8787        void copyRegisters();
    8888        bool isTornOff() const { return d->registerArray; }
    89         void setActivation(JSActivation* activation)
     89        void setActivation(JSGlobalData& globalData, JSActivation* activation)
    9090        {
    91             d->activation = activation;
     91            d->activation.set(globalData, this, activation);
    9292            d->registers = &activation->registerAt(0);
    9393        }
     
    159159        d->numArguments = numArguments;
    160160
    161         d->activation = 0;
    162161        d->registers = callFrame->registers();
    163162
     
    177176        d->extraArguments = extraArguments;
    178177
    179         d->callee = callee;
     178        d->callee.set(callFrame->globalData(), this, callee);
    180179        d->overrodeLength = false;
    181180        d->overrodeCallee = false;
     
    196195        d->numParameters = 0;
    197196        d->numArguments = numArguments;
    198         d->activation = 0;
    199197
    200198        Register* extraArguments;
     
    210208        d->extraArguments = extraArguments;
    211209
    212         d->callee = asFunction(callFrame->callee());
     210        d->callee.set(callFrame->globalData(), this, asFunction(callFrame->callee()));
    213211        d->overrodeLength = false;
    214212        d->overrodeCallee = false;
  • trunk/Source/JavaScriptCore/runtime/ArrayConstructor.cpp

    r77113 r77151  
    4343{
    4444    // ECMA 15.4.3.1 Array.prototype
    45     putDirectWithoutTransition(exec->propertyNames().prototype, arrayPrototype, DontEnum | DontDelete | ReadOnly);
     45    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, arrayPrototype, DontEnum | DontDelete | ReadOnly);
    4646
    4747    // no. of arguments for constructor
    48     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(1), ReadOnly | DontEnum | DontDelete);
     48    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(1), ReadOnly | DontEnum | DontDelete);
    4949
    5050    // ES5
     
    6363
    6464    // otherwise the array is constructed with the arguments in it
    65     return new (exec) JSArray(exec->lexicalGlobalObject()->arrayStructure(), args);
     65    return new (exec) JSArray(exec->globalData(), exec->lexicalGlobalObject()->arrayStructure(), args);
    6666}
    6767
  • trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp

    r77113 r77151  
    546546    JSArray* resObj = new (exec) JSArray(exec->lexicalGlobalObject()->arrayStructure(), deleteCount, CreateCompact);
    547547    JSValue result = resObj;
    548 
     548    JSGlobalData& globalData = exec->globalData();
    549549    for (unsigned k = 0; k < deleteCount; k++)
    550         resObj->uncheckedSetIndex(k, getProperty(exec, thisObj, k + begin));
     550        resObj->uncheckedSetIndex(globalData, k, getProperty(exec, thisObj, k + begin));
    551551
    552552    resObj->setLength(deleteCount);
  • trunk/Source/JavaScriptCore/runtime/BatchedTransitionOptimizer.h

    r77113 r77151  
    3535        WTF_MAKE_NONCOPYABLE(BatchedTransitionOptimizer);
    3636    public:
    37         BatchedTransitionOptimizer(JSObject* object)
    38             : m_object(object)
     37        BatchedTransitionOptimizer(JSGlobalData& globalData, JSObject* object)
     38            : m_globalData(&globalData)
     39            , m_object(object)
    3940        {
    4041            if (!m_object->structure()->isDictionary())
     
    4445        ~BatchedTransitionOptimizer()
    4546        {
    46             m_object->flattenDictionaryObject();
     47            m_object->flattenDictionaryObject(*m_globalData);
    4748        }
    4849
    4950    private:
     51        JSGlobalData* m_globalData;
    5052        JSObject* m_object;
    5153    };
  • trunk/Source/JavaScriptCore/runtime/BooleanConstructor.cpp

    r77113 r77151  
    3232    : InternalFunction(&exec->globalData(), globalObject, structure, Identifier(exec, booleanPrototype->classInfo()->className))
    3333{
    34     putDirectWithoutTransition(exec->propertyNames().prototype, booleanPrototype, DontEnum | DontDelete | ReadOnly);
     34    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, booleanPrototype, DontEnum | DontDelete | ReadOnly);
    3535
    3636    // no. of arguments for constructor
    37     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(1), ReadOnly | DontDelete | DontEnum);
     37    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(1), ReadOnly | DontDelete | DontEnum);
    3838}
    3939
     
    4242{
    4343    BooleanObject* obj = new (exec) BooleanObject(exec->lexicalGlobalObject()->booleanObjectStructure());
    44     obj->setInternalValue(jsBoolean(args.at(0).toBoolean(exec)));
     44    obj->setInternalValue(exec->globalData(), jsBoolean(args.at(0).toBoolean(exec)));
    4545    return obj;
    4646}
     
    7373{
    7474    BooleanObject* obj = new (exec) BooleanObject(exec->lexicalGlobalObject()->booleanObjectStructure());
    75     obj->setInternalValue(immediateBooleanValue);
     75    obj->setInternalValue(exec->globalData(), immediateBooleanValue);
    7676    return obj;
    7777}
  • trunk/Source/JavaScriptCore/runtime/BooleanPrototype.cpp

    r77113 r77151  
    4242    : BooleanObject(structure)
    4343{
    44     setInternalValue(jsBoolean(false));
     44    setInternalValue(exec->globalData(), jsBoolean(false));
    4545
    4646    putDirectFunctionWithoutTransition(exec, new (exec) NativeFunctionWrapper(exec, globalObject, prototypeFunctionStructure, 0, exec->propertyNames().toString, booleanProtoFuncToString), DontEnum);
  • trunk/Source/JavaScriptCore/runtime/ConservativeSet.cpp

    r77113 r77151  
    3737{
    3838    size_t newCapacity = m_capacity == inlineCapacity ? nonInlineCapacity : m_capacity * 2;
    39     JSCell** newSet = static_cast<JSCell**>(OSAllocator::reserveAndCommit(newCapacity * sizeof(JSCell*)));
     39    DeprecatedPtr<JSCell>* newSet = static_cast<DeprecatedPtr<JSCell>*>(OSAllocator::reserveAndCommit(newCapacity * sizeof(JSCell*)));
    4040    memcpy(newSet, m_set, m_size * sizeof(JSCell*));
    4141    if (m_set != m_inlineSet)
  • trunk/Source/JavaScriptCore/runtime/ConservativeSet.h

    r77113 r77151  
    5050
    5151    Heap* m_heap;
    52     JSCell** m_set;
     52    DeprecatedPtr<JSCell>* m_set;
    5353    size_t m_size;
    5454    size_t m_capacity;
    55     JSCell* m_inlineSet[inlineCapacity];
     55    DeprecatedPtr<JSCell> m_inlineSet[inlineCapacity];
    5656};
    5757
     
    6767{
    6868    if (m_set != m_inlineSet)
    69         OSAllocator::decommitAndRelease(m_set, m_capacity * sizeof(JSCell*));
     69        OSAllocator::decommitAndRelease(m_set, m_capacity * sizeof(DeprecatedPtr<JSCell>*));
    7070}
    7171
     
    7373{
    7474    for (size_t i = 0; i < m_size; ++i)
    75         markStack.append(m_set[i]);
     75        markStack.append(&m_set[i]);
    7676}
    7777
  • trunk/Source/JavaScriptCore/runtime/DateConstructor.cpp

    r77113 r77151  
    6262    : InternalFunction(&exec->globalData(), globalObject, structure, Identifier(exec, datePrototype->classInfo()->className))
    6363{
    64       putDirectWithoutTransition(exec->propertyNames().prototype, datePrototype, DontEnum|DontDelete|ReadOnly);
     64      putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, datePrototype, DontEnum | DontDelete | ReadOnly);
    6565
    6666      putDirectFunctionWithoutTransition(exec, new (exec) NativeFunctionWrapper(exec, globalObject, prototypeFunctionStructure, 1, exec->propertyNames().parse, dateParse), DontEnum);
     
    6868      putDirectFunctionWithoutTransition(exec, new (exec) NativeFunctionWrapper(exec, globalObject, prototypeFunctionStructure, 0, exec->propertyNames().now, dateNow), DontEnum);
    6969
    70       putDirectWithoutTransition(exec->propertyNames().length, jsNumber(7), ReadOnly | DontEnum | DontDelete);
     70      putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(7), ReadOnly | DontEnum | DontDelete);
    7171}
    7272
  • trunk/Source/JavaScriptCore/runtime/DateInstance.cpp

    r77113 r77151  
    3535const ClassInfo DateInstance::info = {"Date", 0, 0, 0};
    3636
    37 DateInstance::DateInstance(ExecState*, NonNullPassRefPtr<Structure> structure)
     37DateInstance::DateInstance(ExecState* exec, NonNullPassRefPtr<Structure> structure)
    3838    : JSWrapperObject(structure)
    3939{
    40     setInternalValue(jsNaN());
     40    setInternalValue(exec->globalData(), jsNaN());
    4141}
    4242
    43 DateInstance::DateInstance(ExecState*, NonNullPassRefPtr<Structure> structure, double time)
     43DateInstance::DateInstance(ExecState* exec, NonNullPassRefPtr<Structure> structure, double time)
    4444    : JSWrapperObject(structure)
    4545{
    46     setInternalValue(jsNumber(timeClip(time)));
     46    setInternalValue(exec->globalData(), jsNumber(timeClip(time)));
    4747}
    4848
     
    5050    : JSWrapperObject(exec->lexicalGlobalObject()->dateStructure())
    5151{
    52     setInternalValue(jsNumber(timeClip(time)));
     52    setInternalValue(exec->globalData(), jsNumber(timeClip(time)));
    5353}
    5454
  • trunk/Source/JavaScriptCore/runtime/DatePrototype.cpp

    r77113 r77151  
    846846    double milli = timeClip(exec->argument(0).toNumber(exec));
    847847    JSValue result = jsNumber(milli);
    848     thisDateObj->setInternalValue(result);
     848    thisDateObj->setInternalValue(exec->globalData(), result);
    849849    return JSValue::encode(result);
    850850}
     
    861861    if (!exec->argumentCount() || isnan(milli)) {
    862862        JSValue result = jsNaN();
    863         thisDateObj->setInternalValue(result);
     863        thisDateObj->setInternalValue(exec->globalData(), result);
    864864        return JSValue::encode(result);
    865865    }
     
    878878    if (!fillStructuresUsingTimeArgs(exec, numArgsToUse, &ms, &gregorianDateTime)) {
    879879        JSValue result = jsNaN();
    880         thisDateObj->setInternalValue(result);
     880        thisDateObj->setInternalValue(exec->globalData(), result);
    881881        return JSValue::encode(result);
    882882    }
    883883   
    884884    JSValue result = jsNumber(gregorianDateTimeToMS(exec, gregorianDateTime, ms, inputIsUTC));
    885     thisDateObj->setInternalValue(result);
     885    thisDateObj->setInternalValue(exec->globalData(), result);
    886886    return JSValue::encode(result);
    887887}
     
    896896    if (!exec->argumentCount()) {
    897897        JSValue result = jsNaN();
    898         thisDateObj->setInternalValue(result);
     898        thisDateObj->setInternalValue(exec->globalData(), result);
    899899        return JSValue::encode(result);
    900900    }     
     
    918918    if (!fillStructuresUsingDateArgs(exec, numArgsToUse, &ms, &gregorianDateTime)) {
    919919        JSValue result = jsNaN();
    920         thisDateObj->setInternalValue(result);
     920        thisDateObj->setInternalValue(exec->globalData(), result);
    921921        return JSValue::encode(result);
    922922    }
    923923           
    924924    JSValue result = jsNumber(gregorianDateTimeToMS(exec, gregorianDateTime, ms, inputIsUTC));
    925     thisDateObj->setInternalValue(result);
     925    thisDateObj->setInternalValue(exec->globalData(), result);
    926926    return JSValue::encode(result);
    927927}
     
    10201020    if (!exec->argumentCount()) {
    10211021        JSValue result = jsNaN();
    1022         thisDateObj->setInternalValue(result);
     1022        thisDateObj->setInternalValue(exec->globalData(), result);
    10231023        return JSValue::encode(result);
    10241024    }
     
    10421042    if (!isfinite(year)) {
    10431043        JSValue result = jsNaN();
    1044         thisDateObj->setInternalValue(result);
     1044        thisDateObj->setInternalValue(exec->globalData(), result);
    10451045        return JSValue::encode(result);
    10461046    }
     
    10481048    gregorianDateTime.year = toInt32((year > 99 || year < 0) ? year - 1900 : year);
    10491049    JSValue result = jsNumber(gregorianDateTimeToMS(exec, gregorianDateTime, ms, false));
    1050     thisDateObj->setInternalValue(result);
     1050    thisDateObj->setInternalValue(exec->globalData(), result);
    10511051    return JSValue::encode(result);
    10521052}
  • trunk/Source/JavaScriptCore/runtime/ErrorConstructor.cpp

    r77113 r77151  
    3434{
    3535    // ECMA 15.11.3.1 Error.prototype
    36     putDirectWithoutTransition(exec->propertyNames().prototype, errorPrototype, DontEnum | DontDelete | ReadOnly);
    37     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(1), DontDelete | ReadOnly | DontEnum);
     36    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, errorPrototype, DontEnum | DontDelete | ReadOnly);
     37    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(1), DontDelete | ReadOnly | DontEnum);
    3838}
    3939
  • trunk/Source/JavaScriptCore/runtime/ErrorInstance.cpp

    r77113 r77151  
    3030    , m_appendSourceToMessage(false)
    3131{
    32     putDirect(globalData->propertyNames->message, jsString(globalData, ""));
     32    putDirect(*globalData, globalData->propertyNames->message, jsString(globalData, ""));
    3333}
    3434
     
    3737    , m_appendSourceToMessage(false)
    3838{
    39     putDirect(globalData->propertyNames->message, jsString(globalData, message));
     39    putDirect(*globalData, globalData->propertyNames->message, jsString(globalData, message));
    4040}
    4141
  • trunk/Source/JavaScriptCore/runtime/ErrorPrototype.cpp

    r77113 r77151  
    4242    // The constructor will be added later in ErrorConstructor's constructor
    4343
    44     putDirectWithoutTransition(exec->propertyNames().name, jsNontrivialString(exec, "Error"), DontEnum);
     44    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().name, jsNontrivialString(exec, "Error"), DontEnum);
    4545    putDirectFunctionWithoutTransition(exec, new (exec) NativeFunctionWrapper(exec, globalObject, prototypeFunctionStructure, 0, exec->propertyNames().toString, errorProtoFuncToString), DontEnum);
    4646}
  • trunk/Source/JavaScriptCore/runtime/FunctionConstructor.cpp

    r77113 r77151  
    4141    : InternalFunction(&exec->globalData(), globalObject, structure, Identifier(exec, functionPrototype->classInfo()->className))
    4242{
    43     putDirectWithoutTransition(exec->propertyNames().prototype, functionPrototype, DontEnum | DontDelete | ReadOnly);
     43    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, functionPrototype, DontEnum | DontDelete | ReadOnly);
    4444
    4545    // Number of arguments for constructor
    46     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(1), ReadOnly | DontDelete | DontEnum);
     46    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(1), ReadOnly | DontDelete | DontEnum);
    4747}
    4848
  • trunk/Source/JavaScriptCore/runtime/FunctionPrototype.cpp

    r77113 r77151  
    4242    : InternalFunction(&exec->globalData(), globalObject, structure, exec->propertyNames().nullIdentifier)
    4343{
    44     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(0), DontDelete | ReadOnly | DontEnum);
     44    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(0), DontDelete | ReadOnly | DontEnum);
    4545}
    4646
  • trunk/Source/JavaScriptCore/runtime/GetterSetter.cpp

    r77113 r77151  
    3434
    3535    if (m_getter)
    36         markStack.append(m_getter);
     36        markStack.append(&m_getter);
    3737    if (m_setter)
    38         markStack.append(m_setter);
     38        markStack.append(&m_setter);
    3939}
    4040
  • trunk/Source/JavaScriptCore/runtime/GetterSetter.h

    r77113 r77151  
    3939        GetterSetter(ExecState* exec)
    4040            : JSCell(exec->globalData().getterSetterStructure.get())
    41             , m_getter(0)
    42             , m_setter(0)
    4341        {
    4442        }
     
    4644        virtual void markChildren(MarkStack&);
    4745
    48         JSObject* getter() const { return m_getter; }
    49         void setGetter(JSObject* getter) { m_getter = getter; }
    50         JSObject* setter() const { return m_setter; }
    51         void setSetter(JSObject* setter) { m_setter = setter; }
     46        JSObject* getter() const { return m_getter.get(); }
     47        void setGetter(JSGlobalData& globalData, JSObject* getter) { m_getter.set(globalData, this, getter); }
     48        JSObject* setter() const { return m_setter.get(); }
     49        void setSetter(JSGlobalData& globalData, JSObject* setter) { m_setter.set(globalData, this, setter); }
    5250        static PassRefPtr<Structure> createStructure(JSValue prototype)
    5351        {
     
    5755        virtual bool isGetterSetter() const;
    5856
    59         JSObject* m_getter;
    60         JSObject* m_setter; 
     57        WriteBarrier<JSObject> m_getter;
     58        WriteBarrier<JSObject> m_setter; 
    6159    };
    6260
  • trunk/Source/JavaScriptCore/runtime/GlobalEvalFunction.cpp

    r77113 r77151  
    3535GlobalEvalFunction::GlobalEvalFunction(ExecState* exec, JSGlobalObject* globalObject, NonNullPassRefPtr<Structure> structure, int len, const Identifier& name, NativeFunction function, JSGlobalObject* cachedGlobalObject)
    3636    : PrototypeFunction(exec, globalObject, structure, len, name, function)
    37     , m_cachedGlobalObject(cachedGlobalObject)
     37    , m_cachedGlobalObject(exec->globalData(), this, cachedGlobalObject)
    3838{
    3939    ASSERT_ARG(cachedGlobalObject, cachedGlobalObject);
     
    4343{
    4444    PrototypeFunction::markChildren(markStack);
    45     markStack.append(m_cachedGlobalObject);
     45    markStack.append(&m_cachedGlobalObject);
    4646}
    4747
  • trunk/Source/JavaScriptCore/runtime/GlobalEvalFunction.h

    r77113 r77151  
    3434    public:
    3535        GlobalEvalFunction(ExecState*, JSGlobalObject*, NonNullPassRefPtr<Structure>, int len, const Identifier&, NativeFunction, JSGlobalObject* expectedThisObject);
    36         JSGlobalObject* cachedGlobalObject() const { return m_cachedGlobalObject; }
     36        JSGlobalObject* cachedGlobalObject() const { return m_cachedGlobalObject.get(); }
    3737
    3838        static PassRefPtr<Structure> createStructure(JSValue prototype)
     
    4747        virtual void markChildren(MarkStack&);
    4848
    49         JSGlobalObject* m_cachedGlobalObject;
     49        WriteBarrier<JSGlobalObject> m_cachedGlobalObject;
    5050    };
    5151
  • trunk/Source/JavaScriptCore/runtime/Heap.cpp

    r77113 r77151  
    180180    ProtectCountSet::iterator end = m_protectedValues.end();
    181181    for (ProtectCountSet::iterator it = m_protectedValues.begin(); it != end; ++it)
    182         markStack.append(it->first);
     182        markStack.deprecatedAppend(&it->first);
    183183}
    184184
     
    205205        for (Vector<ValueStringPair>::iterator vectorIt = tempSortingVector->begin(); vectorIt != vectorEnd; ++vectorIt) {
    206206            if (vectorIt->first)
    207                 markStack.append(vectorIt->first);
     207                markStack.deprecatedAppend(&vectorIt->first);
    208208        }
    209209    }
     
    256256        MarkedArgumentBuffer::markLists(markStack, *m_markListSet);
    257257    if (m_globalData->exception)
    258         markStack.append(m_globalData->exception);
     258        markStack.append(&m_globalData->exception);
    259259    if (m_globalData->firstStringifierToMark)
    260260        JSONObject::markStringifiers(markStack, m_globalData->firstStringifierToMark);
  • trunk/Source/JavaScriptCore/runtime/InternalFunction.cpp

    r77113 r77151  
    4747    : JSObjectWithGlobalObject(globalObject, structure)
    4848{
    49     putDirect(globalData->propertyNames->name, jsString(globalData, name.isNull() ? "" : name.ustring()), DontDelete | ReadOnly | DontEnum);
     49    putDirect(*globalData, globalData->propertyNames->name, jsString(globalData, name.isNull() ? "" : name.ustring()), DontDelete | ReadOnly | DontEnum);
    5050}
    5151
  • trunk/Source/JavaScriptCore/runtime/JSAPIValueWrapper.h

    r77113 r77151  
    3232        friend JSValue jsAPIValueWrapper(ExecState*, JSValue);
    3333    public:
    34         JSValue value() const { return m_value; }
     34        JSValue value() const { return m_value.get(); }
    3535
    3636        virtual bool isAPIValueWrapper() const { return true; }
     
    4545        JSAPIValueWrapper(ExecState* exec, JSValue value)
    4646            : JSCell(exec->globalData().apiWrapperStructure.get())
    47             , m_value(value)
    4847        {
     48            m_value.set(exec->globalData(), this, value);
    4949            ASSERT(!value.isCell());
    5050        }
    5151
    52         JSValue m_value;
     52        WriteBarrier<Unknown> m_value;
    5353    };
    5454
  • trunk/Source/JavaScriptCore/runtime/JSActivation.cpp

    r77113 r77151  
    6262
    6363    size_t count = numParametersMinusThis;
    64     markStack.appendValues(registerArray, count);
     64    markStack.deprecatedAppendValues(registerArray, count);
    6565
    6666    size_t numVars = d()->functionExecutable->capturedVariableCount();
    6767
    6868    // Skip the call frame, which sits between the parameters and vars.
    69     markStack.appendValues(registerArray + count + RegisterFile::CallFrameHeaderSize, numVars, MayContainNullValues);
     69    markStack.deprecatedAppendValues(registerArray + count + RegisterFile::CallFrameHeaderSize, numVars, MayContainNullValues);
    7070}
    7171
     
    145145}
    146146
    147 void JSActivation::put(ExecState*, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
     147void JSActivation::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
    148148{
    149149    ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this));
     
    156156    // expose in the activation object.
    157157    ASSERT(!hasGetterSetterProperties());
    158     putDirect(propertyName, value, 0, true, slot);
     158    putDirect(exec->globalData(), propertyName, value, 0, true, slot);
    159159}
    160160
  • trunk/Source/JavaScriptCore/runtime/JSArray.cpp

    r77113 r77151  
    189189        m_storage->m_length = initialLength;
    190190        m_storage->m_numValuesInVector = 0;
    191         JSValue* vector = m_storage->m_vector;
     191        WriteBarrier<Unknown>* vector = m_storage->m_vector;
    192192        for (size_t i = 0; i < initialCapacity; ++i)
    193             vector[i] = JSValue();
     193            vector[i].clear();
    194194    }
    195195
     
    199199}
    200200
    201 JSArray::JSArray(NonNullPassRefPtr<Structure> structure, const ArgList& list)
     201JSArray::JSArray(JSGlobalData& globalData, NonNullPassRefPtr<Structure> structure, const ArgList& list)
    202202    : JSObject(structure)
    203203{
     
    226226
    227227    size_t i = 0;
    228     JSValue* vector = m_storage->m_vector;
     228    WriteBarrier<Unknown>* vector = m_storage->m_vector;
    229229    ArgList::const_iterator end = list.end();
    230230    for (ArgList::const_iterator it = list.begin(); it != end; ++it, ++i)
    231         vector[i] = *it;
     231        vector[i].set(globalData, this, *it);
    232232    for (; i < initialStorage; i++)
    233         vector[i] = JSValue();
     233        vector[i].clear();
    234234
    235235    checkConsistency();
     
    258258
    259259    if (i < m_vectorLength) {
    260         JSValue& valueSlot = storage->m_vector[i];
     260        WriteBarrier<Unknown>& valueSlot = storage->m_vector[i];
    261261        if (valueSlot) {
    262             slot.setValueSlot(&valueSlot);
     262            slot.setValueSlot(valueSlot.slot());
    263263            return true;
    264264        }
     
    267267            SparseArrayValueMap::iterator it = map->find(i);
    268268            if (it != map->end()) {
    269                 slot.setValueSlot(&it->second);
     269                slot.setValueSlot(it->second.slot());
    270270                return true;
    271271            }
     
    306306            return false;
    307307        if (i < m_vectorLength) {
    308             JSValue& value = storage->m_vector[i];
     308            WriteBarrier<Unknown>& value = storage->m_vector[i];
    309309            if (value) {
    310                 descriptor.setDescriptor(value, 0);
     310                descriptor.setDescriptor(value.get(), 0);
    311311                return true;
    312312            }
     
    315315                SparseArrayValueMap::iterator it = map->find(i);
    316316                if (it != map->end()) {
    317                     descriptor.setDescriptor(it->second, 0);
     317                    descriptor.setDescriptor(it->second.get(), 0);
    318318                    return true;
    319319                }
     
    360360
    361361    if (i < m_vectorLength) {
    362         JSValue& valueSlot = storage->m_vector[i];
     362        WriteBarrier<Unknown>& valueSlot = storage->m_vector[i];
    363363        if (valueSlot) {
    364             valueSlot = value;
     364            valueSlot.set(exec->globalData(), this, value);
    365365            checkConsistency();
    366366            return;
    367367        }
    368         valueSlot = value;
     368        valueSlot.set(exec->globalData(), this, value);
    369369        ++storage->m_numValuesInVector;
    370370        checkConsistency();
     
    396396            }
    397397
    398             pair<SparseArrayValueMap::iterator, bool> result = map->add(i, value);
    399             if (!result.second) { // pre-existing entry
    400                 result.first->second = value;
     398            WriteBarrier<Unknown> temp;
     399            pair<SparseArrayValueMap::iterator, bool> result = map->add(i, temp);
     400            result.first->second.set(exec->globalData(), this, value);
     401            if (!result.second) // pre-existing entry
    401402                return;
    402             }
    403403
    404404            size_t capacity = map->capacity();
     
    416416        if (increaseVectorLength(i + 1)) {
    417417            storage = m_storage;
    418             storage->m_vector[i] = value;
     418            storage->m_vector[i].set(exec->globalData(), this, value);
    419419            ++storage->m_numValuesInVector;
    420420            checkConsistency();
     
    458458   
    459459    unsigned vectorLength = m_vectorLength;
    460     JSValue* vector = storage->m_vector;
     460    WriteBarrier<Unknown>* vector = storage->m_vector;
    461461
    462462    if (newNumValuesInVector == storage->m_numValuesInVector + 1) {
    463463        for (unsigned j = vectorLength; j < newVectorLength; ++j)
    464             vector[j] = JSValue();
     464            vector[j].clear();
    465465        if (i > MIN_SPARSE_ARRAY_INDEX)
    466466            map->remove(i);
    467467    } else {
    468468        for (unsigned j = vectorLength; j < max(vectorLength, MIN_SPARSE_ARRAY_INDEX); ++j)
    469             vector[j] = JSValue();
     469            vector[j].clear();
     470        JSGlobalData& globalData = exec->globalData();
    470471        for (unsigned j = max(vectorLength, MIN_SPARSE_ARRAY_INDEX); j < newVectorLength; ++j)
    471             vector[j] = map->take(j);
     472            vector[j].set(globalData, this, map->take(j).get());
    472473    }
    473474
     
    477478    storage->m_numValuesInVector = newNumValuesInVector;
    478479
    479     storage->m_vector[i] = value;
     480    storage->m_vector[i].set(exec->globalData(), this, value);
    480481
    481482    checkConsistency();
     
    504505   
    505506    if (i < m_vectorLength) {
    506         JSValue& valueSlot = storage->m_vector[i];
     507        WriteBarrier<Unknown>& valueSlot = storage->m_vector[i];
    507508        if (!valueSlot) {
    508509            checkConsistency();
    509510            return false;
    510511        }
    511         valueSlot = JSValue();
     512        valueSlot.clear();
    512513        --storage->m_numValuesInVector;
    513514        checkConsistency();
     
    606607    m_storage->m_allocBase = baseStorage;
    607608
    608     JSValue* vector = storage->m_vector;
     609    WriteBarrier<Unknown>* vector = storage->m_vector;
    609610    for (unsigned i = vectorLength; i < newVectorLength; ++i)
    610         vector[i] = JSValue();
     611        vector[i].clear();
    611612
    612613    m_vectorLength = newVectorLength;
     
    667668        unsigned usedVectorLength = min(length, m_vectorLength);
    668669        for (unsigned i = newLength; i < usedVectorLength; ++i) {
    669             JSValue& valueSlot = storage->m_vector[i];
     670            WriteBarrier<Unknown>& valueSlot = storage->m_vector[i];
    670671            bool hadValue = valueSlot;
    671             valueSlot = JSValue();
     672            valueSlot.clear();
    672673            storage->m_numValuesInVector -= hadValue;
    673674        }
     
    707708
    708709    if (length < m_vectorLength) {
    709         JSValue& valueSlot = storage->m_vector[length];
     710        WriteBarrier<Unknown>& valueSlot = storage->m_vector[length];
    710711        if (valueSlot) {
    711712            --storage->m_numValuesInVector;
    712             result = valueSlot;
    713             valueSlot = JSValue();
     713            result = valueSlot.get();
     714            valueSlot.clear();
    714715        } else
    715716            result = jsUndefined();
     
    719720            SparseArrayValueMap::iterator it = map->find(length);
    720721            if (it != map->end()) {
    721                 result = it->second;
     722                result = it->second.get();
    722723                map->remove(it);
    723724                if (map->isEmpty()) {
     
    743744
    744745    if (storage->m_length < m_vectorLength) {
    745         storage->m_vector[storage->m_length] = value;
     746        storage->m_vector[storage->m_length].set(exec->globalData(), this, value);
    746747        ++storage->m_numValuesInVector;
    747748        ++storage->m_length;
     
    755756            if (increaseVectorLength(storage->m_length + 1)) {
    756757                storage = m_storage;
    757                 storage->m_vector[storage->m_length] = value;
     758                storage->m_vector[storage->m_length].set(exec->globalData(), this, value);
    758759                ++storage->m_numValuesInVector;
    759760                ++storage->m_length;
     
    858859    }
    859860
    860     JSValue* vector = m_storage->m_vector;
     861    WriteBarrier<Unknown>* vector = m_storage->m_vector;
    861862    for (int i = 0; i < count; i++)
    862         vector[i] = JSValue();
     863        vector[i].clear();
    863864}
    864865
     
    942943
    943944    for (size_t i = 0; i < lengthNotIncludingUndefined; i++) {
    944         JSValue value = storage->m_vector[i];
     945        JSValue value = storage->m_vector[i].get();
    945946        ASSERT(!value.isUndefined());
    946947        values[i].first = value;
     
    975976    if (storage->m_length < lengthNotIncludingUndefined)
    976977        storage->m_length = lengthNotIncludingUndefined;
    977        
     978
     979    JSGlobalData& globalData = exec->globalData();
    978980    for (size_t i = 0; i < lengthNotIncludingUndefined; i++)
    979         storage->m_vector[i] = values[i].first;
     981        storage->m_vector[i].set(globalData, this, values[i].first);
    980982
    981983    Heap::heap(this)->popTempSortVector(&values);
     
    11061108    // Iterate over the array, ignoring missing values, counting undefined ones, and inserting all other ones into the tree.
    11071109    for (; numDefined < usedVectorLength; ++numDefined) {
    1108         JSValue v = storage->m_vector[numDefined];
     1110        JSValue v = storage->m_vector[numDefined].get();
    11091111        if (!v || v.isUndefined())
    11101112            break;
     
    11131115    }
    11141116    for (unsigned i = numDefined; i < usedVectorLength; ++i) {
    1115         JSValue v = storage->m_vector[i];
     1117        JSValue v = storage->m_vector[i].get();
    11161118        if (v) {
    11171119            if (v.isUndefined())
     
    11411143        SparseArrayValueMap::iterator end = map->end();
    11421144        for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it) {
    1143             tree.abstractor().m_nodes[numDefined].value = it->second;
     1145            tree.abstractor().m_nodes[numDefined].value = it->second.get();
    11441146            tree.insert(numDefined);
    11451147            ++numDefined;
     
    11581160    AVLTree<AVLTreeAbstractorForArrayCompare, 44>::Iterator iter;
    11591161    iter.start_iter_least(tree);
     1162    JSGlobalData& globalData = exec->globalData();
    11601163    for (unsigned i = 0; i < numDefined; ++i) {
    1161         storage->m_vector[i] = tree.abstractor().m_nodes[*iter].value;
     1164        storage->m_vector[i].set(globalData, this, tree.abstractor().m_nodes[*iter].value);
    11621165        ++iter;
    11631166    }
     
    11651168    // Put undefined values back in.
    11661169    for (unsigned i = numDefined; i < newUsedVectorLength; ++i)
    1167         storage->m_vector[i] = jsUndefined();
     1170        storage->m_vector[i].setUndefined();
    11681171
    11691172    // Ensure that unused values in the vector are zeroed out.
    11701173    for (unsigned i = newUsedVectorLength; i < usedVectorLength; ++i)
    1171         storage->m_vector[i] = JSValue();
     1174        storage->m_vector[i].clear();
    11721175
    11731176    storage->m_numValuesInVector = newUsedVectorLength;
     
    11801183    ArrayStorage* storage = m_storage;
    11811184
    1182     JSValue* vector = storage->m_vector;
     1185    WriteBarrier<Unknown>* vector = storage->m_vector;
    11831186    unsigned vectorEnd = min(storage->m_length, m_vectorLength);
    11841187    unsigned i = 0;
    11851188    for (; i < vectorEnd; ++i) {
    1186         JSValue& v = vector[i];
     1189        WriteBarrier<Unknown>& v = vector[i];
    11871190        if (!v)
    11881191            break;
    1189         args.append(v);
     1192        args.append(v.get());
    11901193    }
    11911194
     
    11981201    ASSERT(m_storage->m_length >= maxSize);
    11991202    UNUSED_PARAM(maxSize);
    1200     JSValue* vector = m_storage->m_vector;
     1203    WriteBarrier<Unknown>* vector = m_storage->m_vector;
    12011204    unsigned vectorEnd = min(maxSize, m_vectorLength);
    12021205    unsigned i = 0;
    12031206    for (; i < vectorEnd; ++i) {
    1204         JSValue& v = vector[i];
     1207        WriteBarrier<Unknown>& v = vector[i];
    12051208        if (!v)
    12061209            break;
    1207         buffer[i] = v;
     1210        buffer[i] = v.get();
    12081211    }
    12091212
     
    12241227
    12251228    for (; numDefined < usedVectorLength; ++numDefined) {
    1226         JSValue v = storage->m_vector[numDefined];
     1229        JSValue v = storage->m_vector[numDefined].get();
    12271230        if (!v || v.isUndefined())
    12281231            break;
    12291232    }
     1233
    12301234    for (unsigned i = numDefined; i < usedVectorLength; ++i) {
    1231         JSValue v = storage->m_vector[i];
     1235        JSValue v = storage->m_vector[i].get();
    12321236        if (v) {
    12331237            if (v.isUndefined())
    12341238                ++numUndefined;
    12351239            else
    1236                 storage->m_vector[numDefined++] = v;
     1240                storage->m_vector[numDefined++].setWithoutWriteBarrier(v);
    12371241        }
    12381242    }
     
    12531257        SparseArrayValueMap::iterator end = map->end();
    12541258        for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it)
    1255             storage->m_vector[numDefined++] = it->second;
     1259            storage->m_vector[numDefined++].setWithoutWriteBarrier(it->second.get());
    12561260
    12571261        delete map;
     
    12601264
    12611265    for (unsigned i = numDefined; i < newUsedVectorLength; ++i)
    1262         storage->m_vector[i] = jsUndefined();
     1266        storage->m_vector[i].setUndefined();
    12631267    for (unsigned i = newUsedVectorLength; i < usedVectorLength; ++i)
    1264         storage->m_vector[i] = JSValue();
     1268        storage->m_vector[i].clear();
    12651269
    12661270    storage->m_numValuesInVector = newUsedVectorLength;
  • trunk/Source/JavaScriptCore/runtime/JSArray.h

    r77113 r77151  
    2828namespace JSC {
    2929
    30     typedef HashMap<unsigned, JSValue> SparseArrayValueMap;
     30    typedef HashMap<unsigned, WriteBarrier<Unknown> > SparseArrayValueMap;
    3131
    3232    // This struct holds the actual data values of an array.  A JSArray object points to it's contained ArrayStorage
     
    4545        bool m_inCompactInitialization;
    4646#endif
    47         JSValue m_vector[1];
     47        WriteBarrier<Unknown> m_vector[1];
    4848    };
    4949
     
    6868        explicit JSArray(NonNullPassRefPtr<Structure>);
    6969        JSArray(NonNullPassRefPtr<Structure>, unsigned initialLength, ArrayCreationMode);
    70         JSArray(NonNullPassRefPtr<Structure>, const ArgList& initialValues);
     70        JSArray(JSGlobalData&, NonNullPassRefPtr<Structure>, const ArgList& initialValues);
    7171        virtual ~JSArray();
    7272
     
    9595        {
    9696            ASSERT(canGetIndex(i));
    97             return m_storage->m_vector[i];
     97            return m_storage->m_vector[i].get();
    9898        }
    9999
    100100        bool canSetIndex(unsigned i) { return i < m_vectorLength; }
    101         void setIndex(unsigned i, JSValue v)
     101        void setIndex(JSGlobalData& globalData, unsigned i, JSValue v)
    102102        {
    103103            ASSERT(canSetIndex(i));
    104104           
    105             JSValue& x = m_storage->m_vector[i];
     105            WriteBarrier<Unknown>& x = m_storage->m_vector[i];
    106106            if (!x) {
    107107                ArrayStorage *storage = m_storage;
     
    110110                    storage->m_length = i + 1;
    111111            }
    112             x = v;
    113         }
    114        
    115         void uncheckedSetIndex(unsigned i, JSValue v)
     112            x.set(globalData, this, v);
     113        }
     114       
     115        void uncheckedSetIndex(JSGlobalData& globalData, unsigned i, JSValue v)
    116116        {
    117117            ASSERT(canSetIndex(i));
     
    120120            ASSERT(storage->m_inCompactInitialization);
    121121#endif
    122             storage->m_vector[i] = v;
     122            storage->m_vector[i].set(globalData, this, v);
    123123        }
    124124
     
    195195            SparseArrayValueMap::iterator end = map->end();
    196196            for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it)
    197                 markStack.append(it->second);
     197                markStack.append(&it->second);
    198198        }
    199199    }
  • trunk/Source/JavaScriptCore/runtime/JSByteArray.cpp

    r77113 r77151  
    4141    , m_classInfo(classInfo)
    4242{
    43     putDirect(exec->globalData().propertyNames->length, jsNumber(m_storage->length()), ReadOnly | DontDelete);
     43    putDirect(exec->globalData(), exec->globalData().propertyNames->length, jsNumber(m_storage->length()), ReadOnly | DontDelete);
    4444}
    4545
  • trunk/Source/JavaScriptCore/runtime/JSCell.h

    r77113 r77151  
    337337        return isCell() ? asCell()->toThisObject(exec) : toThisObjectSlowCase(exec);
    338338    }
    339 
    340     ALWAYS_INLINE void MarkStack::append(JSCell* cell)
     339   
     340    template <typename T> void MarkStack::append(DeprecatedPtr<T>* slot)
     341    {
     342        internalAppend(slot->get());
     343    }
     344   
     345    template <typename T> void MarkStack::append(WriteBarrierBase<T>* slot)
     346    {
     347        internalAppend(slot->get());
     348    }
     349
     350    ALWAYS_INLINE void MarkStack::internalAppend(JSCell* cell)
    341351    {
    342352        ASSERT(!m_isCheckingForDefaultMarkViolation);
     
    348358    }
    349359
    350     ALWAYS_INLINE void MarkStack::append(JSValue value)
     360    ALWAYS_INLINE void MarkStack::deprecatedAppend(JSCell** value)
     361    {
     362        ASSERT(value);
     363        internalAppend(*value);
     364    }
     365
     366    ALWAYS_INLINE void MarkStack::deprecatedAppend(JSValue* value)
     367    {
     368        ASSERT(value);
     369        internalAppend(*value);
     370    }
     371   
     372    ALWAYS_INLINE void MarkStack::deprecatedAppend(Register* value)
     373    {
     374        ASSERT(value);
     375        internalAppend(value->jsValue());
     376    }
     377
     378    ALWAYS_INLINE void MarkStack::internalAppend(JSValue value)
    351379    {
    352380        ASSERT(value);
    353381        if (value.isCell())
    354             append(value.asCell());
     382            internalAppend(value.asCell());
    355383    }
    356384
  • trunk/Source/JavaScriptCore/runtime/JSFunction.cpp

    r77113 r77151  
    7272    , m_scopeChain(globalObject->globalScopeChain())
    7373{
    74     putDirect(exec->globalData().propertyNames->name, jsString(exec, name.isNull() ? "" : name.ustring()), DontDelete | ReadOnly | DontEnum);
    75     putDirect(exec->propertyNames().length, jsNumber(length), DontDelete | ReadOnly | DontEnum);
     74    putDirect(exec->globalData(), exec->globalData().propertyNames->name, jsString(exec, name.isNull() ? "" : name.ustring()), DontDelete | ReadOnly | DontEnum);
     75    putDirect(exec->globalData(), exec->propertyNames().length, jsNumber(length), DontDelete | ReadOnly | DontEnum);
    7676}
    7777#endif
     
    8484    , m_scopeChain(globalObject->globalScopeChain())
    8585{
    86     putDirect(exec->globalData().propertyNames->name, jsString(exec, name.isNull() ? "" : name.ustring()), DontDelete | ReadOnly | DontEnum);
    87 #if ENABLE(JIT)
    88     putDirect(exec->propertyNames().length, jsNumber(length), DontDelete | ReadOnly | DontEnum);
     86    putDirect(exec->globalData(), exec->globalData().propertyNames->name, jsString(exec, name.isNull() ? "" : name.ustring()), DontDelete | ReadOnly | DontEnum);
     87#if ENABLE(JIT)
     88    putDirect(exec->globalData(), exec->propertyNames().length, jsNumber(length), DontDelete | ReadOnly | DontEnum);
    8989#else
    9090    UNUSED_PARAM(length);
     
    100100{
    101101    const Identifier& name = static_cast<FunctionExecutable*>(m_executable.get())->name();
    102     putDirect(exec->globalData().propertyNames->name, jsString(exec, name.isNull() ? "" : name.ustring()), DontDelete | ReadOnly | DontEnum);
     102    putDirect(exec->globalData(), exec->globalData().propertyNames->name, jsString(exec, name.isNull() ? "" : name.ustring()), DontDelete | ReadOnly | DontEnum);
    103103}
    104104
     
    208208        if (!location) {
    209209            JSObject* prototype = new (exec) JSObject(scope().globalObject()->emptyObjectStructure());
    210             prototype->putDirect(exec->propertyNames().constructor, this, DontEnum);
    211             putDirect(exec->propertyNames().prototype, prototype, DontDelete | DontEnum);
     210            prototype->putDirect(exec->globalData(), exec->propertyNames().constructor, this, DontEnum);
     211            putDirect(exec->globalData(), exec->propertyNames().prototype, prototype, DontDelete | DontEnum);
    212212            location = getDirectLocation(propertyName);
    213213        }
  • trunk/Source/JavaScriptCore/runtime/JSGlobalData.h

    r77113 r77151  
    204204        Heap heap;
    205205
    206         JSValue exception;
     206        DeprecatedPtr<Unknown> exception;
    207207#if ENABLE(JIT)
    208208        ReturnAddressPtr exceptionLocation;
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp

    r77113 r77151  
    8181static const int preferredScriptCheckTimeInterval = 1000;
    8282
    83 static inline void markIfNeeded(MarkStack& markStack, JSValue v)
    84 {
    85     if (v)
     83template <typename T> static inline void markIfNeeded(MarkStack& markStack, WriteBarrier<T>* v)
     84{
     85    if (*v)
    8686        markStack.append(v);
    8787}
     
    8989static inline void markIfNeeded(MarkStack& markStack, const RefPtr<Structure>& s)
    9090{
    91     if (s)
    92         markIfNeeded(markStack, s->storedPrototype());
     91    if (s && s->storedPrototype())
     92        markStack.append(s->storedPrototypeSlot());
    9393}
    9494
     
    203203    // Prototypes
    204204
    205     d()->functionPrototype = new (exec) FunctionPrototype(exec, this, FunctionPrototype::createStructure(jsNull())); // The real prototype will be set once ObjectPrototype is created.
    206     d()->prototypeFunctionStructure = PrototypeFunction::createStructure(d()->functionPrototype);
    207     d()->internalFunctionStructure = InternalFunction::createStructure(d()->functionPrototype);
     205    d()->functionPrototype.set(exec->globalData(), this, new (exec) FunctionPrototype(exec, this, FunctionPrototype::createStructure(jsNull()))); // The real prototype will be set once ObjectPrototype is created.
     206    d()->prototypeFunctionStructure = PrototypeFunction::createStructure(d()->functionPrototype.get());
     207    d()->internalFunctionStructure = InternalFunction::createStructure(d()->functionPrototype.get());
    208208    NativeFunctionWrapper* callFunction = 0;
    209209    NativeFunctionWrapper* applyFunction = 0;
    210210    d()->functionPrototype->addFunctionProperties(exec, this, d()->prototypeFunctionStructure.get(), &callFunction, &applyFunction);
    211     d()->callFunction = callFunction;
    212     d()->applyFunction = applyFunction;
    213     d()->objectPrototype = new (exec) ObjectPrototype(exec, this, ObjectPrototype::createStructure(jsNull()), d()->prototypeFunctionStructure.get());
    214     d()->functionPrototype->structure()->setPrototypeWithoutTransition(d()->objectPrototype);
     211    d()->callFunction.set(exec->globalData(), this, callFunction);
     212    d()->applyFunction.set(exec->globalData(), this, applyFunction);
     213    d()->objectPrototype.set(exec->globalData(), this, new (exec) ObjectPrototype(exec, this, ObjectPrototype::createStructure(jsNull()), d()->prototypeFunctionStructure.get()));
     214    d()->functionPrototype->structure()->setPrototypeWithoutTransition(d()->objectPrototype.get());
    215215
    216216    d()->emptyObjectStructure = d()->objectPrototype->inheritorID();
    217217
    218     d()->functionStructure = JSFunction::createStructure(d()->functionPrototype);
    219     d()->callbackFunctionStructure = JSCallbackFunction::createStructure(d()->functionPrototype);
    220     d()->argumentsStructure = Arguments::createStructure(d()->objectPrototype);
    221     d()->callbackConstructorStructure = JSCallbackConstructor::createStructure(d()->objectPrototype);
    222     d()->callbackObjectStructure = JSCallbackObject<JSObjectWithGlobalObject>::createStructure(d()->objectPrototype);
    223 
    224     d()->arrayPrototype = new (exec) ArrayPrototype(this, ArrayPrototype::createStructure(d()->objectPrototype));
    225     d()->arrayStructure = JSArray::createStructure(d()->arrayPrototype);
    226     d()->regExpMatchesArrayStructure = RegExpMatchesArray::createStructure(d()->arrayPrototype);
    227 
    228     d()->stringPrototype = new (exec) StringPrototype(exec, this, StringPrototype::createStructure(d()->objectPrototype));
    229     d()->stringObjectStructure = StringObject::createStructure(d()->stringPrototype);
    230 
    231     d()->booleanPrototype = new (exec) BooleanPrototype(exec, this, BooleanPrototype::createStructure(d()->objectPrototype), d()->prototypeFunctionStructure.get());
    232     d()->booleanObjectStructure = BooleanObject::createStructure(d()->booleanPrototype);
    233 
    234     d()->numberPrototype = new (exec) NumberPrototype(exec, this, NumberPrototype::createStructure(d()->objectPrototype), d()->prototypeFunctionStructure.get());
    235     d()->numberObjectStructure = NumberObject::createStructure(d()->numberPrototype);
    236 
    237     d()->datePrototype = new (exec) DatePrototype(exec, this, DatePrototype::createStructure(d()->objectPrototype));
    238     d()->dateStructure = DateInstance::createStructure(d()->datePrototype);
    239 
    240     d()->regExpPrototype = new (exec) RegExpPrototype(exec, this, RegExpPrototype::createStructure(d()->objectPrototype), d()->prototypeFunctionStructure.get());
    241     d()->regExpStructure = RegExpObject::createStructure(d()->regExpPrototype);
    242 
    243     d()->methodCallDummy = constructEmptyObject(exec);
    244 
    245     ErrorPrototype* errorPrototype = new (exec) ErrorPrototype(exec, this, ErrorPrototype::createStructure(d()->objectPrototype), d()->prototypeFunctionStructure.get());
     218    d()->functionStructure = JSFunction::createStructure(d()->functionPrototype.get());
     219    d()->callbackFunctionStructure = JSCallbackFunction::createStructure(d()->functionPrototype.get());
     220    d()->argumentsStructure = Arguments::createStructure(d()->objectPrototype.get());
     221    d()->callbackConstructorStructure = JSCallbackConstructor::createStructure(d()->objectPrototype.get());
     222    d()->callbackObjectStructure = JSCallbackObject<JSObjectWithGlobalObject>::createStructure(d()->objectPrototype.get());
     223
     224    d()->arrayPrototype.set(exec->globalData(), this, new (exec) ArrayPrototype(this, ArrayPrototype::createStructure(d()->objectPrototype.get())));
     225    d()->arrayStructure = JSArray::createStructure(d()->arrayPrototype.get());
     226    d()->regExpMatchesArrayStructure = RegExpMatchesArray::createStructure(d()->arrayPrototype.get());
     227
     228    d()->stringPrototype.set(exec->globalData(), this, new (exec) StringPrototype(exec, this, StringPrototype::createStructure(d()->objectPrototype.get())));
     229    d()->stringObjectStructure = StringObject::createStructure(d()->stringPrototype.get());
     230
     231    d()->booleanPrototype.set(exec->globalData(), this, new (exec) BooleanPrototype(exec, this, BooleanPrototype::createStructure(d()->objectPrototype.get()), d()->prototypeFunctionStructure.get()));
     232    d()->booleanObjectStructure = BooleanObject::createStructure(d()->booleanPrototype.get());
     233
     234    d()->numberPrototype.set(exec->globalData(), this, new (exec) NumberPrototype(exec, this, NumberPrototype::createStructure(d()->objectPrototype.get()), d()->prototypeFunctionStructure.get()));
     235    d()->numberObjectStructure = NumberObject::createStructure(d()->numberPrototype.get());
     236
     237    d()->datePrototype.set(exec->globalData(), this, new (exec) DatePrototype(exec, this, DatePrototype::createStructure(d()->objectPrototype.get())));
     238    d()->dateStructure = DateInstance::createStructure(d()->datePrototype.get());
     239
     240    d()->regExpPrototype.set(exec->globalData(), this, new (exec) RegExpPrototype(exec, this, RegExpPrototype::createStructure(d()->objectPrototype.get()), d()->prototypeFunctionStructure.get()));
     241    d()->regExpStructure = RegExpObject::createStructure(d()->regExpPrototype.get());
     242
     243    d()->methodCallDummy.set(exec->globalData(), this, constructEmptyObject(exec));
     244
     245    ErrorPrototype* errorPrototype = new (exec) ErrorPrototype(exec, this, ErrorPrototype::createStructure(d()->objectPrototype.get()), d()->prototypeFunctionStructure.get());
    246246    d()->errorStructure = ErrorInstance::createStructure(errorPrototype);
    247247
    248248    // Constructors
    249249
    250     JSCell* objectConstructor = new (exec) ObjectConstructor(exec, this, ObjectConstructor::createStructure(d()->functionPrototype), d()->objectPrototype, d()->prototypeFunctionStructure.get());
    251     JSCell* functionConstructor = new (exec) FunctionConstructor(exec, this, FunctionConstructor::createStructure(d()->functionPrototype), d()->functionPrototype);
    252     JSCell* arrayConstructor = new (exec) ArrayConstructor(exec, this, ArrayConstructor::createStructure(d()->functionPrototype), d()->arrayPrototype, d()->prototypeFunctionStructure.get());
    253     JSCell* stringConstructor = new (exec) StringConstructor(exec, this, StringConstructor::createStructure(d()->functionPrototype), d()->prototypeFunctionStructure.get(), d()->stringPrototype);
    254     JSCell* booleanConstructor = new (exec) BooleanConstructor(exec, this, BooleanConstructor::createStructure(d()->functionPrototype), d()->booleanPrototype);
    255     JSCell* numberConstructor = new (exec) NumberConstructor(exec, this, NumberConstructor::createStructure(d()->functionPrototype), d()->numberPrototype);
    256     JSCell* dateConstructor = new (exec) DateConstructor(exec, this, DateConstructor::createStructure(d()->functionPrototype), d()->prototypeFunctionStructure.get(), d()->datePrototype);
    257 
    258     d()->regExpConstructor = new (exec) RegExpConstructor(exec, this, RegExpConstructor::createStructure(d()->functionPrototype), d()->regExpPrototype);
    259 
    260     d()->errorConstructor = new (exec) ErrorConstructor(exec, this, ErrorConstructor::createStructure(d()->functionPrototype), errorPrototype);
     250    JSCell* objectConstructor = new (exec) ObjectConstructor(exec, this, ObjectConstructor::createStructure(d()->functionPrototype.get()), d()->objectPrototype.get(), d()->prototypeFunctionStructure.get());
     251    JSCell* functionConstructor = new (exec) FunctionConstructor(exec, this, FunctionConstructor::createStructure(d()->functionPrototype.get()), d()->functionPrototype.get());
     252    JSCell* arrayConstructor = new (exec) ArrayConstructor(exec, this, ArrayConstructor::createStructure(d()->functionPrototype.get()), d()->arrayPrototype.get(), d()->prototypeFunctionStructure.get());
     253    JSCell* stringConstructor = new (exec) StringConstructor(exec, this, StringConstructor::createStructure(d()->functionPrototype.get()), d()->prototypeFunctionStructure.get(), d()->stringPrototype.get());
     254    JSCell* booleanConstructor = new (exec) BooleanConstructor(exec, this, BooleanConstructor::createStructure(d()->functionPrototype.get()), d()->booleanPrototype.get());
     255    JSCell* numberConstructor = new (exec) NumberConstructor(exec, this, NumberConstructor::createStructure(d()->functionPrototype.get()), d()->numberPrototype.get());
     256    JSCell* dateConstructor = new (exec) DateConstructor(exec, this, DateConstructor::createStructure(d()->functionPrototype.get()), d()->prototypeFunctionStructure.get(), d()->datePrototype.get());
     257
     258    d()->regExpConstructor.set(exec->globalData(), this, new (exec) RegExpConstructor(exec, this, RegExpConstructor::createStructure(d()->functionPrototype.get()), d()->regExpPrototype.get()));
     259
     260    d()->errorConstructor.set(exec->globalData(), this, new (exec) ErrorConstructor(exec, this, ErrorConstructor::createStructure(d()->functionPrototype.get()), errorPrototype));
    261261
    262262    RefPtr<Structure> nativeErrorPrototypeStructure = NativeErrorPrototype::createStructure(errorPrototype);
    263     RefPtr<Structure> nativeErrorStructure = NativeErrorConstructor::createStructure(d()->functionPrototype);
    264     d()->evalErrorConstructor = new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "EvalError");
    265     d()->rangeErrorConstructor = new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "RangeError");
    266     d()->referenceErrorConstructor = new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "ReferenceError");
    267     d()->syntaxErrorConstructor = new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "SyntaxError");
    268     d()->typeErrorConstructor = new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "TypeError");
    269     d()->URIErrorConstructor = new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "URIError");
    270 
    271     d()->objectPrototype->putDirectFunctionWithoutTransition(exec->propertyNames().constructor, objectConstructor, DontEnum);
    272     d()->functionPrototype->putDirectFunctionWithoutTransition(exec->propertyNames().constructor, functionConstructor, DontEnum);
    273     d()->arrayPrototype->putDirectFunctionWithoutTransition(exec->propertyNames().constructor, arrayConstructor, DontEnum);
    274     d()->booleanPrototype->putDirectFunctionWithoutTransition(exec->propertyNames().constructor, booleanConstructor, DontEnum);
    275     d()->stringPrototype->putDirectFunctionWithoutTransition(exec->propertyNames().constructor, stringConstructor, DontEnum);
    276     d()->numberPrototype->putDirectFunctionWithoutTransition(exec->propertyNames().constructor, numberConstructor, DontEnum);
    277     d()->datePrototype->putDirectFunctionWithoutTransition(exec->propertyNames().constructor, dateConstructor, DontEnum);
    278     d()->regExpPrototype->putDirectFunctionWithoutTransition(exec->propertyNames().constructor, d()->regExpConstructor, DontEnum);
    279     errorPrototype->putDirectFunctionWithoutTransition(exec->propertyNames().constructor, d()->errorConstructor, DontEnum);
     263    RefPtr<Structure> nativeErrorStructure = NativeErrorConstructor::createStructure(d()->functionPrototype.get());
     264    d()->evalErrorConstructor.set(exec->globalData(), this, new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "EvalError"));
     265    d()->rangeErrorConstructor.set(exec->globalData(), this, new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "RangeError"));
     266    d()->referenceErrorConstructor.set(exec->globalData(), this, new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "ReferenceError"));
     267    d()->syntaxErrorConstructor.set(exec->globalData(), this, new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "SyntaxError"));
     268    d()->typeErrorConstructor.set(exec->globalData(), this, new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "TypeError"));
     269    d()->URIErrorConstructor.set(exec->globalData(), this, new (exec) NativeErrorConstructor(exec, this, nativeErrorStructure, nativeErrorPrototypeStructure, "URIError"));
     270
     271    d()->objectPrototype->putDirectFunctionWithoutTransition(exec->globalData(), exec->propertyNames().constructor, objectConstructor, DontEnum);
     272    d()->functionPrototype->putDirectFunctionWithoutTransition(exec->globalData(), exec->propertyNames().constructor, functionConstructor, DontEnum);
     273    d()->arrayPrototype->putDirectFunctionWithoutTransition(exec->globalData(), exec->propertyNames().constructor, arrayConstructor, DontEnum);
     274    d()->booleanPrototype->putDirectFunctionWithoutTransition(exec->globalData(), exec->propertyNames().constructor, booleanConstructor, DontEnum);
     275    d()->stringPrototype->putDirectFunctionWithoutTransition(exec->globalData(), exec->propertyNames().constructor, stringConstructor, DontEnum);
     276    d()->numberPrototype->putDirectFunctionWithoutTransition(exec->globalData(), exec->propertyNames().constructor, numberConstructor, DontEnum);
     277    d()->datePrototype->putDirectFunctionWithoutTransition(exec->globalData(), exec->propertyNames().constructor, dateConstructor, DontEnum);
     278    d()->regExpPrototype->putDirectFunctionWithoutTransition(exec->globalData(), exec->propertyNames().constructor, d()->regExpConstructor.get(), DontEnum);
     279    errorPrototype->putDirectFunctionWithoutTransition(exec->globalData(), exec->propertyNames().constructor, d()->errorConstructor.get(), DontEnum);
    280280
    281281    // Set global constructors
     
    283283    // FIXME: These properties could be handled by a static hash table.
    284284
    285     putDirectFunctionWithoutTransition(Identifier(exec, "Object"), objectConstructor, DontEnum);
    286     putDirectFunctionWithoutTransition(Identifier(exec, "Function"), functionConstructor, DontEnum);
    287     putDirectFunctionWithoutTransition(Identifier(exec, "Array"), arrayConstructor, DontEnum);
    288     putDirectFunctionWithoutTransition(Identifier(exec, "Boolean"), booleanConstructor, DontEnum);
    289     putDirectFunctionWithoutTransition(Identifier(exec, "String"), stringConstructor, DontEnum);
    290     putDirectFunctionWithoutTransition(Identifier(exec, "Number"), numberConstructor, DontEnum);
    291     putDirectFunctionWithoutTransition(Identifier(exec, "Date"), dateConstructor, DontEnum);
    292     putDirectFunctionWithoutTransition(Identifier(exec, "RegExp"), d()->regExpConstructor, DontEnum);
    293     putDirectFunctionWithoutTransition(Identifier(exec, "Error"), d()->errorConstructor, DontEnum);
    294     putDirectFunctionWithoutTransition(Identifier(exec, "EvalError"), d()->evalErrorConstructor, DontEnum);
    295     putDirectFunctionWithoutTransition(Identifier(exec, "RangeError"), d()->rangeErrorConstructor, DontEnum);
    296     putDirectFunctionWithoutTransition(Identifier(exec, "ReferenceError"), d()->referenceErrorConstructor, DontEnum);
    297     putDirectFunctionWithoutTransition(Identifier(exec, "SyntaxError"), d()->syntaxErrorConstructor, DontEnum);
    298     putDirectFunctionWithoutTransition(Identifier(exec, "TypeError"), d()->typeErrorConstructor, DontEnum);
    299     putDirectFunctionWithoutTransition(Identifier(exec, "URIError"), d()->URIErrorConstructor, DontEnum);
     285    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "Object"), objectConstructor, DontEnum);
     286    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "Function"), functionConstructor, DontEnum);
     287    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "Array"), arrayConstructor, DontEnum);
     288    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "Boolean"), booleanConstructor, DontEnum);
     289    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "String"), stringConstructor, DontEnum);
     290    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "Number"), numberConstructor, DontEnum);
     291    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "Date"), dateConstructor, DontEnum);
     292    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "RegExp"), d()->regExpConstructor.get(), DontEnum);
     293    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "Error"), d()->errorConstructor.get(), DontEnum);
     294    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "EvalError"), d()->evalErrorConstructor.get(), DontEnum);
     295    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "RangeError"), d()->rangeErrorConstructor.get(), DontEnum);
     296    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "ReferenceError"), d()->referenceErrorConstructor.get(), DontEnum);
     297    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "SyntaxError"), d()->syntaxErrorConstructor.get(), DontEnum);
     298    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "TypeError"), d()->typeErrorConstructor.get(), DontEnum);
     299    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, "URIError"), d()->URIErrorConstructor.get(), DontEnum);
    300300
    301301    // Set global values.
    302302    GlobalPropertyInfo staticGlobals[] = {
    303         GlobalPropertyInfo(Identifier(exec, "Math"), new (exec) MathObject(exec, this, MathObject::createStructure(d()->objectPrototype)), DontEnum | DontDelete),
     303        GlobalPropertyInfo(Identifier(exec, "Math"), new (exec) MathObject(exec, this, MathObject::createStructure(d()->objectPrototype.get())), DontEnum | DontDelete),
    304304        GlobalPropertyInfo(Identifier(exec, "NaN"), jsNaN(), DontEnum | DontDelete | ReadOnly),
    305305        GlobalPropertyInfo(Identifier(exec, "Infinity"), jsNumber(Inf), DontEnum | DontDelete | ReadOnly),
    306306        GlobalPropertyInfo(Identifier(exec, "undefined"), jsUndefined(), DontEnum | DontDelete | ReadOnly),
    307         GlobalPropertyInfo(Identifier(exec, "JSON"), new (exec) JSONObject(this, JSONObject::createStructure(d()->objectPrototype)), DontEnum | DontDelete)
     307        GlobalPropertyInfo(Identifier(exec, "JSON"), new (exec) JSONObject(this, JSONObject::createStructure(d()->objectPrototype.get())), DontEnum | DontDelete)
    308308    };
    309309
     
    312312    // Set global functions.
    313313
    314     d()->evalFunction = new (exec) GlobalEvalFunction(exec, this, GlobalEvalFunction::createStructure(d()->functionPrototype), 1, exec->propertyNames().eval, globalFuncEval, this);
    315     putDirectFunctionWithoutTransition(exec, d()->evalFunction, DontEnum);
     314    d()->evalFunction.set(exec->globalData(), this, new (exec) GlobalEvalFunction(exec, this, GlobalEvalFunction::createStructure(d()->functionPrototype.get()), 1, exec->propertyNames().eval, globalFuncEval, this));
     315    putDirectFunctionWithoutTransition(exec, d()->evalFunction.get(), DontEnum);
    316316    putDirectFunctionWithoutTransition(exec, new (exec) NativeFunctionWrapper(exec, this, d()->prototypeFunctionStructure.get(), 2, Identifier(exec, "parseInt"), globalFuncParseInt), DontEnum);
    317317    putDirectFunctionWithoutTransition(exec, new (exec) NativeFunctionWrapper(exec, this, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "parseFloat"), globalFuncParseFloat), DontEnum);
     
    337337
    338338    JSObject* oldLastInPrototypeChain = lastInPrototypeChain(this);
    339     JSObject* objectPrototype = d()->objectPrototype;
     339    JSObject* objectPrototype = d()->objectPrototype.get();
    340340    if (oldLastInPrototypeChain != objectPrototype)
    341341        oldLastInPrototypeChain->setPrototype(objectPrototype);
     
    350350        (*it)->markAggregate(markStack);
    351351
    352     markIfNeeded(markStack, d()->regExpConstructor);
    353     markIfNeeded(markStack, d()->errorConstructor);
    354     markIfNeeded(markStack, d()->evalErrorConstructor);
    355     markIfNeeded(markStack, d()->rangeErrorConstructor);
    356     markIfNeeded(markStack, d()->referenceErrorConstructor);
    357     markIfNeeded(markStack, d()->syntaxErrorConstructor);
    358     markIfNeeded(markStack, d()->typeErrorConstructor);
    359     markIfNeeded(markStack, d()->URIErrorConstructor);
    360 
    361     markIfNeeded(markStack, d()->evalFunction);
    362     markIfNeeded(markStack, d()->callFunction);
    363     markIfNeeded(markStack, d()->applyFunction);
    364 
    365     markIfNeeded(markStack, d()->objectPrototype);
    366     markIfNeeded(markStack, d()->functionPrototype);
    367     markIfNeeded(markStack, d()->arrayPrototype);
    368     markIfNeeded(markStack, d()->booleanPrototype);
    369     markIfNeeded(markStack, d()->stringPrototype);
    370     markIfNeeded(markStack, d()->numberPrototype);
    371     markIfNeeded(markStack, d()->datePrototype);
    372     markIfNeeded(markStack, d()->regExpPrototype);
    373 
    374     markIfNeeded(markStack, d()->methodCallDummy);
     352    markIfNeeded(markStack, &d()->regExpConstructor);
     353    markIfNeeded(markStack, &d()->errorConstructor);
     354    markIfNeeded(markStack, &d()->evalErrorConstructor);
     355    markIfNeeded(markStack, &d()->rangeErrorConstructor);
     356    markIfNeeded(markStack, &d()->referenceErrorConstructor);
     357    markIfNeeded(markStack, &d()->syntaxErrorConstructor);
     358    markIfNeeded(markStack, &d()->typeErrorConstructor);
     359    markIfNeeded(markStack, &d()->URIErrorConstructor);
     360
     361    markIfNeeded(markStack, &d()->evalFunction);
     362    markIfNeeded(markStack, &d()->callFunction);
     363    markIfNeeded(markStack, &d()->applyFunction);
     364
     365    markIfNeeded(markStack, &d()->objectPrototype);
     366    markIfNeeded(markStack, &d()->functionPrototype);
     367    markIfNeeded(markStack, &d()->arrayPrototype);
     368    markIfNeeded(markStack, &d()->booleanPrototype);
     369    markIfNeeded(markStack, &d()->stringPrototype);
     370    markIfNeeded(markStack, &d()->numberPrototype);
     371    markIfNeeded(markStack, &d()->datePrototype);
     372    markIfNeeded(markStack, &d()->regExpPrototype);
     373
     374    markIfNeeded(markStack, &d()->methodCallDummy);
    375375
    376376    markIfNeeded(markStack, d()->errorStructure);
     
    397397        // Outside the execution of global code, when our variables are torn off,
    398398        // we can mark the torn-off array.
    399         markStack.appendValues(d()->registerArray.get(), d()->registerArraySize);
     399        markStack.deprecatedAppendValues(d()->registerArray.get(), d()->registerArraySize);
    400400    } else if (d()->registers) {
    401401        // During execution of global code, when our variables are in the register file,
    402402        // the symbol table tells us how many variables there are, and registers
    403403        // points to where they end, and the registers used for execution begin.
    404         markStack.appendValues(d()->registers - symbolTable().size(), symbolTable().size());
     404        markStack.deprecatedAppendValues(d()->registers - symbolTable().size(), symbolTable().size());
    405405    }
    406406}
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h

    r77113 r77151  
    7474                , registerArraySize(0)
    7575                , globalScopeChain(NoScopeChain())
    76                 , regExpConstructor(0)
    77                 , errorConstructor(0)
    78                 , evalErrorConstructor(0)
    79                 , rangeErrorConstructor(0)
    80                 , referenceErrorConstructor(0)
    81                 , syntaxErrorConstructor(0)
    82                 , typeErrorConstructor(0)
    83                 , URIErrorConstructor(0)
    84                 , evalFunction(0)
    85                 , callFunction(0)
    86                 , applyFunction(0)
    87                 , objectPrototype(0)
    88                 , functionPrototype(0)
    89                 , arrayPrototype(0)
    90                 , booleanPrototype(0)
    91                 , stringPrototype(0)
    92                 , numberPrototype(0)
    93                 , datePrototype(0)
    94                 , regExpPrototype(0)
    95                 , methodCallDummy(0)
    9676                , weakRandom(static_cast<unsigned>(randomNumber() * (std::numeric_limits<unsigned>::max() + 1.0)))
    9777            {
     
    11090            Register globalCallFrame[RegisterFile::CallFrameHeaderSize];
    11191
    112             RegExpConstructor* regExpConstructor;
    113             ErrorConstructor* errorConstructor;
    114             NativeErrorConstructor* evalErrorConstructor;
    115             NativeErrorConstructor* rangeErrorConstructor;
    116             NativeErrorConstructor* referenceErrorConstructor;
    117             NativeErrorConstructor* syntaxErrorConstructor;
    118             NativeErrorConstructor* typeErrorConstructor;
    119             NativeErrorConstructor* URIErrorConstructor;
    120 
    121             GlobalEvalFunction* evalFunction;
    122             NativeFunctionWrapper* callFunction;
    123             NativeFunctionWrapper* applyFunction;
    124 
    125             ObjectPrototype* objectPrototype;
    126             FunctionPrototype* functionPrototype;
    127             ArrayPrototype* arrayPrototype;
    128             BooleanPrototype* booleanPrototype;
    129             StringPrototype* stringPrototype;
    130             NumberPrototype* numberPrototype;
    131             DatePrototype* datePrototype;
    132             RegExpPrototype* regExpPrototype;
    133 
    134             JSObject* methodCallDummy;
     92            WriteBarrier<RegExpConstructor> regExpConstructor;
     93            WriteBarrier<ErrorConstructor> errorConstructor;
     94            WriteBarrier<NativeErrorConstructor> evalErrorConstructor;
     95            WriteBarrier<NativeErrorConstructor> rangeErrorConstructor;
     96            WriteBarrier<NativeErrorConstructor> referenceErrorConstructor;
     97            WriteBarrier<NativeErrorConstructor> syntaxErrorConstructor;
     98            WriteBarrier<NativeErrorConstructor> typeErrorConstructor;
     99            WriteBarrier<NativeErrorConstructor> URIErrorConstructor;
     100
     101            WriteBarrier<GlobalEvalFunction> evalFunction;
     102            WriteBarrier<NativeFunctionWrapper> callFunction;
     103            WriteBarrier<NativeFunctionWrapper> applyFunction;
     104
     105            WriteBarrier<ObjectPrototype> objectPrototype;
     106            WriteBarrier<FunctionPrototype> functionPrototype;
     107            WriteBarrier<ArrayPrototype> arrayPrototype;
     108            WriteBarrier<BooleanPrototype> booleanPrototype;
     109            WriteBarrier<StringPrototype> stringPrototype;
     110            WriteBarrier<NumberPrototype> numberPrototype;
     111            WriteBarrier<DatePrototype> datePrototype;
     112            WriteBarrier<RegExpPrototype> regExpPrototype;
     113
     114            WriteBarrier<JSObject> methodCallDummy;
    135115
    136116            RefPtr<Structure> argumentsStructure;
     
    210190        // replaces the global object's associated property.
    211191
    212         RegExpConstructor* regExpConstructor() const { return d()->regExpConstructor; }
    213 
    214         ErrorConstructor* errorConstructor() const { return d()->errorConstructor; }
    215         NativeErrorConstructor* evalErrorConstructor() const { return d()->evalErrorConstructor; }
    216         NativeErrorConstructor* rangeErrorConstructor() const { return d()->rangeErrorConstructor; }
    217         NativeErrorConstructor* referenceErrorConstructor() const { return d()->referenceErrorConstructor; }
    218         NativeErrorConstructor* syntaxErrorConstructor() const { return d()->syntaxErrorConstructor; }
    219         NativeErrorConstructor* typeErrorConstructor() const { return d()->typeErrorConstructor; }
    220         NativeErrorConstructor* URIErrorConstructor() const { return d()->URIErrorConstructor; }
    221 
    222         GlobalEvalFunction* evalFunction() const { return d()->evalFunction; }
    223 
    224         ObjectPrototype* objectPrototype() const { return d()->objectPrototype; }
    225         FunctionPrototype* functionPrototype() const { return d()->functionPrototype; }
    226         ArrayPrototype* arrayPrototype() const { return d()->arrayPrototype; }
    227         BooleanPrototype* booleanPrototype() const { return d()->booleanPrototype; }
    228         StringPrototype* stringPrototype() const { return d()->stringPrototype; }
    229         NumberPrototype* numberPrototype() const { return d()->numberPrototype; }
    230         DatePrototype* datePrototype() const { return d()->datePrototype; }
    231         RegExpPrototype* regExpPrototype() const { return d()->regExpPrototype; }
    232 
    233         JSObject* methodCallDummy() const { return d()->methodCallDummy; }
     192        RegExpConstructor* regExpConstructor() const { return d()->regExpConstructor.get(); }
     193
     194        ErrorConstructor* errorConstructor() const { return d()->errorConstructor.get(); }
     195        NativeErrorConstructor* evalErrorConstructor() const { return d()->evalErrorConstructor.get(); }
     196        NativeErrorConstructor* rangeErrorConstructor() const { return d()->rangeErrorConstructor.get(); }
     197        NativeErrorConstructor* referenceErrorConstructor() const { return d()->referenceErrorConstructor.get(); }
     198        NativeErrorConstructor* syntaxErrorConstructor() const { return d()->syntaxErrorConstructor.get(); }
     199        NativeErrorConstructor* typeErrorConstructor() const { return d()->typeErrorConstructor.get(); }
     200        NativeErrorConstructor* URIErrorConstructor() const { return d()->URIErrorConstructor.get(); }
     201
     202        GlobalEvalFunction* evalFunction() const { return d()->evalFunction.get(); }
     203
     204        ObjectPrototype* objectPrototype() const { return d()->objectPrototype.get(); }
     205        FunctionPrototype* functionPrototype() const { return d()->functionPrototype.get(); }
     206        ArrayPrototype* arrayPrototype() const { return d()->arrayPrototype.get(); }
     207        BooleanPrototype* booleanPrototype() const { return d()->booleanPrototype.get(); }
     208        StringPrototype* stringPrototype() const { return d()->stringPrototype.get(); }
     209        NumberPrototype* numberPrototype() const { return d()->numberPrototype.get(); }
     210        DatePrototype* datePrototype() const { return d()->datePrototype.get(); }
     211        RegExpPrototype* regExpPrototype() const { return d()->regExpPrototype.get(); }
     212
     213        JSObject* methodCallDummy() const { return d()->methodCallDummy.get(); }
    234214
    235215        Structure* argumentsStructure() const { return d()->argumentsStructure.get(); }
     
    386366    {
    387367        if (typeInfo().type() == ObjectType)
    388             return m_prototype;
     368            return m_prototype.get();
    389369
    390370        ASSERT(typeInfo().type() == StringType);
     
    458438        MarkedArgumentBuffer values;
    459439        values.append(singleItemValue);
    460         return new (exec) JSArray(exec->lexicalGlobalObject()->arrayStructure(), values);
     440        return new (exec) JSArray(exec->globalData(), exec->lexicalGlobalObject()->arrayStructure(), values);
    461441    }
    462442
    463443    inline JSArray* constructArray(ExecState* exec, const ArgList& values)
    464444    {
    465         return new (exec) JSArray(exec->lexicalGlobalObject()->arrayStructure(), values);
     445        return new (exec) JSArray(exec->globalData(), exec->lexicalGlobalObject()->arrayStructure(), values);
    466446    }
    467447
  • trunk/Source/JavaScriptCore/runtime/JSONObject.cpp

    r77113 r77151  
    8585        Holder(JSObject*);
    8686
    87         JSObject* object() const { return m_object; }
     87        JSObject* object() const { return m_object.get(); }
     88        DeprecatedPtr<JSObject>* objectSlot() { return &m_object; }
    8889
    8990        bool appendNextProperty(Stringifier&, UStringBuilder&);
    9091
    9192    private:
    92         JSObject* const m_object;
     93        DeprecatedPtr<JSObject> m_object;
    9394        const bool m_isArray;
    9495        bool m_isJSArray;
     
    259260        size_t size = m_holderStack.size();
    260261        for (size_t i = 0; i < size; ++i)
    261             markStack.append(m_holderStack[i].object());
     262            markStack.append(m_holderStack[i].objectSlot());
    262263    }
    263264}
     
    270271
    271272    PropertyNameForFunctionCall emptyPropertyName(m_exec->globalData().propertyNames->emptyIdentifier);
    272     object->putDirect(m_exec->globalData().propertyNames->emptyIdentifier, value);
     273    object->putDirect(m_exec->globalData(), m_exec->globalData().propertyNames->emptyIdentifier, value);
    273274
    274275    UStringBuilder result;
     
    500501    if (!m_index) {
    501502        if (m_isArray) {
    502             m_isJSArray = isJSArray(&exec->globalData(), m_object);
     503            m_isJSArray = isJSArray(&exec->globalData(), m_object.get());
    503504            m_size = m_object->get(exec, exec->globalData().propertyNames->length).toUInt32(exec);
    504505            builder.append('[');
     
    533534        // Get the value.
    534535        JSValue value;
    535         if (m_isJSArray && asArray(m_object)->canGetIndex(index))
    536             value = asArray(m_object)->getIndex(index);
     536        if (m_isJSArray && asArray(m_object.get())->canGetIndex(index))
     537            value = asArray(m_object.get())->getIndex(index);
    537538        else {
    538             PropertySlot slot(m_object);
     539            PropertySlot slot(m_object.get());
    539540            if (!m_object->getOwnPropertySlot(exec, index, slot))
    540541                slot.setUndefined();
     
    550551
    551552        // Append the stringified value.
    552         stringifyResult = stringifier.appendStringifiedValue(builder, value, m_object, index);
     553        stringifyResult = stringifier.appendStringifiedValue(builder, value, m_object.get(), index);
    553554    } else {
    554555        // Get the value.
    555         PropertySlot slot(m_object);
     556        PropertySlot slot(m_object.get());
    556557        Identifier& propertyName = m_propertyNames->propertyNameVector()[index];
    557558        if (!m_object->getOwnPropertySlot(exec, propertyName, slot))
     
    575576
    576577        // Append the stringified value.
    577         stringifyResult = stringifier.appendStringifiedValue(builder, value, m_object, propertyName);
     578        stringifyResult = stringifier.appendStringifiedValue(builder, value, m_object.get(), propertyName);
    578579    }
    579580
     
    642643        JSValue args[] = { property, unfiltered };
    643644        ArgList argList(args, 2);
    644         return call(m_exec, m_function, m_callType, m_callData, thisObj, argList);
     645        return call(m_exec, m_function.get(), m_callType, m_callData, thisObj, argList);
    645646    }
    646647
     
    648649
    649650    ExecState* m_exec;
    650     JSObject* m_function;
     651    DeprecatedPtr<JSObject> m_function;
    651652    CallType m_callType;
    652653    CallData m_callData;
     
    727728                else {
    728729                    if (isJSArray(&m_exec->globalData(), array) && array->canSetIndex(indexStack.last()))
    729                         array->setIndex(indexStack.last(), filteredValue);
     730                        array->setIndex(m_exec->globalData(), indexStack.last(), filteredValue);
    730731                    else
    731732                        array->put(m_exec, indexStack.last(), filteredValue);
  • trunk/Source/JavaScriptCore/runtime/JSObject.cpp

    r77113 r77151  
    313313    if (object && object.isGetterSetter()) {
    314314        ASSERT(m_structure->hasGetterSetterProperties());
    315         asGetterSetter(object)->setGetter(getterFunction);
     315        asGetterSetter(object)->setGetter(exec->globalData(), getterFunction);
    316316        return;
    317317    }
     
    332332
    333333    m_structure->setHasGetterSetterProperties(true);
    334     getterSetter->setGetter(getterFunction);
     334    getterSetter->setGetter(exec->globalData(), getterFunction);
    335335}
    336336
     
    340340    if (object && object.isGetterSetter()) {
    341341        ASSERT(m_structure->hasGetterSetterProperties());
    342         asGetterSetter(object)->setSetter(setterFunction);
     342        asGetterSetter(object)->setSetter(exec->globalData(), setterFunction);
    343343        return;
    344344    }
     
    359359
    360360    m_structure->setHasGetterSetterProperties(true);
    361     getterSetter->setSetter(setterFunction);
     361    getterSetter->setSetter(exec->globalData(), setterFunction);
    362362}
    363363
     
    513513        offset = m_structure->removePropertyWithoutTransition(propertyName);
    514514        if (offset != WTF::notFound)
    515             putDirectOffset(offset, jsUndefined());
     515            putUndefinedAtDirectOffset(offset);
    516516        return;
    517517    }
     
    520520    setStructure(structure.release());
    521521    if (offset != WTF::notFound)
    522         putDirectOffset(offset, jsUndefined());
     522        putUndefinedAtDirectOffset(offset);
    523523}
    524524
    525525void JSObject::putDirectFunction(ExecState* exec, InternalFunction* function, unsigned attr)
    526526{
    527     putDirectFunction(Identifier(exec, function->name(exec)), function, attr);
     527    putDirectFunction(exec->globalData(), Identifier(exec, function->name(exec)), function, attr);
    528528}
    529529
    530530void JSObject::putDirectFunction(ExecState* exec, JSFunction* function, unsigned attr)
    531531{
    532     putDirectFunction(Identifier(exec, function->name(exec)), function, attr);
     532    putDirectFunction(exec->globalData(), Identifier(exec, function->name(exec)), function, attr);
    533533}
    534534
    535535void JSObject::putDirectFunctionWithoutTransition(ExecState* exec, InternalFunction* function, unsigned attr)
    536536{
    537     putDirectFunctionWithoutTransition(Identifier(exec, function->name(exec)), function, attr);
     537    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, function->name(exec)), function, attr);
    538538}
    539539
    540540void JSObject::putDirectFunctionWithoutTransition(ExecState* exec, JSFunction* function, unsigned attr)
    541541{
    542     putDirectFunctionWithoutTransition(Identifier(exec, function->name(exec)), function, attr);
     542    putDirectFunctionWithoutTransition(exec->globalData(), Identifier(exec, function->name(exec)), function, attr);
    543543}
    544544
     
    596596            if (oldDescriptor.getter()) {
    597597                attributes |= Getter;
    598                 accessor->setGetter(asObject(oldDescriptor.getter()));
     598                accessor->setGetter(exec->globalData(), asObject(oldDescriptor.getter()));
    599599            }
    600600            if (oldDescriptor.setter()) {
    601601                attributes |= Setter;
    602                 accessor->setSetter(asObject(oldDescriptor.setter()));
     602                accessor->setSetter(exec->globalData(), asObject(oldDescriptor.setter()));
    603603            }
    604604            target->putWithAttributes(exec, propertyName, accessor, attributes);
     
    721721    if (current.attributesEqual(descriptor)) {
    722722        if (descriptor.setter())
    723             getterSetter->setSetter(asObject(descriptor.setter()));
     723            getterSetter->setSetter(exec->globalData(), asObject(descriptor.setter()));
    724724        if (descriptor.getter())
    725             getterSetter->setGetter(asObject(descriptor.getter()));
     725            getterSetter->setGetter(exec->globalData(), asObject(descriptor.getter()));
    726726        return true;
    727727    }
     
    732732    if (descriptor.getter())
    733733        attrs |= Getter;
    734     putDirect(propertyName, getterSetter, attrs);
     734    putDirect(exec->globalData(), propertyName, getterSetter, attrs);
    735735    return true;
    736736}
  • trunk/Source/JavaScriptCore/runtime/JSObject.h

    r77113 r77151  
    7171    };
    7272
    73     typedef EncodedJSValue* PropertyStorage;
    74     typedef const EncodedJSValue* ConstPropertyStorage;
     73    typedef WriteBarrierBase<Unknown>* PropertyStorage;
     74    typedef const WriteBarrierBase<Unknown>* ConstPropertyStorage;
    7575
    7676    class JSObject : public JSCell {
     
    180180        bool hasGetterSetterProperties() { return m_structure->hasGetterSetterProperties(); }
    181181
    182         bool putDirect(const Identifier& propertyName, JSValue value, unsigned attr, bool checkReadOnly, PutPropertySlot& slot);
    183         void putDirect(const Identifier& propertyName, JSValue value, unsigned attr = 0);
    184         bool putDirect(const Identifier& propertyName, JSValue value, PutPropertySlot&);
    185 
    186         void putDirectFunction(const Identifier& propertyName, JSCell* value, unsigned attr = 0);
    187         void putDirectFunction(const Identifier& propertyName, JSCell* value, unsigned attr, bool checkReadOnly, PutPropertySlot& slot);
     182        bool putDirect(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr, bool checkReadOnly, PutPropertySlot&);
     183        void putDirect(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr = 0);
     184        bool putDirect(JSGlobalData&, const Identifier& propertyName, JSValue, PutPropertySlot&);
     185
     186        void putDirectFunction(JSGlobalData&, const Identifier& propertyName, JSCell*, unsigned attr = 0);
     187        void putDirectFunction(JSGlobalData&, const Identifier& propertyName, JSCell*, unsigned attr, bool checkReadOnly, PutPropertySlot&);
    188188        void putDirectFunction(ExecState* exec, InternalFunction* function, unsigned attr = 0);
    189189        void putDirectFunction(ExecState* exec, JSFunction* function, unsigned attr = 0);
    190190
    191         void putDirectWithoutTransition(const Identifier& propertyName, JSValue value, unsigned attr = 0);
    192         void putDirectFunctionWithoutTransition(const Identifier& propertyName, JSCell* value, unsigned attr = 0);
     191        void putDirectWithoutTransition(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr = 0);
     192        void putDirectFunctionWithoutTransition(JSGlobalData&, const Identifier& propertyName, JSCell* value, unsigned attr = 0);
    193193        void putDirectFunctionWithoutTransition(ExecState* exec, InternalFunction* function, unsigned attr = 0);
    194194        void putDirectFunctionWithoutTransition(ExecState* exec, JSFunction* function, unsigned attr = 0);
    195195
    196196        // Fast access to known property offsets.
    197         JSValue getDirectOffset(size_t offset) const { return JSValue::decode(propertyStorage()[offset]); }
    198         void putDirectOffset(size_t offset, JSValue value) { propertyStorage()[offset] = JSValue::encode(value); }
     197        JSValue getDirectOffset(size_t offset) const { return propertyStorage()[offset].get(); }
     198        void putDirectOffset(JSGlobalData& globalData, size_t offset, JSValue value) { propertyStorage()[offset].set(globalData, this, value); }
     199        void putUndefinedAtDirectOffset(size_t offset) { propertyStorage()[offset].setUndefined(); }
    199200
    200201        void fillGetterPropertySlot(PropertySlot&, JSValue* location);
     
    226227        }
    227228
    228         void flattenDictionaryObject()
    229         {
    230             m_structure->flattenDictionaryStructure(this);
     229        void flattenDictionaryObject(JSGlobalData& globalData)
     230        {
     231            m_structure->flattenDictionaryStructure(globalData, this);
    231232        }
    232233
     
    268269        }
    269270
    270         bool putDirectInternal(const Identifier& propertyName, JSValue value, unsigned attr, bool checkReadOnly, PutPropertySlot& slot, JSCell*);
    271         bool putDirectInternal(JSGlobalData&, const Identifier& propertyName, JSValue value, unsigned attr, bool checkReadOnly, PutPropertySlot& slot);
     271        bool putDirectInternal(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr, bool checkReadOnly, PutPropertySlot&, JSCell*);
     272        bool putDirectInternal(JSGlobalData&, const Identifier& propertyName, JSValue, unsigned attr, bool checkReadOnly, PutPropertySlot&);
    272273        void putDirectInternal(JSGlobalData&, const Identifier& propertyName, JSValue value, unsigned attr = 0);
    273274
     
    279280        union {
    280281            PropertyStorage m_externalStorage;
    281             EncodedJSValue m_inlineStorage[inlineStorageCapacity];
     282            WriteBarrierBase<Unknown> m_inlineStorage[inlineStorageCapacity];
    282283        };
    283284
     
    451452}
    452453
    453 inline bool JSObject::putDirectInternal(const Identifier& propertyName, JSValue value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot, JSCell* specificFunction)
     454inline bool JSObject::putDirectInternal(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot, JSCell* specificFunction)
    454455{
    455456    ASSERT(value);
     
    468469                return false;
    469470
    470             putDirectOffset(offset, value);
     471            putDirectOffset(globalData, offset, value);
    471472            // At this point, the objects structure only has a specific value set if previously there
    472473            // had been one set, and if the new value being specified is the same (otherwise we would
     
    486487
    487488        ASSERT(offset < m_structure->propertyStorageCapacity());
    488         putDirectOffset(offset, value);
     489        putDirectOffset(globalData, offset, value);
    489490        // See comment on setNewProperty call below.
    490491        if (!specificFunction)
     
    501502        ASSERT(offset < structure->propertyStorageCapacity());
    502503        setStructure(structure.release());
    503         putDirectOffset(offset, value);
     504        putDirectOffset(globalData, offset, value);
    504505        // This is a new property; transitions with specific values are not currently cachable,
    505506        // so leave the slot in an uncachable state.
     
    528529            // case (1) Do the put, then return leaving the slot uncachable.
    529530            if (specificFunction == currentSpecificFunction) {
    530                 putDirectOffset(offset, value);
     531                putDirectOffset(globalData, offset, value);
    531532                return true;
    532533            }
     
    537538        // case (3) set the slot, do the put, return.
    538539        slot.setExistingProperty(this, offset);
    539         putDirectOffset(offset, value);
     540        putDirectOffset(globalData, offset, value);
    540541        return true;
    541542    }
     
    558559    ASSERT(offset < structure->propertyStorageCapacity());
    559560    setStructure(structure.release());
    560     putDirectOffset(offset, value);
     561    putDirectOffset(globalData, offset, value);
    561562    // This is a new property; transitions with specific values are not currently cachable,
    562563    // so leave the slot in an uncachable state.
     
    571572    ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this));
    572573
    573     return putDirectInternal(propertyName, value, attributes, checkReadOnly, slot, getJSFunction(globalData, value));
     574    return putDirectInternal(globalData, propertyName, value, attributes, checkReadOnly, slot, getJSFunction(globalData, value));
    574575}
    575576
     
    577578{
    578579    PutPropertySlot slot;
    579     putDirectInternal(propertyName, value, attributes, false, slot, getJSFunction(globalData, value));
    580 }
    581 
    582 inline bool JSObject::putDirect(const Identifier& propertyName, JSValue value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot)
     580    putDirectInternal(globalData, propertyName, value, attributes, false, slot, getJSFunction(globalData, value));
     581}
     582
     583inline bool JSObject::putDirect(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot)
    583584{
    584585    ASSERT(value);
    585586    ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this));
    586587
    587     return putDirectInternal(propertyName, value, attributes, checkReadOnly, slot, 0);
    588 }
    589 
    590 inline void JSObject::putDirect(const Identifier& propertyName, JSValue value, unsigned attributes)
     588    return putDirectInternal(globalData, propertyName, value, attributes, checkReadOnly, slot, 0);
     589}
     590
     591inline void JSObject::putDirect(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes)
    591592{
    592593    PutPropertySlot slot;
    593     putDirectInternal(propertyName, value, attributes, false, slot, 0);
    594 }
    595 
    596 inline bool JSObject::putDirect(const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
    597 {
    598     return putDirectInternal(propertyName, value, 0, false, slot, 0);
    599 }
    600 
    601 inline void JSObject::putDirectFunction(const Identifier& propertyName, JSCell* value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot)
    602 {
    603     putDirectInternal(propertyName, value, attributes, checkReadOnly, slot, value);
    604 }
    605 
    606 inline void JSObject::putDirectFunction(const Identifier& propertyName, JSCell* value, unsigned attr)
     594    putDirectInternal(globalData, propertyName, value, attributes, false, slot, 0);
     595}
     596
     597inline bool JSObject::putDirect(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
     598{
     599    return putDirectInternal(globalData, propertyName, value, 0, false, slot, 0);
     600}
     601
     602inline void JSObject::putDirectFunction(JSGlobalData& globalData, const Identifier& propertyName, JSCell* value, unsigned attributes, bool checkReadOnly, PutPropertySlot& slot)
     603{
     604    putDirectInternal(globalData, propertyName, value, attributes, checkReadOnly, slot, value);
     605}
     606
     607inline void JSObject::putDirectFunction(JSGlobalData& globalData, const Identifier& propertyName, JSCell* value, unsigned attr)
    607608{
    608609    PutPropertySlot slot;
    609     putDirectInternal(propertyName, value, attr, false, slot, value);
    610 }
    611 
    612 inline void JSObject::putDirectWithoutTransition(const Identifier& propertyName, JSValue value, unsigned attributes)
     610    putDirectInternal(globalData, propertyName, value, attr, false, slot, value);
     611}
     612
     613inline void JSObject::putDirectWithoutTransition(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes)
    613614{
    614615    size_t currentCapacity = m_structure->propertyStorageCapacity();
     
    616617    if (currentCapacity != m_structure->propertyStorageCapacity())
    617618        allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
    618     putDirectOffset(offset, value);
    619 }
    620 
    621 inline void JSObject::putDirectFunctionWithoutTransition(const Identifier& propertyName, JSCell* value, unsigned attributes)
     619    putDirectOffset(globalData, offset, value);
     620}
     621
     622inline void JSObject::putDirectFunctionWithoutTransition(JSGlobalData& globalData, const Identifier& propertyName, JSCell* value, unsigned attributes)
    622623{
    623624    size_t currentCapacity = m_structure->propertyStorageCapacity();
     
    625626    if (currentCapacity != m_structure->propertyStorageCapacity())
    626627        allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
    627     putDirectOffset(offset, value);
     628    putDirectOffset(globalData, offset, value);
    628629}
    629630
     
    704705{
    705706    ASSERT(isCell() && isObject());
    706     if (!asObject(asCell())->putDirect(propertyName, value, slot) && slot.isStrictMode())
     707    if (!asObject(asCell())->putDirect(exec->globalData(), propertyName, value, slot) && slot.isStrictMode())
    707708        throwTypeError(exec, StrictModeReadonlyPropertyWriteError);
    708709}
     
    726727
    727728    PropertyStorage oldPropertyStorage = (wasInline ? m_inlineStorage : m_externalStorage);
    728     PropertyStorage newPropertyStorage = new EncodedJSValue[newSize];
     729    PropertyStorage newPropertyStorage = new WriteBarrierBase<Unknown>[newSize];
    729730
    730731    for (unsigned i = 0; i < oldSize; ++i)
     
    741742    JSCell::markChildren(markStack);
    742743
    743     markStack.append(prototype());
    744    
     744    markStack.append(m_structure->storedPrototypeSlot());
    745745    PropertyStorage storage = propertyStorage();
    746746    size_t storageSize = m_structure->propertyStorageSize();
    747     markStack.appendValues(reinterpret_cast<JSValue*>(storage), storageSize);
     747    markStack.appendValues(storage, storageSize);
    748748}
    749749
  • trunk/Source/JavaScriptCore/runtime/JSPropertyNameIterator.cpp

    r77113 r77151  
    4141    , m_numCacheableSlots(numCacheableSlots)
    4242    , m_jsStringsSize(propertyNameArrayData->propertyNameVector().size())
    43     , m_jsStrings(new JSValue[m_jsStringsSize])
     43    , m_jsStrings(new WriteBarrier<Unknown>[m_jsStringsSize])
    4444{
    4545    PropertyNameArrayData::PropertyNameVector& propertyNameVector = propertyNameArrayData->propertyNameVector();
    4646    for (size_t i = 0; i < m_jsStringsSize; ++i)
    47         m_jsStrings[i] = jsOwnedString(exec, propertyNameVector[i].ustring());
     47        m_jsStrings[i].set(exec->globalData(), this, jsOwnedString(exec, propertyNameVector[i].ustring()));
    4848}
    4949
     
    9292JSValue JSPropertyNameIterator::get(ExecState* exec, JSObject* base, size_t i)
    9393{
    94     JSValue& identifier = m_jsStrings[i];
     94    JSValue identifier = m_jsStrings[i].get();
    9595    if (m_cachedStructure == base->structure() && m_cachedPrototypeChain == base->structure()->prototypeChain(exec))
    9696        return identifier;
  • trunk/Source/JavaScriptCore/runtime/JSPropertyNameIterator.h

    r77113 r77151  
    8686        uint32_t m_numCacheableSlots;
    8787        uint32_t m_jsStringsSize;
    88         OwnArrayPtr<JSValue> m_jsStrings;
     88        OwnArrayPtr<WriteBarrier<Unknown> > m_jsStrings;
    8989    };
    9090
  • trunk/Source/JavaScriptCore/runtime/JSStaticScopeObject.cpp

    r77113 r77151  
    3535{
    3636    JSVariableObject::markChildren(markStack);
    37     markStack.append(d()->registerStore.jsValue());
     37    markStack.deprecatedAppend(&d()->registerStore);
    3838}
    3939
  • trunk/Source/JavaScriptCore/runtime/JSString.cpp

    r77113 r77151  
    256256inline StringObject* StringObject::create(ExecState* exec, JSString* string)
    257257{
    258     return new (exec) StringObject(exec->lexicalGlobalObject()->stringObjectStructure(), string);
     258    return new (exec) StringObject(exec->globalData(), exec->lexicalGlobalObject()->stringObjectStructure(), string);
    259259}
    260260
  • trunk/Source/JavaScriptCore/runtime/JSValue.h

    r77113 r77151  
    4848    struct Instruction;
    4949
     50    template <class T> class DeprecatedPtr;
     51    template <class T> class WriteBarrierBase;
     52
    5053    enum PreferredPrimitiveType { NoPreference, PreferNumber, PreferString };
    5154
     
    213216
    214217    private:
     218        template <class T> JSValue(DeprecatedPtr<T>);
     219        template <class T> JSValue(WriteBarrierBase<T>);
     220
    215221        enum HashTableDeletedValueTag { HashTableDeletedValue };
    216222        JSValue(HashTableDeletedValueTag);
  • trunk/Source/JavaScriptCore/runtime/JSWrapperObject.cpp

    r77113 r77151  
    3131    JSObject::markChildren(markStack);
    3232    if (m_internalValue)
    33         markStack.append(m_internalValue);
     33        markStack.append(&m_internalValue);
    3434}
    3535
  • trunk/Source/JavaScriptCore/runtime/JSWrapperObject.h

    r77113 r77151  
    3434
    3535    public:
    36         JSValue internalValue() const { return m_internalValue; }
    37         void setInternalValue(JSValue);
     36        JSValue internalValue() const { return m_internalValue.get(); }
     37        void setInternalValue(JSGlobalData&, JSValue);
    3838
    3939        static PassRefPtr<Structure> createStructure(JSValue prototype)
     
    4848        virtual void markChildren(MarkStack&);
    4949       
    50         JSValue m_internalValue;
     50        WriteBarrier<Unknown> m_internalValue;
    5151    };
    5252
     
    5757    }
    5858
    59     inline void JSWrapperObject::setInternalValue(JSValue value)
     59    inline void JSWrapperObject::setInternalValue(JSGlobalData& globalData, JSValue value)
    6060    {
    6161        ASSERT(value);
    6262        ASSERT(!value.isObject());
    63         m_internalValue = value;
     63        m_internalValue.set(globalData, this, value);
    6464        putAnonymousValue(0, value);
    6565    }
  • trunk/Source/JavaScriptCore/runtime/LiteralParser.cpp

    r77113 r77151  
    374374            case DoParseObjectEndExpression:
    375375            {
    376                 asObject(objectStack.last())->putDirect(identifierStack.last(), lastValue);
     376                asObject(objectStack.last())->putDirect(m_exec->globalData(), identifierStack.last(), lastValue);
    377377                identifierStack.removeLast();
    378378                if (m_lexer.currentToken().type == TokComma)
  • trunk/Source/JavaScriptCore/runtime/Lookup.cpp

    r77113 r77151  
    8787            function = new (exec) NativeFunctionWrapper(exec, globalObject, globalObject->prototypeFunctionStructure(), entry->functionLength(), propertyName, entry->function());
    8888
    89         thisObj->putDirectFunction(propertyName, function, entry->attributes());
     89        thisObj->putDirectFunction(exec->globalData(), propertyName, function, entry->attributes());
    9090        location = thisObj->getDirectLocation(propertyName);
    9191    }
  • trunk/Source/JavaScriptCore/runtime/Lookup.h

    r77113 r77151  
    313313        if (entry->attributes() & Function) { // function: put as override property
    314314            if (LIKELY(value.isCell()))
    315                 thisObj->putDirectFunction(propertyName, value.asCell());
     315                thisObj->putDirectFunction(exec->globalData(), propertyName, value.asCell());
    316316            else
    317                 thisObj->putDirect(propertyName, value);
     317                thisObj->putDirect(exec->globalData(), propertyName, value);
    318318        } else if (!(entry->attributes() & ReadOnly))
    319319            entry->propertyPutter()(exec, thisObj, value);
  • trunk/Source/JavaScriptCore/runtime/MarkStack.h

    r77113 r77151  
    2828
    2929#include "JSValue.h"
     30#include "WriteBarrier.h"
    3031#include <wtf/Vector.h>
    3132#include <wtf/Noncopyable.h>
     
    5051        {
    5152        }
    52 
    53         ALWAYS_INLINE void append(JSValue);
    54         void append(JSCell*);
    5553       
    56         ALWAYS_INLINE void appendValues(Register* values, size_t count, MarkSetProperties properties = NoNullValues)
    57         {
    58             appendValues(reinterpret_cast<JSValue*>(values), count, properties);
    59         }
    60 
    61         ALWAYS_INLINE void appendValues(JSValue* values, size_t count, MarkSetProperties properties = NoNullValues)
    62         {
     54        void deprecatedAppend(JSValue*);
     55        void deprecatedAppend(JSCell**);
     56        void deprecatedAppend(Register*);
     57        template <typename T> void append(WriteBarrierBase<T>*);
     58        template <typename T> void append(DeprecatedPtr<T>*);
     59       
     60        ALWAYS_INLINE void deprecatedAppendValues(Register* registers, size_t count, MarkSetProperties properties = NoNullValues)
     61        {
     62            JSValue* values = reinterpret_cast<JSValue*>(registers);
    6363            if (count)
    6464                m_markSets.append(MarkSet(values, values + count, properties));
    6565        }
    6666
     67        void appendValues(WriteBarrierBase<Unknown>* barriers, size_t count, MarkSetProperties properties = NoNullValues)
     68        {
     69            JSValue* values = barriers->slot();
     70            if (count)
     71                m_markSets.append(MarkSet(values, values + count, properties));
     72        }
     73
    6774        inline void drain();
    6875        void compact();
     
    7582
    7683    private:
     84        void internalAppend(JSCell*);
     85        void internalAppend(JSValue);
    7786        void markChildren(JSCell*);
    7887
  • trunk/Source/JavaScriptCore/runtime/MathObject.cpp

    r77113 r77151  
    9090    : JSObjectWithGlobalObject(globalObject, structure)
    9191{
    92     putDirectWithoutTransition(Identifier(exec, "E"), jsNumber(exp(1.0)), DontDelete | DontEnum | ReadOnly);
    93     putDirectWithoutTransition(Identifier(exec, "LN2"), jsNumber(log(2.0)), DontDelete | DontEnum | ReadOnly);
    94     putDirectWithoutTransition(Identifier(exec, "LN10"), jsNumber(log(10.0)), DontDelete | DontEnum | ReadOnly);
    95     putDirectWithoutTransition(Identifier(exec, "LOG2E"), jsNumber(1.0 / log(2.0)), DontDelete | DontEnum | ReadOnly);
    96     putDirectWithoutTransition(Identifier(exec, "LOG10E"), jsNumber(1.0 / log(10.0)), DontDelete | DontEnum | ReadOnly);
    97     putDirectWithoutTransition(Identifier(exec, "PI"), jsNumber(piDouble), DontDelete | DontEnum | ReadOnly);
    98     putDirectWithoutTransition(Identifier(exec, "SQRT1_2"), jsNumber(sqrt(0.5)), DontDelete | DontEnum | ReadOnly);
    99     putDirectWithoutTransition(Identifier(exec, "SQRT2"), jsNumber(sqrt(2.0)), DontDelete | DontEnum | ReadOnly);
     92    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "E"), jsNumber(exp(1.0)), DontDelete | DontEnum | ReadOnly);
     93    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "LN2"), jsNumber(log(2.0)), DontDelete | DontEnum | ReadOnly);
     94    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "LN10"), jsNumber(log(10.0)), DontDelete | DontEnum | ReadOnly);
     95    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "LOG2E"), jsNumber(1.0 / log(2.0)), DontDelete | DontEnum | ReadOnly);
     96    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "LOG10E"), jsNumber(1.0 / log(10.0)), DontDelete | DontEnum | ReadOnly);
     97    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "PI"), jsNumber(piDouble), DontDelete | DontEnum | ReadOnly);
     98    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "SQRT1_2"), jsNumber(sqrt(0.5)), DontDelete | DontEnum | ReadOnly);
     99    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "SQRT2"), jsNumber(sqrt(2.0)), DontDelete | DontEnum | ReadOnly);
    100100}
    101101
  • trunk/Source/JavaScriptCore/runtime/NativeErrorConstructor.cpp

    r77113 r77151  
    3838    NativeErrorPrototype* prototype = new (exec) NativeErrorPrototype(exec, globalObject, prototypeStructure, nameAndMessage, this);
    3939
    40     putDirect(exec->propertyNames().length, jsNumber(1), DontDelete | ReadOnly | DontEnum); // ECMA 15.11.7.5
    41     putDirect(exec->propertyNames().prototype, prototype, DontDelete | ReadOnly | DontEnum);
     40    putDirect(exec->globalData(), exec->propertyNames().length, jsNumber(1), DontDelete | ReadOnly | DontEnum); // ECMA 15.11.7.5
     41    putDirect(exec->globalData(), exec->propertyNames().prototype, prototype, DontDelete | ReadOnly | DontEnum);
    4242    m_errorStructure = ErrorInstance::createStructure(prototype);
    4343}
  • trunk/Source/JavaScriptCore/runtime/NativeErrorPrototype.cpp

    r77113 r77151  
    3535    : JSObjectWithGlobalObject(globalObject, structure)
    3636{
    37     putDirect(exec->propertyNames().name, jsString(exec, nameAndMessage), 0);
    38     putDirect(exec->propertyNames().message, jsString(exec, nameAndMessage), 0);
    39     putDirect(exec->propertyNames().constructor, constructor, DontEnum);
     37    putDirect(exec->globalData(), exec->propertyNames().name, jsString(exec, nameAndMessage), 0);
     38    putDirect(exec->globalData(), exec->propertyNames().message, jsString(exec, nameAndMessage), 0);
     39    putDirect(exec->globalData(), exec->propertyNames().constructor, constructor, DontEnum);
    4040}
    4141
  • trunk/Source/JavaScriptCore/runtime/NumberConstructor.cpp

    r77113 r77151  
    5959{
    6060    // Number.Prototype
    61     putDirectWithoutTransition(exec->propertyNames().prototype, numberPrototype, DontEnum | DontDelete | ReadOnly);
     61    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, numberPrototype, DontEnum | DontDelete | ReadOnly);
    6262
    6363    // no. of arguments for constructor
    64     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(1), ReadOnly | DontEnum | DontDelete);
     64    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(1), ReadOnly | DontEnum | DontDelete);
    6565}
    6666
     
    105105    NumberObject* object = new (exec) NumberObject(exec->lexicalGlobalObject()->numberObjectStructure());
    106106    double n = exec->argumentCount() ? exec->argument(0).toNumber(exec) : 0;
    107     object->setInternalValue(jsNumber(n));
     107    object->setInternalValue(exec->globalData(), jsNumber(n));
    108108    return JSValue::encode(object);
    109109}
  • trunk/Source/JavaScriptCore/runtime/NumberObject.cpp

    r77113 r77151  
    4545{
    4646    NumberObject* object = new (exec) NumberObject(exec->lexicalGlobalObject()->numberObjectStructure());
    47     object->setInternalValue(number);
     47    object->setInternalValue(exec->globalData(), number);
    4848    return object;
    4949}
  • trunk/Source/JavaScriptCore/runtime/NumberPrototype.cpp

    r77113 r77151  
    5050    : NumberObject(structure)
    5151{
    52     setInternalValue(jsNumber(0));
     52    setInternalValue(exec->globalData(), jsNumber(0));
    5353
    5454    // The constructor will be added later, after NumberConstructor has been constructed
  • trunk/Source/JavaScriptCore/runtime/ObjectConstructor.cpp

    r77113 r77151  
    4848{
    4949    // ECMA 15.2.3.1
    50     putDirectWithoutTransition(exec->propertyNames().prototype, objectPrototype, DontEnum | DontDelete | ReadOnly);
     50    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, objectPrototype, DontEnum | DontDelete | ReadOnly);
    5151   
    5252    // no. of arguments for constructor
    53     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(1), ReadOnly | DontEnum | DontDelete);
     53    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(1), ReadOnly | DontEnum | DontDelete);
    5454   
    5555    putDirectFunctionWithoutTransition(exec, new (exec) NativeFunctionWrapper(exec, globalObject, prototypeFunctionStructure, 1, exec->propertyNames().getPrototypeOf, objectConstructorGetPrototypeOf), DontEnum);
     
    118118    JSObject* description = constructEmptyObject(exec);
    119119    if (!descriptor.isAccessorDescriptor()) {
    120         description->putDirect(exec->propertyNames().value, descriptor.value() ? descriptor.value() : jsUndefined(), 0);
    121         description->putDirect(exec->propertyNames().writable, jsBoolean(descriptor.writable()), 0);
     120        description->putDirect(exec->globalData(), exec->propertyNames().value, descriptor.value() ? descriptor.value() : jsUndefined(), 0);
     121        description->putDirect(exec->globalData(), exec->propertyNames().writable, jsBoolean(descriptor.writable()), 0);
    122122    } else {
    123         description->putDirect(exec->propertyNames().get, descriptor.getter() ? descriptor.getter() : jsUndefined(), 0);
    124         description->putDirect(exec->propertyNames().set, descriptor.setter() ? descriptor.setter() : jsUndefined(), 0);
     123        description->putDirect(exec->globalData(), exec->propertyNames().get, descriptor.getter() ? descriptor.getter() : jsUndefined(), 0);
     124        description->putDirect(exec->globalData(), exec->propertyNames().set, descriptor.setter() ? descriptor.setter() : jsUndefined(), 0);
    125125    }
    126126   
    127     description->putDirect(exec->propertyNames().enumerable, jsBoolean(descriptor.enumerable()), 0);
    128     description->putDirect(exec->propertyNames().configurable, jsBoolean(descriptor.configurable()), 0);
     127    description->putDirect(exec->globalData(), exec->propertyNames().enumerable, jsBoolean(descriptor.enumerable()), 0);
     128    description->putDirect(exec->globalData(), exec->propertyNames().configurable, jsBoolean(descriptor.configurable()), 0);
    129129
    130130    return JSValue::encode(description);
  • trunk/Source/JavaScriptCore/runtime/Operations.h

    r77113 r77151  
    430430            // should not be treated as a dictionary.
    431431            if (cell->structure()->isDictionary()) {
    432                 asObject(cell)->flattenDictionaryObject();
     432                asObject(cell)->flattenDictionaryObject(callFrame->globalData());
    433433                if (slotBase == cell)
    434434                    slotOffset = cell->structure()->get(propertyName);
     
    455455            // should not be treated as a dictionary.
    456456            if (base->structure()->isDictionary())
    457                 asObject(base)->flattenDictionaryObject();
     457                asObject(base)->flattenDictionaryObject(callFrame->globalData());
    458458
    459459            ++count;
     
    472472        JSObject* base;
    473473        while (true) {
    474             base = *iter;
     474            base = iter->get();
    475475            if (next == end)
    476476                return isStrictPut ? JSValue() : base;
  • trunk/Source/JavaScriptCore/runtime/PrototypeFunction.cpp

    r77113 r77151  
    3838{
    3939    ASSERT_ARG(function, function);
    40     putDirect(exec->propertyNames().length, jsNumber(length), DontDelete | ReadOnly | DontEnum);
     40    putDirect(exec->globalData(), exec->propertyNames().length, jsNumber(length), DontDelete | ReadOnly | DontEnum);
    4141}
    4242
     
    4646{
    4747    ASSERT_ARG(function, function);
    48     putDirect(exec->propertyNames().length, jsNumber(length), DontDelete | ReadOnly | DontEnum);
     48    putDirect(exec->globalData(), exec->propertyNames().length, jsNumber(length), DontDelete | ReadOnly | DontEnum);
    4949}
    5050   
  • trunk/Source/JavaScriptCore/runtime/PutPropertySlot.h

    r77113 r77151  
    4646        }
    4747
    48         void setExistingProperty(JSObject* base, size_t offset)
     48        void setExistingProperty(DeprecatedPtr<JSObject> base, size_t offset)
    4949        {
    5050            m_type = ExistingProperty;
     
    5353        }
    5454
    55         void setNewProperty(JSObject* base, size_t offset)
     55        void setNewProperty(DeprecatedPtr<JSObject> base, size_t offset)
    5656        {
    5757            m_type = NewProperty;
     
    6161
    6262        Type type() const { return m_type; }
    63         JSObject* base() const { return m_base; }
     63        JSObject* base() const { return m_base.get(); }
    6464
    6565        bool isStrictMode() const { return m_isStrictMode; }
     
    7171    private:
    7272        Type m_type;
    73         JSObject* m_base;
     73        DeprecatedPtr<JSObject> m_base;
    7474        size_t m_offset;
    7575        bool m_isStrictMode;
  • trunk/Source/JavaScriptCore/runtime/RegExpConstructor.cpp

    r77113 r77151  
    101101{
    102102    // ECMA 15.10.5.1 RegExp.prototype
    103     putDirectWithoutTransition(exec->propertyNames().prototype, regExpPrototype, DontEnum | DontDelete | ReadOnly);
     103    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, regExpPrototype, DontEnum | DontDelete | ReadOnly);
    104104
    105105    // no. of arguments for constructor
    106     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(2), ReadOnly | DontDelete | DontEnum);
     106    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(2), ReadOnly | DontDelete | DontEnum);
    107107}
    108108
  • trunk/Source/JavaScriptCore/runtime/ScopeChain.cpp

    r77113 r77151  
    3636    ScopeChainIterator scopeEnd = end();
    3737    for (ScopeChainIterator scopeIter = begin(); scopeIter != scopeEnd; ++scopeIter) {
    38         JSObject* o = *scopeIter;
     38        DeprecatedPtr<JSObject> o = *scopeIter;
    3939        PropertyNameArray propertyNames(globalObject->globalExec());
    4040        o->getPropertyNames(globalObject->globalExec(), propertyNames);
    4141        PropertyNameArray::const_iterator propEnd = propertyNames.end();
    4242
    43         fprintf(stderr, "----- [scope %p] -----\n", o);
     43        fprintf(stderr, "----- [scope %p] -----\n", o.get());
    4444        for (PropertyNameArray::const_iterator propIter = propertyNames.begin(); propIter != propEnd; propIter++) {
    4545            Identifier name = *propIter;
  • trunk/Source/JavaScriptCore/runtime/ScopeChain.h

    r77113 r77151  
    2222#define ScopeChain_h
    2323
     24#include "WriteBarrier.h"
    2425#include <wtf/FastAllocBase.h>
    2526
     
    5354        {
    5455            next = 0;
    55             object = 0;
    5656            globalData = 0;
    5757            globalObject = 0;
     
    6161
    6262        ScopeChainNode* next;
    63         JSObject* object;
     63        DeprecatedPtr<JSObject> object;
    6464        JSGlobalData* globalData;
    6565        JSGlobalObject* globalObject;
     
    132132        }
    133133
    134         JSObject* const & operator*() const { return m_node->object; }
    135         JSObject* const * operator->() const { return &(operator*()); }
     134        DeprecatedPtr<JSObject> const & operator*() const { return m_node->object; }
     135        DeprecatedPtr<JSObject> const * operator->() const { return &(operator*()); }
    136136   
    137137        ScopeChainIterator& operator++() { m_node = m_node->next; return *this; }
     
    196196        ScopeChainNode* node() const { return m_node; }
    197197
    198         JSObject* top() const { return m_node->object; }
     198        JSObject* top() const { return m_node->object.get(); }
    199199
    200200        ScopeChainIterator begin() const { return m_node->begin(); }
  • trunk/Source/JavaScriptCore/runtime/ScopeChainMark.h

    r77113 r77151  
    2929    {
    3030        for (ScopeChainNode* n = m_node; n; n = n->next)
    31             markStack.append(n->object);
     31            markStack.append(&n->object);
    3232    }
    3333
  • trunk/Source/JavaScriptCore/runtime/SmallStrings.cpp

    r77113 r77151  
    3636static const unsigned numCharactersToStore = 0x100;
    3737
    38 static inline bool isMarked(JSString* string)
     38static inline bool isMarked(JSCell* string)
    3939{
    4040    return string && Heap::isCellMarked(string);
     
    8484     */
    8585
    86     bool isAnyStringMarked = isMarked(m_emptyString);
     86    bool isAnyStringMarked = isMarked(m_emptyString.get());
    8787    for (unsigned i = 0; i < numCharactersToStore && !isAnyStringMarked; ++i)
    88         isAnyStringMarked = isMarked(m_singleCharacterStrings[i]);
     88        isAnyStringMarked = isMarked(m_singleCharacterStrings[i].get());
    8989   
    9090    if (!isAnyStringMarked) {
     
    9494   
    9595    if (m_emptyString)
    96         markStack.append(m_emptyString);
     96        markStack.append(&m_emptyString);
    9797    for (unsigned i = 0; i < numCharactersToStore; ++i) {
    9898        if (m_singleCharacterStrings[i])
    99             markStack.append(m_singleCharacterStrings[i]);
     99            markStack.append(&m_singleCharacterStrings[i]);
    100100    }
    101101}
  • trunk/Source/JavaScriptCore/runtime/SmallStrings.h

    r77113 r77151  
    2828
    2929#include "UString.h"
     30#include "WriteBarrier.h"
    3031#include <wtf/FixedArray.h>
    3132#include <wtf/OwnPtr.h>
     
    4849            if (!m_emptyString)
    4950                createEmptyString(globalData);
    50             return m_emptyString;
     51            return m_emptyString.get();
    5152        }
    5253        JSString* singleCharacterString(JSGlobalData* globalData, unsigned char character)
     
    5455            if (!m_singleCharacterStrings[character])
    5556                createSingleCharacterString(globalData, character);
    56             return m_singleCharacterStrings[character];
     57            return m_singleCharacterStrings[character].get();
    5758        }
    5859
     
    6465        unsigned count() const;
    6566#if ENABLE(JIT)
    66         JSString** singleCharacterStrings() { return m_singleCharacterStrings.data(); }
     67        JSCell** singleCharacterStrings() { return m_singleCharacterStrings[0].slot(); }
    6768#endif
    6869    private:
     
    7071        void createSingleCharacterString(JSGlobalData*, unsigned char);
    7172
    72         JSString* m_emptyString;
    73         FixedArray<JSString*, 0x100> m_singleCharacterStrings;
     73        DeprecatedPtr<JSString> m_emptyString;
     74        FixedArray<DeprecatedPtr<JSString>, 0x100> m_singleCharacterStrings;
    7475        OwnPtr<SmallStringsStorage> m_storage;
    7576    };
  • trunk/Source/JavaScriptCore/runtime/StringConstructor.cpp

    r77113 r77151  
    5454{
    5555    // ECMA 15.5.3.1 String.prototype
    56     putDirectWithoutTransition(exec->propertyNames().prototype, stringPrototype, ReadOnly | DontEnum | DontDelete);
     56    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, stringPrototype, ReadOnly | DontEnum | DontDelete);
    5757
    5858    // ECMA 15.5.3.2 fromCharCode()
     
    6363#endif
    6464    // no. of arguments for constructor
    65     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(1), ReadOnly | DontEnum | DontDelete);
     65    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(1), ReadOnly | DontEnum | DontDelete);
    6666}
    6767
  • trunk/Source/JavaScriptCore/runtime/StringObject.cpp

    r77113 r77151  
    3333    : JSWrapperObject(structure)
    3434{
    35     setInternalValue(jsEmptyString(exec));
     35    setInternalValue(exec->globalData(), jsEmptyString(exec));
    3636}
    3737
    38 StringObject::StringObject(NonNullPassRefPtr<Structure> structure, JSString* string)
     38StringObject::StringObject(JSGlobalData& globalData, NonNullPassRefPtr<Structure> structure, JSString* string)
    3939    : JSWrapperObject(structure)
    4040{
    41     setInternalValue(string);
     41    setInternalValue(globalData, string);
    4242}
    4343
     
    4545    : JSWrapperObject(structure)
    4646{
    47     setInternalValue(jsString(exec, string));
     47    setInternalValue(exec->globalData(), jsString(exec, string));
    4848}
    4949
  • trunk/Source/JavaScriptCore/runtime/StringObject.h

    r77113 r77151  
    5454    protected:
    5555        static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | OverridesGetPropertyNames | JSWrapperObject::StructureFlags;
    56         StringObject(NonNullPassRefPtr<Structure>, JSString*);
     56        StringObject(JSGlobalData&, NonNullPassRefPtr<Structure>, JSString*);
    5757  };
    5858
  • trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp

    r77113 r77151  
    137137    putAnonymousValue(0, globalObject);
    138138    // The constructor will be added later, after StringConstructor has been built
    139     putDirectWithoutTransition(exec->propertyNames().length, jsNumber(0), DontDelete | ReadOnly | DontEnum);
     139    putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(0), DontDelete | ReadOnly | DontEnum);
    140140}
    141141
  • trunk/Source/JavaScriptCore/runtime/Structure.cpp

    r77113 r77151  
    243243
    244244    ASSERT(m_prototype);
    245     ASSERT(m_prototype.isObject() || m_prototype.isNull());
     245    ASSERT(m_prototype->isObject() || m_prototype->isNull());
    246246
    247247#ifndef NDEBUG
     
    477477    }
    478478
    479     RefPtr<Structure> transition = create(structure->m_prototype, structure->typeInfo(), structure->anonymousSlotCount());
     479    RefPtr<Structure> transition = create(structure->m_prototype.get(), structure->typeInfo(), structure->anonymousSlotCount());
    480480
    481481    transition->m_cachedPrototypeChain = structure->m_cachedPrototypeChain;
     
    596596    ASSERT(!structure->isUncacheableDictionary());
    597597   
    598     RefPtr<Structure> transition = create(structure->m_prototype, structure->typeInfo(), structure->anonymousSlotCount());
     598    RefPtr<Structure> transition = create(structure->m_prototype.get(), structure->typeInfo(), structure->anonymousSlotCount());
    599599    transition->m_dictionaryKind = kind;
    600600    transition->m_propertyStorageCapacity = structure->m_propertyStorageCapacity;
     
    621621}
    622622
    623 PassRefPtr<Structure> Structure::flattenDictionaryStructure(JSObject* object)
     623PassRefPtr<Structure> Structure::flattenDictionaryStructure(JSGlobalData& globalData, JSObject* object)
    624624{
    625625    ASSERT(isDictionary());
     
    652652        // Copy the original property values into their final locations
    653653        for (unsigned i = 0; i < propertyCount; i++)
    654             object->putDirectOffset(anonymousSlotCount + i, values[i]);
     654            object->putDirectOffset(globalData, anonymousSlotCount + i, values[i]);
    655655
    656656        if (m_propertyTable->deletedOffsets) {
  • trunk/Source/JavaScriptCore/runtime/Structure.h

    r77113 r77151  
    8181        static PassRefPtr<Structure> toUncacheableDictionaryTransition(Structure*);
    8282
    83         PassRefPtr<Structure> flattenDictionaryStructure(JSObject*);
     83        PassRefPtr<Structure> flattenDictionaryStructure(JSGlobalData&, JSObject*);
    8484
    8585        ~Structure();
     
    9595        const TypeInfo& typeInfo() const { return m_typeInfo; }
    9696
    97         JSValue storedPrototype() const { return m_prototype; }
     97        JSValue storedPrototype() const { return m_prototype.get(); }
     98        DeprecatedPtr<Unknown>* storedPrototypeSlot() { return &m_prototype; }
    9899        JSValue prototypeForLookup(ExecState*) const;
    99100        StructureChain* prototypeChain(ExecState*) const;
     
    207208        TypeInfo m_typeInfo;
    208209
    209         JSValue m_prototype;
     210        DeprecatedPtr<Unknown> m_prototype;
    210211        mutable RefPtr<StructureChain> m_cachedPrototypeChain;
    211212
  • trunk/Source/JavaScriptCore/runtime/WeakGCMap.h

    r77125 r77151  
    4747
    4848public:
    49     typedef typename HashMap<KeyType, MappedType>::iterator iterator;
    50     typedef typename HashMap<KeyType, MappedType>::const_iterator const_iterator;
     49    typedef typename HashMap<KeyType, DeprecatedPtr<MappedType> >::iterator iterator;
     50    typedef typename HashMap<KeyType, DeprecatedPtr<MappedType> >::const_iterator const_iterator;
    5151   
    5252    bool isEmpty() { return m_map.isEmpty(); }
    5353    void clear() { m_map.clear(); }
    5454
    55     MappedType get(const KeyType& key) const;
    56     pair<iterator, bool> set(const KeyType&, const MappedType&);
    57     MappedType take(const KeyType& key);
     55    MappedType* get(const KeyType&) const;
     56    pair<iterator, bool> set(const KeyType&, MappedType*);
     57    MappedType* take(const KeyType&);
    5858
    5959    // These unchecked functions provide access to a value even if the value's
     
    6161    // during the GC mark phase, which begins by clearing all mark bits.
    6262
    63     MappedType uncheckedGet(const KeyType& key) const { return m_map.get(key); }
    64     bool uncheckedRemove(const KeyType&, const MappedType&);
     63    MappedType* uncheckedGet(const KeyType& key) const { return m_map.get(key).get(); }
     64    DeprecatedPtr<MappedType>* uncheckedGetSlot(const KeyType& key)
     65    {
     66        iterator iter = m_map.find(key);
     67        if (iter == m_map.end())
     68            return 0;
     69        return &iter->second;
     70    }
     71    bool uncheckedRemove(const KeyType&, MappedType*);
    6572
    6673    iterator uncheckedBegin() { return m_map.begin(); }
     
    7178
    7279private:
    73     HashMap<KeyType, MappedType> m_map;
     80    HashMap<KeyType, DeprecatedPtr<MappedType> > m_map;
    7481};
    7582
    7683template<typename KeyType, typename MappedType>
    77 inline MappedType WeakGCMap<KeyType, MappedType>::get(const KeyType& key) const
     84inline MappedType* WeakGCMap<KeyType, MappedType>::get(const KeyType& key) const
    7885{
    79     MappedType result = m_map.get(key);
    80     if (result == HashTraits<MappedType>::emptyValue())
     86    MappedType* result = m_map.get(key).get();
     87    if (result == HashTraits<MappedType*>::emptyValue())
    8188        return result;
    8289    if (!Heap::isCellMarked(result))
    83         return HashTraits<MappedType>::emptyValue();
     90        return HashTraits<MappedType*>::emptyValue();
    8491    return result;
    8592}
    8693
    8794template<typename KeyType, typename MappedType>
    88 MappedType WeakGCMap<KeyType, MappedType>::take(const KeyType& key)
     95MappedType* WeakGCMap<KeyType, MappedType>::take(const KeyType& key)
    8996{
    90     MappedType result = m_map.take(key);
    91     if (result == HashTraits<MappedType>::emptyValue())
     97    MappedType* result = m_map.take(key).get();
     98    if (result == HashTraits<MappedType*>::emptyValue())
    9299        return result;
    93100    if (!Heap::isCellMarked(result))
    94         return HashTraits<MappedType>::emptyValue();
     101        return HashTraits<MappedType*>::emptyValue();
    95102    return result;
    96103}
    97104
    98105template<typename KeyType, typename MappedType>
    99 pair<typename HashMap<KeyType, MappedType>::iterator, bool> WeakGCMap<KeyType, MappedType>::set(const KeyType& key, const MappedType& value)
     106pair<typename WeakGCMap<KeyType, MappedType>::iterator, bool> WeakGCMap<KeyType, MappedType>::set(const KeyType& key, MappedType* value)
    100107{
    101108    Heap::markCell(value); // If value is newly allocated, it's not marked, so mark it now.
    102109    pair<iterator, bool> result = m_map.add(key, value);
    103110    if (!result.second) { // pre-existing entry
    104         result.second = !Heap::isCellMarked(result.first->second);
     111        result.second = !Heap::isCellMarked(result.first->second.get());
    105112        result.first->second = value;
    106113    }
     
    109116
    110117template<typename KeyType, typename MappedType>
    111 bool WeakGCMap<KeyType, MappedType>::uncheckedRemove(const KeyType& key, const MappedType& value)
     118bool WeakGCMap<KeyType, MappedType>::uncheckedRemove(const KeyType& key, MappedType* value)
    112119{
    113120    iterator it = m_map.find(key);
    114121    if (it == m_map.end())
    115122        return false;
    116     if (it->second != value)
     123    if (it->second.get() != value)
    117124        return false;
    118125    m_map.remove(it);
Note: See TracChangeset for help on using the changeset viewer.