Changeset 34659 in webkit for trunk/JavaScriptCore


Ignore:
Timestamp:
Jun 19, 2008, 10:29:29 AM (17 years ago)
Author:
[email protected]
Message:

Reviewed by Darin.

Prepare JavaScript heap for being per-thread.

Location:
trunk/JavaScriptCore
Files:
59 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/API/JSBase.cpp

    r34581 r34659  
    2929
    3030#include "APICast.h"
     31#include "completion.h"
    3132#include <kjs/ExecState.h>
    3233#include <kjs/InitializeThreading.h>
     
    8687        initializeThreading();
    8788
     89    // It might seem that we have a context passed to this function, and can use toJS(ctx)->heap(), but the parameter is likely to be NULL,
     90    // and it may actually be garbage for some clients (most likely, because of JSGarbageCollect being called after releasing the context).
     91
    8892    JSLock lock;
    89     if (!Collector::isBusy())
    90         Collector::collect();
     93
     94    // FIXME: It would be good to avoid creating a JSGlobalData instance if it didn't exist for this thread yet.
     95    Heap* heap = JSGlobalData::threadInstance().heap;
     96    if (!heap->isBusy())
     97        heap->collect();
     98
     99    // FIXME: Similarly, we shouldn't create a shared instance here.
     100    heap = JSGlobalData::sharedInstance().heap;
     101    if (!heap->isBusy())
     102        heap->collect();
     103
    91104    // FIXME: Perhaps we should trigger a second mark and sweep
    92105    // once the garbage collector is done if this is called when
  • trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h

    r34607 r34659  
    471471            if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) {
    472472                if (JSObjectCallAsFunctionCallback callAsFunction = entry->callAsFunction) {
    473                     JSObject* o = new JSCallbackFunction(exec, callAsFunction, propertyName);
     473                    JSObject* o = new (exec) JSCallbackFunction(exec, callAsFunction, propertyName);
    474474                    thisObj->putDirect(propertyName, o, entry->attributes);
    475475                    return o;
  • trunk/JavaScriptCore/API/JSClassRef.cpp

    r34361 r34659  
    163163        if (!parentPrototype)
    164164            parentPrototype = exec->dynamicGlobalObject()->objectPrototype();
    165         cachedPrototype = new JSCallbackObject<JSObject>(exec, prototypeClass, parentPrototype, this); // set ourself as the object's private data, so it can clear our reference on destruction
     165        cachedPrototype = new (exec) JSCallbackObject<JSObject>(exec, prototypeClass, parentPrototype, this); // set ourself as the object's private data, so it can clear our reference on destruction
    166166    }
    167167    return cachedPrototype;
  • trunk/JavaScriptCore/API/JSContextRef.cpp

    r34581 r34659  
    4545
    4646    if (!globalObjectClass) {
    47         JSGlobalObject* globalObject = new JSGlobalObject;
     47        JSGlobalObject* globalObject = new (JSGlobalObject::Shared) JSGlobalObject;
    4848        return JSGlobalContextRetain(toGlobalRef(globalObject->globalExec()));
    4949    }
    5050
    51     JSGlobalObject* globalObject = new JSCallbackObject<JSGlobalObject>(globalObjectClass);
     51    JSGlobalObject* globalObject = new (JSGlobalObject::Shared) JSCallbackObject<JSGlobalObject>(globalObjectClass);
    5252    JSGlobalContextRef ctx = toGlobalRef(globalObject->globalExec());
    5353    JSValue* prototype = globalObjectClass->prototype(ctx);
  • trunk/JavaScriptCore/API/JSObjectRef.cpp

    r34607 r34659  
    7575
    7676    if (!jsClass)
    77         return toRef(new JSObject(exec->lexicalGlobalObject()->objectPrototype())); // slightly more efficient
     77        return toRef(new (exec) JSObject(exec->lexicalGlobalObject()->objectPrototype())); // slightly more efficient
    7878
    7979    JSValue* jsPrototype = jsClass->prototype(ctx);
     
    8181        jsPrototype = exec->lexicalGlobalObject()->objectPrototype();
    8282
    83     return toRef(new JSCallbackObject<JSObject>(exec, jsClass, jsPrototype, data));
     83    return toRef(new (exec) JSCallbackObject<JSObject>(exec, jsClass, jsPrototype, data));
    8484}
    8585
     
    9090    Identifier nameID = name ? Identifier(exec, toJS(name)) : Identifier(exec, "anonymous");
    9191   
    92     return toRef(new JSCallbackFunction(exec, callAsFunction, nameID));
     92    return toRef(new (exec) JSCallbackFunction(exec, callAsFunction, nameID));
    9393}
    9494
     
    102102        : exec->dynamicGlobalObject()->objectPrototype();
    103103   
    104     JSCallbackConstructor* constructor = new JSCallbackConstructor(exec, jsClass, callAsConstructor);
     104    JSCallbackConstructor* constructor = new (exec) JSCallbackConstructor(exec, jsClass, callAsConstructor);
    105105    constructor->putDirect(exec->propertyNames().prototype, jsPrototype, DontEnum | DontDelete | ReadOnly);
    106106    return toRef(constructor);
     
    119119    ArgList args;
    120120    for (unsigned i = 0; i < parameterCount; i++)
    121         args.append(jsString(UString(toJS(parameterNames[i]))));
    122     args.append(jsString(UString(bodyRep)));
     121        args.append(jsString(exec, UString(toJS(parameterNames[i]))));
     122    args.append(jsString(exec, UString(bodyRep)));
    123123
    124124    JSObject* result = exec->dynamicGlobalObject()->functionConstructor()->construct(exec, args, nameID, UString(sourceURLRep), startingLineNumber);
  • trunk/JavaScriptCore/API/JSValueRef.cpp

    r34581 r34659  
    177177}
    178178
    179 JSValueRef JSValueMakeNumber(JSContextRef, double value)
    180 {
    181     JSLock lock;
    182     return toRef(jsNumber(value));
    183 }
    184 
    185 JSValueRef JSValueMakeString(JSContextRef, JSStringRef string)
     179JSValueRef JSValueMakeNumber(JSContextRef ctx, double value)
     180{
     181    JSLock lock;
     182    return toRef(jsNumber(toJS(ctx), value));
     183}
     184
     185JSValueRef JSValueMakeString(JSContextRef ctx, JSStringRef string)
    186186{
    187187    JSLock lock;
    188188    UString::Rep* rep = toJS(string);
    189     return toRef(jsString(UString(rep)));
     189    return toRef(jsString(toJS(ctx), UString(rep)));
    190190}
    191191
  • trunk/JavaScriptCore/ChangeLog

    r34634 r34659  
     12008-06-17  Alexey Proskuryakov  <[email protected]>
     2
     3        Reviewed by Darin.
     4
     5        Prepare JavaScript heap for being per-thread.
     6
     7        * kjs/ExecState.h: Shuffle includes, making it possible to include ExecState.h in JSValue.h.
     8        (KJS::ExecState::heap): Added an accessor.
     9
     10        * API/JSBase.cpp: (JSGarbageCollect): Collect both shared and per-thread heaps.
     11
     12        * API/JSContextRef.cpp: (JSGlobalContextCreate): When allocating JSGlobalObject, indicate
     13        that it belongs to a shared heap.
     14
     15        * JavaScriptCore.xcodeproj/project.pbxproj:
     16        * kjs/AllInOneFile.cpp:
     17        Moved JSGlobalObject.cpp to AllInOneFile, as a build fix for inlineAllocate magic.
     18
     19        * VM/CodeGenerator.h: (KJS::CodeGenerator::globalExec): Added an accessor (working via
     20        m_scopeChain).
     21
     22        * VM/RegisterFile.h:
     23        (KJS::RegisterFile::mark):
     24        * VM/RegisterFileStack.h:
     25        (KJS::RegisterFileStack::mark):
     26        Made these pseudo-mark functions take Heap*.
     27
     28        * kjs/InitializeThreading.cpp:
     29        (KJS::initializeThreading): Initialize heap introspector.
     30
     31        * kjs/JSGlobalData.h: Added Heap to the structure.
     32
     33        * kjs/JSGlobalData.cpp:
     34        (KJS::JSGlobalData::JSGlobalData): Initialize Heap.
     35        (KJS::JSGlobalData::sharedInstance): Added a method to access shared global data instance
     36        for legacy clients.
     37
     38        * kjs/JSGlobalObject.cpp:
     39        (KJS::JSGlobalObject::~JSGlobalObject): Changed to work with per-thread head; fixed list
     40        maintenance logic.
     41        (KJS::JSGlobalObject::init): Changed to work with per-thread head.
     42        (KJS::JSGlobalObject::put): Assert that a cross-heap operation is not being attempted.
     43        (KJS::JSGlobalObject::reset): Pass ExecState* where now required.
     44        (KJS::JSGlobalObject::mark): Pass the current heap to RegisterFileStack::mark.
     45        (KJS::JSGlobalObject::operator new): Overload operator new to use per-thread or shared heap.
     46        * kjs/JSGlobalObject.h: Removed static s_head member.
     47
     48        * kjs/PropertyMap.h: (KJS::PropertyMap::PropertyMap): Removed unused SavedProperty.
     49
     50        * kjs/collector.h: Turned Collector into an actual object with its own data, renamed to Heap.
     51        (KJS::Heap::initializeHeapIntrospector): Added.
     52        (KJS::Heap::heap): Added a method to determine which heap a JSValue is in, if any.
     53        (KJS::Heap::allocate): Made non-static.
     54        (KJS::Heap::inlineAllocateNumber): Ditto.
     55        (KJS::Heap::markListSet): Ditto.
     56        (KJS::Heap::cellBlock): Ditto.
     57        (KJS::Heap::cellOffset): Ditto.
     58        (KJS::Heap::isCellMarked): Ditto.
     59        (KJS::Heap::markCell): Ditto.
     60        (KJS::Heap::reportExtraMemoryCost): Ditto.
     61        (KJS::CollectorBlock): Added a back-reference to Heap for Heap::heap() method.
     62        (KJS::SmallCellCollectorBlock): Ditto.
     63
     64        * kjs/collector.cpp: Changed MIN_ARRAY_SIZE to a #define to avoid a PIC branch. Removed
     65        main thread related machinery.
     66        (KJS::Heap::Heap): Initialize the newly added data members.
     67        (KJS::allocateBlock): Marked NEVER_INLINE, as this is a rare case that uses a PIC branch.
     68        Moved static pagesize to the class to make it safely initialized.
     69        (KJS::Heap::heapAllocate): Initialize heap back reference after a new block is allocated.
     70        (KJS::Heap::registerThread): Removed introspector initialization, as it is now performed
     71        in InitializeThreading.cpp.
     72        (KJS::Heap::markOtherThreadConservatively): Assert that the "other thread" case only occurs
     73        for legacy clients using a shared heap.
     74        (KJS::Heap::markStackObjectsConservatively): Moved fastMallocForbid/Allow down here, since
     75        it doesn't need to be forbidden during other GC phases.
     76
     77        * kjs/JSImmediate.h:
     78        (KJS::jsUndefined):
     79        (KJS::jsNull):
     80        (KJS::jsBoolean):
     81        Moved from JSvalue.h, to make these usable in files that cannot include JSValue.h (such
     82        as list.h).
     83
     84        * API/JSCallbackObjectFunctions.h:
     85        (KJS::::staticFunctionGetter):
     86        * API/JSClassRef.cpp:
     87        (OpaqueJSClass::prototype):
     88        * API/JSObjectRef.cpp:
     89        (JSObjectMake):
     90        (JSObjectMakeFunctionWithCallback):
     91        (JSObjectMakeConstructor):
     92        (JSObjectMakeFunction):
     93        * API/JSValueRef.cpp:
     94        (JSValueMakeNumber):
     95        (JSValueMakeString):
     96        * JavaScriptCore.exp:
     97        * VM/CodeGenerator.cpp:
     98        (KJS::CodeGenerator::emitLoad):
     99        * VM/JSPropertyNameIterator.cpp:
     100        (KJS::JSPropertyNameIterator::create):
     101        (KJS::JSPropertyNameIterator::next):
     102        * VM/Machine.cpp:
     103        (KJS::jsAddSlowCase):
     104        (KJS::jsAdd):
     105        (KJS::jsTypeStringForValue):
     106        (KJS::scopeChainForCall):
     107        (KJS::Machine::throwException):
     108        (KJS::Machine::execute):
     109        (KJS::Machine::privateExecute):
     110        (KJS::Machine::retrieveArguments):
     111        * kjs/ArrayPrototype.cpp:
     112        (KJS::arrayProtoFuncToString):
     113        (KJS::arrayProtoFuncToLocaleString):
     114        (KJS::arrayProtoFuncJoin):
     115        (KJS::arrayProtoFuncConcat):
     116        (KJS::arrayProtoFuncPop):
     117        (KJS::arrayProtoFuncPush):
     118        (KJS::arrayProtoFuncShift):
     119        (KJS::arrayProtoFuncSlice):
     120        (KJS::arrayProtoFuncSplice):
     121        (KJS::arrayProtoFuncUnShift):
     122        (KJS::arrayProtoFuncFilter):
     123        (KJS::arrayProtoFuncMap):
     124        (KJS::arrayProtoFuncEvery):
     125        (KJS::arrayProtoFuncForEach):
     126        (KJS::arrayProtoFuncSome):
     127        (KJS::arrayProtoFuncIndexOf):
     128        (KJS::arrayProtoFuncLastIndexOf):
     129        (KJS::ArrayConstructor::ArrayConstructor):
     130        (KJS::ArrayConstructor::construct):
     131        (KJS::ArrayConstructor::callAsFunction):
     132        * kjs/BooleanObject.cpp:
     133        (KJS::BooleanPrototype::BooleanPrototype):
     134        (KJS::booleanProtoFuncToString):
     135        (KJS::BooleanConstructor::BooleanConstructor):
     136        (KJS::BooleanConstructor::construct):
     137        * kjs/FunctionPrototype.cpp:
     138        (KJS::FunctionPrototype::FunctionPrototype):
     139        (KJS::functionProtoFuncToString):
     140        (KJS::FunctionConstructor::FunctionConstructor):
     141        (KJS::FunctionConstructor::construct):
     142        * kjs/JSActivation.cpp:
     143        (KJS::JSActivation::createArgumentsObject):
     144        * kjs/JSArray.cpp:
     145        (KJS::JSArray::JSArray):
     146        (KJS::JSArray::lengthGetter):
     147        * kjs/JSFunction.cpp:
     148        (KJS::JSFunction::lengthGetter):
     149        (KJS::JSFunction::construct):
     150        (KJS::Arguments::Arguments):
     151        (KJS::encode):
     152        (KJS::decode):
     153        (KJS::globalFuncParseInt):
     154        (KJS::globalFuncParseFloat):
     155        (KJS::globalFuncEscape):
     156        (KJS::globalFuncUnescape):
     157        (KJS::PrototypeFunction::PrototypeFunction):
     158        (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction):
     159        * kjs/JSImmediate.cpp:
     160        (KJS::JSImmediate::toObject):
     161        * kjs/JSLock.cpp:
     162        (KJS::JSLock::registerThread):
     163        * kjs/JSObject.cpp:
     164        (KJS::JSObject::put):
     165        (KJS::JSObject::defineGetter):
     166        (KJS::JSObject::defineSetter):
     167        (KJS::Error::create):
     168        * kjs/JSObject.h:
     169        (KJS::JSObject::putDirect):
     170        * kjs/JSString.h:
     171        (KJS::JSString::JSString):
     172        * kjs/JSValue.cpp:
     173        (KJS::JSCell::operator new):
     174        (KJS::jsString):
     175        (KJS::jsOwnedString):
     176        * kjs/JSValue.h:
     177        (KJS::JSNumberCell::operator new):
     178        (KJS::jsNumberCell):
     179        (KJS::jsNaN):
     180        (KJS::jsNumber):
     181        (KJS::JSCell::marked):
     182        (KJS::JSCell::mark):
     183        (KJS::JSValue::toJSNumber):
     184        * kjs/MathObject.cpp:
     185        (KJS::MathObject::getValueProperty):
     186        (KJS::mathProtoFuncAbs):
     187        (KJS::mathProtoFuncACos):
     188        (KJS::mathProtoFuncASin):
     189        (KJS::mathProtoFuncATan):
     190        (KJS::mathProtoFuncATan2):
     191        (KJS::mathProtoFuncCeil):
     192        (KJS::mathProtoFuncCos):
     193        (KJS::mathProtoFuncExp):
     194        (KJS::mathProtoFuncFloor):
     195        (KJS::mathProtoFuncLog):
     196        (KJS::mathProtoFuncMax):
     197        (KJS::mathProtoFuncMin):
     198        (KJS::mathProtoFuncPow):
     199        (KJS::mathProtoFuncRandom):
     200        (KJS::mathProtoFuncRound):
     201        (KJS::mathProtoFuncSin):
     202        (KJS::mathProtoFuncSqrt):
     203        (KJS::mathProtoFuncTan):
     204        * kjs/NumberObject.cpp:
     205        (KJS::NumberPrototype::NumberPrototype):
     206        (KJS::numberProtoFuncToString):
     207        (KJS::numberProtoFuncToLocaleString):
     208        (KJS::numberProtoFuncToFixed):
     209        (KJS::numberProtoFuncToExponential):
     210        (KJS::numberProtoFuncToPrecision):
     211        (KJS::NumberConstructor::NumberConstructor):
     212        (KJS::NumberConstructor::getValueProperty):
     213        (KJS::NumberConstructor::construct):
     214        (KJS::NumberConstructor::callAsFunction):
     215        * kjs/RegExpObject.cpp:
     216        (KJS::RegExpPrototype::RegExpPrototype):
     217        (KJS::regExpProtoFuncToString):
     218        (KJS::RegExpObject::getValueProperty):
     219        (KJS::RegExpConstructor::RegExpConstructor):
     220        (KJS::RegExpMatchesArray::fillArrayInstance):
     221        (KJS::RegExpConstructor::arrayOfMatches):
     222        (KJS::RegExpConstructor::getBackref):
     223        (KJS::RegExpConstructor::getLastParen):
     224        (KJS::RegExpConstructor::getLeftContext):
     225        (KJS::RegExpConstructor::getRightContext):
     226        (KJS::RegExpConstructor::getValueProperty):
     227        (KJS::RegExpConstructor::construct):
     228        * kjs/RegExpObject.h:
     229        * kjs/Shell.cpp:
     230        (GlobalObject::GlobalObject):
     231        (functionGC):
     232        (functionRun):
     233        (functionReadline):
     234        (jscmain):
     235        * kjs/date_object.cpp:
     236        (KJS::formatLocaleDate):
     237        (KJS::DatePrototype::DatePrototype):
     238        (KJS::DateConstructor::DateConstructor):
     239        (KJS::DateConstructor::construct):
     240        (KJS::DateConstructor::callAsFunction):
     241        (KJS::DateFunction::DateFunction):
     242        (KJS::DateFunction::callAsFunction):
     243        (KJS::dateProtoFuncToString):
     244        (KJS::dateProtoFuncToUTCString):
     245        (KJS::dateProtoFuncToDateString):
     246        (KJS::dateProtoFuncToTimeString):
     247        (KJS::dateProtoFuncToLocaleString):
     248        (KJS::dateProtoFuncToLocaleDateString):
     249        (KJS::dateProtoFuncToLocaleTimeString):
     250        (KJS::dateProtoFuncValueOf):
     251        (KJS::dateProtoFuncGetTime):
     252        (KJS::dateProtoFuncGetFullYear):
     253        (KJS::dateProtoFuncGetUTCFullYear):
     254        (KJS::dateProtoFuncToGMTString):
     255        (KJS::dateProtoFuncGetMonth):
     256        (KJS::dateProtoFuncGetUTCMonth):
     257        (KJS::dateProtoFuncGetDate):
     258        (KJS::dateProtoFuncGetUTCDate):
     259        (KJS::dateProtoFuncGetDay):
     260        (KJS::dateProtoFuncGetUTCDay):
     261        (KJS::dateProtoFuncGetHours):
     262        (KJS::dateProtoFuncGetUTCHours):
     263        (KJS::dateProtoFuncGetMinutes):
     264        (KJS::dateProtoFuncGetUTCMinutes):
     265        (KJS::dateProtoFuncGetSeconds):
     266        (KJS::dateProtoFuncGetUTCSeconds):
     267        (KJS::dateProtoFuncGetMilliSeconds):
     268        (KJS::dateProtoFuncGetUTCMilliseconds):
     269        (KJS::dateProtoFuncGetTimezoneOffset):
     270        (KJS::dateProtoFuncSetTime):
     271        (KJS::setNewValueFromTimeArgs):
     272        (KJS::setNewValueFromDateArgs):
     273        (KJS::dateProtoFuncSetYear):
     274        (KJS::dateProtoFuncGetYear):
     275        * kjs/error_object.cpp:
     276        (KJS::ErrorPrototype::ErrorPrototype):
     277        (KJS::errorProtoFuncToString):
     278        (KJS::ErrorConstructor::ErrorConstructor):
     279        (KJS::ErrorConstructor::construct):
     280        (KJS::NativeErrorPrototype::NativeErrorPrototype):
     281        (KJS::NativeErrorConstructor::NativeErrorConstructor):
     282        (KJS::NativeErrorConstructor::construct):
     283        * kjs/identifier.h:
     284        * kjs/internal.cpp:
     285        (KJS::StringObject::create):
     286        (KJS::JSString::lengthGetter):
     287        (KJS::JSString::indexGetter):
     288        (KJS::JSString::indexNumericPropertyGetter):
     289        * kjs/interpreter.cpp:
     290        * kjs/list.cpp:
     291        (KJS::ArgList::slowAppend):
     292        * kjs/list.h:
     293        * kjs/lookup.h:
     294        (KJS::staticFunctionGetter):
     295        (KJS::cacheGlobalObject):
     296        * kjs/nodes.cpp:
     297        (KJS::Node::emitThrowError):
     298        (KJS::StringNode::emitCode):
     299        (KJS::ArrayNode::emitCode):
     300        (KJS::FuncDeclNode::makeFunction):
     301        (KJS::FuncExprNode::makeFunction):
     302        * kjs/nodes.h:
     303        * kjs/object_object.cpp:
     304        (KJS::ObjectPrototype::ObjectPrototype):
     305        (KJS::objectProtoFuncToLocaleString):
     306        (KJS::objectProtoFuncToString):
     307        (KJS::ObjectConstructor::ObjectConstructor):
     308        (KJS::ObjectConstructor::construct):
     309        * kjs/protect.h:
     310        (KJS::gcProtect):
     311        (KJS::gcUnprotect):
     312        * kjs/string_object.cpp:
     313        (KJS::StringObject::StringObject):
     314        (KJS::StringPrototype::StringPrototype):
     315        (KJS::replace):
     316        (KJS::stringProtoFuncCharAt):
     317        (KJS::stringProtoFuncCharCodeAt):
     318        (KJS::stringProtoFuncConcat):
     319        (KJS::stringProtoFuncIndexOf):
     320        (KJS::stringProtoFuncLastIndexOf):
     321        (KJS::stringProtoFuncMatch):
     322        (KJS::stringProtoFuncSearch):
     323        (KJS::stringProtoFuncReplace):
     324        (KJS::stringProtoFuncSlice):
     325        (KJS::stringProtoFuncSplit):
     326        (KJS::stringProtoFuncSubstr):
     327        (KJS::stringProtoFuncSubstring):
     328        (KJS::stringProtoFuncToLowerCase):
     329        (KJS::stringProtoFuncToUpperCase):
     330        (KJS::stringProtoFuncToLocaleLowerCase):
     331        (KJS::stringProtoFuncToLocaleUpperCase):
     332        (KJS::stringProtoFuncLocaleCompare):
     333        (KJS::stringProtoFuncBig):
     334        (KJS::stringProtoFuncSmall):
     335        (KJS::stringProtoFuncBlink):
     336        (KJS::stringProtoFuncBold):
     337        (KJS::stringProtoFuncFixed):
     338        (KJS::stringProtoFuncItalics):
     339        (KJS::stringProtoFuncStrike):
     340        (KJS::stringProtoFuncSub):
     341        (KJS::stringProtoFuncSup):
     342        (KJS::stringProtoFuncFontcolor):
     343        (KJS::stringProtoFuncFontsize):
     344        (KJS::stringProtoFuncAnchor):
     345        (KJS::stringProtoFuncLink):
     346        (KJS::StringConstructor::StringConstructor):
     347        (KJS::StringConstructor::construct):
     348        (KJS::StringConstructor::callAsFunction):
     349        (KJS::StringConstructorFunction::StringConstructorFunction):
     350        (KJS::StringConstructorFunction::callAsFunction):
     351        * kjs/string_object.h:
     352        (KJS::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined):
     353        * kjs/ustring.h:
     354        Updated for the above changes.
     355
    13562008-06-17  Timothy Hatcher  <[email protected]>
    2357
  • trunk/JavaScriptCore/JavaScriptCore.exp

    r34634 r34659  
    9898__ZN3KJS11PropertyMapD1Ev
    9999__ZN3KJS12DateInstance4infoE
     100__ZN3KJS12JSGlobalData14sharedInstanceEv
    100101__ZN3KJS12JSGlobalData14threadInstanceEv
    101102__ZN3KJS12PropertySlot15undefinedGetterEPNS_9ExecStateERKNS_10IdentifierERKS0_
     
    107108__ZN3KJS12StringObject3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE
    108109__ZN3KJS12StringObject4infoE
    109 __ZN3KJS12StringObjectC2EPNS_8JSObjectERKNS_7UStringE
     110__ZN3KJS12StringObjectC2EPNS_9ExecStateEPNS_8JSObjectERKNS_7UStringE
    110111__ZN3KJS13CodeGenerator21setDumpsGeneratedCodeEb
    111112__ZN3KJS13StatementNode6setLocEii
    112 __ZN3KJS13jsOwnedStringERKNS_7UStringE
     113__ZN3KJS13jsOwnedStringEPNS_9ExecStateERKNS_7UStringE
    113114__ZN3KJS14JSGlobalObject10globalExecEv
    114115__ZN3KJS14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE
     
    121122__ZN3KJS14JSGlobalObject4markEv
    122123__ZN3KJS14JSGlobalObjectD2Ev
     124__ZN3KJS14JSGlobalObjectnwEm
     125__ZN3KJS14JSGlobalObjectnwEmNS0_9SharedTagE
    123126__ZN3KJS15JSWrapperObject4markEv
    124127__ZN3KJS16InternalFunction11getCallDataERNS_8CallDataE
     
    135138__ZN3KJS19initializeThreadingEv
    136139__ZN3KJS23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE
     140__ZN3KJS4Heap14allocateNumberEm
     141__ZN3KJS4Heap15recordExtraCostEm
     142__ZN3KJS4Heap17globalObjectCountEv
     143__ZN3KJS4Heap20protectedObjectCountEv
     144__ZN3KJS4Heap23collectOnMainThreadOnlyEPNS_7JSValueE
     145__ZN3KJS4Heap25protectedObjectTypeCountsEv
     146__ZN3KJS4Heap26protectedGlobalObjectCountEv
     147__ZN3KJS4Heap4heapEPKNS_7JSValueE
     148__ZN3KJS4Heap4sizeEv
     149__ZN3KJS4Heap7collectEv
     150__ZN3KJS4Heap7protectEPNS_7JSValueE
     151__ZN3KJS4Heap8allocateEm
     152__ZN3KJS4Heap9unprotectEPNS_7JSValueE
    137153__ZN3KJS5equalEPKNS_7UString3RepES3_
    138154__ZN3KJS6JSCell11getCallDataERNS_8CallDataE
     
    143159__ZN3KJS6JSCell3putEPNS_9ExecStateEjPNS_7JSValueE
    144160__ZN3KJS6JSCell9getObjectEv
    145 __ZN3KJS6JSCellnwEm
     161__ZN3KJS6JSCellnwEmPNS_9ExecStateE
    146162__ZN3KJS6JSLock12DropAllLocksC1Ev
    147163__ZN3KJS6JSLock12DropAllLocksD1Ev
     
    197213__ZN3KJS8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE
    198214__ZN3KJS8Profiler8profilerEv
    199 __ZN3KJS8jsStringEPKc
    200 __ZN3KJS8jsStringERKNS_7UStringE
    201 __ZN3KJS9Collector14allocateNumberEm
    202 __ZN3KJS9Collector15recordExtraCostEm
    203 __ZN3KJS9Collector17globalObjectCountEv
    204 __ZN3KJS9Collector20protectedObjectCountEv
    205 __ZN3KJS9Collector23collectOnMainThreadOnlyEPNS_7JSValueE
    206 __ZN3KJS9Collector25protectedObjectTypeCountsEv
    207 __ZN3KJS9Collector26protectedGlobalObjectCountEv
    208 __ZN3KJS9Collector4sizeEv
    209 __ZN3KJS9Collector7collectEv
    210 __ZN3KJS9Collector7protectEPNS_7JSValueE
    211 __ZN3KJS9Collector9unprotectEPNS_7JSValueE
     215__ZN3KJS8jsStringEPNS_9ExecStateEPKc
     216__ZN3KJS8jsStringEPNS_9ExecStateERKNS_7UStringE
    212217__ZN3KJSeqERKNS_7UStringEPKc
    213218__ZN3KJSgtERKNS_7UStringES2_
     
    247252__ZNK3KJS16JSVariableObject16isVariableObjectEv
    248253__ZNK3KJS16JSVariableObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj
    249 __ZNK3KJS17DebuggerCallFrame4typeEv
    250254__ZNK3KJS17DebuggerCallFrame10thisObjectEv
    251255__ZNK3KJS17DebuggerCallFrame12functionNameEv
     256__ZNK3KJS17DebuggerCallFrame4typeEv
    252257__ZNK3KJS17DebuggerCallFrame8evaluateERKNS_7UStringERPNS_7JSValueE
    253258__ZNK3KJS4Node8toStringEv
  • trunk/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r34615 r34659  
    103103                14D797810DAC3307001A9F05 /* RegisterFileStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14D7977F0DAC3307001A9F05 /* RegisterFileStack.cpp */; };
    104104                14DA81900D99FD2000B0A4FB /* JSActivation.h in Headers */ = {isa = PBXBuildFile; fileRef = 14DA818E0D99FD2000B0A4FB /* JSActivation.h */; };
    105                 14DE0D690D02431400AACCA2 /* JSGlobalObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14DE0D680D02431400AACCA2 /* JSGlobalObject.cpp */; };
    106105                14E0FF120DBAAED00007C0AB /* Machine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 149B15E70D81F986009CB8C7 /* Machine.cpp */; settings = {COMPILER_FLAGS = "-fno-tree-pre"; }; };
    107106                14F252570D08DD8D004ECFFF /* JSVariableObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 14F252560D08DD8D004ECFFF /* JSVariableObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    15401539                                1440FCE40A51E46B0005F061 /* JSClassRef.cpp in Sources */,
    15411540                                14BD5A300A3E91F600BAF59C /* JSContextRef.cpp in Sources */,
    1542                                 14DE0D690D02431400AACCA2 /* JSGlobalObject.cpp in Sources */,
    15431541                                1482B7E40A43076000517CFC /* JSObjectRef.cpp in Sources */,
    15441542                                1482B74E0A43032800517CFC /* JSStringRef.cpp in Sources */,
  • trunk/JavaScriptCore/VM/CodeGenerator.cpp

    r34610 r34659  
    569569    emitOpcode(op_load);
    570570    instructions().append(dst->index());
    571     instructions().append(addConstant(jsNumber(d)));
     571    instructions().append(addConstant(jsNumber(globalExec(), d)));
    572572    return dst;
    573573}
  • trunk/JavaScriptCore/VM/CodeGenerator.h

    r34607 r34659  
    279279        CodeType codeType() const { return m_codeType; }
    280280
     281        ExecState* globalExec() { return m_scopeChain->globalObject()->globalExec(); }
     282
    281283    private:
    282284        void emitOpcode(OpcodeID);
  • trunk/JavaScriptCore/VM/JSPropertyNameIterator.cpp

    r34607 r34659  
    4141{
    4242    if (v->isUndefinedOrNull())
    43         return new JSPropertyNameIterator(0, 0, 0);
     43        return new (exec) JSPropertyNameIterator(0, 0, 0);
    4444
    4545    JSObject* o = v->toObject(exec);
     
    4747    o->getPropertyNames(exec, propertyNames);
    4848    size_t numProperties = propertyNames.size();
    49     return new JSPropertyNameIterator(o, propertyNames.releaseIdentifiers(), numProperties);
     49    return new (exec) JSPropertyNameIterator(o, propertyNames.releaseIdentifiers(), numProperties);
    5050}
    5151
     
    115115    while (m_position != m_end) {
    116116        if (m_object->hasProperty(exec, *m_position))
    117             return jsOwnedString((*m_position++).ustring());;
     117            return jsOwnedString(exec, (*m_position++).ustring());;
    118118        m_position++;
    119119    }
  • trunk/JavaScriptCore/VM/Machine.cpp

    r34607 r34659  
    132132        if (value.isNull())
    133133            return throwOutOfMemoryError(exec);
    134         return jsString(value);
    135     }
    136 
    137     return jsNumber(p1->toNumber(exec) + p2->toNumber(exec));
     134        return jsString(exec, value);
     135    }
     136
     137    return jsNumber(exec, p1->toNumber(exec) + p2->toNumber(exec));
    138138}
    139139
     
    154154
    155155    if (bothTypes == ((NumberType << 3) | NumberType))
    156         return jsNumber(v1->uncheckedGetNumber() + v2->uncheckedGetNumber());
     156        return jsNumber(exec, v1->uncheckedGetNumber() + v2->uncheckedGetNumber());
    157157    if (bothTypes == ((StringType << 3) | StringType)) {
    158158        UString value = static_cast<JSString*>(v1)->value() + static_cast<JSString*>(v2)->value();
    159159        if (value.isNull())
    160160            return throwOutOfMemoryError(exec);
    161         return jsString(value);
     161        return jsString(exec, value);
    162162    }
    163163
     
    166166}
    167167
    168 static JSValue* jsTypeStringForValue(JSValue* v)
     168static JSValue* jsTypeStringForValue(ExecState* exec, JSValue* v)
    169169{
    170170    switch (v->type()) {
    171171        case UndefinedType:
    172             return jsString("undefined");
     172            return jsString(exec, "undefined");
    173173        case NullType:
    174             return jsString("object");
     174            return jsString(exec, "object");
    175175        case BooleanType:
    176             return jsString("boolean");
     176            return jsString(exec, "boolean");
    177177        case NumberType:
    178             return jsString("number");
     178            return jsString(exec, "number");
    179179        case StringType:
    180             return jsString("string");
     180            return jsString(exec, "string");
    181181        default:
    182182            if (v->isObject()) {
     
    184184                // as null when doing comparisons.
    185185                if (static_cast<JSObject*>(v)->masqueradeAsUndefined())
    186                     return jsString("undefined");
     186                    return jsString(exec, "undefined");
    187187                else if (static_cast<JSObject*>(v)->implementsCall())
    188                     return jsString("function");
     188                    return jsString(exec, "function");
    189189            }
    190190
    191             return jsString("object");
     191            return jsString(exec, "object");
    192192    }
    193193}
     
    413413}
    414414
    415 ALWAYS_INLINE ScopeChainNode* scopeChainForCall(FunctionBodyNode* functionBodyNode, CodeBlock* newCodeBlock, ScopeChainNode* callDataScopeChain, Register** registerBase, Register* r)
     415ALWAYS_INLINE ScopeChainNode* scopeChainForCall(ExecState* exec, FunctionBodyNode* functionBodyNode, CodeBlock* newCodeBlock, ScopeChainNode* callDataScopeChain, Register** registerBase, Register* r)
    416416{
    417417    if (newCodeBlock->needsFullScopeChain) {
    418         JSActivation* activation = new JSActivation(functionBodyNode, registerBase, r - (*registerBase));
     418        JSActivation* activation = new (exec) JSActivation(functionBodyNode, registerBase, r - (*registerBase));
    419419        r[Machine::OptionalCalleeActivation - Machine::CallFrameHeaderSize - newCodeBlock->numLocals].u.jsValue = activation;
    420420
     
    611611        JSObject* exception = static_cast<JSObject*>(exceptionValue);
    612612        if (!exception->hasProperty(exec, Identifier(exec, "line")) && !exception->hasProperty(exec, Identifier(exec, "sourceURL"))) {
    613             exception->put(exec, Identifier(exec, "line"), jsNumber(codeBlock->lineNumberForVPC(vPC)));
    614             exception->put(exec, Identifier(exec, "sourceURL"), jsOwnedString(codeBlock->ownerNode->sourceURL()));
     613            exception->put(exec, Identifier(exec, "line"), jsNumber(exec, codeBlock->lineNumberForVPC(vPC)));
     614            exception->put(exec, Identifier(exec, "sourceURL"), jsOwnedString(exec, codeBlock->ownerNode->sourceURL()));
    615615        }
    616616    }
     
    726726    }
    727727
    728     scopeChain = scopeChainForCall(functionBodyNode, newCodeBlock, scopeChain, registerBase, r);
     728    scopeChain = scopeChainForCall(exec, functionBodyNode, newCodeBlock, scopeChain, registerBase, r);
    729729
    730730    ExecState newExec(exec, this, registerFile, scopeChain, callFrameOffset);
     
    971971        int dst = (++vPC)->u.operand;
    972972        int regExp = (++vPC)->u.operand;
    973         r[dst].u.jsValue = new RegExpObject(scopeChain->globalObject()->regExpPrototype(), codeBlock->regexps[regExp]);
     973        r[dst].u.jsValue = new (exec) RegExpObject(scopeChain->globalObject()->regExpPrototype(), codeBlock->regexps[regExp]);
    974974
    975975        ++vPC;
     
    11141114            result = JSImmediate::incImmediateNumber(v);
    11151115        else
    1116             result = jsNumber(v->toNumber(exec) + 1);
     1116            result = jsNumber(exec, v->toNumber(exec) + 1);
    11171117        VM_CHECK_EXCEPTION();
    11181118        r[srcDst].u.jsValue = result;
     
    11331133            result = JSImmediate::decImmediateNumber(v);
    11341134        else
    1135             result = jsNumber(v->toNumber(exec) - 1);
     1135            result = jsNumber(exec, v->toNumber(exec) - 1);
    11361136        VM_CHECK_EXCEPTION();
    11371137        r[srcDst].u.jsValue = result;
     
    11571157        } else {
    11581158            number = r[srcDst].u.jsValue->toJSNumber(exec);
    1159             result = jsNumber(number->uncheckedGetNumber() + 1);
     1159            result = jsNumber(exec, number->uncheckedGetNumber() + 1);
    11601160        }
    11611161        VM_CHECK_EXCEPTION();
     
    11841184        } else {
    11851185            number = r[srcDst].u.jsValue->toJSNumber(exec);
    1186             result = jsNumber(number->uncheckedGetNumber() - 1);
     1186            result = jsNumber(exec, number->uncheckedGetNumber() - 1);
    11871187        }
    11881188        VM_CHECK_EXCEPTION();
     
    12181218        int dst = (++vPC)->u.operand;
    12191219        int src = (++vPC)->u.operand;
    1220         JSValue* result = jsNumber(-r[src].u.jsValue->toNumber(exec));
     1220        JSValue* result = jsNumber(exec, -r[src].u.jsValue->toNumber(exec));
    12211221        VM_CHECK_EXCEPTION();
    12221222        r[dst].u.jsValue = result;
     
    12551255        JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    12561256        JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
    1257         JSValue* result = jsNumber(src1->toNumber(exec) * src2->toNumber(exec));
     1257        JSValue* result = jsNumber(exec, src1->toNumber(exec) * src2->toNumber(exec));
    12581258        VM_CHECK_EXCEPTION();
    12591259        dst = result;
     
    12721272        int dividend = (++vPC)->u.operand;
    12731273        int divisor = (++vPC)->u.operand;
    1274         JSValue* result = jsNumber(r[dividend].u.jsValue->toNumber(exec) / r[divisor].u.jsValue->toNumber(exec));
     1274        JSValue* result = jsNumber(exec, r[dividend].u.jsValue->toNumber(exec) / r[divisor].u.jsValue->toNumber(exec));
    12751275        VM_CHECK_EXCEPTION();
    12761276        r[dst].u.jsValue = result;
     
    12891289        int divisor = (++vPC)->u.operand;
    12901290        double d = r[dividend].u.jsValue->toNumber(exec);
    1291         JSValue* result = jsNumber(fmod(d, r[divisor].u.jsValue->toNumber(exec)));
     1291        JSValue* result = jsNumber(exec, fmod(d, r[divisor].u.jsValue->toNumber(exec)));
    12921292        VM_CHECK_EXCEPTION();
    12931293        r[dst].u.jsValue = result;
     
    13091309            result = JSImmediate::subImmediateNumbers(src1, src2);
    13101310        else {
    1311             result = jsNumber(src1->toNumber(exec) - src2->toNumber(exec));
     1311            result = jsNumber(exec, src1->toNumber(exec) - src2->toNumber(exec));
    13121312            VM_CHECK_EXCEPTION();
    13131313        }
     
    13281328        JSValue* result;
    13291329        if (JSImmediate::areBothImmediateNumbers(val, shift))
    1330             result = jsNumber(JSImmediate::getTruncatedInt32(val) << (JSImmediate::toTruncatedUInt32(shift) & 0x1f));
     1330            result = jsNumber(exec, JSImmediate::getTruncatedInt32(val) << (JSImmediate::toTruncatedUInt32(shift) & 0x1f));
    13311331        else {
    1332             result = jsNumber((val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f));
     1332            result = jsNumber(exec, (val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f));
    13331333            VM_CHECK_EXCEPTION();
    13341334        }
     
    13521352            result = JSImmediate::rightShiftImmediateNumbers(val, shift);
    13531353        else {
    1354             result = jsNumber((val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
     1354            result = jsNumber(exec, (val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
    13551355            VM_CHECK_EXCEPTION();
    13561356        }
     
    13741374            result = JSImmediate::rightShiftImmediateNumbers(val, shift);
    13751375        else {
    1376             result = jsNumber((val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
     1376            result = jsNumber(exec, (val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
    13771377            VM_CHECK_EXCEPTION();
    13781378        }
     
    13961396            result = JSImmediate::andImmediateNumbers(src1, src2);
    13971397        else {
    1398             result = jsNumber(src1->toInt32(exec) & src2->toInt32(exec));
     1398            result = jsNumber(exec, src1->toInt32(exec) & src2->toInt32(exec));
    13991399            VM_CHECK_EXCEPTION();
    14001400        }
     
    14181418            result = JSImmediate::xorImmediateNumbers(src1, src2);
    14191419        else {
    1420             result = jsNumber(src1->toInt32(exec) ^ src2->toInt32(exec));
     1420            result = jsNumber(exec, src1->toInt32(exec) ^ src2->toInt32(exec));
    14211421            VM_CHECK_EXCEPTION();
    14221422        }
     
    14401440            result = JSImmediate::orImmediateNumbers(src1, src2);
    14411441        else {
    1442             result = jsNumber(src1->toInt32(exec) | src2->toInt32(exec));
     1442            result = jsNumber(exec, src1->toInt32(exec) | src2->toInt32(exec));
    14431443            VM_CHECK_EXCEPTION();
    14441444        }
     
    14561456        int dst = (++vPC)->u.operand;
    14571457        int src = (++vPC)->u.operand;
    1458         JSValue* result = jsNumber(~r[src].u.jsValue->toInt32(exec));
     1458        JSValue* result = jsNumber(exec, ~r[src].u.jsValue->toInt32(exec));
    14591459        VM_CHECK_EXCEPTION();
    14601460        r[dst].u.jsValue = result;
     
    15101510        int dst = (++vPC)->u.operand;
    15111511        int src = (++vPC)->u.operand;
    1512         r[dst].u.jsValue = jsTypeStringForValue(r[src].u.jsValue);
     1512        r[dst].u.jsValue = jsTypeStringForValue(exec, r[src].u.jsValue);
    15131513
    15141514        ++vPC;
     
    20962096            codeBlock = newCodeBlock;
    20972097            exec->m_callFrameOffset = callFrameOffset;
    2098             setScopeChain(exec, scopeChain, scopeChainForCall(functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));
     2098            setScopeChain(exec, scopeChain, scopeChainForCall(exec, functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));
    20992099            k = codeBlock->jsValues.data();
    21002100            vPC = codeBlock->instructions.begin();
     
    22242224            else
    22252225                prototype = scopeChain->globalObject()->objectPrototype();
    2226             JSObject* newObject = new JSObject(prototype);
     2226            JSObject* newObject = new (exec) JSObject(prototype);
    22272227            r[firstArg].u.jsValue = newObject; // "this" value
    22282228
     
    22392239            codeBlock = newCodeBlock;
    22402240            exec->m_callFrameOffset = callFrameOffset;
    2241             setScopeChain(exec, scopeChain, scopeChainForCall(functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));
     2241            setScopeChain(exec, scopeChain, scopeChainForCall(exec, functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));
    22422242            k = codeBlock->jsValues.data();
    22432243            vPC = codeBlock->instructions.begin();
     
    25512551    if (!activation) {
    25522552        CodeBlock* codeBlock = &function->body->generatedCode();
    2553         activation = new JSActivation(function->body, registerBase, callFrameOffset + CallFrameHeaderSize + codeBlock->numLocals);
     2553        activation = new (exec) JSActivation(function->body, registerBase, callFrameOffset + CallFrameHeaderSize + codeBlock->numLocals);
    25542554        callFrame[OptionalCalleeActivation].u.jsValue = activation;
    25552555    }
  • trunk/JavaScriptCore/VM/RegisterFile.h

    r34372 r34659  
    137137        void copyGlobals(RegisterFile* src);
    138138
    139         void mark()
     139        void mark(Heap* heap)
    140140        {
    141             Collector::markStackObjectsConservatively(m_buffer, m_base + m_size);
     141            heap->markStackObjectsConservatively(m_buffer, m_base + m_size);
    142142        }
    143143
  • trunk/JavaScriptCore/VM/RegisterFileStack.h

    r34372 r34659  
    5252        RegisterFile* current() { return m_stack.last(); }
    5353
    54         void mark()
     54        void mark(Heap* heap)
    5555        {
    5656            Stack::iterator end = m_stack.end();
    5757            for (Stack::iterator it = m_stack.begin(); it != end; ++it)
    58                 (*it)->mark();
     58                (*it)->mark(heap);
    5959        }
    6060
  • trunk/JavaScriptCore/kjs/AllInOneFile.cpp

    r34582 r34659  
    5757#include "NumberObject.cpp"
    5858#include "JSObject.cpp"
     59#include "JSGlobalObject.cpp"
    5960#include "object_object.cpp"
    6061#include "operations.cpp"
  • trunk/JavaScriptCore/kjs/ArrayPrototype.cpp

    r34607 r34659  
    101101    Vector<UChar, 256> strBuffer;
    102102    if (alreadyVisited)
    103         return jsString(UString(0, 0)); // return an empty string, avoding infinite recursion.
     103        return jsString(exec, UString(0, 0)); // return an empty string, avoding infinite recursion.
    104104
    105105    unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
     
    129129    }
    130130    exec->dynamicGlobalObject()->arrayVisitedElements().remove(thisObj);
    131     return jsString(UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
     131    return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
    132132}
    133133
     
    144144    Vector<UChar, 256> strBuffer;
    145145    if (alreadyVisited)
    146         return jsString(UString(0, 0)); // return an empty string, avoding infinite recursion.
     146        return jsString(exec, UString(0, 0)); // return an empty string, avoding infinite recursion.
    147147
    148148    unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
     
    178178    }
    179179    exec->dynamicGlobalObject()->arrayVisitedElements().remove(thisObj);
    180     return jsString(UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
     180    return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
    181181}
    182182
     
    190190    Vector<UChar, 256> strBuffer;
    191191    if (alreadyVisited)
    192         return jsString(UString(0, 0)); // return an empty string, avoding infinite recursion.
     192        return jsString(exec, UString(0, 0)); // return an empty string, avoding infinite recursion.
    193193
    194194    UChar comma = ',';
     
    221221    }
    222222    exec->dynamicGlobalObject()->arrayVisitedElements().remove(thisObj);
    223     return jsString(UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
     223    return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
    224224}
    225225
     
    254254        ++it;
    255255    }
    256     arr->put(exec, exec->propertyNames().length, jsNumber(n));
     256    arr->put(exec, exec->propertyNames().length, jsNumber(exec, n));
    257257    return arr;
    258258}
     
    263263    unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
    264264    if (length == 0) {
    265         thisObj->put(exec, exec->propertyNames().length, jsNumber(length));
     265        thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length));
    266266        result = jsUndefined();
    267267    } else {
    268268        result = thisObj->get(exec, length - 1);
    269269        thisObj->deleteProperty(exec, length - 1);
    270         thisObj->put(exec, exec->propertyNames().length, jsNumber(length - 1));
     270        thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - 1));
    271271    }
    272272    return result;
     
    279279        thisObj->put(exec, length + n, args[n]);
    280280    length += args.size();
    281     thisObj->put(exec, exec->propertyNames().length, jsNumber(length));
    282     return jsNumber(length);
     281    thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length));
     282    return jsNumber(exec, length);
    283283}
    284284
     
    312312    unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
    313313    if (length == 0) {
    314         thisObj->put(exec, exec->propertyNames().length, jsNumber(length));
     314        thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length));
    315315        result = jsUndefined();
    316316    } else {
     
    323323        }
    324324        thisObj->deleteProperty(exec, length - 1);
    325         thisObj->put(exec, exec->propertyNames().length, jsNumber(length - 1));
     325        thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - 1));
    326326    }
    327327    return result;
     
    367367            resObj->put(exec, n, v);
    368368    }
    369     resObj->put(exec, exec->propertyNames().length, jsNumber(n));
     369    resObj->put(exec, exec->propertyNames().length, jsNumber(exec, n));
    370370    return result;
    371371}
     
    452452            resObj->put(exec, k, v);
    453453    }
    454     resObj->put(exec, exec->propertyNames().length, jsNumber(deleteCount));
     454    resObj->put(exec, exec->propertyNames().length, jsNumber(exec, deleteCount));
    455455
    456456    unsigned additionalArgs = std::max<int>(args.size() - 2, 0);
     
    477477        thisObj->put(exec, k + begin, args[k + 2]);
    478478
    479     thisObj->put(exec, exec->propertyNames().length, jsNumber(length - deleteCount + additionalArgs));
     479    thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - deleteCount + additionalArgs));
    480480    return result;
    481481}
     
    496496    for (unsigned k = 0; k < nrArgs; ++k)
    497497        thisObj->put(exec, k, args[k]);
    498     JSValue* result = jsNumber(length + nrArgs);
     498    JSValue* result = jsNumber(exec, length + nrArgs);
    499499    thisObj->put(exec, exec->propertyNames().length, result);
    500500    return result;
     
    524524
    525525        eachArguments.append(v);
    526         eachArguments.append(jsNumber(k));
     526        eachArguments.append(jsNumber(exec, k));
    527527        eachArguments.append(thisObj);
    528528
     
    546546
    547547    ArgList mapArgs;
    548     mapArgs.append(jsNumber(length));
     548    mapArgs.append(jsNumber(exec, length));
    549549    JSObject* resultArray = static_cast<JSObject*>(exec->lexicalGlobalObject()->arrayConstructor()->construct(exec, mapArgs));
    550550
     
    559559
    560560        eachArguments.append(v);
    561         eachArguments.append(jsNumber(k));
     561        eachArguments.append(jsNumber(exec, k));
    562562        eachArguments.append(thisObj);
    563563
     
    595595
    596596        eachArguments.append(slot.getValue(exec, k));
    597         eachArguments.append(jsNumber(k));
     597        eachArguments.append(jsNumber(exec, k));
    598598        eachArguments.append(thisObj);
    599599
     
    626626        ArgList eachArguments;
    627627        eachArguments.append(slot.getValue(exec, k));
    628         eachArguments.append(jsNumber(k));
     628        eachArguments.append(jsNumber(exec, k));
    629629        eachArguments.append(thisObj);
    630630
     
    653653        ArgList eachArguments;
    654654        eachArguments.append(slot.getValue(exec, k));
    655         eachArguments.append(jsNumber(k));
     655        eachArguments.append(jsNumber(exec, k));
    656656        eachArguments.append(thisObj);
    657657
     
    689689            continue;
    690690        if (strictEqual(searchElement, e))
    691             return jsNumber(index);
    692     }
    693 
    694     return jsNumber(-1);
     691            return jsNumber(exec, index);
     692    }
     693
     694    return jsNumber(exec, -1);
    695695}
    696696
     
    707707        d += length;
    708708        if (d < 0)
    709             return jsNumber(-1);
     709            return jsNumber(exec, -1);
    710710    }
    711711    if (d < length)
     
    718718            continue;
    719719        if (strictEqual(searchElement, e))
    720             return jsNumber(index);
    721     }
    722 
    723     return jsNumber(-1);
     720            return jsNumber(exec, index);
     721    }
     722
     723    return jsNumber(exec, -1);
    724724}
    725725
     
    733733
    734734    // no. of arguments for constructor
    735     putDirect(exec->propertyNames().length, jsNumber(1), ReadOnly|DontDelete|DontEnum);
     735    putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
    736736}
    737737
     
    749749        if (n != args[0]->toNumber(exec))
    750750            return throwError(exec, RangeError, "Array size is not a small enough positive integer.");
    751         return new JSArray(exec->lexicalGlobalObject()->arrayPrototype(), n);
     751        return new (exec) JSArray(exec->lexicalGlobalObject()->arrayPrototype(), n);
    752752    }
    753753
    754754    // otherwise the array is constructed with the arguments in it
    755     return new JSArray(exec->lexicalGlobalObject()->arrayPrototype(), args);
     755    return new (exec) JSArray(exec->lexicalGlobalObject()->arrayPrototype(), args);
    756756}
    757757
     
    760760{
    761761    // equivalent to 'new Array(....)'
    762     return construct(exec,args);
    763 }
    764 
    765 }
     762    return construct(exec, args);
     763}
     764
     765}
  • trunk/JavaScriptCore/kjs/BooleanObject.cpp

    r34607 r34659  
    5151    setInternalValue(jsBoolean(false));
    5252
    53     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, booleanProtoFuncToString), DontEnum);
    54     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, booleanProtoFuncValueOf), DontEnum);
     53    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, booleanProtoFuncToString), DontEnum);
     54    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, booleanProtoFuncValueOf), DontEnum);
    5555}
    5656
     
    6868    ASSERT(v);
    6969
    70     return jsString(v->toString(exec));
     70    return jsString(exec, v->toString(exec));
    7171}
    7272JSValue* booleanProtoFuncValueOf(ExecState* exec, JSObject* thisObj, const ArgList&)
     
    9191
    9292    // no. of arguments for constructor
    93     putDirect(exec->propertyNames().length, jsNumber(1), ReadOnly | DontDelete | DontEnum);
     93    putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly | DontDelete | DontEnum);
    9494}
    9595
     
    102102JSObject* BooleanConstructor::construct(ExecState* exec, const ArgList& args)
    103103{
    104     BooleanObject* obj(new BooleanObject(exec->lexicalGlobalObject()->booleanPrototype()));
     104    BooleanObject* obj(new (exec) BooleanObject(exec->lexicalGlobalObject()->booleanPrototype()));
    105105    obj->setInternalValue(jsBoolean(args[0]->toBoolean(exec)));
    106106    return obj;
  • trunk/JavaScriptCore/kjs/ExecState.h

    r34615 r34659  
    2626
    2727#include "JSGlobalData.h"
    28 #include "LabelStack.h"
    29 #include "completion.h"
    30 #include "list.h"
    3128#include "ScopeChain.h"
    3229
     
    9289        static const HashTable* stringTable(ExecState* exec) { return exec->m_globalData->stringTable; }
    9390
     91        Heap* heap() const { return m_globalData->heap; }
     92
    9493    private:
    9594        // Default constructor required for gcc 3.
  • trunk/JavaScriptCore/kjs/FunctionPrototype.cpp

    r34607 r34659  
    4545FunctionPrototype::FunctionPrototype(ExecState* exec)
    4646{
    47     putDirect(exec->propertyNames().length, jsNumber(0), DontDelete | ReadOnly | DontEnum);
    48 
    49     putDirectFunction(new PrototypeFunction(exec, this, 0, exec->propertyNames().toString, functionProtoFuncToString), DontEnum);
    50     putDirectFunction(new PrototypeFunction(exec, this, 2, exec->propertyNames().apply, functionProtoFuncApply), DontEnum);
    51     putDirectFunction(new PrototypeFunction(exec, this, 1, exec->propertyNames().call, functionProtoFuncCall), DontEnum);
     47    putDirect(exec->propertyNames().length, jsNumber(exec, 0), DontDelete | ReadOnly | DontEnum);
     48
     49    putDirectFunction(new (exec) PrototypeFunction(exec, this, 0, exec->propertyNames().toString, functionProtoFuncToString), DontEnum);
     50    putDirectFunction(new (exec) PrototypeFunction(exec, this, 2, exec->propertyNames().apply, functionProtoFuncApply), DontEnum);
     51    putDirectFunction(new (exec) PrototypeFunction(exec, this, 1, exec->propertyNames().call, functionProtoFuncCall), DontEnum);
    5252}
    5353
     
    7171    if (thisObj->inherits(&JSFunction::info)) {
    7272        JSFunction* fi = static_cast<JSFunction*>(thisObj);
    73         return jsString("function " + fi->functionName().ustring() + "(" + fi->body->paramString() + ") " + fi->body->toSourceString());
    74     }
    75 
    76     return jsString("function " + static_cast<InternalFunction*>(thisObj)->functionName().ustring() + "() {\n    [native code]\n}");
     73        return jsString(exec, "function " + fi->functionName().ustring() + "(" + fi->body->paramString() + ") " + fi->body->toSourceString());
     74    }
     75
     76    return jsString(exec, "function " + static_cast<InternalFunction*>(thisObj)->functionName().ustring() + "() {\n    [native code]\n}");
    7777}
    7878
     
    134134
    135135    // Number of arguments for constructor
    136     putDirect(exec->propertyNames().length, jsNumber(1), ReadOnly | DontDelete | DontEnum);
     136    putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly | DontDelete | DontEnum);
    137137}
    138138
     
    175175    ScopeChain scopeChain(exec->lexicalGlobalObject(), exec->globalThisValue());
    176176
    177     JSFunction* fimp = new JSFunction(exec, functionName, functionBody.get(), scopeChain.node());
     177    JSFunction* fimp = new (exec) JSFunction(exec, functionName, functionBody.get(), scopeChain.node());
    178178
    179179    // parse parameter list. throw syntax error on illegal identifiers
  • trunk/JavaScriptCore/kjs/InitializeThreading.cpp

    r34412 r34659  
    5050    s_dtoaP5Mutex = new Mutex;
    5151#if !PLATFORM(DARWIN) // Darwin has pthread_main_np(), and doesn't need registerAsMainThread() called.
    52     Collector::registerAsMainThread();
     52    Heap::registerAsMainThread();
    5353#endif
    5454    JSGlobalData::threadInstance();
     
    6262#if PLATFORM(DARWIN)
    6363    pthread_once(&initializeThreadingKeyOnce, initializeThreadingOnce);
     64
     65    // FIXME: do we want heap introspector to work on other threads?
     66    if (pthread_main_np())
     67       JSGlobalData::threadInstance().heap->initializeHeapIntrospector();
    6468#else
    6569    static bool initializedThreading = false;
  • trunk/JavaScriptCore/kjs/JSActivation.cpp

    r34587 r34659  
    187187    exec->machine()->getFunctionAndArguments(registerBase(), callFrame, function, argv, argc);
    188188    ArgList args(reinterpret_cast<JSValue***>(registerBase()), argv - *registerBase(), argc);
    189     return new Arguments(exec, function, args, this);
     189    return new (exec) Arguments(exec, function, args, this);
    190190}
    191191
  • trunk/JavaScriptCore/kjs/JSArray.cpp

    r34607 r34659  
    8989    m_storage = static_cast<ArrayStorage*>(fastZeroedMalloc(storageSize(initialCapacity)));
    9090
    91     Collector::reportExtraMemoryCost(initialCapacity * sizeof(JSValue*));
     91    Heap::heap(this)->reportExtraMemoryCost(initialCapacity * sizeof(JSValue*));
    9292
    9393    checkConsistency();
     
    147147}
    148148
    149 JSValue* JSArray::lengthGetter(ExecState*, const Identifier&, const PropertySlot& slot)
    150 {
    151     return jsNumber(static_cast<JSArray*>(slot.slotBase())->m_length);
     149JSValue* JSArray::lengthGetter(ExecState* exec, const Identifier&, const PropertySlot& slot)
     150{
     151    return jsNumber(exec, static_cast<JSArray*>(slot.slotBase())->m_length);
    152152}
    153153
  • trunk/JavaScriptCore/kjs/JSFunction.cpp

    r34607 r34659  
    114114}
    115115
    116 JSValue* JSFunction::lengthGetter(ExecState*, const Identifier&, const PropertySlot& slot)
     116JSValue* JSFunction::lengthGetter(ExecState* exec, const Identifier&, const PropertySlot& slot)
    117117{
    118118    JSFunction* thisObj = static_cast<JSFunction*>(slot.slotBase());
    119     return jsNumber(thisObj->body->parameters().size());
     119    return jsNumber(exec, thisObj->body->parameters().size());
    120120}
    121121
     
    196196        proto = exec->lexicalGlobalObject()->objectPrototype();
    197197
    198     JSObject* thisObj = new JSObject(proto);
     198    JSObject* thisObj = new (exec) JSObject(proto);
    199199
    200200    JSValue* exception = 0;
     
    285285{
    286286    putDirect(exec->propertyNames().callee, func, DontEnum);
    287     putDirect(exec->propertyNames().length, args.size(), DontEnum);
     287    putDirect(exec, exec->propertyNames().length, args.size(), DontEnum);
    288288 
    289289    int i = 0;
     
    356356    }
    357357  }
    358   return jsString(r);
     358  return jsString(exec, r);
    359359}
    360360
     
    421421    s.append(c);
    422422  }
    423   return jsString(s);
     423  return jsString(exec, s);
    424424}
    425425
     
    593593JSValue* globalFuncParseInt(ExecState* exec, JSObject*, const ArgList& args)
    594594{
    595     return jsNumber(parseInt(args[0]->toString(exec), args[1]->toInt32(exec)));
     595    return jsNumber(exec, parseInt(args[0]->toString(exec), args[1]->toInt32(exec)));
    596596}
    597597
    598598JSValue* globalFuncParseFloat(ExecState* exec, JSObject*, const ArgList& args)
    599599{
    600     return jsNumber(parseFloat(args[0]->toString(exec)));
     600    return jsNumber(exec, parseFloat(args[0]->toString(exec)));
    601601}
    602602
     
    673673    }
    674674
    675     return jsString(r);
     675    return jsString(exec, r);
    676676}
    677677
     
    698698    }
    699699
    700     return jsString(s);
     700    return jsString(exec, s);
    701701}
    702702
     
    718718{
    719719    ASSERT_ARG(function, function);
    720     putDirect(exec->propertyNames().length, jsNumber(len), DontDelete | ReadOnly | DontEnum);
     720    putDirect(exec->propertyNames().length, jsNumber(exec, len), DontDelete | ReadOnly | DontEnum);
    721721}
    722722
     
    726726{
    727727    ASSERT_ARG(function, function);
    728     putDirect(exec->propertyNames().length, jsNumber(len), DontDelete | ReadOnly | DontEnum);
     728    putDirect(exec->propertyNames().length, jsNumber(exec, len), DontDelete | ReadOnly | DontEnum);
    729729}
    730730
     
    743743    ASSERT_ARG(function, function);
    744744    ASSERT_ARG(cachedGlobalObject, cachedGlobalObject);
    745     putDirect(exec->propertyNames().length, jsNumber(len), DontDelete | ReadOnly | DontEnum);
     745    putDirect(exec->propertyNames().length, jsNumber(exec, len), DontDelete | ReadOnly | DontEnum);
    746746}
    747747
  • trunk/JavaScriptCore/kjs/JSGlobalData.cpp

    r34607 r34659  
    3939
    4040#if USE(MULTIPLE_THREADS)
     41#include <wtf/Threading.h>
    4142#include <wtf/ThreadSpecific.h>
    4243#endif
     
    5657
    5758JSGlobalData::JSGlobalData()
    58 //    : heap(new Heap)
     59    : heap(new Heap)
    5960#if USE(MULTIPLE_THREADS)
    60     : arrayTable(new HashTable(KJS::arrayTable))
     61    , arrayTable(new HashTable(KJS::arrayTable))
    6162    , dateTable(new HashTable(KJS::dateTable))
    6263    , mathTable(new HashTable(KJS::mathTable))
     
    6667    , stringTable(new HashTable(KJS::stringTable))
    6768#else
    68     : arrayTable(&KJS::arrayTable)
     69    , arrayTable(&KJS::arrayTable)
    6970    , dateTable(&KJS::dateTable)
    7071    , mathTable(&KJS::mathTable)
     
    119120}
    120121
     122JSGlobalData& JSGlobalData::sharedInstance()
     123{
     124    return threadInstance();
     125/*
     126#if USE(MULTIPLE_THREADS)
     127    AtomicallyInitializedStatic(JSGlobalData, sharedInstance);
     128#else
     129    static JSGlobalData sharedInstance;
     130#endif
     131    return sharedInstance;
     132*/
    121133}
     134
     135}
  • trunk/JavaScriptCore/kjs/JSGlobalData.h

    r34587 r34659  
    3131
    3232#include "list.h"
    33 #include "ustring.h"
    3433#include <wtf/HashCountedSet.h>
    3534#include <wtf/HashSet.h>
     
    4342
    4443    class CommonIdentifiers;
    45 //    class Heap;
     44    class Heap;
    4645    class IdentifierTable;
    4746    class JSGlobalObject;
     
    5756    struct JSGlobalData : Noncopyable {
    5857        static JSGlobalData& threadInstance();
     58        static JSGlobalData& sharedInstance();
    5959
    60 //        Heap* heap;
     60        Heap* heap;
    6161
    6262        const HashTable* arrayTable;
  • trunk/JavaScriptCore/kjs/JSGlobalObject.cpp

    r34607 r34659  
    9090}
    9191
    92 JSGlobalObject* JSGlobalObject::s_head = 0;
    93 
    9492JSGlobalObject::~JSGlobalObject()
    9593{
    96     ASSERT(JSLock::currentThreadIsHoldingLock());
    97 
    9894    if (d()->debugger)
    9995        d()->debugger->detach(this);
     
    10197    d()->next->d()->prev = d()->prev;
    10298    d()->prev->d()->next = d()->next;
    103     s_head = d()->next;
    104     if (s_head == this)
    105         s_head = 0;
     99    JSGlobalObject*& headObject = head();
     100    if (headObject == this)
     101        headObject = d()->next;
     102    if (headObject == this)
     103        headObject = 0;
    106104
    107105    HashSet<ProgramCodeBlock*>::const_iterator end = codeBlocks().end();
     
    116114    ASSERT(JSLock::currentThreadIsHoldingLock());
    117115
    118     if (s_head) {
    119         d()->prev = s_head;
    120         d()->next = s_head->d()->next;
    121         s_head->d()->next->d()->prev = this;
    122         s_head->d()->next = this;
     116    if (JSGlobalObject*& headObject = head()) {
     117        d()->prev = headObject;
     118        d()->next = headObject->d()->next;
     119        headObject->d()->next->d()->prev = this;
     120        headObject->d()->next = this;
    123121    } else
    124         s_head = d()->next = d()->prev = this;
     122        headObject = d()->next = d()->prev = this;
    125123
    126124    resetTimeoutCheck();
     
    142140void JSGlobalObject::put(ExecState* exec, const Identifier& propertyName, JSValue* value)
    143141{
     142    ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this));
     143
    144144    if (symbolTablePut(propertyName, value))
    145145        return;
     
    235235
    236236    // Prototypes
    237     d()->functionPrototype = new FunctionPrototype(exec);
    238     d()->objectPrototype = new ObjectPrototype(exec, d()->functionPrototype);
     237    d()->functionPrototype = new (exec) FunctionPrototype(exec);
     238    d()->objectPrototype = new (exec) ObjectPrototype(exec, d()->functionPrototype);
    239239    d()->functionPrototype->setPrototype(d()->objectPrototype);
    240240
    241     d()->arrayPrototype = new ArrayPrototype(exec, d()->objectPrototype);
    242     d()->stringPrototype = new StringPrototype(exec, d()->objectPrototype);
    243     d()->booleanPrototype = new BooleanPrototype(exec, d()->objectPrototype, d()->functionPrototype);
    244     d()->numberPrototype = new NumberPrototype(exec, d()->objectPrototype, d()->functionPrototype);
    245     d()->datePrototype = new DatePrototype(exec, d()->objectPrototype);
    246     d()->regExpPrototype = new RegExpPrototype(exec, d()->objectPrototype, d()->functionPrototype);
    247     d()->errorPrototype = new ErrorPrototype(exec, d()->objectPrototype, d()->functionPrototype);
    248    
    249     d()->evalErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "EvalError", "EvalError");
    250     d()->rangeErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "RangeError", "RangeError");
    251     d()->referenceErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "ReferenceError", "ReferenceError");
    252     d()->syntaxErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "SyntaxError", "SyntaxError");
    253     d()->typeErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "TypeError", "TypeError");
    254     d()->URIErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "URIError", "URIError");
     241    d()->arrayPrototype = new (exec) ArrayPrototype(exec, d()->objectPrototype);
     242    d()->stringPrototype = new (exec) StringPrototype(exec, d()->objectPrototype);
     243    d()->booleanPrototype = new (exec) BooleanPrototype(exec, d()->objectPrototype, d()->functionPrototype);
     244    d()->numberPrototype = new (exec) NumberPrototype(exec, d()->objectPrototype, d()->functionPrototype);
     245    d()->datePrototype = new (exec) DatePrototype(exec, d()->objectPrototype);
     246    d()->regExpPrototype = new (exec) RegExpPrototype(exec, d()->objectPrototype, d()->functionPrototype);
     247    d()->errorPrototype = new (exec) ErrorPrototype(exec, d()->objectPrototype, d()->functionPrototype);
     248   
     249    d()->evalErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "EvalError", "EvalError");
     250    d()->rangeErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "RangeError", "RangeError");
     251    d()->referenceErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "ReferenceError", "ReferenceError");
     252    d()->syntaxErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "SyntaxError", "SyntaxError");
     253    d()->typeErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "TypeError", "TypeError");
     254    d()->URIErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "URIError", "URIError");
    255255
    256256    // Constructors
    257     d()->objectConstructor = new ObjectConstructor(exec, d()->objectPrototype, d()->functionPrototype);
    258     d()->functionConstructor = new FunctionConstructor(exec, d()->functionPrototype);
    259     d()->arrayConstructor = new ArrayConstructor(exec, d()->functionPrototype, d()->arrayPrototype);
    260     d()->stringConstructor = new StringConstructor(exec, d()->functionPrototype, d()->stringPrototype);
    261     d()->booleanConstructor = new BooleanConstructor(exec, d()->functionPrototype, d()->booleanPrototype);
    262     d()->numberConstructor = new NumberConstructor(exec, d()->functionPrototype, d()->numberPrototype);
    263     d()->dateConstructor = new DateConstructor(exec, d()->functionPrototype, d()->datePrototype);
    264     d()->regExpConstructor = new RegExpConstructor(exec, d()->functionPrototype, d()->regExpPrototype);
    265     d()->errorConstructor = new ErrorConstructor(exec, d()->functionPrototype, d()->errorPrototype);
    266    
    267     d()->evalErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->evalErrorPrototype);
    268     d()->rangeErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->rangeErrorPrototype);
    269     d()->referenceErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->referenceErrorPrototype);
    270     d()->syntaxErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->syntaxErrorPrototype);
    271     d()->typeErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->typeErrorPrototype);
    272     d()->URIErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->URIErrorPrototype);
     257    d()->objectConstructor = new (exec) ObjectConstructor(exec, d()->objectPrototype, d()->functionPrototype);
     258    d()->functionConstructor = new (exec) FunctionConstructor(exec, d()->functionPrototype);
     259    d()->arrayConstructor = new (exec) ArrayConstructor(exec, d()->functionPrototype, d()->arrayPrototype);
     260    d()->stringConstructor = new (exec) StringConstructor(exec, d()->functionPrototype, d()->stringPrototype);
     261    d()->booleanConstructor = new (exec) BooleanConstructor(exec, d()->functionPrototype, d()->booleanPrototype);
     262    d()->numberConstructor = new (exec) NumberConstructor(exec, d()->functionPrototype, d()->numberPrototype);
     263    d()->dateConstructor = new (exec) DateConstructor(exec, d()->functionPrototype, d()->datePrototype);
     264    d()->regExpConstructor = new (exec) RegExpConstructor(exec, d()->functionPrototype, d()->regExpPrototype);
     265    d()->errorConstructor = new (exec) ErrorConstructor(exec, d()->functionPrototype, d()->errorPrototype);
     266   
     267    d()->evalErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->evalErrorPrototype);
     268    d()->rangeErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->rangeErrorPrototype);
     269    d()->referenceErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->referenceErrorPrototype);
     270    d()->syntaxErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->syntaxErrorPrototype);
     271    d()->typeErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->typeErrorPrototype);
     272    d()->URIErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->URIErrorPrototype);
    273273   
    274274    d()->functionPrototype->putDirect(exec->propertyNames().constructor, d()->functionConstructor, DontEnum);
     
    312312    // Set global values.
    313313    GlobalPropertyInfo staticGlobals[] = {
    314         GlobalPropertyInfo(Identifier(exec, "Math"), new MathObject(exec, d()->objectPrototype), DontEnum | DontDelete),
    315         GlobalPropertyInfo(Identifier(exec, "NaN"), jsNaN(), DontEnum | DontDelete),
    316         GlobalPropertyInfo(Identifier(exec, "Infinity"), jsNumber(Inf), DontEnum | DontDelete),
     314        GlobalPropertyInfo(Identifier(exec, "Math"), new (exec) MathObject(exec, d()->objectPrototype), DontEnum | DontDelete),
     315        GlobalPropertyInfo(Identifier(exec, "NaN"), jsNaN(exec), DontEnum | DontDelete),
     316        GlobalPropertyInfo(Identifier(exec, "Infinity"), jsNumber(exec, Inf), DontEnum | DontDelete),
    317317        GlobalPropertyInfo(Identifier(exec, "undefined"), jsUndefined(), DontEnum | DontDelete)
    318318    };
     
    322322    // Set global functions.
    323323
    324     d()->evalFunction = new PrototypeReflexiveFunction(exec, d()->functionPrototype, 1, exec->propertyNames().eval, globalFuncEval, this);
     324    d()->evalFunction = new (exec) PrototypeReflexiveFunction(exec, d()->functionPrototype, 1, exec->propertyNames().eval, globalFuncEval, this);
    325325    putDirectFunction(d()->evalFunction, DontEnum);
    326     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 2, Identifier(exec, "parseInt"), globalFuncParseInt), DontEnum);
    327     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "parseFloat"), globalFuncParseFloat), DontEnum);
    328     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isNaN"), globalFuncIsNaN), DontEnum);
    329     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isFinite"), globalFuncIsFinite), DontEnum);
    330     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "escape"), globalFuncEscape), DontEnum);
    331     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "unescape"), globalFuncUnescape), DontEnum);
    332     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURI"), globalFuncDecodeURI), DontEnum);
    333     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURIComponent"), globalFuncDecodeURIComponent), DontEnum);
    334     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURI"), globalFuncEncodeURI), DontEnum);
    335     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURIComponent"), globalFuncEncodeURIComponent), DontEnum);
     326    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 2, Identifier(exec, "parseInt"), globalFuncParseInt), DontEnum);
     327    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "parseFloat"), globalFuncParseFloat), DontEnum);
     328    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isNaN"), globalFuncIsNaN), DontEnum);
     329    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isFinite"), globalFuncIsFinite), DontEnum);
     330    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "escape"), globalFuncEscape), DontEnum);
     331    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "unescape"), globalFuncUnescape), DontEnum);
     332    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURI"), globalFuncDecodeURI), DontEnum);
     333    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURIComponent"), globalFuncDecodeURIComponent), DontEnum);
     334    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURI"), globalFuncEncodeURI), DontEnum);
     335    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURIComponent"), globalFuncEncodeURIComponent), DontEnum);
    336336#ifndef NDEBUG
    337     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "kjsprint"), globalFuncKJSPrint), DontEnum);
     337    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "kjsprint"), globalFuncKJSPrint), DontEnum);
    338338#endif
    339339
     
    412412        (*it)->mark();
    413413
    414     registerFileStack().mark();
     414    registerFileStack().mark(globalData()->heap);
    415415
    416416    markIfNeeded(d()->globalExec->exception());
     
    466466}
    467467
     468void* JSGlobalObject::operator new(size_t size)
     469{
     470#ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
     471    return JSGlobalData::threadInstance().heap->inlineAllocate(size);
     472#else
     473    return JSGlobalData::threadInstance().heap->allocate(size);
     474#endif
     475}
     476
     477void* JSGlobalObject::operator new(size_t size, SharedTag)
     478{
     479#ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
     480    return JSGlobalData::sharedInstance().heap->inlineAllocate(size);
     481#else
     482    return JSGlobalData::sharedInstance().heap->allocate(size);
     483#endif
     484}
    468485
    469486} // namespace KJS
  • trunk/JavaScriptCore/kjs/JSGlobalObject.h

    r34580 r34659  
    171171        virtual void putWithAttributes(ExecState*, const Identifier& propertyName, JSValue* value, unsigned attributes);
    172172
    173 
    174173        virtual void defineGetter(ExecState*, const Identifier& propertyName, JSObject* getterFunc);
    175174        virtual void defineSetter(ExecState*, const Identifier& propertyName, JSObject* setterFunc);
     
    261260        JSGlobalData* globalData() { return d()->globalData; }
    262261
     262        enum SharedTag { Shared };
     263        void* operator new(size_t);
     264        void* operator new(size_t, SharedTag);
     265
    263266        void init(JSObject* thisValue);
    264267       
     
    283286        bool checkTimeout();
    284287        void resetTimeoutCheck();
    285 
    286         static JSGlobalObject* s_head;
    287288    };
    288289
  • trunk/JavaScriptCore/kjs/JSImmediate.cpp

    r34587 r34659  
    3434    ASSERT(isImmediate(v));
    3535    if (v == jsNull())
    36         return new JSNotAnObject(throwError(exec, TypeError, "Null value"));
     36        return new (exec) JSNotAnObject(throwError(exec, TypeError, "Null value"));
    3737    else if (v == jsUndefined())
    38         return new JSNotAnObject(throwError(exec, TypeError, "Undefined value"));
     38        return new (exec) JSNotAnObject(throwError(exec, TypeError, "Undefined value"));
    3939    else if (isBoolean(v)) {
    4040        ArgList args;
  • trunk/JavaScriptCore/kjs/JSImmediate.h

    r34265 r34659  
    353353}
    354354
     355ALWAYS_INLINE JSValue* jsUndefined()
     356{
     357    return JSImmediate::undefinedImmediate();
     358}
     359
     360inline JSValue* jsNull()
     361{
     362    return JSImmediate::nullImmediate();
     363}
     364
     365inline JSValue* jsBoolean(bool b)
     366{
     367    return b ? JSImmediate::trueImmediate() : JSImmediate::falseImmediate();
     368}
     369
    355370} // namespace KJS
    356371
  • trunk/JavaScriptCore/kjs/JSLock.cpp

    r33038 r34659  
    8383void JSLock::registerThread()
    8484{
    85     Collector::registerThread();
     85    Heap::registerThread();
    8686}
    8787
  • trunk/JavaScriptCore/kjs/JSObject.cpp

    r34607 r34659  
    9797{
    9898  ASSERT(value);
     99  ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this));
    99100
    100101  if (propertyName == exec->propertyNames().underscoreProto) {
     
    294295}
    295296
    296 void JSObject::defineGetter(ExecState*, const Identifier& propertyName, JSObject* getterFunc)
     297void JSObject::defineGetter(ExecState* exec, const Identifier& propertyName, JSObject* getterFunc)
    297298{
    298299    JSValue *o = getDirect(propertyName);
     
    302303        gs = static_cast<GetterSetter *>(o);
    303304    } else {
    304         gs = new GetterSetter;
     305        gs = new (exec) GetterSetter;
    305306        putDirect(propertyName, gs, IsGetterSetter);
    306307    }
     
    310311}
    311312
    312 void JSObject::defineSetter(ExecState*, const Identifier& propertyName, JSObject* setterFunc)
     313void JSObject::defineSetter(ExecState* exec, const Identifier& propertyName, JSObject* setterFunc)
    313314{
    314315    JSValue *o = getDirect(propertyName);
     
    318319        gs = static_cast<GetterSetter *>(o);
    319320    } else {
    320         gs = new GetterSetter;
     321        gs = new (exec) GetterSetter;
    321322        putDirect(propertyName, gs, IsGetterSetter);
    322323    }
     
    557558  ArgList args;
    558559  if (message.isEmpty())
    559     args.append(jsString(name));
     560    args.append(jsString(exec, name));
    560561  else
    561     args.append(jsString(message));
     562    args.append(jsString(exec, message));
    562563  JSObject *err = static_cast<JSObject *>(cons->construct(exec,args));
    563564
    564565  if (lineno != -1)
    565     err->put(exec, Identifier(exec, "line"), jsNumber(lineno));
     566    err->put(exec, Identifier(exec, "line"), jsNumber(exec, lineno));
    566567  if (sourceId != -1)
    567     err->put(exec, Identifier(exec, "sourceId"), jsNumber(sourceId));
     568    err->put(exec, Identifier(exec, "sourceId"), jsNumber(exec, sourceId));
    568569
    569570  if(!sourceURL.isNull())
    570     err->put(exec, Identifier(exec, "sourceURL"), jsString(sourceURL));
     571    err->put(exec, Identifier(exec, "sourceURL"), jsString(exec, sourceURL));
    571572 
    572573  return err;
  • trunk/JavaScriptCore/kjs/JSObject.h

    r34587 r34659  
    421421        { return _prop.getLocation(propertyName, isWriteable); }
    422422    void putDirect(const Identifier &propertyName, JSValue *value, int attr = 0);
    423     void putDirect(const Identifier &propertyName, int value, int attr = 0);
     423    void putDirect(ExecState*, const Identifier& propertyName, int value, int attr = 0);
    424424    void removeDirect(const Identifier &propertyName);
    425425   
     
    487487{
    488488    ASSERT(proto);
     489    ASSERT(Heap::heap(this) == Heap::heap(proto));
    489490}
    490491
     
    630631}
    631632
    632 inline void JSObject::putDirect(const Identifier &propertyName, int value, int attr)
    633 {
    634     _prop.put(propertyName, jsNumber(value), attr);
     633inline void JSObject::putDirect(ExecState* exec, const Identifier &propertyName, int value, int attr)
     634{
     635    _prop.put(propertyName, jsNumber(exec, value), attr);
    635636}
    636637
  • trunk/JavaScriptCore/kjs/JSString.h

    r34582 r34659  
    3232  class JSString : public JSCell {
    3333  public:
    34     JSString(const UString& value) : m_value(value) { Collector::reportExtraMemoryCost(value.cost()); }
     34    JSString(const UString& value) : m_value(value) { Heap::heap(this)->reportExtraMemoryCost(value.cost()); }
    3535    enum HasOtherOwnerType { HasOtherOwner };
    3636    JSString(const UString& value, HasOtherOwnerType) : m_value(value) { }
  • trunk/JavaScriptCore/kjs/JSValue.cpp

    r34581 r34659  
    8181static const double D32 = 4294967296.0;
    8282
    83 void* JSCell::operator new(size_t size)
    84 {
    85     return Collector::allocate(size);
     83void* JSCell::operator new(size_t size, ExecState* exec)
     84{
     85#ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
     86    return exec->heap()->inlineAllocate(size);
     87#else
     88    return exec->heap()->allocate(size);
     89#endif
    8690}
    8791
     
    257261}
    258262
    259 JSCell* jsString(const char* s)
    260 {
    261     return new JSString(s ? s : "");
    262 }
    263 
    264 JSCell* jsString(const UString& s)
    265 {
    266     return s.isNull() ? new JSString("") : new JSString(s);
    267 }
    268 
    269 JSCell* jsOwnedString(const UString& s)
    270 {
    271     return s.isNull() ? new JSString("", JSString::HasOtherOwner) : new JSString(s, JSString::HasOtherOwner);
     263JSCell* jsString(ExecState* exec, const char* s)
     264{
     265    return new (exec) JSString(s ? s : "");
     266}
     267
     268JSCell* jsString(ExecState* exec, const UString& s)
     269{
     270    return s.isNull() ? new (exec) JSString("") : new (exec) JSString(s);
     271}
     272
     273JSCell* jsOwnedString(ExecState* exec, const UString& s)
     274{
     275    return s.isNull() ? new (exec) JSString("", JSString::HasOtherOwner) : new (exec) JSString(s, JSString::HasOtherOwner);
    272276}
    273277
  • trunk/JavaScriptCore/kjs/JSValue.h

    r34582 r34659  
    2626#include "CallData.h"
    2727#include "ConstructData.h"
     28#include "ExecState.h"
    2829#include "JSImmediate.h"
    2930#include "collector.h"
     
    5253class JSValue : Noncopyable {
    5354    friend class JSCell; // so it can derive from this class
    54     friend class Collector; // so it can call asCell()
     55    friend class Heap; // so it can call asCell()
    5556private:
    5657    JSValue();
     
    142143
    143144class JSCell : public JSValue {
    144     friend class Collector;
     145    friend class Heap;
    145146    friend class GetterSetter;
    146147    friend class JSObject;
     
    186187
    187188    // Garbage collection.
    188     void* operator new(size_t);
     189    void* operator new(size_t, ExecState*);
    189190    virtual void mark();
    190191    bool marked() const;
     
    202203
    203204class JSNumberCell : public JSCell {
    204     friend JSValue* jsNumberCell(double);
     205    friend JSValue* jsNumberCell(ExecState*, double);
    205206public:
    206207    double value() const { return val; }
     
    216217    virtual JSObject* toThisObject(ExecState*) const;
    217218
    218     void* operator new(size_t size)
     219    void* operator new(size_t size, ExecState* exec)
    219220    {
    220221#ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
    221         return Collector::inlineAllocateNumber(size);
     222        return exec->heap()->inlineAllocateNumber(size);
    222223#else
    223         return Collector::allocateNumber(size);
     224        return exec->heap()->allocateNumber(size);
    224225#endif
    225226    }
     
    238239};
    239240
    240 JSCell* jsString(const UString&); // returns empty string if passed null string
    241 JSCell* jsString(const char* = ""); // returns empty string if passed 0
     241JSCell* jsString(ExecState*, const UString&); // returns empty string if passed null string
     242JSCell* jsString(ExecState*, const char* = ""); // returns empty string if passed 0
    242243
    243244// should be used for strings that are owned by an object that will
    244245// likely outlive the JSValue this makes, such as the parse tree or a
    245246// DOM object that contains a UString
    246 JSCell* jsOwnedString(const UString&);
     247JSCell* jsOwnedString(ExecState*, const UString&);
    247248
    248249extern const double NaN;
     
    251252// Beware marking this function ALWAYS_INLINE: It takes a PIC branch, so
    252253// inlining it may not always be a win.
    253 inline JSValue* jsNumberCell(double d)
    254 {
    255     return new JSNumberCell(d);
    256 }
    257 
    258 ALWAYS_INLINE JSValue* jsUndefined()
    259 {
    260     return JSImmediate::undefinedImmediate();
    261 }
    262 
    263 inline JSValue* jsNull()
    264 {
    265     return JSImmediate::nullImmediate();
    266 }
    267 
    268 inline JSValue* jsNaN()
    269 {
    270     return jsNumberCell(NaN);
    271 }
    272 
    273 inline JSValue* jsBoolean(bool b)
    274 {
    275     return b ? JSImmediate::trueImmediate() : JSImmediate::falseImmediate();
    276 }
    277 
    278 ALWAYS_INLINE JSValue* jsNumber(double d)
     254inline JSValue* jsNumberCell(ExecState* exec, double d)
     255{
     256    return new (exec) JSNumberCell(d);
     257}
     258
     259inline JSValue* jsNaN(ExecState* exec)
     260{
     261    return jsNumberCell(exec, NaN);
     262}
     263
     264ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, double d)
    279265{
    280266    JSValue* v = JSImmediate::from(d);
    281     return v ? v : jsNumberCell(d);
    282 }
    283 
    284 ALWAYS_INLINE JSValue* jsNumber(int i)
     267    return v ? v : jsNumberCell(exec, d);
     268}
     269
     270ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, int i)
    285271{
    286272    JSValue* v = JSImmediate::from(i);
    287     return v ? v : jsNumberCell(i);
    288 }
    289 
    290 ALWAYS_INLINE JSValue* jsNumber(unsigned i)
     273    return v ? v : jsNumberCell(exec, i);
     274}
     275
     276ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned i)
    291277{
    292278    JSValue* v = JSImmediate::from(i);
    293     return v ? v : jsNumberCell(i);
    294 }
    295 
    296 ALWAYS_INLINE JSValue* jsNumber(long i)
     279    return v ? v : jsNumberCell(exec, i);
     280}
     281
     282ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, long i)
    297283{
    298284    JSValue* v = JSImmediate::from(i);
    299     return v ? v : jsNumberCell(i);
    300 }
    301 
    302 ALWAYS_INLINE JSValue* jsNumber(unsigned long i)
     285    return v ? v : jsNumberCell(exec, i);
     286}
     287
     288ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned long i)
    303289{
    304290    JSValue* v = JSImmediate::from(i);
    305     return v ? v : jsNumberCell(i);
    306 }
    307 
    308 ALWAYS_INLINE JSValue* jsNumber(long long i)
     291    return v ? v : jsNumberCell(exec, i);
     292}
     293
     294ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, long long i)
    309295{
    310296    JSValue* v = JSImmediate::from(i);
    311     return v ? v : jsNumberCell(static_cast<double>(i));
    312 }
    313 
    314 ALWAYS_INLINE JSValue* jsNumber(unsigned long long i)
     297    return v ? v : jsNumberCell(exec, static_cast<double>(i));
     298}
     299
     300ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned long long i)
    315301{
    316302    JSValue* v = JSImmediate::from(i);
    317     return v ? v : jsNumberCell(static_cast<double>(i));
    318 }
    319 
    320 ALWAYS_INLINE JSValue* jsNumberFromAnd(ExecState *exec, JSValue* v1, JSValue* v2)
    321 {
    322     if (JSImmediate::areBothImmediateNumbers(v1, v2))
    323         return JSImmediate::andImmediateNumbers(v1, v2);
    324     return jsNumber(v1->toInt32(exec) & v2->toInt32(exec));
     303    return v ? v : jsNumberCell(exec, static_cast<double>(i));
    325304}
    326305
     
    358337inline bool JSCell::marked() const
    359338{
    360     return Collector::isCellMarked(this);
     339    return Heap::isCellMarked(this);
    361340}
    362341
    363342inline void JSCell::mark()
    364343{
    365     return Collector::markCell(this);
     344    return Heap::markCell(this);
    366345}
    367346
     
    536515ALWAYS_INLINE JSValue* JSValue::toJSNumber(ExecState* exec) const
    537516{
    538     return JSImmediate::isNumber(this) ? const_cast<JSValue*>(this) : jsNumber(this->toNumber(exec));
     517    return JSImmediate::isNumber(this) ? const_cast<JSValue*>(this) : jsNumber(exec, this->toNumber(exec));
    539518}
    540519
  • trunk/JavaScriptCore/kjs/MathObject.cpp

    r34587 r34659  
    7777}
    7878
    79 JSValue* MathObject::getValueProperty(ExecState*, int token) const
     79JSValue* MathObject::getValueProperty(ExecState* exec, int token) const
    8080{
    8181    switch (token) {
    8282    case Euler:
    83         return jsNumber(exp(1.0));
     83        return jsNumber(exec, exp(1.0));
    8484    case Ln2:
    85         return jsNumber(log(2.0));
     85        return jsNumber(exec, log(2.0));
    8686    case Ln10:
    87         return jsNumber(log(10.0));
     87        return jsNumber(exec, log(10.0));
    8888    case Log2E:
    89         return jsNumber(1.0 / log(2.0));
     89        return jsNumber(exec, 1.0 / log(2.0));
    9090    case Log10E:
    91         return jsNumber(1.0 / log(10.0));
     91        return jsNumber(exec, 1.0 / log(10.0));
    9292    case Pi:
    93         return jsNumber(piDouble);
     93        return jsNumber(exec, piDouble);
    9494    case Sqrt1_2:
    95         return jsNumber(sqrt(0.5));
     95        return jsNumber(exec, sqrt(0.5));
    9696    case Sqrt2:
    97         return jsNumber(sqrt(2.0));
     97        return jsNumber(exec, sqrt(2.0));
    9898    }
    9999
     
    107107{
    108108    double arg = args[0]->toNumber(exec);
    109     return signbit(arg) ? jsNumber(-arg) : jsNumber(arg);
     109    return signbit(arg) ? jsNumber(exec, -arg) : jsNumber(exec, arg);
    110110}
    111111
    112112JSValue* mathProtoFuncACos(ExecState* exec, JSObject*, const ArgList& args)
    113113{
    114     return jsNumber(acos(args[0]->toNumber(exec)));
     114    return jsNumber(exec, acos(args[0]->toNumber(exec)));
    115115}
    116116
    117117JSValue* mathProtoFuncASin(ExecState* exec, JSObject*, const ArgList& args)
    118118{
    119     return jsNumber(asin(args[0]->toNumber(exec)));
     119    return jsNumber(exec, asin(args[0]->toNumber(exec)));
    120120}
    121121
    122122JSValue* mathProtoFuncATan(ExecState* exec, JSObject*, const ArgList& args)
    123123{
    124     return jsNumber(atan(args[0]->toNumber(exec)));
     124    return jsNumber(exec, atan(args[0]->toNumber(exec)));
    125125}
    126126
    127127JSValue* mathProtoFuncATan2(ExecState* exec, JSObject*, const ArgList& args)
    128128{
    129     return jsNumber(atan2(args[0]->toNumber(exec), args[1]->toNumber(exec)));
     129    return jsNumber(exec, atan2(args[0]->toNumber(exec), args[1]->toNumber(exec)));
    130130}
    131131
     
    134134    double arg = args[0]->toNumber(exec);
    135135    if (signbit(arg) && arg > -1.0)
    136         return jsNumber(-0.0);
    137     return jsNumber(ceil(arg));
     136        return jsNumber(exec, -0.0);
     137    return jsNumber(exec, ceil(arg));
    138138}
    139139
    140140JSValue* mathProtoFuncCos(ExecState* exec, JSObject*, const ArgList& args)
    141141{
    142     return jsNumber(cos(args[0]->toNumber(exec)));
     142    return jsNumber(exec, cos(args[0]->toNumber(exec)));
    143143}
    144144
    145145JSValue* mathProtoFuncExp(ExecState* exec, JSObject*, const ArgList& args)
    146146{
    147     return jsNumber(exp(args[0]->toNumber(exec)));
     147    return jsNumber(exec, exp(args[0]->toNumber(exec)));
    148148}
    149149
     
    152152    double arg = args[0]->toNumber(exec);
    153153    if (signbit(arg) && arg == 0.0)
    154         return jsNumber(-0.0);
    155     return jsNumber(floor(arg));
     154        return jsNumber(exec, -0.0);
     155    return jsNumber(exec, floor(arg));
    156156}
    157157
    158158JSValue* mathProtoFuncLog(ExecState* exec, JSObject*, const ArgList& args)
    159159{
    160     return jsNumber(log(args[0]->toNumber(exec)));
     160    return jsNumber(exec, log(args[0]->toNumber(exec)));
    161161}
    162162
     
    174174            result = val;
    175175    }
    176     return jsNumber(result);
     176    return jsNumber(exec, result);
    177177}
    178178
     
    190190            result = val;
    191191    }
    192     return jsNumber(result);
     192    return jsNumber(exec, result);
    193193}
    194194
     
    201201
    202202    if (isnan(arg2))
    203         return jsNaN();
     203        return jsNaN(exec);
    204204    if (isinf(arg2) && fabs(arg) == 1)
    205         return jsNaN();
    206     return jsNumber(pow(arg, arg2));
    207 }
    208 
    209 JSValue* mathProtoFuncRandom(ExecState*, JSObject*, const ArgList&)
     205        return jsNaN(exec);
     206    return jsNumber(exec, pow(arg, arg2));
     207}
     208
     209JSValue* mathProtoFuncRandom(ExecState* exec, JSObject*, const ArgList&)
    210210{
    211211#if !USE(MULTIPLE_THREADS)
     
    217217#endif
    218218
    219     return jsNumber(wtf_random());
     219    return jsNumber(exec, wtf_random());
    220220}
    221221
     
    224224    double arg = args[0]->toNumber(exec);
    225225    if (signbit(arg) && arg >= -0.5)
    226          return jsNumber(-0.0);
    227     return jsNumber(floor(arg + 0.5));
     226         return jsNumber(exec, -0.0);
     227    return jsNumber(exec, floor(arg + 0.5));
    228228}
    229229
    230230JSValue* mathProtoFuncSin(ExecState* exec, JSObject*, const ArgList& args)
    231231{
    232     return jsNumber(sin(args[0]->toNumber(exec)));
     232    return jsNumber(exec, sin(args[0]->toNumber(exec)));
    233233}
    234234
    235235JSValue* mathProtoFuncSqrt(ExecState* exec, JSObject*, const ArgList& args)
    236236{
    237     return jsNumber(sqrt(args[0]->toNumber(exec)));
     237    return jsNumber(exec, sqrt(args[0]->toNumber(exec)));
    238238}
    239239
    240240JSValue* mathProtoFuncTan(ExecState* exec, JSObject*, const ArgList& args)
    241241{
    242     return jsNumber(tan(args[0]->toNumber(exec)));
     242    return jsNumber(exec, tan(args[0]->toNumber(exec)));
    243243}
    244244
  • trunk/JavaScriptCore/kjs/NumberObject.cpp

    r34607 r34659  
    5656    : NumberObject(objectPrototype)
    5757{
    58     setInternalValue(jsNumber(0));
     58    setInternalValue(jsNumber(exec, 0));
    5959
    6060    // The constructor will be added later, after NumberConstructor has been constructed
    6161
    62     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toString, numberProtoFuncToString), DontEnum);
    63     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toLocaleString, numberProtoFuncToLocaleString), DontEnum);
    64     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, numberProtoFuncValueOf), DontEnum);
    65     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toFixed, numberProtoFuncToFixed), DontEnum);
    66     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toExponential, numberProtoFuncToExponential), DontEnum);
    67     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toPrecision, numberProtoFuncToPrecision), DontEnum);
     62    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toString, numberProtoFuncToString), DontEnum);
     63    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toLocaleString, numberProtoFuncToLocaleString), DontEnum);
     64    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, numberProtoFuncValueOf), DontEnum);
     65    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toFixed, numberProtoFuncToFixed), DontEnum);
     66    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toExponential, numberProtoFuncToExponential), DontEnum);
     67    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().toPrecision, numberProtoFuncToPrecision), DontEnum);
    6868}
    6969
     
    152152    double radixAsDouble = args[0]->toInteger(exec); // nan -> 0
    153153    if (radixAsDouble == 10 || args[0]->isUndefined())
    154         return jsString(v->toString(exec));
     154        return jsString(exec, v->toString(exec));
    155155
    156156    if (radixAsDouble < 2 || radixAsDouble > 36)
     
    166166    double x = v->toNumber(exec);
    167167    if (isnan(x) || isinf(x))
    168         return jsString(UString::from(x));
     168        return jsString(exec, UString::from(x));
    169169
    170170    bool isNegative = x < 0.0;
     
    205205    ASSERT(p < s + sizeof(s));
    206206
    207     return jsString(startOfResultString);
     207    return jsString(exec, startOfResultString);
    208208}
    209209
     
    214214
    215215    // TODO
    216     return jsString(static_cast<NumberObject*>(thisObj)->internalValue()->toString(exec));
     216    return jsString(exec, static_cast<NumberObject*>(thisObj)->internalValue()->toString(exec));
    217217}
    218218
     
    240240    double x = v->toNumber(exec);
    241241    if (isnan(x))
    242         return jsString("NaN");
     242        return jsString(exec, "NaN");
    243243
    244244    UString s;
     
    250250
    251251    if (x >= pow(10.0, 21.0))
    252         return jsString(s + UString::from(x));
     252        return jsString(exec, s + UString::from(x));
    253253
    254254    const double tenToTheF = pow(10.0, f);
     
    270270    int kMinusf = k - f;
    271271    if (kMinusf < m.size())
    272         return jsString(s + m.substr(0, kMinusf) + "." + m.substr(kMinusf));
    273     return jsString(s + m.substr(0, kMinusf));
     272        return jsString(exec, s + m.substr(0, kMinusf) + "." + m.substr(kMinusf));
     273    return jsString(exec, s + m.substr(0, kMinusf));
    274274}
    275275
     
    321321
    322322    if (isnan(x) || isinf(x))
    323         return jsString(UString::from(x));
     323        return jsString(exec, UString::from(x));
    324324
    325325    JSValue* fractionalDigitsValue = args[0];
     
    347347
    348348    if (isnan(x))
    349         return jsString("NaN");
     349        return jsString(exec, "NaN");
    350350
    351351    if (x == -0.0) // (-0.0).toExponential() should print as 0 instead of -0
     
    379379    freedtoa(result);
    380380
    381     return jsString(buf);
     381    return jsString(exec, buf);
    382382}
    383383
     
    392392    double x = v->toNumber(exec);
    393393    if (args[0]->isUndefined() || isnan(x) || isinf(x))
    394         return jsString(v->toString(exec));
     394        return jsString(exec, v->toString(exec));
    395395
    396396    UString s;
     
    431431                m = m.substr(0, 1) + "." + m.substr(1);
    432432            if (e >= 0)
    433                 return jsString(s + m + "e+" + UString::from(e));
    434             return jsString(s + m + "e-" + UString::from(-e));
     433                return jsString(exec, s + m + "e+" + UString::from(e));
     434            return jsString(exec, s + m + "e-" + UString::from(-e));
    435435        }
    436436    } else {
     
    440440
    441441    if (e == precision - 1)
    442         return jsString(s + m);
     442        return jsString(exec, s + m);
    443443    if (e >= 0) {
    444444        if (e + 1 < m.size())
    445             return jsString(s + m.substr(0, e + 1) + "." + m.substr(e + 1));
    446         return jsString(s + m);
    447     }
    448     return jsString(s + "0." + char_sequence('0', -(e + 1)) + m);
     445            return jsString(exec, s + m.substr(0, e + 1) + "." + m.substr(e + 1));
     446        return jsString(exec, s + m);
     447    }
     448    return jsString(exec, s + "0." + char_sequence('0', -(e + 1)) + m);
    449449}
    450450
     
    469469
    470470    // no. of arguments for constructor
    471     putDirect(exec->propertyNames().length, jsNumber(1), ReadOnly|DontDelete|DontEnum);
     471    putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
    472472}
    473473
     
    477477}
    478478
    479 JSValue* NumberConstructor::getValueProperty(ExecState*, int token) const
     479JSValue* NumberConstructor::getValueProperty(ExecState* exec, int token) const
    480480{
    481481    // ECMA 15.7.3
    482482    switch (token) {
    483483        case NaNValue:
    484             return jsNaN();
     484            return jsNaN(exec);
    485485        case NegInfinity:
    486             return jsNumberCell(-Inf);
     486            return jsNumberCell(exec, -Inf);
    487487        case PosInfinity:
    488             return jsNumberCell(Inf);
     488            return jsNumberCell(exec, Inf);
    489489        case MaxValue:
    490             return jsNumberCell(1.7976931348623157E+308);
     490            return jsNumberCell(exec, 1.7976931348623157E+308);
    491491        case MinValue:
    492             return jsNumberCell(5E-324);
     492            return jsNumberCell(exec, 5E-324);
    493493    }
    494494    ASSERT_NOT_REACHED();
     
    505505{
    506506    JSObject* proto = exec->lexicalGlobalObject()->numberPrototype();
    507     NumberObject* obj = new NumberObject(proto);
     507    NumberObject* obj = new (exec) NumberObject(proto);
    508508
    509509    // FIXME: Check args[0]->isUndefined() instead of args.isEmpty()?
    510510    double n = args.isEmpty() ? 0 : args[0]->toNumber(exec);
    511     obj->setInternalValue(jsNumber(n));
     511    obj->setInternalValue(jsNumber(exec, n));
    512512    return obj;
    513513}
     
    517517{
    518518    // FIXME: Check args[0]->isUndefined() instead of args.isEmpty()?
    519     return jsNumber(args.isEmpty() ? 0 : args[0]->toNumber(exec));
     519    return jsNumber(exec, args.isEmpty() ? 0 : args[0]->toNumber(exec));
    520520}
    521521
  • trunk/JavaScriptCore/kjs/PropertyMap.h

    r34582 r34659  
    3535    struct PropertyMapEntry;
    3636    struct PropertyMapHashTable;
    37 
    38     class SavedProperty : Noncopyable {
    39     public:
    40         // Since we use this in arrays, we allocate it uninitialized
    41         // and then explicitly initialize. This means we can allocate
    42         // the array without initializing every saved property in the
    43         // array twice. To accomplish this, the class uses data members
    44         // with types that don't have constructors.
    45         SavedProperty();
    46         void init(UString::Rep* name, JSValue*, unsigned attributes);
    47         ~SavedProperty();
    48 
    49         UString::Rep* name() const;
    50         JSValue* value() const;
    51         unsigned attributes() const;
    52 
    53     private:
    54         UString::Rep* m_name;
    55         JSValue* m_value;
    56         unsigned m_attributes;
    57     };
    5837
    5938    class PropertyMap : Noncopyable {
     
    11190    {
    11291    }
    113 
    114     inline SavedProperty::SavedProperty()
    115 #ifndef NDEBUG
    116         : m_name(0)
    117         , m_value(0)
    118         , m_attributes(0)
    119 #endif
    120     {
    121     }
    122 
    123     inline void SavedProperty::init(UString::Rep* name, JSValue* value, unsigned attributes)
    124     {
    125         ASSERT(name);
    126         ASSERT(value);
    127 
    128         ASSERT(!m_name);
    129         ASSERT(!m_value);
    130         ASSERT(!m_attributes);
    131 
    132         m_name = name;
    133         m_value = value;
    134         m_attributes = attributes;
    135         name->ref();
    136         gcProtect(value);
    137     }
    138 
    139     inline SavedProperty::~SavedProperty()
    140     {
    141         ASSERT(m_name);
    142         ASSERT(m_value);
    143 
    144         m_name->deref();
    145         gcUnprotect(m_value);
    146     }
    147 
    148     inline UString::Rep* SavedProperty::name() const
    149     {
    150         ASSERT(m_name);
    151         ASSERT(m_value);
    152 
    153         return m_name;
    154     }
    155 
    156     inline JSValue* SavedProperty::value() const
    157     {
    158         ASSERT(m_name);
    159         ASSERT(m_value);
    160 
    161         return m_value;
    162     }
    163 
    164     inline unsigned SavedProperty::attributes() const
    165     {
    166         ASSERT(m_name);
    167         ASSERT(m_value);
    168 
    169         return m_attributes;
    170     }
    171 
    17292} // namespace
    17393
  • trunk/JavaScriptCore/kjs/RegExpObject.cpp

    r34615 r34659  
    5151    : JSObject(objectPrototype)
    5252{
    53     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().compile, regExpProtoFuncCompile), DontEnum);
    54     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().exec, regExpProtoFuncExec), DontEnum);
    55     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().test, regExpProtoFuncTest), DontEnum);
    56     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, regExpProtoFuncToString), DontEnum);
     53    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().compile, regExpProtoFuncCompile), DontEnum);
     54    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().exec, regExpProtoFuncExec), DontEnum);
     55    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().test, regExpProtoFuncTest), DontEnum);
     56    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, regExpProtoFuncToString), DontEnum);
    5757}
    5858
     
    106106    if (!thisObj->inherits(&RegExpObject::info)) {
    107107        if (thisObj->inherits(&RegExpPrototype::info))
    108             return jsString("//");
     108            return jsString(exec, "//");
    109109        return throwError(exec, TypeError);
    110110    }
     
    117117    if (thisObj->get(exec, exec->propertyNames().multiline)->toBoolean(exec))
    118118        result += "m";
    119     return jsString(result);
     119    return jsString(exec, result);
    120120}
    121121
     
    150150}
    151151
    152 JSValue* RegExpObject::getValueProperty(ExecState*, int token) const
     152JSValue* RegExpObject::getValueProperty(ExecState* exec, int token) const
    153153{
    154154    switch (token) {
     
    160160            return jsBoolean(m_regExp->multiline());
    161161        case Source:
    162             return jsString(m_regExp->pattern());
     162            return jsString(exec, m_regExp->pattern());
    163163        case LastIndex:
    164             return jsNumber(m_lastIndex);
     164            return jsNumber(exec, m_lastIndex);
    165165    }
    166166   
     
    287287
    288288  // no. of arguments for constructor
    289   putDirect(exec->propertyNames().length, jsNumber(2), ReadOnly | DontDelete | DontEnum);
     289  putDirect(exec->propertyNames().length, jsNumber(exec, 2), ReadOnly | DontDelete | DontEnum);
    290290}
    291291
     
    361361        int start = d->lastOvector[2 * i];
    362362        if (start >= 0)
    363             JSArray::put(exec, i, jsString(d->lastInput.substr(start, d->lastOvector[2 * i + 1] - start)));
    364     }
    365     JSArray::put(exec, exec->propertyNames().index, jsNumber(d->lastOvector[0]));
    366     JSArray::put(exec, exec->propertyNames().input, jsString(d->lastInput));
     363            JSArray::put(exec, i, jsString(exec, d->lastInput.substr(start, d->lastOvector[2 * i + 1] - start)));
     364    }
     365    JSArray::put(exec, exec->propertyNames().index, jsNumber(exec, d->lastOvector[0]));
     366    JSArray::put(exec, exec->propertyNames().input, jsString(exec, d->lastInput));
    367367
    368368    delete d;
     
    372372JSObject* RegExpConstructor::arrayOfMatches(ExecState* exec) const
    373373{
    374     return new RegExpMatchesArray(exec, d.get());
    375 }
    376 
    377 JSValue* RegExpConstructor::getBackref(unsigned i) const
     374    return new (exec) RegExpMatchesArray(exec, d.get());
     375}
     376
     377JSValue* RegExpConstructor::getBackref(ExecState* exec, unsigned i) const
    378378{
    379379  if (d->lastOvector && i <= d->lastNumSubPatterns)
    380     return jsString(d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));
    381   return jsString("");
    382 }
    383 
    384 JSValue* RegExpConstructor::getLastParen() const
     380    return jsString(exec, d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));
     381  return jsString(exec, "");
     382}
     383
     384JSValue* RegExpConstructor::getLastParen(ExecState* exec) const
    385385{
    386386  unsigned i = d->lastNumSubPatterns;
    387387  if (i > 0) {
    388388    ASSERT(d->lastOvector);
    389     return jsString(d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));
     389    return jsString(exec, d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));
    390390  }
    391   return jsString("");
    392 }
    393 
    394 JSValue *RegExpConstructor::getLeftContext() const
     391  return jsString(exec, "");
     392}
     393
     394JSValue* RegExpConstructor::getLeftContext(ExecState* exec) const
    395395{
    396396  if (d->lastOvector)
    397     return jsString(d->lastInput.substr(0, d->lastOvector[0]));
    398   return jsString("");
    399 }
    400 
    401 JSValue *RegExpConstructor::getRightContext() const
     397    return jsString(exec, d->lastInput.substr(0, d->lastOvector[0]));
     398  return jsString(exec, "");
     399}
     400
     401JSValue* RegExpConstructor::getRightContext(ExecState* exec) const
    402402{
    403403  if (d->lastOvector) {
    404404    UString s = d->lastInput;
    405     return jsString(s.substr(d->lastOvector[1], s.size() - d->lastOvector[1]));
     405    return jsString(exec, s.substr(d->lastOvector[1], s.size() - d->lastOvector[1]));
    406406  }
    407   return jsString("");
     407  return jsString(exec, "");
    408408}
    409409
     
    413413}
    414414
    415 JSValue *RegExpConstructor::getValueProperty(ExecState*, int token) const
     415JSValue *RegExpConstructor::getValueProperty(ExecState* exec, int token) const
    416416{
    417417  switch (token) {
    418418    case Dollar1:
    419       return getBackref(1);
     419      return getBackref(exec, 1);
    420420    case Dollar2:
    421       return getBackref(2);
     421      return getBackref(exec, 2);
    422422    case Dollar3:
    423       return getBackref(3);
     423      return getBackref(exec, 3);
    424424    case Dollar4:
    425       return getBackref(4);
     425      return getBackref(exec, 4);
    426426    case Dollar5:
    427       return getBackref(5);
     427      return getBackref(exec, 5);
    428428    case Dollar6:
    429       return getBackref(6);
     429      return getBackref(exec, 6);
    430430    case Dollar7:
    431       return getBackref(7);
     431      return getBackref(exec, 7);
    432432    case Dollar8:
    433       return getBackref(8);
     433      return getBackref(exec, 8);
    434434    case Dollar9:
    435       return getBackref(9);
     435      return getBackref(exec, 9);
    436436    case Input:
    437       return jsString(d->lastInput);
     437      return jsString(exec, d->lastInput);
    438438    case Multiline:
    439439      return jsBoolean(d->multiline);
    440440    case LastMatch:
    441       return getBackref(0);
     441      return getBackref(exec, 0);
    442442    case LastParen:
    443       return getLastParen();
     443      return getLastParen(exec);
    444444    case LeftContext:
    445       return getLeftContext();
     445      return getLeftContext(exec);
    446446    case RightContext:
    447       return getRightContext();
     447      return getRightContext(exec);
    448448    default:
    449       ASSERT(0);
     449      ASSERT_NOT_REACHED();
    450450  }
    451451
    452   return jsString("");
     452  return jsString(exec, "");
    453453}
    454454
     
    494494  RefPtr<RegExp> regExp = RegExp::create(pattern, flags);
    495495  return regExp->isValid()
    496     ? new RegExpObject(exec->lexicalGlobalObject()->regExpPrototype(), regExp.release())
     496    ? new (exec) RegExpObject(exec->lexicalGlobalObject()->regExpPrototype(), regExp.release())
    497497    : throwError(exec, SyntaxError, UString("Invalid regular expression: ").append(regExp->errorMessage()));
    498498}
  • trunk/JavaScriptCore/kjs/RegExpObject.h

    r34587 r34659  
    9595
    9696    private:
    97         JSValue* getBackref(unsigned) const;
    98         JSValue* getLastParen() const;
    99         JSValue* getLeftContext() const;
    100         JSValue* getRightContext() const;
     97        JSValue* getBackref(ExecState*, unsigned) const;
     98        JSValue* getLastParen(ExecState*) const;
     99        JSValue* getLeftContext(ExecState*) const;
     100        JSValue* getRightContext(ExecState*) const;
    101101
    102102        OwnPtr<RegExpConstructorPrivate> d;
  • trunk/JavaScriptCore/kjs/Shell.cpp

    r34607 r34659  
    2929#include "ArrayPrototype.h"
    3030#include "collector.h"
     31#include "completion.h"
    3132#include "JSFunction.h"
    3233#include "InitializeThreading.h"
     
    164165GlobalObject::GlobalObject(Vector<UString>& arguments)
    165166{
    166     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "debug"), functionDebug));
    167     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "print"), functionPrint));
    168     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "quit"), functionQuit));
    169     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "gc"), functionGC));
    170     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "version"), functionVersion));
    171     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "run"), functionRun));
    172     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "load"), functionLoad));
    173     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "readline"), functionReadline));
     167    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "debug"), functionDebug));
     168    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "print"), functionPrint));
     169    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "quit"), functionQuit));
     170    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "gc"), functionGC));
     171    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "version"), functionVersion));
     172    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "run"), functionRun));
     173    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "load"), functionLoad));
     174    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "readline"), functionReadline));
    174175
    175176    JSObject* array = arrayConstructor()->construct(globalExec(), globalExec()->emptyList());
    176177    for (size_t i = 0; i < arguments.size(); ++i)
    177         array->put(globalExec(), i, jsString(arguments[i]));
     178        array->put(globalExec(), i, jsString(globalExec(), arguments[i]));
    178179    putDirect(Identifier(globalExec(), "arguments"), array);
    179180
     
    201202}
    202203
    203 JSValue* functionGC(ExecState*, JSObject*, const ArgList&)
     204JSValue* functionGC(ExecState* exec, JSObject*, const ArgList&)
    204205{
    205206    JSLock lock;
    206     Collector::collect();
     207    exec->heap()->collect();
    207208    return jsUndefined();
    208209}
     
    229230    stopWatch.stop();
    230231
    231     return jsNumber(stopWatch.getElapsedMS());
     232    return jsNumber(globalObject->globalExec(), stopWatch.getElapsedMS());
    232233}
    233234
     
    245246}
    246247
    247 JSValue* functionReadline(ExecState*, JSObject*, const ArgList&)
     248JSValue* functionReadline(ExecState* exec, JSObject*, const ArgList&)
    248249{
    249250    Vector<char, 256> line;
     
    256257    }
    257258    line.append('\0');
    258     return jsString(line.data());
     259    return jsString(exec, line.data());
    259260}
    260261
     
    452453
    453454#ifndef NDEBUG
    454     Collector::collect();
     455    JSGlobalData::threadInstance().heap->collect();
    455456#endif
    456457
  • trunk/JavaScriptCore/kjs/collector.cpp

    r34597 r34659  
    11/*
    2  *  Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
     2 *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
    33 *  Copyright (C) 2007 Eric Seidel <[email protected]>
    44 *
     
    3636#if USE(MULTIPLE_THREADS)
    3737#include <pthread.h>
     38#include <wtf/Threading.h>
    3839#endif
    3940
     
    8081
    8182const size_t SPARE_EMPTY_BLOCKS = 2;
    82 const size_t MIN_ARRAY_SIZE = 14;
    8383const size_t GROWTH_FACTOR = 2;
    8484const size_t LOW_WATER_FACTOR = 4;
    8585const size_t ALLOCATIONS_PER_COLLECTION = 4000;
    86 
    87 static CollectorHeap primaryHeap = { 0, 0, 0, 0, 0, 0, 0, NoOperation };
    88 static CollectorHeap numberHeap = { 0, 0, 0, 0, 0, 0, 0, NoOperation };
    89 
    90 size_t Collector::mainThreadOnlyObjectCount = 0;
    91 HashSet<ArgList*>* Collector::m_markListSet;
    92 
    93 static CollectorBlock* allocateBlock()
     86// This value has to be a macro to be used in max() without introducing
     87// a PIC branch in Mach-O binaries, see <rdar://problem/5971391>.
     88#define MIN_ARRAY_SIZE 14UL
     89
     90Heap::Heap()
     91    : m_pagesize(getpagesize())
     92    , mainThreadOnlyObjectCount(0)
     93    , m_markListSet(0)
     94{
     95    memset(&primaryHeap, 0, sizeof(CollectorHeap));
     96    memset(&numberHeap, 0, sizeof(CollectorHeap));
     97}
     98
     99static NEVER_INLINE CollectorBlock* allocateBlock()
    94100{
    95101#if PLATFORM(DARWIN)   
     
    104110    memset(address, 0, BLOCK_SIZE);
    105111#else
    106     static size_t pagesize = getpagesize();
    107112   
    108113    size_t extra = 0;
    109     if (BLOCK_SIZE > pagesize)
    110         extra = BLOCK_SIZE - pagesize;
     114    if (BLOCK_SIZE > m_pagesize)
     115        extra = BLOCK_SIZE - m_pagesize;
    111116
    112117    void* mmapResult = mmap(NULL, BLOCK_SIZE + extra, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
     
    139144    free(block);
    140145#else
    141     munmap(reinterpret_cast<char *>(block), BLOCK_SIZE);
    142 #endif
    143 }
    144 
    145 void Collector::recordExtraCost(size_t cost)
     146    munmap(reinterpret_cast<char*>(block), BLOCK_SIZE);
     147#endif
     148}
     149
     150void Heap::recordExtraCost(size_t cost)
    146151{
    147152    // Our frequency of garbage collection tries to balance memory use against speed
     
    160165}
    161166
    162 template <Collector::HeapType heapType> struct HeapConstants;
    163 
    164 template <> struct HeapConstants<Collector::PrimaryHeap> {
     167template <Heap::HeapType heapType> struct HeapConstants;
     168
     169template <> struct HeapConstants<Heap::PrimaryHeap> {
    165170    static const size_t cellSize = CELL_SIZE;
    166171    static const size_t cellsPerBlock = CELLS_PER_BLOCK;
     
    170175};
    171176
    172 template <> struct HeapConstants<Collector::NumberHeap> {
     177template <> struct HeapConstants<Heap::NumberHeap> {
    173178    static const size_t cellSize = SMALL_CELL_SIZE;
    174179    static const size_t cellsPerBlock = SMALL_CELLS_PER_BLOCK;
     
    178183};
    179184
    180 template <Collector::HeapType heapType> ALWAYS_INLINE void* Collector::heapAllocate(size_t s)
     185template <Heap::HeapType heapType> ALWAYS_INLINE void* Heap::heapAllocate(size_t s)
    181186{
    182187    typedef typename HeapConstants<heapType>::Block Block;
     
    268273        targetBlock = (Block*)allocateBlock();
    269274        targetBlock->freeList = targetBlock->cells;
     275        targetBlock->heap = this;
    270276        targetBlockUsedCells = 0;
    271277        heap.blocks[usedBlocks] = (CollectorBlock*)targetBlock;
     
    291297}
    292298
    293 #ifndef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
    294 void* Collector::allocate(size_t s)
     299void* Heap::allocate(size_t s)
    295300{
    296301    return heapAllocate<PrimaryHeap>(s);
    297302}
    298 #endif
    299 
    300 void* Collector::allocateNumber(size_t s)
     303
     304void* Heap::allocateNumber(size_t s)
    301305{
    302306    return heapAllocate<NumberHeap>(s);
     
    363367#endif
    364368
    365 void Collector::registerAsMainThread()
     369void Heap::registerAsMainThread()
    366370{
    367371#if USE(MULTIPLE_THREADS)
     
    405409}
    406410
    407 class Collector::Thread {
     411class Heap::Thread {
    408412public:
    409413    Thread(pthread_t pthread, const PlatformThread& platThread, void* base)
     
    422426pthread_key_t registeredThreadKey;
    423427pthread_once_t registeredThreadKeyOnce = PTHREAD_ONCE_INIT;
    424 Collector::Thread* registeredThreads;
     428Heap::Thread* registeredThreads;
    425429
    426430static void destroyRegisteredThread(void* data)
    427431{
    428     Collector::Thread* thread = (Collector::Thread*)data;
     432    Heap::Thread* thread = (Heap::Thread*)data;
    429433
    430434    // Can't use JSLock convenience object here because we don't want to re-register
     
    435439        registeredThreads = registeredThreads->next;
    436440    } else {
    437         Collector::Thread* last = registeredThreads;
    438         Collector::Thread* t;
     441        Heap::Thread* last = registeredThreads;
     442        Heap::Thread* t;
    439443        for (t = registeredThreads->next; t != NULL; t = t->next) {
    440444            if (t == thread) {         
     
    457461}
    458462
    459 void Collector::registerThread()
     463void Heap::registerThread()
    460464{
    461465    ASSERT(JSLock::lockCount() > 0);
     
    465469
    466470    if (!pthread_getspecific(registeredThreadKey)) {
    467 #if PLATFORM(DARWIN)
    468         if (onMainThread())
    469             CollectorHeapIntrospector::init(&primaryHeap, &numberHeap);
    470 #endif
    471 
    472         Collector::Thread* thread = new Collector::Thread(pthread_self(), getCurrentPlatformThread(), currentThreadStackBase());
     471        Heap::Thread* thread = new Heap::Thread(pthread_self(), getCurrentPlatformThread(), currentThreadStackBase());
    473472
    474473        thread->next = registeredThreads;
     
    478477}
    479478
     479void Heap::initializeHeapIntrospector()
     480{
     481    ASSERT(pthread_main_np());
     482    CollectorHeapIntrospector::init(&primaryHeap, &numberHeap);
     483}
     484
    480485#endif
    481486
     
    485490#define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0)
    486491
    487 void Collector::markStackObjectsConservatively(void* start, void* end)
     492void Heap::markStackObjectsConservatively(void* start, void* end)
    488493{
    489494    if (start > end) {
     
    517522            for (size_t block = 0; block < usedNumberBlocks; block++) {
    518523                if ((numberBlocks[block] == blockAddr) & (offset <= lastCellOffset)) {
    519                     Collector::markCell(reinterpret_cast<JSCell*>(xAsBits));
     524                    Heap::markCell(reinterpret_cast<JSCell*>(xAsBits));
    520525                    goto endMarkLoop;
    521526                }
     
    539544}
    540545
    541 void NEVER_INLINE Collector::markCurrentThreadConservativelyInternal()
     546void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal()
    542547{
    543548    void* dummy;
     
    547552}
    548553
    549 void Collector::markCurrentThreadConservatively()
     554void Heap::markCurrentThreadConservatively()
    550555{
    551556    // setjmp forces volatile registers onto the stack
     
    692697}
    693698
    694 void Collector::markOtherThreadConservatively(Thread* thread)
    695 {
     699void Heap::markOtherThreadConservatively(Thread* thread)
     700{
     701    ASSERT(this == JSGlobalData::sharedInstance().heap);
     702
    696703    suspendThread(thread->platformThread);
    697704
     
    710717#endif
    711718
    712 void Collector::markStackObjectsConservatively()
     719void Heap::markStackObjectsConservatively()
    713720{
    714721    markCurrentThreadConservatively();
    715722
    716723#if USE(MULTIPLE_THREADS)
    717     for (Thread* thread = registeredThreads; thread != NULL; thread = thread->next) {
    718         if (!pthread_equal(thread->posixThread, pthread_self())) {
    719             markOtherThreadConservatively(thread);
     724
     725    if (this == JSGlobalData::sharedInstance().heap) {
     726
     727#ifndef NDEBUG
     728        // Forbid malloc during the mark phase. Marking a thread suspends it, so
     729        // a malloc inside mark() would risk a deadlock with a thread that had been
     730        // suspended while holding the malloc lock.
     731        fastMallocForbid();
     732#endif
     733        for (Thread* thread = registeredThreads; thread != NULL; thread = thread->next) {
     734            if (!pthread_equal(thread->posixThread, pthread_self()))
     735                markOtherThreadConservatively(thread);
    720736        }
    721     }
    722 #endif
    723 }
    724 
    725 typedef HashCountedSet<JSCell*> ProtectCountSet;
    726 
    727 static ProtectCountSet& protectedValues()
    728 {
    729     static ProtectCountSet staticProtectCountSet;
    730     return staticProtectCountSet;
    731 }
    732 
    733 void Collector::protect(JSValue* k)
     737#ifndef NDEBUG
     738        fastMallocAllow();
     739#endif
     740    }
     741#endif
     742}
     743
     744void Heap::protect(JSValue* k)
    734745{
    735746    ASSERT(k);
     
    740751        return;
    741752
    742     protectedValues().add(k->asCell());
    743 }
    744 
    745 void Collector::unprotect(JSValue* k)
     753    protectedValues.add(k->asCell());
     754}
     755
     756void Heap::unprotect(JSValue* k)
    746757{
    747758    ASSERT(k);
     
    752763        return;
    753764
    754     protectedValues().remove(k->asCell());
    755 }
    756 
    757 void Collector::collectOnMainThreadOnly(JSValue* value)
     765    protectedValues.remove(k->asCell());
     766}
     767
     768void Heap::collectOnMainThreadOnly(JSValue* value)
    758769{
    759770    ASSERT(value);
     
    769780}
    770781
    771 void Collector::markProtectedObjects()
    772 {
    773     ProtectCountSet& protectedValues = KJS::protectedValues();
     782Heap* Heap::heap(const JSValue* v)
     783{
     784    if (JSImmediate::isImmediate(v))
     785        return 0;
     786    return Heap::cellBlock(v->asCell())->heap;
     787}
     788
     789void Heap::markProtectedObjects()
     790{
    774791    ProtectCountSet::iterator end = protectedValues.end();
    775792    for (ProtectCountSet::iterator it = protectedValues.begin(); it != end; ++it) {
     
    780797}
    781798
    782 void Collector::markMainThreadOnlyObjects()
     799void Heap::markMainThreadOnlyObjects()
    783800{
    784801#if USE(MULTIPLE_THREADS)
     
    822839}
    823840
    824 template <Collector::HeapType heapType> size_t Collector::sweep(bool currentThreadIsMainThread)
     841template <Heap::HeapType heapType> size_t Heap::sweep(bool currentThreadIsMainThread)
    825842{
    826843    typedef typename HeapConstants<heapType>::Block Block;
     
    829846    UNUSED_PARAM(currentThreadIsMainThread); // currentThreadIsMainThread is only used in ASSERTs
    830847    // SWEEP: delete everything with a zero refcount (garbage) and unmark everything else
    831     CollectorHeap& heap = heapType == Collector::PrimaryHeap ? primaryHeap : numberHeap;
     848    CollectorHeap& heap = heapType == Heap::PrimaryHeap ? primaryHeap : numberHeap;
    832849   
    833850    size_t emptyBlocks = 0;
     
    846863                    Cell* cell = curBlock->cells + i;
    847864                   
    848                     if (heapType != Collector::NumberHeap) {
     865                    if (heapType != Heap::NumberHeap) {
    849866                        JSCell* imp = reinterpret_cast<JSCell*>(cell);
    850867                        // special case for allocated but uninitialized object
     
    857874                        if (curBlock->collectOnMainThreadOnly.get(i)) {
    858875                            curBlock->collectOnMainThreadOnly.clear(i);
    859                             --Collector::mainThreadOnlyObjectCount;
     876                            --mainThreadOnlyObjectCount;
    860877                        }
    861878                        imp->~JSCell();
     
    879896                } else {
    880897                    if (!curBlock->marked.get(i >> HeapConstants<heapType>::bitmapShift)) {
    881                         if (heapType != Collector::NumberHeap) {
     898                        if (heapType != Heap::NumberHeap) {
    882899                            JSCell* imp = reinterpret_cast<JSCell*>(cell);
    883900                            ASSERT(currentThreadIsMainThread || !curBlock->collectOnMainThreadOnly.get(i));
    884901                            if (curBlock->collectOnMainThreadOnly.get(i)) {
    885902                                curBlock->collectOnMainThreadOnly.clear(i);
    886                                 --Collector::mainThreadOnlyObjectCount;
     903                                --mainThreadOnlyObjectCount;
    887904                            }
    888905                            imp->~JSCell();
     
    932949}
    933950   
    934 bool Collector::collect()
    935 {
    936     ASSERT(JSLock::lockCount() > 0);
    937     ASSERT(JSLock::currentThreadIsHoldingLock());
     951bool Heap::collect()
     952{
     953#ifndef NDEBUG
     954    if (JSGlobalData::sharedInstance().heap == this) {
     955        ASSERT(JSLock::lockCount() > 0);
     956        ASSERT(JSLock::currentThreadIsHoldingLock());
     957    }
     958#endif
    938959
    939960    ASSERT((primaryHeap.operationInProgress == NoOperation) | (numberHeap.operationInProgress == NoOperation));
     
    947968
    948969    // MARK: first mark all referenced objects recursively starting out from the set of root objects
    949 
    950 #ifndef NDEBUG
    951     // Forbid malloc during the mark phase. Marking a thread suspends it, so
    952     // a malloc inside mark() would risk a deadlock with a thread that had been
    953     // suspended while holding the malloc lock.
    954     fastMallocForbid();
    955 #endif
    956970
    957971    markStackObjectsConservatively();
     
    964978#endif
    965979
    966 #ifndef NDEBUG
    967     fastMallocAllow();
    968 #endif
    969 
    970980    size_t originalLiveObjects = primaryHeap.numLiveObjects + numberHeap.numLiveObjects;
    971981    size_t numLiveObjects = sweep<PrimaryHeap>(currentThreadIsMainThread);
     
    978988}
    979989
    980 size_t Collector::size()
     990size_t Heap::size()
    981991{
    982992    return primaryHeap.numLiveObjects + numberHeap.numLiveObjects;
    983993}
    984994
    985 size_t Collector::globalObjectCount()
     995size_t Heap::globalObjectCount()
    986996{
    987997    size_t count = 0;
     
    9961006}
    9971007
    998 size_t Collector::protectedGlobalObjectCount()
     1008size_t Heap::protectedGlobalObjectCount()
    9991009{
    10001010    size_t count = 0;
     
    10021012        JSGlobalObject* o = JSGlobalObject::head();
    10031013        do {
    1004             if (protectedValues().contains(o))
     1014            if (protectedValues.contains(o))
    10051015                ++count;
    10061016            o = o->next();
     
    10101020}
    10111021
    1012 size_t Collector::protectedObjectCount()
    1013 {
    1014     return protectedValues().size();
     1022size_t Heap::protectedObjectCount()
     1023{
     1024    return protectedValues.size();
    10151025}
    10161026
     
    10481058}
    10491059
    1050 HashCountedSet<const char*>* Collector::protectedObjectTypeCounts()
     1060HashCountedSet<const char*>* Heap::protectedObjectTypeCounts()
    10511061{
    10521062    HashCountedSet<const char*>* counts = new HashCountedSet<const char*>;
    10531063
    1054     ProtectCountSet& protectedValues = KJS::protectedValues();
    10551064    ProtectCountSet::iterator end = protectedValues.end();
    10561065    for (ProtectCountSet::iterator it = protectedValues.begin(); it != end; ++it)
     
    10601069}
    10611070
    1062 bool Collector::isBusy()
     1071bool Heap::isBusy()
    10631072{
    10641073    return (primaryHeap.operationInProgress != NoOperation) | (numberHeap.operationInProgress != NoOperation);
  • trunk/JavaScriptCore/kjs/collector.h

    r34587 r34659  
    22 *  Copyright (C) 1999-2000 Harri Porten ([email protected])
    33 *  Copyright (C) 2001 Peter Kelly ([email protected])
    4  *  Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
     4 *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
    55 *
    66 *  This library is free software; you can redistribute it and/or
     
    2626#include <wtf/HashCountedSet.h>
    2727#include <wtf/HashSet.h>
     28#include <wtf/Noncopyable.h>
    2829
    2930namespace KJS {
     
    3435    class ArgList;
    3536
    36     class Collector {
     37    enum OperationInProgress { NoOperation, Allocation, Collection };
     38
     39    struct CollectorHeap {
     40        CollectorBlock** blocks;
     41        size_t numBlocks;
     42        size_t usedBlocks;
     43        size_t firstBlockWithPossibleSpace;
     44
     45        size_t numLiveObjects;
     46        size_t numLiveObjectsAtLastCollect;
     47        size_t extraCost;
     48
     49        OperationInProgress operationInProgress;
     50    };
     51
     52    class Heap : Noncopyable {
    3753    public:
    3854        class Thread;
     
    4460        // However, allocateNumber is used via jsNumberCell outside JavaScriptCore.
    4561        // Thus allocateNumber needs to provide a non-inline version too.
    46         static void* allocate(size_t s) { return heapAllocate<PrimaryHeap>(s); }
    47         static void* inlineAllocateNumber(size_t s) { return heapAllocate<NumberHeap>(s); }
    48 #else
    49         static void* allocate(size_t);
     62        void* inlineAllocateNumber(size_t s) { return heapAllocate<NumberHeap>(s); }
     63        void* inlineAllocate(size_t s) { return heapAllocate<PrimaryHeap>(s); }
    5064#endif
    51         static void* allocateNumber(size_t s);
    52 
    53         static bool collect();
    54         static bool isBusy(); // true if an allocation or collection is in progress
     65        void* allocateNumber(size_t);
     66        void* allocate(size_t);
     67
     68        bool collect();
     69        bool isBusy(); // true if an allocation or collection is in progress
    5570
    5671        static const size_t minExtraCostSize = 256;
    5772
    58         static void reportExtraMemoryCost(size_t cost);
    59 
    60         static size_t size();
    61 
    62         static void protect(JSValue*);
    63         static void unprotect(JSValue*);
    64        
    65         static void collectOnMainThreadOnly(JSValue*);
    66 
    67         static size_t globalObjectCount();
    68         static size_t protectedObjectCount();
    69         static size_t protectedGlobalObjectCount();
    70         static HashCountedSet<const char*>* protectedObjectTypeCounts();
    71 
    72         static void registerThread();
    73        
     73        void reportExtraMemoryCost(size_t cost);
     74
     75        size_t size();
     76
     77        void protect(JSValue*);
     78        void unprotect(JSValue*);
     79
     80        void collectOnMainThreadOnly(JSValue*);
     81
     82        static Heap* heap(const JSValue*); // 0 for immediate values
     83
     84        size_t globalObjectCount();
     85        size_t protectedObjectCount();
     86        size_t protectedGlobalObjectCount();
     87        HashCountedSet<const char*>* protectedObjectTypeCounts();
     88
    7489        static void registerAsMainThread();
     90        static void registerThread(); // Should only be called by clients that can use the same heap from multiple threads.
     91
     92#if PLATFORM(DARWIN)
     93        void initializeHeapIntrospector();
     94#endif
    7595
    7696        static bool isCellMarked(const JSCell*);
    7797        static void markCell(JSCell*);
    7898
    79         static void markStackObjectsConservatively(void* start, void* end);
    80 
    81         static HashSet<ArgList*>& markListSet() { if (!m_markListSet) m_markListSet = new HashSet<ArgList*>; return *m_markListSet; }
     99        void markStackObjectsConservatively(void* start, void* end);
     100
     101        HashSet<ArgList*>& markListSet() { if (!m_markListSet) m_markListSet = new HashSet<ArgList*>; return *m_markListSet; }
    82102
    83103    private:
    84         template <Collector::HeapType heapType> static void* heapAllocate(size_t s);
    85         template <Collector::HeapType heapType> static size_t sweep(bool);
     104        template <Heap::HeapType heapType> void* heapAllocate(size_t);
     105        template <Heap::HeapType heapType> size_t sweep(bool);
    86106        static const CollectorBlock* cellBlock(const JSCell*);
    87107        static CollectorBlock* cellBlock(JSCell*);
    88108        static size_t cellOffset(const JSCell*);
    89109
    90         Collector();
    91 
    92         static void recordExtraCost(size_t);
    93         static void markProtectedObjects();
    94         static void markMainThreadOnlyObjects();
    95         static void markCurrentThreadConservatively();
    96         static void markCurrentThreadConservativelyInternal();
    97         static void markOtherThreadConservatively(Thread*);
    98         static void markStackObjectsConservatively();
    99 
    100         static size_t mainThreadOnlyObjectCount;
    101         static bool memoryFull;
    102 
    103         static HashSet<ArgList*>* m_markListSet;
     110        Heap();
     111        friend class JSGlobalData;
     112
     113        void recordExtraCost(size_t);
     114        void markProtectedObjects();
     115        void markMainThreadOnlyObjects();
     116        void markCurrentThreadConservatively();
     117        void markCurrentThreadConservativelyInternal();
     118        void markOtherThreadConservatively(Thread*);
     119        void markStackObjectsConservatively();
     120
     121        typedef HashCountedSet<JSCell*> ProtectCountSet;
     122
     123        const size_t m_pagesize;
     124
     125        size_t mainThreadOnlyObjectCount;
     126        CollectorHeap primaryHeap;
     127        CollectorHeap numberHeap;
     128        ProtectCountSet protectedValues;
     129        HashSet<ArgList*>* m_markListSet;
    104130    };
    105131
     
    161187        CollectorBitmap marked;
    162188        CollectorBitmap collectOnMainThreadOnly;
     189        Heap* heap;
    163190    };
    164191
     
    170197        CollectorBitmap marked;
    171198        CollectorBitmap collectOnMainThreadOnly;
    172     };
    173 
    174     enum OperationInProgress { NoOperation, Allocation, Collection };
    175 
    176     struct CollectorHeap {
    177         CollectorBlock** blocks;
    178         size_t numBlocks;
    179         size_t usedBlocks;
    180         size_t firstBlockWithPossibleSpace;
    181 
    182         size_t numLiveObjects;
    183         size_t numLiveObjectsAtLastCollect;
    184         size_t extraCost;
    185 
    186         OperationInProgress operationInProgress;
    187     };
    188 
    189     inline const CollectorBlock* Collector::cellBlock(const JSCell* cell)
     199        Heap* heap;
     200    };
     201
     202    inline const CollectorBlock* Heap::cellBlock(const JSCell* cell)
    190203    {
    191204        return reinterpret_cast<const CollectorBlock*>(reinterpret_cast<uintptr_t>(cell) & BLOCK_MASK);
    192205    }
    193206
    194     inline CollectorBlock* Collector::cellBlock(JSCell* cell)
     207    inline CollectorBlock* Heap::cellBlock(JSCell* cell)
    195208    {
    196209        return const_cast<CollectorBlock*>(cellBlock(const_cast<const JSCell*>(cell)));
    197210    }
    198211
    199     inline size_t Collector::cellOffset(const JSCell* cell)
     212    inline size_t Heap::cellOffset(const JSCell* cell)
    200213    {
    201214        return (reinterpret_cast<uintptr_t>(cell) & BLOCK_OFFSET_MASK) / CELL_SIZE;
    202215    }
    203216
    204     inline bool Collector::isCellMarked(const JSCell* cell)
     217    inline bool Heap::isCellMarked(const JSCell* cell)
    205218    {
    206219        return cellBlock(cell)->marked.get(cellOffset(cell));
    207220    }
    208221
    209     inline void Collector::markCell(JSCell* cell)
     222    inline void Heap::markCell(JSCell* cell)
    210223    {
    211224        cellBlock(cell)->marked.set(cellOffset(cell));
    212225    }
    213226
    214     inline void Collector::reportExtraMemoryCost(size_t cost)
     227    inline void Heap::reportExtraMemoryCost(size_t cost)
    215228    {
    216229        if (cost > minExtraCostSize)
  • trunk/JavaScriptCore/kjs/date_object.cpp

    r34607 r34659  
    171171enum LocaleDateTimeFormat { LocaleDateAndTime, LocaleDate, LocaleTime };
    172172 
    173 static JSCell* formatLocaleDate(const GregorianDateTime& gdt, const LocaleDateTimeFormat format)
     173static JSCell* formatLocaleDate(ExecState* exec, const GregorianDateTime& gdt, const LocaleDateTimeFormat format)
    174174{
    175175    static const char* formatStrings[] = {"%#c", "%#x", "%X"};
     
    189189 
    190190    if ( ret == 0 )
    191         return jsString("");
     191        return jsString(exec, "");
    192192 
    193193    // Copy original into the buffer
     
    203203    }
    204204 
    205     return jsString(timebuffer);
     205    return jsString(exec, timebuffer);
    206206}
    207207
     
    470470// ECMA 15.9.4
    471471
    472 DatePrototype::DatePrototype(ExecState *, ObjectPrototype *objectProto)
    473   : DateInstance(objectProto)
    474 {
    475     setInternalValue(jsNaN());
     472DatePrototype::DatePrototype(ExecState* exec, ObjectPrototype* objectProto)
     473    : DateInstance(objectProto)
     474{
     475    setInternalValue(jsNaN(exec));
    476476    // The constructor will be added later, after DateConstructor has been built.
    477477}
     
    490490{
    491491  putDirect(exec->propertyNames().prototype, dateProto, DontEnum|DontDelete|ReadOnly);
    492   putDirectFunction(new DateFunction(exec, funcProto, DateFunction::Parse, 1, exec->propertyNames().parse), DontEnum);
    493   putDirectFunction(new DateFunction(exec, funcProto, DateFunction::UTC, 7, exec->propertyNames().UTC), DontEnum);
    494   putDirectFunction(new DateFunction(exec, funcProto, DateFunction::Now, 0, exec->propertyNames().now), DontEnum);
    495   putDirect(exec->propertyNames().length, 7, ReadOnly|DontDelete|DontEnum);
     492  putDirectFunction(new (exec) DateFunction(exec, funcProto, DateFunction::Parse, 1, exec->propertyNames().parse), DontEnum);
     493  putDirectFunction(new (exec) DateFunction(exec, funcProto, DateFunction::UTC, 7, exec->propertyNames().UTC), DontEnum);
     494  putDirectFunction(new (exec) DateFunction(exec, funcProto, DateFunction::Now, 0, exec->propertyNames().now), DontEnum);
     495  putDirect(exec, exec->propertyNames().length, 7, ReadOnly|DontDelete|DontEnum);
    496496}
    497497
     
    544544  }
    545545 
    546   DateInstance *ret = new DateInstance(exec->lexicalGlobalObject()->datePrototype());
    547   ret->setInternalValue(jsNumber(timeClip(value)));
     546  DateInstance* ret = new (exec) DateInstance(exec->lexicalGlobalObject()->datePrototype());
     547  ret->setInternalValue(jsNumber(exec, timeClip(value)));
    548548  return ret;
    549549}
    550550
    551551// ECMA 15.9.2
    552 JSValue *DateConstructor::callAsFunction(ExecState * /*exec*/, JSObject * /*thisObj*/, const ArgList &/*args*/)
     552JSValue* DateConstructor::callAsFunction(ExecState* exec, JSObject * /*thisObj*/, const ArgList &/*args*/)
    553553{
    554554    time_t localTime = time(0);
     
    556556    getLocalTime(&localTime, &localTM);
    557557    GregorianDateTime ts(localTM);
    558     return jsString(formatDate(ts) + " " + formatTime(ts, false));
     558    return jsString(exec, formatDate(ts) + " " + formatTime(ts, false));
    559559}
    560560
     
    564564    : InternalFunction(funcProto, name), id(i)
    565565{
    566     putDirect(exec->propertyNames().length, len, DontDelete|ReadOnly|DontEnum);
     566    putDirect(exec, exec->propertyNames().length, len, DontDelete|ReadOnly|DontEnum);
    567567}
    568568
     
    571571{
    572572  if (id == Parse)
    573     return jsNumber(parseDate(args[0]->toString(exec)));
     573    return jsNumber(exec, parseDate(args[0]->toString(exec)));
    574574  else if (id == Now)
    575     return jsNumber(getCurrentUTCTime());
     575    return jsNumber(exec, getCurrentUTCTime());
    576576  else { // UTC
    577577    int n = args.size();
     
    583583        || (n >= 6 && isnan(args[5]->toNumber(exec)))
    584584        || (n >= 7 && isnan(args[6]->toNumber(exec)))) {
    585       return jsNaN();
     585      return jsNaN(exec);
    586586    }
    587587
     
    595595    t.second = args[5]->toInt32(exec);
    596596    double ms = (n >= 7) ? args[6]->toNumber(exec) : 0;
    597     return jsNumber(gregorianDateTimeToMS(t, ms, true));
     597    return jsNumber(exec, gregorianDateTimeToMS(t, ms, true));
    598598  }
    599599}
     
    990990    double milli = v->toNumber(exec);
    991991    if (isnan(milli))
    992         return jsString("Invalid Date");
    993 
    994     GregorianDateTime t;
    995     thisDateObj->msToGregorianDateTime(milli, utc, t);
    996     return jsString(formatDate(t) + " " + formatTime(t, utc));
     992        return jsString(exec, "Invalid Date");
     993
     994    GregorianDateTime t;
     995    thisDateObj->msToGregorianDateTime(milli, utc, t);
     996    return jsString(exec, formatDate(t) + " " + formatTime(t, utc));
    997997}
    998998
     
    10081008    double milli = v->toNumber(exec);
    10091009    if (isnan(milli))
    1010         return jsString("Invalid Date");
    1011 
    1012     GregorianDateTime t;
    1013     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1014     return jsString(formatDateUTCVariant(t) + " " + formatTime(t, utc));
     1010        return jsString(exec, "Invalid Date");
     1011
     1012    GregorianDateTime t;
     1013    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1014    return jsString(exec, formatDateUTCVariant(t) + " " + formatTime(t, utc));
    10151015}
    10161016
     
    10261026    double milli = v->toNumber(exec);
    10271027    if (isnan(milli))
    1028         return jsString("Invalid Date");
    1029 
    1030     GregorianDateTime t;
    1031     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1032     return jsString(formatDate(t));
     1028        return jsString(exec, "Invalid Date");
     1029
     1030    GregorianDateTime t;
     1031    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1032    return jsString(exec, formatDate(t));
    10331033}
    10341034
     
    10441044    double milli = v->toNumber(exec);
    10451045    if (isnan(milli))
    1046         return jsString("Invalid Date");
    1047 
    1048     GregorianDateTime t;
    1049     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1050     return jsString(formatTime(t, utc));
     1046        return jsString(exec, "Invalid Date");
     1047
     1048    GregorianDateTime t;
     1049    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1050    return jsString(exec, formatTime(t, utc));
    10511051}
    10521052
     
    10601060    double milli = v->toNumber(exec);
    10611061    if (isnan(milli))
    1062         return jsString("Invalid Date");
     1062        return jsString(exec, "Invalid Date");
    10631063
    10641064#if PLATFORM(MAC)
    10651065    double secs = floor(milli / msPerSecond);
    1066     return jsString(formatLocaleDate(exec, secs, true, true, args));
     1066    return jsString(exec, formatLocaleDate(exec, secs, true, true, args));
    10671067#else
    10681068    UNUSED_PARAM(args);
     
    10721072    GregorianDateTime t;
    10731073    thisDateObj->msToGregorianDateTime(milli, utc, t);
    1074     return formatLocaleDate(t, LocaleDateAndTime);
     1074    return formatLocaleDate(exec, t, LocaleDateAndTime);
    10751075#endif
    10761076}
     
    10851085    double milli = v->toNumber(exec);
    10861086    if (isnan(milli))
    1087         return jsString("Invalid Date");
     1087        return jsString(exec, "Invalid Date");
    10881088
    10891089#if PLATFORM(MAC)
    10901090    double secs = floor(milli / msPerSecond);
    1091     return jsString(formatLocaleDate(exec, secs, true, false, args));
     1091    return jsString(exec, formatLocaleDate(exec, secs, true, false, args));
    10921092#else
    10931093    UNUSED_PARAM(args);
     
    10971097    GregorianDateTime t;
    10981098    thisDateObj->msToGregorianDateTime(milli, utc, t);
    1099     return formatLocaleDate(t, LocaleDate);
     1099    return formatLocaleDate(exec, t, LocaleDate);
    11001100#endif
    11011101}
     
    11101110    double milli = v->toNumber(exec);
    11111111    if (isnan(milli))
    1112         return jsString("Invalid Date");
     1112        return jsString(exec, "Invalid Date");
    11131113
    11141114#if PLATFORM(MAC)
    11151115    double secs = floor(milli / msPerSecond);
    1116     return jsString(formatLocaleDate(exec, secs, false, true, args));
     1116    return jsString(exec, formatLocaleDate(exec, secs, false, true, args));
    11171117#else
    11181118    UNUSED_PARAM(args);
     
    11221122    GregorianDateTime t;
    11231123    thisDateObj->msToGregorianDateTime(milli, utc, t);
    1124     return formatLocaleDate(t, LocaleTime);
     1124    return formatLocaleDate(exec, t, LocaleTime);
    11251125#endif
    11261126}
     
    11351135    double milli = v->toNumber(exec);
    11361136    if (isnan(milli))
    1137         return jsNaN();
    1138 
    1139     return jsNumber(milli);
     1137        return jsNaN(exec);
     1138
     1139    return jsNumber(exec, milli);
    11401140}
    11411141
     
    11491149    double milli = v->toNumber(exec);
    11501150    if (isnan(milli))
    1151         return jsNaN();
    1152 
    1153     return jsNumber(milli);
     1151        return jsNaN(exec);
     1152
     1153    return jsNumber(exec, milli);
    11541154}
    11551155
     
    11651165    double milli = v->toNumber(exec);
    11661166    if (isnan(milli))
    1167         return jsNaN();
    1168 
    1169     GregorianDateTime t;
    1170     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1171     return jsNumber(1900 + t.year);
     1167        return jsNaN(exec);
     1168
     1169    GregorianDateTime t;
     1170    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1171    return jsNumber(exec, 1900 + t.year);
    11721172}
    11731173
     
    11831183    double milli = v->toNumber(exec);
    11841184    if (isnan(milli))
    1185         return jsNaN();
    1186 
    1187     GregorianDateTime t;
    1188     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1189     return jsNumber(1900 + t.year);
     1185        return jsNaN(exec);
     1186
     1187    GregorianDateTime t;
     1188    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1189    return jsNumber(exec, 1900 + t.year);
    11901190}
    11911191
     
    12011201    double milli = v->toNumber(exec);
    12021202    if (isnan(milli))
    1203         return jsString("Invalid Date");
    1204 
    1205     GregorianDateTime t;
    1206     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1207     return jsString(formatDateUTCVariant(t) + " " + formatTime(t, utc));
     1203        return jsString(exec, "Invalid Date");
     1204
     1205    GregorianDateTime t;
     1206    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1207    return jsString(exec, formatDateUTCVariant(t) + " " + formatTime(t, utc));
    12081208}
    12091209
     
    12191219    double milli = v->toNumber(exec);
    12201220    if (isnan(milli))
    1221         return jsNaN();
    1222 
    1223     GregorianDateTime t;
    1224     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1225     return jsNumber(t.month);
     1221        return jsNaN(exec);
     1222
     1223    GregorianDateTime t;
     1224    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1225    return jsNumber(exec, t.month);
    12261226}
    12271227
     
    12371237    double milli = v->toNumber(exec);
    12381238    if (isnan(milli))
    1239         return jsNaN();
    1240 
    1241     GregorianDateTime t;
    1242     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1243     return jsNumber(t.month);
     1239        return jsNaN(exec);
     1240
     1241    GregorianDateTime t;
     1242    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1243    return jsNumber(exec, t.month);
    12441244}
    12451245
     
    12551255    double milli = v->toNumber(exec);
    12561256    if (isnan(milli))
    1257         return jsNaN();
    1258 
    1259     GregorianDateTime t;
    1260     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1261     return jsNumber(t.monthDay);
     1257        return jsNaN(exec);
     1258
     1259    GregorianDateTime t;
     1260    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1261    return jsNumber(exec, t.monthDay);
    12621262}
    12631263
     
    12731273    double milli = v->toNumber(exec);
    12741274    if (isnan(milli))
    1275         return jsNaN();
    1276 
    1277     GregorianDateTime t;
    1278     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1279     return jsNumber(t.monthDay);
     1275        return jsNaN(exec);
     1276
     1277    GregorianDateTime t;
     1278    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1279    return jsNumber(exec, t.monthDay);
    12801280}
    12811281
     
    12911291    double milli = v->toNumber(exec);
    12921292    if (isnan(milli))
    1293         return jsNaN();
    1294 
    1295     GregorianDateTime t;
    1296     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1297     return jsNumber(t.weekDay);
     1293        return jsNaN(exec);
     1294
     1295    GregorianDateTime t;
     1296    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1297    return jsNumber(exec, t.weekDay);
    12981298}
    12991299
     
    13091309    double milli = v->toNumber(exec);
    13101310    if (isnan(milli))
    1311         return jsNaN();
    1312 
    1313     GregorianDateTime t;
    1314     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1315     return jsNumber(t.weekDay);
     1311        return jsNaN(exec);
     1312
     1313    GregorianDateTime t;
     1314    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1315    return jsNumber(exec, t.weekDay);
    13161316}
    13171317
     
    13271327    double milli = v->toNumber(exec);
    13281328    if (isnan(milli))
    1329         return jsNaN();
    1330 
    1331     GregorianDateTime t;
    1332     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1333     return jsNumber(t.hour);
     1329        return jsNaN(exec);
     1330
     1331    GregorianDateTime t;
     1332    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1333    return jsNumber(exec, t.hour);
    13341334}
    13351335
     
    13451345    double milli = v->toNumber(exec);
    13461346    if (isnan(milli))
    1347         return jsNaN();
    1348 
    1349     GregorianDateTime t;
    1350     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1351     return jsNumber(t.hour);
     1347        return jsNaN(exec);
     1348
     1349    GregorianDateTime t;
     1350    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1351    return jsNumber(exec, t.hour);
    13521352}
    13531353
     
    13631363    double milli = v->toNumber(exec);
    13641364    if (isnan(milli))
    1365         return jsNaN();
    1366 
    1367     GregorianDateTime t;
    1368     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1369     return jsNumber(t.minute);
     1365        return jsNaN(exec);
     1366
     1367    GregorianDateTime t;
     1368    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1369    return jsNumber(exec, t.minute);
    13701370}
    13711371
     
    13811381    double milli = v->toNumber(exec);
    13821382    if (isnan(milli))
    1383         return jsNaN();
    1384 
    1385     GregorianDateTime t;
    1386     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1387     return jsNumber(t.minute);
     1383        return jsNaN(exec);
     1384
     1385    GregorianDateTime t;
     1386    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1387    return jsNumber(exec, t.minute);
    13881388}
    13891389
     
    13991399    double milli = v->toNumber(exec);
    14001400    if (isnan(milli))
    1401         return jsNaN();
    1402 
    1403     GregorianDateTime t;
    1404     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1405     return jsNumber(t.second);
     1401        return jsNaN(exec);
     1402
     1403    GregorianDateTime t;
     1404    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1405    return jsNumber(exec, t.second);
    14061406}
    14071407
     
    14171417    double milli = v->toNumber(exec);
    14181418    if (isnan(milli))
    1419         return jsNaN();
    1420 
    1421     GregorianDateTime t;
    1422     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1423     return jsNumber(t.second);
     1419        return jsNaN(exec);
     1420
     1421    GregorianDateTime t;
     1422    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1423    return jsNumber(exec, t.second);
    14241424}
    14251425
     
    14331433    double milli = v->toNumber(exec);
    14341434    if (isnan(milli))
    1435         return jsNaN();
     1435        return jsNaN(exec);
    14361436
    14371437    double secs = floor(milli / msPerSecond);
    14381438    double ms = milli - secs * msPerSecond;
    1439     return jsNumber(ms);
     1439    return jsNumber(exec, ms);
    14401440}
    14411441
     
    14491449    double milli = v->toNumber(exec);
    14501450    if (isnan(milli))
    1451         return jsNaN();
     1451        return jsNaN(exec);
    14521452
    14531453    double secs = floor(milli / msPerSecond);
    14541454    double ms = milli - secs * msPerSecond;
    1455     return jsNumber(ms);
     1455    return jsNumber(exec, ms);
    14561456}
    14571457
     
    14671467    double milli = v->toNumber(exec);
    14681468    if (isnan(milli))
    1469         return jsNaN();
    1470 
    1471     GregorianDateTime t;
    1472     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1473     return jsNumber(-gmtoffset(t) / minutesPerHour);
     1469        return jsNaN(exec);
     1470
     1471    GregorianDateTime t;
     1472    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1473    return jsNumber(exec, -gmtoffset(t) / minutesPerHour);
    14741474}
    14751475
     
    14821482
    14831483    double milli = timeClip(args[0]->toNumber(exec));
    1484     JSValue* result = jsNumber(milli);
     1484    JSValue* result = jsNumber(exec, milli);
    14851485    thisDateObj->setInternalValue(result);
    14861486    return result;
     
    14971497   
    14981498    if (args.isEmpty() || isnan(milli)) {
    1499         JSValue* result = jsNaN();
     1499        JSValue* result = jsNaN(exec);
    15001500        thisDateObj->setInternalValue(result);
    15011501        return result;
     
    15091509
    15101510    if (!fillStructuresUsingTimeArgs(exec, args, numArgsToUse, &ms, &t)) {
    1511         JSValue* result = jsNaN();
     1511        JSValue* result = jsNaN(exec);
    15121512        thisDateObj->setInternalValue(result);
    15131513        return result;
    15141514    }
    15151515   
    1516     JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, inputIsUTC));
     1516    JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, inputIsUTC));
    15171517    thisDateObj->setInternalValue(result);
    15181518    return result;
     
    15261526    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj);
    15271527    if (args.isEmpty()) {
    1528         JSValue* result = jsNaN();
     1528        JSValue* result = jsNaN(exec);
    15291529        thisDateObj->setInternalValue(result);
    15301530        return result;
     
    15471547   
    15481548    if (!fillStructuresUsingDateArgs(exec, args, numArgsToUse, &ms, &t)) {
    1549         JSValue* result = jsNaN();
     1549        JSValue* result = jsNaN(exec);
    15501550        thisDateObj->setInternalValue(result);
    15511551        return result;
    15521552    }
    15531553           
    1554     JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, inputIsUTC));
     1554    JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, inputIsUTC));
    15551555    thisDateObj->setInternalValue(result);
    15561556    return result;
     
    16501650    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj);     
    16511651    if (args.isEmpty()) {
    1652         JSValue* result = jsNaN();
     1652        JSValue* result = jsNaN(exec);
    16531653        thisDateObj->setInternalValue(result);
    16541654        return result;
     
    16731673    int32_t year = args[0]->toInt32(exec, ok);
    16741674    if (!ok) {
    1675         JSValue* result = jsNaN();
     1675        JSValue* result = jsNaN(exec);
    16761676        thisDateObj->setInternalValue(result);
    16771677        return result;
     
    16791679           
    16801680    t.year = (year > 99 || year < 0) ? year - 1900 : year;
    1681     JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
     1681    JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, utc));
    16821682    thisDateObj->setInternalValue(result);
    16831683    return result;
     
    16951695    double milli = v->toNumber(exec);
    16961696    if (isnan(milli))
    1697         return jsNaN();
     1697        return jsNaN(exec);
    16981698
    16991699    GregorianDateTime t;
     
    17011701
    17021702    // NOTE: IE returns the full year even in getYear.
    1703     return jsNumber(t.year);
     1703    return jsNumber(exec, t.year);
    17041704}
    17051705
  • trunk/JavaScriptCore/kjs/error_object.cpp

    r34615 r34659  
    4646    // The constructor will be added later in ErrorConstructor's constructor
    4747
    48     putDirect(exec->propertyNames().name, jsString("Error"), DontEnum);
    49     putDirect(exec->propertyNames().message, jsString("Unknown error"), DontEnum);
     48    putDirect(exec->propertyNames().name, jsString(exec, "Error"), DontEnum);
     49    putDirect(exec->propertyNames().message, jsString(exec, "Unknown error"), DontEnum);
    5050
    51     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, errorProtoFuncToString), DontEnum);
     51    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, errorProtoFuncToString), DontEnum);
    5252}
    5353
     
    6565        s += ": " + v->toString(exec);
    6666
    67     return jsString(s);
     67    return jsString(exec, s);
    6868}
    6969
     
    7575    // ECMA 15.11.3.1 Error.prototype
    7676    putDirect(exec->propertyNames().prototype, errorProto, DontEnum|DontDelete|ReadOnly);
    77     putDirect(exec->propertyNames().length, jsNumber(1), DontDelete|ReadOnly|DontEnum);
     77    putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum);
    7878}
    7979
     
    8787{
    8888    JSObject* proto = static_cast<JSObject*>(exec->lexicalGlobalObject()->errorPrototype());
    89     JSObject* imp = new ErrorInstance(proto);
     89    JSObject* imp = new (exec) ErrorInstance(proto);
    9090    JSObject* obj(imp);
    9191
    9292    if (!args[0]->isUndefined())
    93         imp->putDirect(exec->propertyNames().message, jsString(args[0]->toString(exec)));
     93        imp->putDirect(exec->propertyNames().message, jsString(exec, args[0]->toString(exec)));
    9494
    9595    return obj;
     
    108108    : JSObject(errorProto)
    109109{
    110     putDirect(exec->propertyNames().name, jsString(name), 0);
    111     putDirect(exec->propertyNames().message, jsString(message), 0);
     110    putDirect(exec->propertyNames().name, jsString(exec, name), 0);
     111    putDirect(exec->propertyNames().message, jsString(exec, message), 0);
    112112}
    113113
     
    120120    , proto(prot)
    121121{
    122     putDirect(exec->propertyNames().length, jsNumber(1), DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5
     122    putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5
    123123    putDirect(exec->propertyNames().prototype, proto, DontDelete|ReadOnly|DontEnum);
    124124}
     
    131131JSObject* NativeErrorConstructor::construct(ExecState* exec, const ArgList& args)
    132132{
    133     JSObject* imp = new ErrorInstance(proto);
     133    JSObject* imp = new (exec) ErrorInstance(proto);
    134134    JSObject* obj(imp);
    135135    if (!args[0]->isUndefined())
    136         imp->putDirect(exec->propertyNames().message, jsString(args[0]->toString(exec)));
     136        imp->putDirect(exec->propertyNames().message, jsString(exec, args[0]->toString(exec)));
    137137    return obj;
    138138}
  • trunk/JavaScriptCore/kjs/identifier.h

    r34607 r34659  
    2626
    2727namespace KJS {
     28
     29    class ExecState;
    2830
    2931    class Identifier {
  • trunk/JavaScriptCore/kjs/internal.cpp

    r34607 r34659  
    8181inline StringObject* StringObject::create(ExecState* exec, JSString* string)
    8282{
    83     return new StringObject(exec->lexicalGlobalObject()->stringPrototype(), string);
     83    return new (exec) StringObject(exec->lexicalGlobalObject()->stringPrototype(), string);
    8484}
    8585
     
    9494}
    9595
    96 JSValue* JSString::lengthGetter(ExecState*, const Identifier&, const PropertySlot& slot)
    97 {
    98     return jsNumber(static_cast<JSString*>(slot.slotBase())->value().size());
    99 }
    100 
    101 JSValue* JSString::indexGetter(ExecState*, const Identifier&, const PropertySlot& slot)
    102 {
    103     return jsString(static_cast<JSString*>(slot.slotBase())->value().substr(slot.index(), 1));
    104 }
    105 
    106 JSValue* JSString::indexNumericPropertyGetter(ExecState*, unsigned index, const PropertySlot& slot)
    107 {
    108     return jsString(static_cast<JSString*>(slot.slotBase())->value().substr(index, 1));
     96JSValue* JSString::lengthGetter(ExecState* exec, const Identifier&, const PropertySlot& slot)
     97{
     98    return jsNumber(exec, static_cast<JSString*>(slot.slotBase())->value().size());
     99}
     100
     101JSValue* JSString::indexGetter(ExecState* exec, const Identifier&, const PropertySlot& slot)
     102{
     103    return jsString(exec, static_cast<JSString*>(slot.slotBase())->value().substr(slot.index(), 1));
     104}
     105
     106JSValue* JSString::indexNumericPropertyGetter(ExecState* exec, unsigned index, const PropertySlot& slot)
     107{
     108    return jsString(exec, static_cast<JSString*>(slot.slotBase())->value().substr(index, 1));
    109109}
    110110
  • trunk/JavaScriptCore/kjs/interpreter.cpp

    r34412 r34659  
    2828#include "Machine.h"
    2929#include "Parser.h"
     30#include "completion.h"
    3031#include "debugger.h"
    3132#include <profiler/Profiler.h>
  • trunk/JavaScriptCore/kjs/list.cpp

    r34587 r34659  
    2121#include "config.h"
    2222#include "list.h"
     23
     24#include "JSValue.h"
    2325
    2426using std::min;
     
    6163        // We can only register for explicit marking once we know which heap
    6264        // is the current one, i.e., when a non-immediate value is appended.
    63         if (!JSImmediate::isImmediate(v)) { // Will be: if (Heap* heap = Heap::heap(v))
    64             ListSet& markSet = Collector::markListSet();
     65        if (Heap* heap = Heap::heap(v)) {
     66            ListSet& markSet = heap->markListSet();
    6567            markSet.add(this);
    6668            m_markSet = &markSet;
  • trunk/JavaScriptCore/kjs/list.h

    r34587 r34659  
    11/*
    22 *  Copyright (C) 1999-2001 Harri Porten ([email protected])
    3  *  Copyright (C) 2003, 2007 Apple Computer, Inc.
     3 *  Copyright (C) 2003, 2007, 2008 Apple Computer, Inc.
    44 *
    55 *  This library is free software; you can redistribute it and/or
     
    2323#define KJS_LIST_H
    2424
    25 #include <kjs/JSValue.h>
     25#include "JSImmediate.h"
    2626#include <wtf/HashSet.h>
    2727#include <wtf/Noncopyable.h>
     
    121121       
    122122        JSValue** buffer() const { return *m_bufferSlot + m_offset; }
    123        
     123
    124124        JSValue*** m_bufferSlot;
    125125        size_t m_offset;
  • trunk/JavaScriptCore/kjs/lookup.h

    r34607 r34659  
    110110
    111111      const HashEntry* entry = slot.staticEntry();
    112       JSValue* val = new PrototypeFunction(exec, entry->length, propertyName, entry->functionValue);
     112      JSValue* val = new (exec) PrototypeFunction(exec, entry->length, propertyName, entry->functionValue);
    113113      thisObj->putDirect(propertyName, val, entry->attributes);
    114114      return val;
     
    250250      return static_cast<JSObject* >(obj);
    251251    }
    252     JSObject* newObject = new ClassCtor(exec);
     252    JSObject* newObject = new (exec) ClassCtor(exec);
    253253    globalObject->putDirect(propertyName, newObject, DontEnum);
    254254    return newObject;
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r34620 r34659  
    196196RegisterID* Node::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg)
    197197{
    198     RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(msg));
     198    RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalExec(), msg));
    199199    generator.emitThrow(exception);
    200200    return exception;
     
    205205    UString message = msg;
    206206    substitute(message, label.ustring());
    207     RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(message));
     207    RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalExec(), message));
    208208    generator.emitThrow(exception);
    209209    return exception;
     
    273273{
    274274    // FIXME: should we try to atomize constant strings?
    275     return generator.emitLoad(generator.finalDestination(dst), jsOwnedString(m_value));
     275    return generator.emitLoad(generator.finalDestination(dst), jsOwnedString(generator.globalExec(), m_value));
    276276}
    277277
     
    322322    }
    323323
    324     value = generator.emitLoad(generator.newTemporary(), jsNumber(m_elision + length));
     324    value = generator.emitLoad(generator.newTemporary(), jsNumber(generator.globalExec(), m_elision + length));
    325325    generator.emitPutById(newArray.get(), generator.propertyNames().length, value);
    326326
     
    16931693JSFunction* FuncDeclNode::makeFunction(ExecState* exec, ScopeChainNode* scopeChain)
    16941694{
    1695     JSFunction* func = new JSFunction(exec, m_ident, m_body.get(), scopeChain);
     1695    JSFunction* func = new (exec) JSFunction(exec, m_ident, m_body.get(), scopeChain);
    16961696
    16971697    JSObject* proto = exec->lexicalGlobalObject()->objectConstructor()->construct(exec, exec->emptyList());
    16981698    proto->putDirect(exec->propertyNames().constructor, func, DontEnum);
    16991699    func->putDirect(exec->propertyNames().prototype, proto, DontDelete);
    1700     func->putDirect(exec->propertyNames().length, jsNumber(m_body->parameters().size()), ReadOnly | DontDelete | DontEnum);
     1700    func->putDirect(exec->propertyNames().length, jsNumber(exec, m_body->parameters().size()), ReadOnly | DontDelete | DontEnum);
    17011701    return func;
    17021702}
     
    17161716JSFunction* FuncExprNode::makeFunction(ExecState* exec, ScopeChainNode* scopeChain)
    17171717{
    1718     JSFunction* func = new JSFunction(exec, m_ident, m_body.get(), scopeChain);
     1718    JSFunction* func = new (exec) JSFunction(exec, m_ident, m_body.get(), scopeChain);
    17191719    JSObject* proto = exec->lexicalGlobalObject()->objectConstructor()->construct(exec, exec->emptyList());
    17201720    proto->putDirect(exec->propertyNames().constructor, func, DontEnum);
     
    17301730
    17311731    if (!m_ident.isNull()) {
    1732         JSObject* functionScopeObject = new JSObject;
     1732        JSObject* functionScopeObject = new (exec) JSObject;
    17331733        functionScopeObject->putDirect(m_ident, func, ReadOnly | DontDelete);
    17341734        func->scope().push(functionScopeObject);
  • trunk/JavaScriptCore/kjs/nodes.h

    r34593 r34659  
    2828
    2929#include "JSString.h"
     30#include "LabelStack.h"
    3031#include "Opcode.h"
    3132#include "regexp.h"
  • trunk/JavaScriptCore/kjs/object_object.cpp

    r34607 r34659  
    4444    : JSObject() // [[Prototype]] is null
    4545{
    46     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, objectProtoFuncToString), DontEnum);
    47     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toLocaleString, objectProtoFuncToLocaleString), DontEnum);
    48     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, objectProtoFuncValueOf), DontEnum);
    49     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().hasOwnProperty, objectProtoFuncHasOwnProperty), DontEnum);
    50     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().propertyIsEnumerable, objectProtoFuncPropertyIsEnumerable), DontEnum);
    51     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().isPrototypeOf, objectProtoFuncIsPrototypeOf), DontEnum);
     46    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, objectProtoFuncToString), DontEnum);
     47    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toLocaleString, objectProtoFuncToLocaleString), DontEnum);
     48    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().valueOf, objectProtoFuncValueOf), DontEnum);
     49    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().hasOwnProperty, objectProtoFuncHasOwnProperty), DontEnum);
     50    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().propertyIsEnumerable, objectProtoFuncPropertyIsEnumerable), DontEnum);
     51    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().isPrototypeOf, objectProtoFuncIsPrototypeOf), DontEnum);
    5252
    5353    // Mozilla extensions
    54     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 2, exec->propertyNames().__defineGetter__, objectProtoFuncDefineGetter), DontEnum);
    55     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 2, exec->propertyNames().__defineSetter__, objectProtoFuncDefineSetter), DontEnum);
    56     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().__lookupGetter__, objectProtoFuncLookupGetter), DontEnum);
    57     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().__lookupSetter__, objectProtoFuncLookupSetter), DontEnum);
     54    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 2, exec->propertyNames().__defineGetter__, objectProtoFuncDefineGetter), DontEnum);
     55    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 2, exec->propertyNames().__defineSetter__, objectProtoFuncDefineSetter), DontEnum);
     56    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().__lookupGetter__, objectProtoFuncLookupGetter), DontEnum);
     57    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 1, exec->propertyNames().__lookupSetter__, objectProtoFuncLookupSetter), DontEnum);
    5858}
    5959
     
    125125JSValue* objectProtoFuncToLocaleString(ExecState* exec, JSObject* thisObj, const ArgList&)
    126126{
    127     return jsString(thisObj->toString(exec));
     127    return jsString(exec, thisObj->toString(exec));
    128128}
    129129
    130 JSValue* objectProtoFuncToString(ExecState*, JSObject* thisObj, const ArgList&)
     130JSValue* objectProtoFuncToString(ExecState* exec, JSObject* thisObj, const ArgList&)
    131131{
    132     return jsString("[object " + thisObj->className() + "]");
     132    return jsString(exec, "[object " + thisObj->className() + "]");
    133133}
    134134
     
    142142
    143143  // no. of arguments for constructor
    144   putDirect(exec->propertyNames().length, jsNumber(1), ReadOnly|DontDelete|DontEnum);
     144  putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
    145145}
    146146
     
    162162  case NullType:
    163163  case UndefinedType:
    164       return new JSObject(exec->lexicalGlobalObject()->objectPrototype());
     164      return new (exec) JSObject(exec->lexicalGlobalObject()->objectPrototype());
    165165  default:
    166166      ASSERT_NOT_REACHED();
  • trunk/JavaScriptCore/kjs/protect.h

    r34581 r34659  
    3131namespace KJS {
    3232
    33     inline void gcProtect(JSValue *val)
    34     {
    35         Collector::protect(val);
     33    inline void gcProtect(JSValue* val)
     34    {
     35        Heap* heap = Heap::heap(val);
     36        if (heap)
     37            heap->protect(val);
    3638    }
    3739
    38     inline void gcUnprotect(JSValue *val)
    39     {
    40         Collector::unprotect(val);
     40    inline void gcUnprotect(JSValue* val)
     41    {
     42        Heap* heap = Heap::heap(val);
     43        if (heap)
     44            heap->unprotect(val);
    4145    }
    4246
  • trunk/JavaScriptCore/kjs/string_object.cpp

    r34607 r34659  
    4141const ClassInfo StringObject::info = { "String", 0, 0, 0 };
    4242
    43 StringObject::StringObject(JSObject *proto)
     43StringObject::StringObject(ExecState* exec, JSObject* proto)
    4444  : JSWrapperObject(proto)
    4545{
    46   setInternalValue(jsString(""));
    47 }
    48 
    49 StringObject::StringObject(JSObject *proto, JSString* string)
     46  setInternalValue(jsString(exec, ""));
     47}
     48
     49StringObject::StringObject(JSObject* proto, JSString* string)
    5050  : JSWrapperObject(proto)
    5151{
     
    5353}
    5454
    55 StringObject::StringObject(JSObject *proto, const UString &string)
     55StringObject::StringObject(ExecState* exec, JSObject* proto, const UString& string)
    5656  : JSWrapperObject(proto)
    5757{
    58   setInternalValue(jsString(string));
     58  setInternalValue(jsString(exec, string));
    5959}
    6060
     
    136136// ECMA 15.5.4
    137137StringPrototype::StringPrototype(ExecState* exec, ObjectPrototype* objProto)
    138   : StringObject(objProto)
     138  : StringObject(exec, objProto)
    139139{
    140140  // The constructor will be added later, after StringConstructor has been built
    141   putDirect(exec->propertyNames().length, jsNumber(0), DontDelete | ReadOnly | DontEnum);
     141  putDirect(exec->propertyNames().length, jsNumber(exec, 0), DontDelete | ReadOnly | DontEnum);
    142142}
    143143
     
    315315                args.append(jsUndefined());
    316316              else
    317                 args.append(jsString(source.substr(matchStart, matchLen)));
     317                args.append(jsString(exec, source.substr(matchStart, matchLen)));
    318318          }
    319319         
    320           args.append(jsNumber(completeMatchStart));
     320          args.append(jsNumber(exec, completeMatchStart));
    321321          args.append(sourceVal);
    322322
     
    352352      return sourceVal;
    353353
    354     return jsString(result);
     354    return jsString(exec, result);
    355355  }
    356356 
     
    366366      ArgList args;
    367367     
    368       args.append(jsString(source.substr(matchPos, matchLen)));
    369       args.append(jsNumber(matchPos));
     368      args.append(jsString(exec, source.substr(matchPos, matchLen)));
     369      args.append(jsNumber(exec, matchPos));
    370370      args.append(sourceVal);
    371371     
     
    373373  }
    374374
    375   return jsString(source.substr(0, matchPos) + replacementString + source.substr(matchPos + matchLen));
     375  return jsString(exec, source.substr(0, matchPos) + replacementString + source.substr(matchPos + matchLen));
    376376}
    377377
     
    405405    else
    406406      u = "";
    407     return jsString(u);
     407    return jsString(exec, u);
    408408}
    409409
     
    419419    double dpos = a0->toInteger(exec);
    420420    if (dpos >= 0 && dpos < len)
    421       result = jsNumber(s[static_cast<int>(dpos)]);
     421      result = jsNumber(exec, s[static_cast<int>(dpos)]);
    422422    else
    423       result = jsNaN();
     423      result = jsNaN(exec);
    424424    return result;
    425425}
     
    434434        s += (*it)->toString(exec);
    435435    }
    436     return jsString(s);
     436    return jsString(exec, s);
    437437}
    438438
     
    451451    else if (dpos > len)
    452452        dpos = len;
    453     return jsNumber(s.find(u2, static_cast<int>(dpos)));
     453    return jsNumber(exec, s.find(u2, static_cast<int>(dpos)));
    454454}
    455455
     
    469469    else if (!(dpos <= len)) // true for NaN
    470470        dpos = len;
    471     return jsNumber(s.rfind(u2, static_cast<int>(dpos)));
     471    return jsNumber(exec, s.rfind(u2, static_cast<int>(dpos)));
    472472}
    473473
     
    508508      int lastIndex = 0;
    509509      while (pos >= 0) {
    510         list.append(jsString(u.substr(pos, matchLength)));
     510        list.append(jsString(exec, u.substr(pos, matchLength)));
    511511        lastIndex = pos;
    512512        pos += matchLength == 0 ? 1 : matchLength;
     
    550550    int matchLength;
    551551    regExpObj->performMatch(reg.get(), u, 0, pos, matchLength);
    552     return jsNumber(pos);
     552    return jsNumber(exec, pos);
    553553}
    554554
     
    560560    JSString* sVal = thisObj->inherits(&StringObject::info) ?
    561561      static_cast<StringObject*>(thisObj)->internalValue() :
    562       static_cast<JSString*>(jsString(s));
     562      static_cast<JSString*>(jsString(exec, s));
    563563
    564564    JSValue* a0 = args[0];
     
    587587        if (to > len)
    588588            to = len;
    589         return jsString(s.substr(static_cast<int>(from), static_cast<int>(to - from)));
    590     }
    591 
    592     return jsString("");
     589        return jsString(exec, s.substr(static_cast<int>(from), static_cast<int>(to - from)));
     590    }
     591
     592    return jsString(exec, "");
    593593}
    594594
     
    613613      if (u.isEmpty() && reg->match(u, 0) >= 0) {
    614614        // empty string matched by regexp -> empty array
    615         res->put(exec, exec->propertyNames().length, jsNumber(0));
     615        res->put(exec, exec->propertyNames().length, jsNumber(exec, 0));
    616616        return result;
    617617      }
     
    625625        pos = mpos + (mlen == 0 ? 1 : mlen);
    626626        if (mpos != p0 || mlen) {
    627           res->put(exec,i, jsString(u.substr(p0, mpos-p0)));
     627          res->put(exec,i, jsString(exec, u.substr(p0, mpos-p0)));
    628628          p0 = mpos + mlen;
    629629          i++;
     
    634634            res->put(exec, i++, jsUndefined());
    635635          else
    636             res->put(exec, i++, jsString(u.substr(spos, ovector[si * 2 + 1] - spos)));
     636            res->put(exec, i++, jsString(exec, u.substr(spos, ovector[si * 2 + 1] - spos)));
    637637        }
    638638      }
     
    642642        if (u.isEmpty()) {
    643643          // empty separator matches empty string -> empty array
    644           res->put(exec, exec->propertyNames().length, jsNumber(0));
     644          res->put(exec, exec->propertyNames().length, jsNumber(exec, 0));
    645645          return result;
    646646        } else {
    647647          while (static_cast<uint32_t>(i) != limit && i < u.size()-1)
    648             res->put(exec, i++, jsString(u.substr(p0++, 1)));
     648            res->put(exec, i++, jsString(exec, u.substr(p0++, 1)));
    649649        }
    650650      } else {
    651651        while (static_cast<uint32_t>(i) != limit && (pos = u.find(u2, p0)) >= 0) {
    652           res->put(exec, i, jsString(u.substr(p0, pos-p0)));
     652          res->put(exec, i, jsString(exec, u.substr(p0, pos - p0)));
    653653          p0 = pos + u2.size();
    654654          i++;
     
    658658    // add remaining string, if any
    659659    if (static_cast<uint32_t>(i) != limit)
    660       res->put(exec, i++, jsString(u.substr(p0)));
    661     res->put(exec, exec->propertyNames().length, jsNumber(i));
     660      res->put(exec, i++, jsString(exec, u.substr(p0)));
     661    res->put(exec, exec->propertyNames().length, jsNumber(exec, i));
    662662    return result;
    663663}
     
    675675    double length = a1->isUndefined() ? len : a1->toInteger(exec);
    676676    if (start >= len)
    677       return jsString("");
     677      return jsString(exec, "");
    678678    if (length < 0)
    679       return jsString("");
     679      return jsString(exec, "");
    680680    if (start < 0) {
    681681      start += len;
     
    685685    if (length > len)
    686686      length = len;
    687     return jsString(s.substr(static_cast<int>(start), static_cast<int>(length)));
     687    return jsString(exec, s.substr(static_cast<int>(start), static_cast<int>(length)));
    688688}
    689689
     
    718718      start = temp;
    719719    }
    720     return jsString(s.substr((int)start, (int)end-(int)start));
     720    return jsString(exec, s.substr((int)start, (int)end-(int)start));
    721721}
    722722
     
    728728    JSString* sVal = thisObj->inherits(&StringObject::info)
    729729        ? static_cast<StringObject*>(thisObj)->internalValue()
    730         : static_cast<JSString*>(jsString(s));
     730        : static_cast<JSString*>(jsString(exec, s));
    731731    int ssize = s.size();
    732732    if (!ssize)
     
    743743    if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0)
    744744        return sVal;
    745     return jsString(UString(buffer.releaseBuffer(), length, false));
     745    return jsString(exec, UString(buffer.releaseBuffer(), length, false));
    746746}
    747747
     
    753753    JSString* sVal = thisObj->inherits(&StringObject::info)
    754754        ? static_cast<StringObject*>(thisObj)->internalValue()
    755         : static_cast<JSString*>(jsString(s));
     755        : static_cast<JSString*>(jsString(exec, s));
    756756    int ssize = s.size();
    757757    if (!ssize)
     
    768768    if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0)
    769769        return sVal;
    770     return jsString(UString(buffer.releaseBuffer(), length, false));
     770    return jsString(exec, UString(buffer.releaseBuffer(), length, false));
    771771}
    772772
     
    779779    JSString* sVal = thisObj->inherits(&StringObject::info)
    780780        ? static_cast<StringObject*>(thisObj)->internalValue()
    781         : static_cast<JSString*>(jsString(s));
     781        : static_cast<JSString*>(jsString(exec, s));
    782782    int ssize = s.size();
    783783    if (!ssize)
     
    794794    if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0)
    795795        return sVal;
    796     return jsString(UString(buffer.releaseBuffer(), length, false));
     796    return jsString(exec, UString(buffer.releaseBuffer(), length, false));
    797797}
    798798
     
    804804    JSString* sVal = thisObj->inherits(&StringObject::info)
    805805        ? static_cast<StringObject*>(thisObj)->internalValue()
    806         : static_cast<JSString*>(jsString(s));
     806        : static_cast<JSString*>(jsString(exec, s));
    807807    int ssize = s.size();
    808808    if (!ssize)
     
    819819    if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0)
    820820        return sVal;
    821     return jsString(UString(buffer.releaseBuffer(), length, false));
     821    return jsString(exec, UString(buffer.releaseBuffer(), length, false));
    822822}
    823823
     
    825825{
    826826    if (args.size() < 1)
    827       return jsNumber(0);
    828 
    829     // This optimizes the common case that thisObj is a StringObject
    830     UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    831     JSValue* a0 = args[0];
    832     return jsNumber(localeCompare(s, a0->toString(exec)));
     827      return jsNumber(exec, 0);
     828
     829    // This optimizes the common case that thisObj is a StringObject
     830    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     831    JSValue* a0 = args[0];
     832    return jsNumber(exec, localeCompare(s, a0->toString(exec)));
    833833}
    834834
     
    837837    // This optimizes the common case that thisObj is a StringObject
    838838    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    839     return jsString("<big>" + s + "</big>");
     839    return jsString(exec, "<big>" + s + "</big>");
    840840}
    841841
     
    844844    // This optimizes the common case that thisObj is a StringObject
    845845    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    846     return jsString("<small>" + s + "</small>");
     846    return jsString(exec, "<small>" + s + "</small>");
    847847}
    848848
     
    851851    // This optimizes the common case that thisObj is a StringObject
    852852    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    853     return jsString("<blink>" + s + "</blink>");
     853    return jsString(exec, "<blink>" + s + "</blink>");
    854854}
    855855
     
    858858    // This optimizes the common case that thisObj is a StringObject
    859859    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    860     return jsString("<b>" + s + "</b>");
     860    return jsString(exec, "<b>" + s + "</b>");
    861861}
    862862
     
    865865    // This optimizes the common case that thisObj is a StringObject
    866866    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    867     return jsString("<tt>" + s + "</tt>");
     867    return jsString(exec, "<tt>" + s + "</tt>");
    868868}
    869869
     
    872872    // This optimizes the common case that thisObj is a StringObject
    873873    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    874     return jsString("<i>" + s + "</i>");
     874    return jsString(exec, "<i>" + s + "</i>");
    875875}
    876876
     
    879879    // This optimizes the common case that thisObj is a StringObject
    880880    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    881     return jsString("<strike>" + s + "</strike>");
     881    return jsString(exec, "<strike>" + s + "</strike>");
    882882}
    883883
     
    886886    // This optimizes the common case that thisObj is a StringObject
    887887    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    888     return jsString("<sub>" + s + "</sub>");
     888    return jsString(exec, "<sub>" + s + "</sub>");
    889889}
    890890
     
    893893    // This optimizes the common case that thisObj is a StringObject
    894894    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    895     return jsString("<sup>" + s + "</sup>");
     895    return jsString(exec, "<sup>" + s + "</sup>");
    896896}
    897897
     
    901901    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    902902    JSValue* a0 = args[0];
    903     return jsString("<font color=\"" + a0->toString(exec) + "\">" + s + "</font>");
     903    return jsString(exec, "<font color=\"" + a0->toString(exec) + "\">" + s + "</font>");
    904904}
    905905
     
    909909    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    910910    JSValue* a0 = args[0];
    911     return jsString("<font size=\"" + a0->toString(exec) + "\">" + s + "</font>");
     911    return jsString(exec, "<font size=\"" + a0->toString(exec) + "\">" + s + "</font>");
    912912}
    913913
     
    917917    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    918918    JSValue* a0 = args[0];
    919     return jsString("<a name=\"" + a0->toString(exec) + "\">" + s + "</a>");
     919    return jsString(exec, "<a name=\"" + a0->toString(exec) + "\">" + s + "</a>");
    920920}
    921921
     
    925925    UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    926926    JSValue* a0 = args[0];
    927     return jsString("<a href=\"" + a0->toString(exec) + "\">" + s + "</a>");
     927    return jsString(exec, "<a href=\"" + a0->toString(exec) + "\">" + s + "</a>");
    928928}
    929929
     
    936936  putDirect(exec->propertyNames().prototype, stringProto, DontEnum|DontDelete|ReadOnly);
    937937
    938   putDirectFunction(new StringConstructorFunction(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum);
     938  putDirectFunction(new (exec) StringConstructorFunction(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum);
    939939
    940940  // no. of arguments for constructor
    941   putDirect(exec->propertyNames().length, jsNumber(1), ReadOnly|DontDelete|DontEnum);
     941  putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
    942942}
    943943
     
    949949
    950950// ECMA 15.5.2
    951 JSObject *StringConstructor::construct(ExecState *exec, const ArgList &args)
    952 {
    953   JSObject *proto = exec->lexicalGlobalObject()->stringPrototype();
    954   if (args.size() == 0)
    955     return new StringObject(proto);
    956   return new StringObject(proto, args[0]->toString(exec));
     951JSObject* StringConstructor::construct(ExecState* exec, const ArgList& args)
     952{
     953  JSObject* proto = exec->lexicalGlobalObject()->stringPrototype();
     954  if (!args.size())
     955    return new (exec) StringObject(exec, proto);
     956  return new (exec) StringObject(exec, proto, args[0]->toString(exec));
    957957}
    958958
     
    961961{
    962962  if (args.isEmpty())
    963     return jsString("");
     963    return jsString(exec, "");
    964964  else {
    965965    JSValue *v = args[0];
    966     return jsString(v->toString(exec));
     966    return jsString(exec, v->toString(exec));
    967967  }
    968968}
     
    974974  : InternalFunction(funcProto, name)
    975975{
    976   putDirect(exec->propertyNames().length, jsNumber(1), DontDelete|ReadOnly|DontEnum);
     976  putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum);
    977977}
    978978
     
    992992    s = "";
    993993
    994   return jsString(s);
     994  return jsString(exec, s);
    995995}
    996996
  • trunk/JavaScriptCore/kjs/string_object.h

    r34587 r34659  
    3232  class StringObject : public JSWrapperObject {
    3333  public:
    34     StringObject(JSObject* prototype);
    35     StringObject(JSObject* prototype, const UString&);
     34    StringObject(ExecState*, JSObject* prototype);
     35    StringObject(ExecState*, JSObject* prototype, const UString&);
    3636
    3737    static StringObject* create(ExecState*, JSString*);
     
    5656  class StringObjectThatMasqueradesAsUndefined : public StringObject {
    5757  public:
    58       StringObjectThatMasqueradesAsUndefined(JSObject* proto, const UString& string)
    59           : StringObject(proto, string) { }
     58      StringObjectThatMasqueradesAsUndefined(ExecState* exec, JSObject* proto, const UString& string)
     59          : StringObject(exec, proto, string) { }
    6060      virtual bool masqueradeAsUndefined() const { return true; }
    6161      virtual bool toBoolean(ExecState*) const { return false; }
  • trunk/JavaScriptCore/kjs/ustring.h

    r34361 r34659  
    405405// FIXME: this should be size_t but that would cause warnings until we
    406406// fix UString sizes to be size_t instead of int
    407 static const int minShareSize = Collector::minExtraCostSize / sizeof(UChar);
     407static const int minShareSize = Heap::minExtraCostSize / sizeof(UChar);
    408408
    409409inline size_t UString::cost() const
Note: See TracChangeset for help on using the changeset viewer.