Changeset 32807 in webkit for trunk/JavaScriptCore


Ignore:
Timestamp:
May 2, 2008, 3:07:53 AM (17 years ago)
Author:
[email protected]
Message:

Reviewed by Geoffrey Garen.

https://bugs.webkit.org/show_bug.cgi?id=18826
Make JavaScript heap per-thread

Location:
trunk/JavaScriptCore
Files:
44 edited

Legend:

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

    r29663 r32807  
    8080{
    8181    JSLock lock;
    82     if (!Collector::isBusy())
    83         Collector::collect();
     82
     83    // 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.
     84    // The performance difference should be negligible anyway.
     85    Heap* heap = Heap::threadHeap();
     86    if (!heap->isBusy())
     87        heap->collect();
    8488    // FIXME: Perhaps we should trigger a second mark and sweep
    8589    // once the garbage collector is done if this is called when
  • trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h

    r32609 r32807  
    467467            if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) {
    468468                if (JSObjectCallAsFunctionCallback callAsFunction = entry->callAsFunction) {
    469                     JSObject* o = new JSCallbackFunction(exec, callAsFunction, propertyName);
     469                    JSObject* o = new (exec) JSCallbackFunction(exec, callAsFunction, propertyName);
    470470                    thisObj->putDirect(propertyName, o, entry->attributes);
    471471                    return o;
  • trunk/JavaScriptCore/API/JSClassRef.cpp

    r31872 r32807  
    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/JSObjectRef.cpp

    r32609 r32807  
    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(toJS(name)) : Identifier("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    List 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

    r29663 r32807  
    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

    r32805 r32807  
     12008-05-02  Alexey Proskuryakov  <[email protected]>
     2
     3        Reviewed by Geoffrey Garen.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=18826
     6        Make JavaScript heap per-thread
     7
     8        * wtf/ThreadSpecific.h: Make sure to initialize POD thread-specific varaibles, too
     9        (replaced "new T" with "new T()").
     10
     11        * kjs/collector.h: Renamed Collector to Heap, made the heap per-thread. Removed support for
     12        multithreaded access to a heap.
     13        (KJS::CollectorBlock): Removed collectOnMainThreadOnly bitmap, added a reference to owner heap.
     14        (KJS::SmallCellCollectorBlock): Ditto.
     15        (KJS::Heap::markListSet): Moved from a static variable in List.cpp to a per-thread one here.
     16        (KJS::Heap::heap): Added a method to find which heap a JSValue is allocated in.
     17
     18        * kjs/collector.cpp: Changed "const size_t" constants to #defines, to avoid a PIC branch
     19        (gcc was using one to access a constant used in std::max(), because it takes a reference,
     20        even though std::max() itself was inlined).
     21        (KJS::Heap::threadHeap): JS heap is now per-thread.
     22        (KJS::Heap::Heap): Zero-initialize the heap.
     23        (KJS::allocateBlock): Added NEVER_INLINE, because this function uses a PIC branch, so
     24        inlining it in Heap::heapAllocate() is bad for performance, now that the latter doesn't
     25        use any global data.
     26        (KJS::Heap::heapAllocate): Initialize Block::heap.
     27        (KJS::Heap::markCurrentThreadConservatively): Moved into markStackObjectsConservatively(),
     28        as GC only works with a current thread's heap now.
     29        (KJS::Heap::sweep): Removed collectOnMainThreadOnly checks.
     30        (KJS::Heap::collect): Ditto.
     31
     32        * kjs/JSLock.cpp:
     33        * kjs/JSLock.h:
     34        (KJS::JSLock::JSLock):
     35        Removed registerThread(), as the heap no longer cares.
     36
     37        * kjs/InitializeThreading.cpp: (KJS::initializeThreading): Initialize new per-thread
     38        variables in Heap and JSGlobalObject.
     39
     40        * kjs/ExecState.h: (KJS::ExecState::heap): Added a heap pointer for faster access to
     41        per-thread heap, and an accessor for it.
     42
     43        * kjs/JSGlobalObject.h: Made JSGlobalObject linked list per-thread.
     44        * kjs/JSGlobalObject.cpp:
     45        (KJS::JSGlobalObject::~JSGlobalObject): Fixed a bug in linked list handling. It only worked
     46        right if the removed object was the head one!
     47        (KJS::JSGlobalObject::head): Return a per-thread list head.
     48        (KJS::JSGlobalObject::init): Store a reference to per-thread heap.
     49        (KJS::JSGlobalObject::reset): Pass ExecState to functions that need it.
     50        (KJS::JSGlobalObject::tearOffActivation): Ditto.
     51        (KJS::JSGlobalObject::operator new): JSGlobalObject allocation cannot use an ExecState,
     52        so it needs a custom operator new that directly accesses per-thread heap.
     53
     54        * kjs/list.h:
     55        (KJS::List::List): Replaced m_isInMarkSet boolean with an actual pointer to the set, since it
     56        is no longer a single static object.
     57        (KJS::List::~List): Ditto.
     58        * kjs/list.cpp:
     59        (KJS::List::markSet): Removed, this is now stored in Heap.
     60        (KJS::List::markProtectedLists): Take a reference to the list.
     61        (KJS::List::expandAndAppend): Ask the current thread heap for a mark set reference.
     62
     63        * kjs/protect.h:
     64        (KJS::gcProtect):
     65        (KJS::gcUnprotect):
     66        Use the newly added Heap::heap() method to find out which heap the value to be (un)protected
     67        belongs to.
     68
     69        * kjs/property_map.h: Removed unused SavedProperty class.
     70
     71        * JavaScriptCore.exp:
     72        * API/JSBase.cpp:
     73        (JSGarbageCollect):
     74        * API/JSCallbackObjectFunctions.h:
     75        (KJS::::staticFunctionGetter):
     76        * API/JSClassRef.cpp:
     77        (OpaqueJSClass::prototype):
     78        * API/JSObjectRef.cpp:
     79        (JSObjectMake):
     80        (JSObjectMakeFunctionWithCallback):
     81        (JSObjectMakeConstructor):
     82        (JSObjectMakeFunction):
     83        * API/JSValueRef.cpp:
     84        (JSValueMakeNumber):
     85        (JSValueMakeString):
     86        * kjs/array_instance.cpp:
     87        (KJS::ArrayInstance::ArrayInstance):
     88        (KJS::ArrayInstance::lengthGetter):
     89        * kjs/array_object.cpp:
     90        (KJS::arrayProtoFuncToString):
     91        (KJS::arrayProtoFuncToLocaleString):
     92        (KJS::arrayProtoFuncJoin):
     93        (KJS::arrayProtoFuncConcat):
     94        (KJS::arrayProtoFuncPop):
     95        (KJS::arrayProtoFuncPush):
     96        (KJS::arrayProtoFuncShift):
     97        (KJS::arrayProtoFuncSlice):
     98        (KJS::arrayProtoFuncSplice):
     99        (KJS::arrayProtoFuncUnShift):
     100        (KJS::arrayProtoFuncFilter):
     101        (KJS::arrayProtoFuncMap):
     102        (KJS::arrayProtoFuncEvery):
     103        (KJS::arrayProtoFuncForEach):
     104        (KJS::arrayProtoFuncSome):
     105        (KJS::arrayProtoFuncIndexOf):
     106        (KJS::arrayProtoFuncLastIndexOf):
     107        (KJS::ArrayObjectImp::ArrayObjectImp):
     108        (KJS::ArrayObjectImp::construct):
     109        * kjs/bool_object.cpp:
     110        (KJS::BooleanPrototype::BooleanPrototype):
     111        (KJS::booleanProtoFuncToString):
     112        (KJS::BooleanObjectImp::BooleanObjectImp):
     113        (KJS::BooleanObjectImp::construct):
     114        * kjs/date_object.cpp:
     115        (KJS::formatLocaleDate):
     116        (KJS::DatePrototype::DatePrototype):
     117        (KJS::DateObjectImp::DateObjectImp):
     118        (KJS::DateObjectImp::construct):
     119        (KJS::DateObjectImp::callAsFunction):
     120        (KJS::DateObjectFuncImp::DateObjectFuncImp):
     121        (KJS::DateObjectFuncImp::callAsFunction):
     122        (KJS::dateProtoFuncToString):
     123        (KJS::dateProtoFuncToUTCString):
     124        (KJS::dateProtoFuncToDateString):
     125        (KJS::dateProtoFuncToTimeString):
     126        (KJS::dateProtoFuncToLocaleString):
     127        (KJS::dateProtoFuncToLocaleDateString):
     128        (KJS::dateProtoFuncToLocaleTimeString):
     129        (KJS::dateProtoFuncValueOf):
     130        (KJS::dateProtoFuncGetTime):
     131        (KJS::dateProtoFuncGetFullYear):
     132        (KJS::dateProtoFuncGetUTCFullYear):
     133        (KJS::dateProtoFuncToGMTString):
     134        (KJS::dateProtoFuncGetMonth):
     135        (KJS::dateProtoFuncGetUTCMonth):
     136        (KJS::dateProtoFuncGetDate):
     137        (KJS::dateProtoFuncGetUTCDate):
     138        (KJS::dateProtoFuncGetDay):
     139        (KJS::dateProtoFuncGetUTCDay):
     140        (KJS::dateProtoFuncGetHours):
     141        (KJS::dateProtoFuncGetUTCHours):
     142        (KJS::dateProtoFuncGetMinutes):
     143        (KJS::dateProtoFuncGetUTCMinutes):
     144        (KJS::dateProtoFuncGetSeconds):
     145        (KJS::dateProtoFuncGetUTCSeconds):
     146        (KJS::dateProtoFuncGetMilliSeconds):
     147        (KJS::dateProtoFuncGetUTCMilliseconds):
     148        (KJS::dateProtoFuncGetTimezoneOffset):
     149        (KJS::dateProtoFuncSetTime):
     150        (KJS::setNewValueFromTimeArgs):
     151        (KJS::setNewValueFromDateArgs):
     152        (KJS::dateProtoFuncSetYear):
     153        (KJS::dateProtoFuncGetYear):
     154        * kjs/error_object.cpp:
     155        (KJS::ErrorPrototype::ErrorPrototype):
     156        (KJS::errorProtoFuncToString):
     157        (KJS::ErrorObjectImp::ErrorObjectImp):
     158        (KJS::ErrorObjectImp::construct):
     159        (KJS::NativeErrorPrototype::NativeErrorPrototype):
     160        (KJS::NativeErrorImp::NativeErrorImp):
     161        (KJS::NativeErrorImp::construct):
     162        * kjs/function.cpp:
     163        (KJS::FunctionImp::lengthGetter):
     164        (KJS::FunctionImp::construct):
     165        (KJS::Arguments::Arguments):
     166        (KJS::ActivationImp::createArgumentsObject):
     167        (KJS::encode):
     168        (KJS::decode):
     169        (KJS::globalFuncParseInt):
     170        (KJS::globalFuncParseFloat):
     171        (KJS::globalFuncEscape):
     172        (KJS::globalFuncUnescape):
     173        (KJS::PrototypeFunction::PrototypeFunction):
     174        (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction):
     175        * kjs/function_object.cpp:
     176        (KJS::FunctionPrototype::FunctionPrototype):
     177        (KJS::functionProtoFuncToString):
     178        (KJS::FunctionObjectImp::FunctionObjectImp):
     179        (KJS::FunctionObjectImp::construct):
     180        * kjs/internal.cpp:
     181        (KJS::StringImp::toObject):
     182        * kjs/internal.h:
     183        (KJS::StringImp::StringImp):
     184        (KJS::NumberImp::operator new):
     185        * kjs/lookup.h:
     186        (KJS::staticFunctionGetter):
     187        (KJS::cacheGlobalObject):
     188        * kjs/math_object.cpp:
     189        (KJS::MathObjectImp::getValueProperty):
     190        (KJS::mathProtoFuncAbs):
     191        (KJS::mathProtoFuncACos):
     192        (KJS::mathProtoFuncASin):
     193        (KJS::mathProtoFuncATan):
     194        (KJS::mathProtoFuncATan2):
     195        (KJS::mathProtoFuncCeil):
     196        (KJS::mathProtoFuncCos):
     197        (KJS::mathProtoFuncExp):
     198        (KJS::mathProtoFuncFloor):
     199        (KJS::mathProtoFuncLog):
     200        (KJS::mathProtoFuncMax):
     201        (KJS::mathProtoFuncMin):
     202        (KJS::mathProtoFuncPow):
     203        (KJS::mathProtoFuncRandom):
     204        (KJS::mathProtoFuncRound):
     205        (KJS::mathProtoFuncSin):
     206        (KJS::mathProtoFuncSqrt):
     207        (KJS::mathProtoFuncTan):
     208        * kjs/nodes.cpp:
     209        (KJS::Node::handleException):
     210        (KJS::NumberNode::evaluate):
     211        (KJS::StringNode::evaluate):
     212        (KJS::ArrayNode::evaluate):
     213        (KJS::PostIncResolveNode::evaluate):
     214        (KJS::PostIncLocalVarNode::evaluate):
     215        (KJS::PostDecResolveNode::evaluate):
     216        (KJS::PostDecLocalVarNode::evaluate):
     217        (KJS::PostDecLocalVarNode::inlineEvaluateToNumber):
     218        (KJS::PostIncBracketNode::evaluate):
     219        (KJS::PostDecBracketNode::evaluate):
     220        (KJS::PostIncDotNode::evaluate):
     221        (KJS::PostDecDotNode::evaluate):
     222        (KJS::typeStringForValue):
     223        (KJS::LocalVarTypeOfNode::evaluate):
     224        (KJS::TypeOfResolveNode::evaluate):
     225        (KJS::TypeOfValueNode::evaluate):
     226        (KJS::PreIncLocalVarNode::evaluate):
     227        (KJS::PreIncResolveNode::evaluate):
     228        (KJS::PreDecLocalVarNode::evaluate):
     229        (KJS::PreDecResolveNode::evaluate):
     230        (KJS::PreIncConstNode::evaluate):
     231        (KJS::PreDecConstNode::evaluate):
     232        (KJS::PostIncConstNode::evaluate):
     233        (KJS::PostDecConstNode::evaluate):
     234        (KJS::PreIncBracketNode::evaluate):
     235        (KJS::PreDecBracketNode::evaluate):
     236        (KJS::PreIncDotNode::evaluate):
     237        (KJS::PreDecDotNode::evaluate):
     238        (KJS::NegateNode::evaluate):
     239        (KJS::BitwiseNotNode::evaluate):
     240        (KJS::MultNode::evaluate):
     241        (KJS::DivNode::evaluate):
     242        (KJS::ModNode::evaluate):
     243        (KJS::addSlowCase):
     244        (KJS::add):
     245        (KJS::AddNumbersNode::evaluate):
     246        (KJS::AddStringsNode::evaluate):
     247        (KJS::AddStringLeftNode::evaluate):
     248        (KJS::AddStringRightNode::evaluate):
     249        (KJS::SubNode::evaluate):
     250        (KJS::LeftShiftNode::evaluate):
     251        (KJS::RightShiftNode::evaluate):
     252        (KJS::UnsignedRightShiftNode::evaluate):
     253        (KJS::BitXOrNode::evaluate):
     254        (KJS::BitOrNode::evaluate):
     255        (KJS::valueForReadModifyAssignment):
     256        (KJS::ForInNode::execute):
     257        (KJS::TryNode::execute):
     258        (KJS::FuncDeclNode::makeFunction):
     259        (KJS::FuncExprNode::evaluate):
     260        * kjs/number_object.cpp:
     261        (KJS::NumberPrototype::NumberPrototype):
     262        (KJS::numberProtoFuncToString):
     263        (KJS::numberProtoFuncToLocaleString):
     264        (KJS::numberProtoFuncToFixed):
     265        (KJS::numberProtoFuncToExponential):
     266        (KJS::numberProtoFuncToPrecision):
     267        (KJS::NumberObjectImp::NumberObjectImp):
     268        (KJS::NumberObjectImp::getValueProperty):
     269        (KJS::NumberObjectImp::construct):
     270        (KJS::NumberObjectImp::callAsFunction):
     271        * kjs/object.cpp:
     272        (KJS::JSObject::defineGetter):
     273        (KJS::JSObject::defineSetter):
     274        (KJS::JSObject::putDirect):
     275        (KJS::Error::create):
     276        * kjs/object.h:
     277        * kjs/object_object.cpp:
     278        (KJS::ObjectPrototype::ObjectPrototype):
     279        (KJS::objectProtoFuncToLocaleString):
     280        (KJS::objectProtoFuncToString):
     281        (KJS::ObjectObjectImp::ObjectObjectImp):
     282        (KJS::ObjectObjectImp::construct):
     283        * kjs/regexp_object.cpp:
     284        (KJS::RegExpPrototype::RegExpPrototype):
     285        (KJS::regExpProtoFuncToString):
     286        (KJS::RegExpImp::getValueProperty):
     287        (KJS::RegExpObjectImp::RegExpObjectImp):
     288        (KJS::RegExpObjectImp::arrayOfMatches):
     289        (KJS::RegExpObjectImp::getBackref):
     290        (KJS::RegExpObjectImp::getLastParen):
     291        (KJS::RegExpObjectImp::getLeftContext):
     292        (KJS::RegExpObjectImp::getRightContext):
     293        (KJS::RegExpObjectImp::getValueProperty):
     294        (KJS::RegExpObjectImp::createRegExpImp):
     295        * kjs/regexp_object.h:
     296        * kjs/string_object.cpp:
     297        (KJS::StringInstance::StringInstance):
     298        (KJS::StringInstance::lengthGetter):
     299        (KJS::StringInstance::indexGetter):
     300        (KJS::stringInstanceNumericPropertyGetter):
     301        (KJS::StringPrototype::StringPrototype):
     302        (KJS::replace):
     303        (KJS::stringProtoFuncCharAt):
     304        (KJS::stringProtoFuncCharCodeAt):
     305        (KJS::stringProtoFuncConcat):
     306        (KJS::stringProtoFuncIndexOf):
     307        (KJS::stringProtoFuncLastIndexOf):
     308        (KJS::stringProtoFuncMatch):
     309        (KJS::stringProtoFuncSearch):
     310        (KJS::stringProtoFuncReplace):
     311        (KJS::stringProtoFuncSlice):
     312        (KJS::stringProtoFuncSplit):
     313        (KJS::stringProtoFuncSubstr):
     314        (KJS::stringProtoFuncSubstring):
     315        (KJS::stringProtoFuncToLowerCase):
     316        (KJS::stringProtoFuncToUpperCase):
     317        (KJS::stringProtoFuncToLocaleLowerCase):
     318        (KJS::stringProtoFuncToLocaleUpperCase):
     319        (KJS::stringProtoFuncLocaleCompare):
     320        (KJS::stringProtoFuncBig):
     321        (KJS::stringProtoFuncSmall):
     322        (KJS::stringProtoFuncBlink):
     323        (KJS::stringProtoFuncBold):
     324        (KJS::stringProtoFuncFixed):
     325        (KJS::stringProtoFuncItalics):
     326        (KJS::stringProtoFuncStrike):
     327        (KJS::stringProtoFuncSub):
     328        (KJS::stringProtoFuncSup):
     329        (KJS::stringProtoFuncFontcolor):
     330        (KJS::stringProtoFuncFontsize):
     331        (KJS::stringProtoFuncAnchor):
     332        (KJS::stringProtoFuncLink):
     333        (KJS::StringObjectImp::StringObjectImp):
     334        (KJS::StringObjectImp::construct):
     335        (KJS::StringObjectImp::callAsFunction):
     336        (KJS::StringObjectFuncImp::StringObjectFuncImp):
     337        (KJS::StringObjectFuncImp::callAsFunction):
     338        * kjs/string_object.h:
     339        (KJS::StringInstanceThatMasqueradesAsUndefined::StringInstanceThatMasqueradesAsUndefined):
     340        * kjs/testkjs.cpp:
     341        (GlobalObject::GlobalObject):
     342        (functionGC):
     343        (functionRun):
     344        (functionReadline):
     345        (kjsmain):
     346        * kjs/ustring.h:
     347        * kjs/value.cpp:
     348        (KJS::JSCell::operator new):
     349        (KJS::jsString):
     350        (KJS::jsOwnedString):
     351        (KJS::jsNumberCell):
     352        * kjs/value.h:
     353        (KJS::jsNaN):
     354        (KJS::jsNumber):
     355        (KJS::jsNumberFromAnd):
     356        (KJS::JSCell::marked):
     357        (KJS::JSCell::mark):
     358        (KJS::JSValue::toJSNumber):
     359        Removed collectOnMainThreadOnly, as this is the only way to collect now. Replaced calls to
     360        static Collector methods with calls to per-thread Heap ones.
     361
    13622008-05-02  Dan Bernstein  <[email protected]>
    2363
  • trunk/JavaScriptCore/JavaScriptCore.exp

    r32652 r32807  
     1__Z12jsRegExpFreeP8JSRegExp
     2__Z15jsRegExpCompilePKti24JSRegExpIgnoreCaseOption23JSRegExpMultilineOptionPjPPKc
     3__Z15jsRegExpExecutePK8JSRegExpPKtiiPii
     4__ZN3KJS10Identifier11addSlowCaseEPNS_7UString3RepE
     5__ZN3KJS10Identifier3addEPKc
     6__ZN3KJS10Identifier3addEPKti
     7__ZN3KJS10Identifier5equalEPKNS_7UString3RepEPKc
     8__ZN3KJS10throwErrorEPNS_9ExecStateENS_9ErrorTypeE
     9__ZN3KJS10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc
     10__ZN3KJS10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringE
     11__ZN3KJS11Interpreter11checkSyntaxEPNS_9ExecStateERKNS_7UStringEiPKti
     12__ZN3KJS11Interpreter21shouldPrintExceptionsEv
     13__ZN3KJS11Interpreter24setShouldPrintExceptionsEb
     14__ZN3KJS11Interpreter8evaluateEPNS_9ExecStateERKNS_7UStringEiPKtiPNS_7JSValueE
     15__ZN3KJS11Interpreter8evaluateEPNS_9ExecStateERKNS_7UStringEiS5_PNS_7JSValueE
     16__ZN3KJS11JSImmediate4typeEPKNS_7JSValueE
     17__ZN3KJS11JSImmediate8toObjectEPKNS_7JSValueEPNS_9ExecStateE
     18__ZN3KJS11JSImmediate8toStringEPKNS_7JSValueE
     19__ZN3KJS11ProgramNode6createEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS4_IPNS_12FuncDeclNodeELm16EEEbb
     20__ZN3KJS11PropertyMap11getLocationERKNS_10IdentifierE
     21__ZN3KJS11PropertyMap5clearEv
     22__ZN3KJS11PropertyMapD1Ev
     23__ZN3KJS12DateInstance4infoE
     24__ZN3KJS12jsNumberCellEPNS_9ExecStateEd
     25__ZN3KJS12PropertySlot15undefinedGetterEPNS_9ExecStateEPNS_8JSObjectERKNS_10IdentifierERKS0_
     26__ZN3KJS13ArrayInstance4infoE
     27__ZN3KJS13jsOwnedStringEPNS_9ExecStateERKNS_7UStringE
     28__ZN3KJS13StatementNode6setLocEii
     29__ZN3KJS14JSGlobalObject10globalExecEv
     30__ZN3KJS14JSGlobalObject16stopTimeoutCheckEv
     31__ZN3KJS14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueEj
     32__ZN3KJS14JSGlobalObject17startTimeoutCheckEv
     33__ZN3KJS14JSGlobalObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE
     34__ZN3KJS14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE
     35__ZN3KJS14JSGlobalObject4initEPNS_8JSObjectE
     36__ZN3KJS14JSGlobalObject4markEv
     37__ZN3KJS14JSGlobalObject5resetEPNS_7JSValueE
     38__ZN3KJS14JSGlobalObjectD2Ev
     39__ZN3KJS14JSGlobalObjectnwEm
     40__ZN3KJS14StringInstance14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
     41__ZN3KJS14StringInstance16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE
     42__ZN3KJS14StringInstance18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE
     43__ZN3KJS14StringInstance18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE
     44__ZN3KJS14StringInstance3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE
     45__ZN3KJS14StringInstance4infoE
     46__ZN3KJS14StringInstanceC2EPNS_9ExecStateEPNS_8JSObjectERKNS_7UStringE
     47__ZN3KJS15GlobalExecStateC1EPNS_14JSGlobalObjectEPNS_8JSObjectE
     48__ZN3KJS15GlobalExecStateD1Ev
     49__ZN3KJS15JSWrapperObject4markEv
     50__ZN3KJS16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
     51__ZN3KJS16JSVariableObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE
     52__ZN3KJS16ParserRefCounted3refEv
     53__ZN3KJS16ParserRefCounted5derefEv
     54__ZN3KJS17PropertyNameArray3addEPNS_7UString3RepE
     55__ZN3KJS17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFPNS_7JSValueES2_PNS_8JSObjectERKNS_4ListEE
     56__ZN3KJS17PrototypeFunctionC1EPNS_9ExecStateEPNS_17FunctionPrototypeEiRKNS_10IdentifierEPFPNS_7JSValueES2_PNS_8JSObjectERKNS_4ListEE
     57__ZN3KJS19initializeThreadingEv
     58__ZN3KJS19InternalFunctionImp4infoE
     59__ZN3KJS19InternalFunctionImpC2EPNS_17FunctionPrototypeERKNS_10IdentifierE
     60__ZN3KJS23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectERKNS_4ListE
     61__ZN3KJS4Heap10threadHeapEv
     62__ZN3KJS4Heap15recordExtraCostEm
     63__ZN3KJS4Heap17globalObjectCountEv
     64__ZN3KJS4Heap20protectedObjectCountEv
     65__ZN3KJS4Heap25protectedObjectTypeCountsEv
     66__ZN3KJS4Heap26protectedGlobalObjectCountEv
     67__ZN3KJS4Heap4heapEPKNS_7JSValueE
     68__ZN3KJS4Heap4sizeEv
     69__ZN3KJS4Heap7collectEv
     70__ZN3KJS4Heap7protectEPNS_7JSValueE
     71__ZN3KJS4Heap8allocateEm
     72__ZN3KJS4Heap9unprotectEPNS_7JSValueE
     73__ZN3KJS4List15expandAndAppendEPNS_7JSValueE
     74__ZN3KJS6JSCell9getObjectEv
     75__ZN3KJS6JSCellnwEmPNS_9ExecStateE
     76__ZN3KJS6JSLock12DropAllLocksC1Ev
     77__ZN3KJS6JSLock12DropAllLocksD1Ev
     78__ZN3KJS6JSLock4lockEv
     79__ZN3KJS6JSLock6unlockEv
     80__ZN3KJS6JSLock9lockCountEv
     81__ZN3KJS6Parser5parseEiPKtjPiS3_PNS_7UStringE
     82__ZN3KJS6parserEv
     83__ZN3KJS6strtodEPKcPPc
     84__ZN3KJS7CStringaSERKS0_
     85__ZN3KJS7CStringD1Ev
     86__ZN3KJS7UString3Rep11computeHashEPKti
     87__ZN3KJS7UString3Rep4nullE
     88__ZN3KJS7UString3Rep7destroyEv
     89__ZN3KJS7UString4fromEj
     90__ZN3KJS7UString6appendEPKc
     91__ZN3KJS7UString6appendERKS0_
     92__ZN3KJS7UStringaSEPKc
     93__ZN3KJS7UStringC1EPKc
     94__ZN3KJS7UStringC1EPKti
     95__ZN3KJS7UStringC1ERKS0_S2_
     96__ZN3KJS8Debugger12sourceUnusedEPNS_9ExecStateEi
     97__ZN3KJS8Debugger6attachEPNS_14JSGlobalObjectE
     98__ZN3KJS8Debugger6detachEPNS_14JSGlobalObjectE
     99__ZN3KJS8Debugger9exceptionEPNS_9ExecStateEiiPNS_7JSValueE
     100__ZN3KJS8DebuggerC2Ev
     101__ZN3KJS8DebuggerD2Ev
     102__ZN3KJS8JSObject11hasInstanceEPNS_9ExecStateEPNS_7JSValueE
     103__ZN3KJS8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_
     104__ZN3KJS8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_
     105__ZN3KJS8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE
     106__ZN3KJS8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE
     107__ZN3KJS8JSObject12removeDirectERKNS_10IdentifierE
     108__ZN3KJS8JSObject14callAsFunctionEPNS_9ExecStateEPS0_RKNS_4ListE
     109__ZN3KJS8JSObject14deletePropertyEPNS_9ExecStateEj
     110__ZN3KJS8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
     111__ZN3KJS8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE
     112__ZN3KJS8JSObject17putDirectFunctionEPNS_19InternalFunctionImpEi
     113__ZN3KJS8JSObject17putWithAttributesEPNS_9ExecStateEjPNS_7JSValueEj
     114__ZN3KJS8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueEj
     115__ZN3KJS8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE
     116__ZN3KJS8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRPNS_7JSValueE
     117__ZN3KJS8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPPNS_7JSValueE
     118__ZN3KJS8JSObject3putEPNS_9ExecStateEjPNS_7JSValueE
     119__ZN3KJS8JSObject3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE
     120__ZN3KJS8JSObject4callEPNS_9ExecStateEPS0_RKNS_4ListE
     121__ZN3KJS8JSObject4markEv
     122__ZN3KJS8JSObject9constructEPNS_9ExecStateERKNS_4ListE
     123__ZN3KJS8JSObject9constructEPNS_9ExecStateERKNS_4ListERKNS_10IdentifierERKNS_7UStringEi
     124__ZN3KJS8JSObject9putDirectERKNS_10IdentifierEPNS_7JSValueEi
     125__ZN3KJS8jsStringEPNS_9ExecStateEPKc
     126__ZN3KJS8jsStringEPNS_9ExecStateERKNS_7UStringE
     127__ZN3KJS8Profiler13stopProfilingEv
     128__ZN3KJS8Profiler14startProfilingEj
     129__ZN3KJS8Profiler8profilerEv
     130__ZN3KJSeqERKNS_7UStringEPKc
     131__ZN3WTF10fastCallocEmm
     132__ZN3WTF10fastMallocEm
     133__ZN3WTF11fastReallocEPvm
     134__ZN3WTF12createThreadEPFPvS0_ES0_
     135__ZN3WTF12detachThreadEj
     136__ZN3WTF12isMainThreadEv
     137__ZN3WTF13currentThreadEv
     138__ZN3WTF15ThreadCondition4waitERNS_5MutexE
     139__ZN3WTF15ThreadCondition6signalEv
     140__ZN3WTF15ThreadCondition9broadcastEv
     141__ZN3WTF15ThreadCondition9timedWaitERNS_5MutexEd
     142__ZN3WTF15ThreadConditionC1Ev
     143__ZN3WTF15ThreadConditionD1Ev
     144__ZN3WTF16callOnMainThreadEPFvPvES0_
     145__ZN3WTF16fastZeroedMallocEm
     146__ZN3WTF19initializeThreadingEv
     147__ZN3WTF23waitForThreadCompletionEjPPv
     148__ZN3WTF32atomicallyInitializedStaticMutexE
     149__ZN3WTF5Mutex4lockEv
     150__ZN3WTF5Mutex6unlockEv
     151__ZN3WTF5Mutex7tryLockEv
     152__ZN3WTF5MutexC1Ev
     153__ZN3WTF5MutexD1Ev
     154__ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b
     155__ZN3WTF8Collator18setOrderLowerFirstEb
     156__ZN3WTF8CollatorC1EPKc
     157__ZN3WTF8CollatorD1Ev
     158__ZN3WTF8fastFreeEPv
     159__ZNK3KJS11PropertyMap3getERKNS_10IdentifierE
     160__ZNK3KJS12DateInstance7getTimeERdRi
     161__ZNK3KJS13ArrayInstance7getItemEj
     162__ZNK3KJS14JSGlobalObject14isDynamicScopeEv
     163__ZNK3KJS14JSGlobalObject14toGlobalObjectEPNS_9ExecStateE
     164__ZNK3KJS16JSVariableObject16isVariableObjectEv
     165__ZNK3KJS16JSVariableObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj
     166__ZNK3KJS19InternalFunctionImp14implementsCallEv
     167__ZNK3KJS19InternalFunctionImp21implementsHasInstanceEv
     168__ZNK3KJS4List8getSliceEiRS0_
     169__ZNK3KJS4Node8toStringEv
     170__ZNK3KJS6JSCell17getTruncatedInt32ERi
     171__ZNK3KJS6JSCell18getTruncatedUInt32ERj
     172__ZNK3KJS6JSCell9getNumberERd
     173__ZNK3KJS6JSCell9getNumberEv
     174__ZNK3KJS6JSCell9getStringERNS_7UStringE
     175__ZNK3KJS6JSCell9getStringEv
     176__ZNK3KJS6JSCell9getUInt32ERj
     177__ZNK3KJS7JSValue15toInt32SlowCaseEPNS_9ExecStateERb
     178__ZNK3KJS7JSValue16toUInt32SlowCaseEPNS_9ExecStateERb
     179__ZNK3KJS7JSValue7toFloatEPNS_9ExecStateE
     180__ZNK3KJS7JSValue9toIntegerEPNS_9ExecStateE
     181__ZNK3KJS7UString10UTF8StringEb
     182__ZNK3KJS7UString14toStrictUInt32EPb
     183__ZNK3KJS7UString5asciiEv
     184__ZNK3KJS7UString6is8BitEv
     185__ZNK3KJS7UString8toUInt32EPb
     186__ZNK3KJS7UString8toUInt32EPbb
     187__ZNK3KJS8JSObject11hasPropertyEPNS_9ExecStateEj
     188__ZNK3KJS8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE
     189__ZNK3KJS8JSObject12defaultValueEPNS_9ExecStateENS_6JSTypeE
     190__ZNK3KJS8JSObject12toThisObjectEPNS_9ExecStateE
     191__ZNK3KJS8JSObject14implementsCallEv
     192__ZNK3KJS8JSObject14toGlobalObjectEPNS_9ExecStateE
     193__ZNK3KJS8JSObject19implementsConstructEv
     194__ZNK3KJS8JSObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj
     195__ZNK3KJS8JSObject21implementsHasInstanceEv
     196__ZNK3KJS8JSObject3getEPNS_9ExecStateEj
     197__ZNK3KJS8JSObject3getEPNS_9ExecStateERKNS_10IdentifierE
     198__ZNK3KJS8JSObject4typeEv
     199__ZNK3KJS8JSObject8toNumberEPNS_9ExecStateE
     200__ZNK3KJS8JSObject8toObjectEPNS_9ExecStateE
     201__ZNK3KJS8JSObject8toStringEPNS_9ExecStateE
     202__ZNK3KJS8JSObject9classInfoEv
     203__ZNK3KJS8JSObject9classNameEv
     204__ZNK3KJS8JSObject9toBooleanEPNS_9ExecStateE
     205__ZNK3KJS8Profiler20printDataSampleStyleEv
     206__ZNK3KJS8Profiler23printDataInspectorStyleEv
     207__ZNK3KJS9ExecState19lexicalGlobalObjectEv
     208__ZNK3KJS9HashTable11createTableEv
     209__ZNK3WTF8Collator7collateEPKtmS2_m
     210__ZTVN3KJS14JSGlobalObjectE
     211__ZTVN3KJS14StringInstanceE
     212__ZTVN3KJS15JSWrapperObjectE
     213__ZTVN3KJS16JSVariableObjectE
     214__ZTVN3KJS19InternalFunctionImpE
     215__ZTVN3KJS8JSObjectE
    1216_JSCheckScriptSyntax
    2217_JSClassCreate
     
    4219_JSClassRetain
    5220_JSContextGetGlobalObject
     221_jscore_collector_introspection
     222_jscore_fastmalloc_introspection
    6223_JSEvaluateScript
    7224_JSGarbageCollect
     
    67284_JSValueToStringCopy
    68285_JSValueUnprotect
     286_kJSClassDefinitionEmpty
    69287_WTFLog
    70288_WTFLogVerbose
     
    74292_WTFReportError
    75293_WTFReportFatalError
    76 __Z12jsRegExpFreeP8JSRegExp
    77 __Z15jsRegExpCompilePKti24JSRegExpIgnoreCaseOption23JSRegExpMultilineOptionPjPPKc
    78 __Z15jsRegExpExecutePK8JSRegExpPKtiiPii
    79 __ZN3KJS10Identifier11addSlowCaseEPNS_7UString3RepE
    80 __ZN3KJS10Identifier3addEPKc
    81 __ZN3KJS10Identifier3addEPKti
    82 __ZN3KJS10Identifier5equalEPKNS_7UString3RepEPKc
    83 __ZN3KJS10throwErrorEPNS_9ExecStateENS_9ErrorTypeE
    84 __ZN3KJS10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc
    85 __ZN3KJS10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringE
    86 __ZN3KJS11Interpreter11checkSyntaxEPNS_9ExecStateERKNS_7UStringEiPKti
    87 __ZN3KJS11Interpreter21shouldPrintExceptionsEv
    88 __ZN3KJS11Interpreter24setShouldPrintExceptionsEb
    89 __ZN3KJS11Interpreter8evaluateEPNS_9ExecStateERKNS_7UStringEiPKtiPNS_7JSValueE
    90 __ZN3KJS11Interpreter8evaluateEPNS_9ExecStateERKNS_7UStringEiS5_PNS_7JSValueE
    91 __ZN3KJS11JSImmediate4typeEPKNS_7JSValueE
    92 __ZN3KJS11JSImmediate8toObjectEPKNS_7JSValueEPNS_9ExecStateE
    93 __ZN3KJS11JSImmediate8toStringEPKNS_7JSValueE
    94 __ZN3KJS11ProgramNode6createEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS4_IPNS_12FuncDeclNodeELm16EEEbb
    95 __ZN3KJS11PropertyMap11getLocationERKNS_10IdentifierE
    96 __ZN3KJS11PropertyMap5clearEv
    97 __ZN3KJS11PropertyMapD1Ev
    98 __ZN3KJS12DateInstance4infoE
    99 __ZN3KJS12PropertySlot15undefinedGetterEPNS_9ExecStateEPNS_8JSObjectERKNS_10IdentifierERKS0_
    100 __ZN3KJS12jsNumberCellEd
    101 __ZN3KJS13ArrayInstance4infoE
    102 __ZN3KJS13StatementNode6setLocEii
    103 __ZN3KJS13jsOwnedStringERKNS_7UStringE
    104 __ZN3KJS14JSGlobalObject10globalExecEv
    105 __ZN3KJS14JSGlobalObject16stopTimeoutCheckEv
    106 __ZN3KJS14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueEj
    107 __ZN3KJS14JSGlobalObject17startTimeoutCheckEv
    108 __ZN3KJS14JSGlobalObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE
    109 __ZN3KJS14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE
    110 __ZN3KJS14JSGlobalObject4initEPNS_8JSObjectE
    111 __ZN3KJS14JSGlobalObject4markEv
    112 __ZN3KJS14JSGlobalObject5resetEPNS_7JSValueE
    113 __ZN3KJS14JSGlobalObjectD2Ev
    114 __ZN3KJS14StringInstance14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
    115 __ZN3KJS14StringInstance16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE
    116 __ZN3KJS14StringInstance18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE
    117 __ZN3KJS14StringInstance18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE
    118 __ZN3KJS14StringInstance3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE
    119 __ZN3KJS14StringInstance4infoE
    120 __ZN3KJS14StringInstanceC1EPNS_8JSObjectERKNS_7UStringE
    121 __ZN3KJS14StringInstanceC2EPNS_8JSObjectERKNS_7UStringE
    122 __ZN3KJS15GlobalExecStateC1EPNS_14JSGlobalObjectEPNS_8JSObjectE
    123 __ZN3KJS15GlobalExecStateD1Ev
    124 __ZN3KJS15JSWrapperObject4markEv
    125 __ZN3KJS16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
    126 __ZN3KJS16JSVariableObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE
    127 __ZN3KJS16ParserRefCounted3refEv
    128 __ZN3KJS16ParserRefCounted5derefEv
    129 __ZN3KJS17PropertyNameArray3addEPNS_7UString3RepE
    130 __ZN3KJS17PrototypeFunctionC1EPNS_9ExecStateEPNS_17FunctionPrototypeEiRKNS_10IdentifierEPFPNS_7JSValueES2_PNS_8JSObjectERKNS_4ListEE
    131 __ZN3KJS17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFPNS_7JSValueES2_PNS_8JSObjectERKNS_4ListEE
    132 __ZN3KJS19InternalFunctionImp4infoE
    133 __ZN3KJS19InternalFunctionImpC2EPNS_17FunctionPrototypeERKNS_10IdentifierE
    134 __ZN3KJS19initializeThreadingEv
    135 __ZN3KJS23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectERKNS_4ListE
    136 __ZN3KJS4List15expandAndAppendEPNS_7JSValueE
    137 __ZN3KJS4List7markSetEv
    138 __ZN3KJS6JSCell9getObjectEv
    139 __ZN3KJS6JSCellnwEm
    140 __ZN3KJS6JSLock12DropAllLocksC1Ev
    141 __ZN3KJS6JSLock12DropAllLocksD1Ev
    142 __ZN3KJS6JSLock14registerThreadEv
    143 __ZN3KJS6JSLock4lockEv
    144 __ZN3KJS6JSLock6unlockEv
    145 __ZN3KJS6JSLock9lockCountEv
    146 __ZN3KJS6Parser5parseEiPKtjPiS3_PNS_7UStringE
    147 __ZN3KJS6parserEv
    148 __ZN3KJS6strtodEPKcPPc
    149 __ZN3KJS7CStringD1Ev
    150 __ZN3KJS7CStringaSERKS0_
    151 __ZN3KJS7UString3Rep11computeHashEPKti
    152 __ZN3KJS7UString3Rep4nullE
    153 __ZN3KJS7UString3Rep7destroyEv
    154 __ZN3KJS7UString4fromEj
    155 __ZN3KJS7UString6appendEPKc
    156 __ZN3KJS7UString6appendERKS0_
    157 __ZN3KJS7UStringC1EPKc
    158 __ZN3KJS7UStringC1EPKti
    159 __ZN3KJS7UStringC1ERKS0_S2_
    160 __ZN3KJS7UStringaSEPKc
    161 __ZN3KJS8Debugger12sourceUnusedEPNS_9ExecStateEi
    162 __ZN3KJS8Debugger6attachEPNS_14JSGlobalObjectE
    163 __ZN3KJS8Debugger6detachEPNS_14JSGlobalObjectE
    164 __ZN3KJS8Debugger9exceptionEPNS_9ExecStateEiiPNS_7JSValueE
    165 __ZN3KJS8DebuggerC2Ev
    166 __ZN3KJS8DebuggerD2Ev
    167 __ZN3KJS8JSObject11hasInstanceEPNS_9ExecStateEPNS_7JSValueE
    168 __ZN3KJS8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_
    169 __ZN3KJS8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_
    170 __ZN3KJS8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE
    171 __ZN3KJS8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE
    172 __ZN3KJS8JSObject12removeDirectERKNS_10IdentifierE
    173 __ZN3KJS8JSObject14callAsFunctionEPNS_9ExecStateEPS0_RKNS_4ListE
    174 __ZN3KJS8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
    175 __ZN3KJS8JSObject14deletePropertyEPNS_9ExecStateEj
    176 __ZN3KJS8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE
    177 __ZN3KJS8JSObject17putDirectFunctionEPNS_19InternalFunctionImpEi
    178 __ZN3KJS8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueEj
    179 __ZN3KJS8JSObject17putWithAttributesEPNS_9ExecStateEjPNS_7JSValueEj
    180 __ZN3KJS8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE
    181 __ZN3KJS8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRPNS_7JSValueE
    182 __ZN3KJS8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPPNS_7JSValueE
    183 __ZN3KJS8JSObject3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE
    184 __ZN3KJS8JSObject3putEPNS_9ExecStateEjPNS_7JSValueE
    185 __ZN3KJS8JSObject4callEPNS_9ExecStateEPS0_RKNS_4ListE
    186 __ZN3KJS8JSObject4markEv
    187 __ZN3KJS8JSObject9constructEPNS_9ExecStateERKNS_4ListE
    188 __ZN3KJS8JSObject9constructEPNS_9ExecStateERKNS_4ListERKNS_10IdentifierERKNS_7UStringEi
    189 __ZN3KJS8JSObject9putDirectERKNS_10IdentifierEPNS_7JSValueEi
    190 __ZN3KJS8JSObject9putDirectERKNS_10IdentifierEii
    191 __ZN3KJS8Profiler13stopProfilingEv
    192 __ZN3KJS8Profiler14startProfilingEj
    193 __ZN3KJS8Profiler8profilerEv
    194 __ZN3KJS8jsStringEPKc
    195 __ZN3KJS8jsStringERKNS_7UStringE
    196 __ZN3KJS9Collector15recordExtraCostEm
    197 __ZN3KJS9Collector17globalObjectCountEv
    198 __ZN3KJS9Collector20protectedObjectCountEv
    199 __ZN3KJS9Collector23collectOnMainThreadOnlyEPNS_7JSValueE
    200 __ZN3KJS9Collector25protectedObjectTypeCountsEv
    201 __ZN3KJS9Collector26protectedGlobalObjectCountEv
    202 __ZN3KJS9Collector4sizeEv
    203 __ZN3KJS9Collector7collectEv
    204 __ZN3KJS9Collector7protectEPNS_7JSValueE
    205 __ZN3KJS9Collector9unprotectEPNS_7JSValueE
    206 __ZN3KJSeqERKNS_7UStringEPKc
    207 __ZN3WTF10fastCallocEmm
    208 __ZN3WTF10fastMallocEm
    209 __ZN3WTF11fastReallocEPvm
    210 __ZN3WTF12createThreadEPFPvS0_ES0_
    211 __ZN3WTF12detachThreadEj
    212 __ZN3WTF12isMainThreadEv
    213 __ZN3WTF13currentThreadEv
    214 __ZN3WTF15ThreadCondition4waitERNS_5MutexE
    215 __ZN3WTF15ThreadCondition6signalEv
    216 __ZN3WTF15ThreadCondition9broadcastEv
    217 __ZN3WTF15ThreadCondition9timedWaitERNS_5MutexEd
    218 __ZN3WTF15ThreadConditionC1Ev
    219 __ZN3WTF15ThreadConditionD1Ev
    220 __ZN3WTF16callOnMainThreadEPFvPvES0_
    221 __ZN3WTF16fastZeroedMallocEm
    222 __ZN3WTF19initializeThreadingEv
    223 __ZN3WTF23waitForThreadCompletionEjPPv
    224 __ZN3WTF32atomicallyInitializedStaticMutexE
    225 __ZN3WTF5Mutex4lockEv
    226 __ZN3WTF5Mutex6unlockEv
    227 __ZN3WTF5Mutex7tryLockEv
    228 __ZN3WTF5MutexC1Ev
    229 __ZN3WTF5MutexD1Ev
    230 __ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b
    231 __ZN3WTF8Collator18setOrderLowerFirstEb
    232 __ZN3WTF8CollatorC1EPKc
    233 __ZN3WTF8CollatorD1Ev
    234 __ZN3WTF8fastFreeEPv
    235 __ZNK3KJS11PropertyMap3getERKNS_10IdentifierE
    236 __ZNK3KJS12DateInstance7getTimeERdRi
    237 __ZNK3KJS13ArrayInstance7getItemEj
    238 __ZNK3KJS14JSGlobalObject14isDynamicScopeEv
    239 __ZNK3KJS14JSGlobalObject14toGlobalObjectEPNS_9ExecStateE
    240 __ZNK3KJS16JSVariableObject16isVariableObjectEv
    241 __ZNK3KJS16JSVariableObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj
    242 __ZNK3KJS19InternalFunctionImp14implementsCallEv
    243 __ZNK3KJS19InternalFunctionImp21implementsHasInstanceEv
    244 __ZNK3KJS4List8getSliceEiRS0_
    245 __ZNK3KJS4Node8toStringEv
    246 __ZNK3KJS6JSCell17getTruncatedInt32ERi
    247 __ZNK3KJS6JSCell18getTruncatedUInt32ERj
    248 __ZNK3KJS6JSCell9getNumberERd
    249 __ZNK3KJS6JSCell9getNumberEv
    250 __ZNK3KJS6JSCell9getStringERNS_7UStringE
    251 __ZNK3KJS6JSCell9getStringEv
    252 __ZNK3KJS6JSCell9getUInt32ERj
    253 __ZNK3KJS7JSValue15toInt32SlowCaseEPNS_9ExecStateERb
    254 __ZNK3KJS7JSValue16toUInt32SlowCaseEPNS_9ExecStateERb
    255 __ZNK3KJS7JSValue7toFloatEPNS_9ExecStateE
    256 __ZNK3KJS7JSValue9toIntegerEPNS_9ExecStateE
    257 __ZNK3KJS7UString10UTF8StringEb
    258 __ZNK3KJS7UString14toStrictUInt32EPb
    259 __ZNK3KJS7UString5asciiEv
    260 __ZNK3KJS7UString6is8BitEv
    261 __ZNK3KJS7UString8toUInt32EPb
    262 __ZNK3KJS7UString8toUInt32EPbb
    263 __ZNK3KJS8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE
    264 __ZNK3KJS8JSObject11hasPropertyEPNS_9ExecStateEj
    265 __ZNK3KJS8JSObject12defaultValueEPNS_9ExecStateENS_6JSTypeE
    266 __ZNK3KJS8JSObject12toThisObjectEPNS_9ExecStateE
    267 __ZNK3KJS8JSObject14implementsCallEv
    268 __ZNK3KJS8JSObject14toGlobalObjectEPNS_9ExecStateE
    269 __ZNK3KJS8JSObject19implementsConstructEv
    270 __ZNK3KJS8JSObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj
    271 __ZNK3KJS8JSObject21implementsHasInstanceEv
    272 __ZNK3KJS8JSObject3getEPNS_9ExecStateERKNS_10IdentifierE
    273 __ZNK3KJS8JSObject3getEPNS_9ExecStateEj
    274 __ZNK3KJS8JSObject4typeEv
    275 __ZNK3KJS8JSObject8toNumberEPNS_9ExecStateE
    276 __ZNK3KJS8JSObject8toObjectEPNS_9ExecStateE
    277 __ZNK3KJS8JSObject8toStringEPNS_9ExecStateE
    278 __ZNK3KJS8JSObject9classInfoEv
    279 __ZNK3KJS8JSObject9classNameEv
    280 __ZNK3KJS8JSObject9toBooleanEPNS_9ExecStateE
    281 __ZNK3KJS8Profiler20printDataSampleStyleEv
    282 __ZNK3KJS8Profiler23printDataInspectorStyleEv
    283 __ZNK3KJS9ExecState19lexicalGlobalObjectEv
    284 __ZNK3KJS9HashTable11createTableEv
    285 __ZNK3WTF8Collator7collateEPKtmS2_m
    286 __ZTVN3KJS14JSGlobalObjectE
    287 __ZTVN3KJS14StringInstanceE
    288 __ZTVN3KJS15JSWrapperObjectE
    289 __ZTVN3KJS16JSVariableObjectE
    290 __ZTVN3KJS19InternalFunctionImpE
    291 __ZTVN3KJS8JSObjectE
    292 _jscore_collector_introspection
    293 _jscore_fastmalloc_introspection
    294 _kJSClassDefinitionEmpty
  • trunk/JavaScriptCore/kjs/ExecState.h

    r32654 r32807  
    5959        CommonIdentifiers* propertyNames;
    6060        List emptyList;
     61       
     62        Heap* heap;
    6163    };
    6264
     
    121123        static const HashTable* stringTable(ExecState* exec) { return exec->m_perThreadData->stringTable; }
    122124
     125        Heap* heap() const { return m_perThreadData->heap; }
     126
    123127        LocalStorage& localStorage() { return *m_localStorage; }
    124128        void setLocalStorage(LocalStorage* s) { m_localStorage = s; }
  • trunk/JavaScriptCore/kjs/InitializeThreading.cpp

    r32652 r32807  
    4848    if (!s_dtoaP5Mutex) {
    4949        s_dtoaP5Mutex = new Mutex;
    50 #if !PLATFORM(DARWIN) // Darwin has pthread_main_np(), and doesn't need registerAsMainThread() called.
    51         Collector::registerAsMainThread();
    52 #endif
     50        Heap::threadHeap();
    5351        UString::null();
    5452        Identifier::initializeIdentifierThreading();
     
    5755        initDateMath();
    5856        JSGlobalObject::threadClassInfoHashTables();
     57        JSGlobalObject::head();
    5958    }
    6059#endif
  • trunk/JavaScriptCore/kjs/JSGlobalObject.cpp

    r32687 r32807  
    103103}
    104104
    105 JSGlobalObject* JSGlobalObject::s_head = 0;
    106 
    107105void JSGlobalObject::deleteActivationStack()
    108106{
     
    123121    d()->next->d()->prev = d()->prev;
    124122    d()->prev->d()->next = d()->next;
    125     s_head = d()->next;
    126     if (s_head == this)
    127         s_head = 0;
     123    JSGlobalObject*& headObject = head();
     124    if (headObject == this)
     125        headObject = d()->next;
     126    if (headObject == this)
     127        headObject = 0;
    128128   
    129129    deleteActivationStack();
     
    187187}
    188188
     189JSGlobalObject*& JSGlobalObject::head()
     190{
     191#if USE(MULTIPLE_THREADS)
     192    static ThreadSpecific<JSGlobalObject*> sharedInstance;
     193    return *sharedInstance;
     194#else
     195    static JSGlobalObject* sharedInstance;
     196    return sharedInstance;
     197#endif
     198}
     199
    189200void JSGlobalObject::init(JSObject* thisValue)
    190201{
    191202    ASSERT(JSLock::currentThreadIsHoldingLock());
    192203
    193     if (s_head) {
    194         d()->prev = s_head;
    195         d()->next = s_head->d()->next;
    196         s_head->d()->next->d()->prev = this;
    197         s_head->d()->next = this;
     204    if (JSGlobalObject*& headObject = head()) {
     205        d()->prev = headObject;
     206        d()->next = headObject->d()->next;
     207        headObject->d()->next->d()->prev = this;
     208        headObject->d()->next = this;
    198209    } else
    199         s_head = d()->next = d()->prev = this;
     210        headObject = d()->next = d()->prev = this;
    200211
    201212    resetTimeoutCheck();
     
    219230    d()->perThreadData.stringTable = &threadClassInfoHashTables()->stringTable;
    220231    d()->perThreadData.propertyNames = CommonIdentifiers::shared();
     232    d()->perThreadData.heap = Heap::threadHeap();
    221233
    222234    d()->globalExec.set(new GlobalExecState(this, thisValue));
     
    236248void JSGlobalObject::put(ExecState* exec, const Identifier& propertyName, JSValue* value)
    237249{
     250    ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this));
     251
    238252    if (symbolTablePut(propertyName, value))
    239253        return;
     
    314328
    315329    // Prototypes
    316     d()->functionPrototype = new FunctionPrototype(exec);
    317     d()->objectPrototype = new ObjectPrototype(exec, d()->functionPrototype);
     330    d()->functionPrototype = new (exec) FunctionPrototype(exec);
     331    d()->objectPrototype = new (exec) ObjectPrototype(exec, d()->functionPrototype);
    318332    d()->functionPrototype->setPrototype(d()->objectPrototype);
    319333
    320     d()->arrayPrototype = new ArrayPrototype(exec, d()->objectPrototype);
    321     d()->stringPrototype = new StringPrototype(exec, d()->objectPrototype);
    322     d()->booleanPrototype = new BooleanPrototype(exec, d()->objectPrototype, d()->functionPrototype);
    323     d()->numberPrototype = new NumberPrototype(exec, d()->objectPrototype, d()->functionPrototype);
    324     d()->datePrototype = new DatePrototype(exec, d()->objectPrototype);
    325     d()->regExpPrototype = new RegExpPrototype(exec, d()->objectPrototype, d()->functionPrototype);
    326     d()->errorPrototype = new ErrorPrototype(exec, d()->objectPrototype, d()->functionPrototype);
    327    
    328     d()->evalErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "EvalError", "EvalError");
    329     d()->rangeErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "RangeError", "RangeError");
    330     d()->referenceErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "ReferenceError", "ReferenceError");
    331     d()->syntaxErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "SyntaxError", "SyntaxError");
    332     d()->typeErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "TypeError", "TypeError");
    333     d()->URIErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "URIError", "URIError");
     334    d()->arrayPrototype = new (exec) ArrayPrototype(exec, d()->objectPrototype);
     335    d()->stringPrototype = new (exec) StringPrototype(exec, d()->objectPrototype);
     336    d()->booleanPrototype = new (exec) BooleanPrototype(exec, d()->objectPrototype, d()->functionPrototype);
     337    d()->numberPrototype = new (exec) NumberPrototype(exec, d()->objectPrototype, d()->functionPrototype);
     338    d()->datePrototype = new (exec) DatePrototype(exec, d()->objectPrototype);
     339    d()->regExpPrototype = new (exec) RegExpPrototype(exec, d()->objectPrototype, d()->functionPrototype);
     340    d()->errorPrototype = new (exec) ErrorPrototype(exec, d()->objectPrototype, d()->functionPrototype);
     341   
     342    d()->evalErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "EvalError", "EvalError");
     343    d()->rangeErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "RangeError", "RangeError");
     344    d()->referenceErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "ReferenceError", "ReferenceError");
     345    d()->syntaxErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "SyntaxError", "SyntaxError");
     346    d()->typeErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "TypeError", "TypeError");
     347    d()->URIErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "URIError", "URIError");
    334348
    335349    // Constructors
    336     d()->objectConstructor = new ObjectObjectImp(exec, d()->objectPrototype, d()->functionPrototype);
    337     d()->functionConstructor = new FunctionObjectImp(exec, d()->functionPrototype);
    338     d()->arrayConstructor = new ArrayObjectImp(exec, d()->functionPrototype, d()->arrayPrototype);
    339     d()->stringConstructor = new StringObjectImp(exec, d()->functionPrototype, d()->stringPrototype);
    340     d()->booleanConstructor = new BooleanObjectImp(exec, d()->functionPrototype, d()->booleanPrototype);
    341     d()->numberConstructor = new NumberObjectImp(exec, d()->functionPrototype, d()->numberPrototype);
    342     d()->dateConstructor = new DateObjectImp(exec, d()->functionPrototype, d()->datePrototype);
    343     d()->regExpConstructor = new RegExpObjectImp(exec, d()->functionPrototype, d()->regExpPrototype);
    344     d()->errorConstructor = new ErrorObjectImp(exec, d()->functionPrototype, d()->errorPrototype);
    345    
    346     d()->evalErrorConstructor = new NativeErrorImp(exec, d()->functionPrototype, d()->evalErrorPrototype);
    347     d()->rangeErrorConstructor = new NativeErrorImp(exec, d()->functionPrototype, d()->rangeErrorPrototype);
    348     d()->referenceErrorConstructor = new NativeErrorImp(exec, d()->functionPrototype, d()->referenceErrorPrototype);
    349     d()->syntaxErrorConstructor = new NativeErrorImp(exec, d()->functionPrototype, d()->syntaxErrorPrototype);
    350     d()->typeErrorConstructor = new NativeErrorImp(exec, d()->functionPrototype, d()->typeErrorPrototype);
    351     d()->URIErrorConstructor = new NativeErrorImp(exec, d()->functionPrototype, d()->URIErrorPrototype);
     350    d()->objectConstructor = new (exec) ObjectObjectImp(exec, d()->objectPrototype, d()->functionPrototype);
     351    d()->functionConstructor = new (exec) FunctionObjectImp(exec, d()->functionPrototype);
     352    d()->arrayConstructor = new (exec) ArrayObjectImp(exec, d()->functionPrototype, d()->arrayPrototype);
     353    d()->stringConstructor = new (exec) StringObjectImp(exec, d()->functionPrototype, d()->stringPrototype);
     354    d()->booleanConstructor = new (exec) BooleanObjectImp(exec, d()->functionPrototype, d()->booleanPrototype);
     355    d()->numberConstructor = new (exec) NumberObjectImp(exec, d()->functionPrototype, d()->numberPrototype);
     356    d()->dateConstructor = new (exec) DateObjectImp(exec, d()->functionPrototype, d()->datePrototype);
     357    d()->regExpConstructor = new (exec) RegExpObjectImp(exec, d()->functionPrototype, d()->regExpPrototype);
     358    d()->errorConstructor = new (exec) ErrorObjectImp(exec, d()->functionPrototype, d()->errorPrototype);
     359   
     360    d()->evalErrorConstructor = new (exec) NativeErrorImp(exec, d()->functionPrototype, d()->evalErrorPrototype);
     361    d()->rangeErrorConstructor = new (exec) NativeErrorImp(exec, d()->functionPrototype, d()->rangeErrorPrototype);
     362    d()->referenceErrorConstructor = new (exec) NativeErrorImp(exec, d()->functionPrototype, d()->referenceErrorPrototype);
     363    d()->syntaxErrorConstructor = new (exec) NativeErrorImp(exec, d()->functionPrototype, d()->syntaxErrorPrototype);
     364    d()->typeErrorConstructor = new (exec) NativeErrorImp(exec, d()->functionPrototype, d()->typeErrorPrototype);
     365    d()->URIErrorConstructor = new (exec) NativeErrorImp(exec, d()->functionPrototype, d()->URIErrorPrototype);
    352366   
    353367    d()->functionPrototype->putDirect(exec->propertyNames().constructor, d()->functionConstructor, DontEnum);
     
    391405    // Set global values.
    392406    Identifier mathIdent = "Math";
    393     JSValue* mathObject = new MathObjectImp(exec, d()->objectPrototype);
     407    JSValue* mathObject = new (exec) MathObjectImp(exec, d()->objectPrototype);
    394408    symbolTableInsert(mathIdent, mathObject, DontEnum | DontDelete);
    395409   
    396410    Identifier nanIdent = "NaN";
    397     JSValue* nanValue = jsNaN();
     411    JSValue* nanValue = jsNaN(exec);
    398412    symbolTableInsert(nanIdent, nanValue, DontEnum | DontDelete);
    399413   
    400414    Identifier infinityIdent = "Infinity";
    401     JSValue* infinityValue = jsNumber(Inf);
     415    JSValue* infinityValue = jsNumber(exec, Inf);
    402416    symbolTableInsert(infinityIdent, infinityValue, DontEnum | DontDelete);
    403417   
     
    408422    // Set global functions.
    409423
    410     d()->evalFunction = new PrototypeReflexiveFunction(exec, d()->functionPrototype, 1, exec->propertyNames().eval, globalFuncEval, this);
     424    d()->evalFunction = new (exec) PrototypeReflexiveFunction(exec, d()->functionPrototype, 1, exec->propertyNames().eval, globalFuncEval, this);
    411425    putDirectFunction(d()->evalFunction, DontEnum);
    412     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 2, "parseInt", globalFuncParseInt), DontEnum);
    413     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "parseFloat", globalFuncParseFloat), DontEnum);
    414     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "isNaN", globalFuncIsNaN), DontEnum);
    415     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "isFinite", globalFuncIsFinite), DontEnum);
    416     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "escape", globalFuncEscape), DontEnum);
    417     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "unescape", globalFuncUnescape), DontEnum);
    418     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "decodeURI", globalFuncDecodeURI), DontEnum);
    419     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "decodeURIComponent", globalFuncDecodeURIComponent), DontEnum);
    420     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "encodeURI", globalFuncEncodeURI), DontEnum);
    421     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "encodeURIComponent", globalFuncEncodeURIComponent), DontEnum);
     426    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 2, "parseInt", globalFuncParseInt), DontEnum);
     427    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "parseFloat", globalFuncParseFloat), DontEnum);
     428    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "isNaN", globalFuncIsNaN), DontEnum);
     429    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "isFinite", globalFuncIsFinite), DontEnum);
     430    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "escape", globalFuncEscape), DontEnum);
     431    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "unescape", globalFuncUnescape), DontEnum);
     432    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "decodeURI", globalFuncDecodeURI), DontEnum);
     433    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "decodeURIComponent", globalFuncDecodeURIComponent), DontEnum);
     434    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "encodeURI", globalFuncEncodeURI), DontEnum);
     435    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "encodeURIComponent", globalFuncEncodeURIComponent), DontEnum);
    422436#ifndef NDEBUG
    423     putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, "kjsprint", globalFuncKJSPrint), DontEnum);
     437    putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, "kjsprint", globalFuncKJSPrint), DontEnum);
    424438#endif
    425439
     
    552566
    553567    ASSERT(exec->codeType() == FunctionCode);
    554     ActivationImp* newActivation = new ActivationImp(*oldActivation->d(), leaveRelic);
     568    ActivationImp* newActivation = new (exec) ActivationImp(*oldActivation->d(), leaveRelic);
    555569   
    556570    if (!leaveRelic) {
     
    572586}
    573587
     588void* JSGlobalObject::operator new(size_t size)
     589{
     590    return Heap::threadHeap()->allocate(size);
     591}
    574592
    575593} // namespace KJS
  • trunk/JavaScriptCore/kjs/JSGlobalObject.h

    r32652 r32807  
    167167        virtual void putWithAttributes(ExecState*, const Identifier& propertyName, JSValue* value, unsigned attributes);
    168168
    169         // Linked list of all global objects.
    170         static JSGlobalObject* head() { return s_head; }
     169        // Per-thread linked list of all global objects.
     170        static JSGlobalObject*& head();
    171171        JSGlobalObject* next() { return d()->next; }
    172172
     
    256256        static ThreadClassInfoHashTables* threadClassInfoHashTables();
    257257
     258        void* operator new(size_t);
     259
    258260    private:
    259261        void init(JSObject* thisValue);
     
    266268        void deleteActivationStack();
    267269        void checkActivationCount();
    268 
    269         static JSGlobalObject* s_head;
    270270    };
    271271
  • trunk/JavaScriptCore/kjs/JSLock.cpp

    r21122 r32807  
    8181}
    8282
    83 void JSLock::registerThread()
    84 {
    85     Collector::registerThread();
    86 }
    87 
    8883JSLock::DropAllLocks::DropAllLocks()
    8984    : m_lockCount(0)
     
    122117}
    123118
    124 void JSLock::registerThread()
    125 {
    126 }
    127 
    128119JSLock::DropAllLocks::DropAllLocks()
    129120{
  • trunk/JavaScriptCore/kjs/JSLock.h

    r28468 r32807  
    5252        {
    5353            lock();
    54             registerThread();
    5554        }
    5655
     
    6463        static int lockCount();
    6564        static bool currentThreadIsHoldingLock();
    66 
    67         static void registerThread();
    6865
    6966        class DropAllLocks : Noncopyable {
  • trunk/JavaScriptCore/kjs/array_instance.cpp

    r32652 r32807  
    7777    m_storage = static_cast<ArrayStorage*>(fastZeroedMalloc(storageSize(initialCapacity)));
    7878
    79     Collector::reportExtraMemoryCost(initialCapacity * sizeof(JSValue*));
     79    Heap::heap(this)->reportExtraMemoryCost(initialCapacity * sizeof(JSValue*));
    8080}
    8181
     
    129129}
    130130
    131 JSValue* ArrayInstance::lengthGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot& slot)
    132 {
    133     return jsNumber(static_cast<ArrayInstance*>(slot.slotBase())->m_length);
     131JSValue* ArrayInstance::lengthGetter(ExecState* exec, JSObject*, const Identifier&, const PropertySlot& slot)
     132{
     133    return jsNumber(exec, static_cast<ArrayInstance*>(slot.slotBase())->m_length);
    134134}
    135135
  • trunk/JavaScriptCore/kjs/array_object.cpp

    r32652 r32807  
    9696    Vector<UChar, 256> strBuffer;
    9797    if (alreadyVisited)
    98         return jsString(UString(0, 0)); // return an empty string, avoding infinite recursion.
     98        return jsString(exec, UString(0, 0)); // return an empty string, avoding infinite recursion.
    9999
    100100    unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
     
    124124    }
    125125    exec->dynamicGlobalObject()->arrayVisitedElements().remove(thisObj);
    126     return jsString(UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
     126    return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
    127127}
    128128
     
    135135    Vector<UChar, 256> strBuffer;
    136136    if (alreadyVisited)
    137         return jsString(UString(0, 0)); // return an empty string, avoding infinite recursion.
     137        return jsString(exec, UString(0, 0)); // return an empty string, avoding infinite recursion.
    138138
    139139    unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
     
    169169    }
    170170    exec->dynamicGlobalObject()->arrayVisitedElements().remove(thisObj);
    171     return jsString(UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
     171    return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
    172172}
    173173
     
    177177    Vector<UChar, 256> strBuffer;
    178178    if (alreadyVisited)
    179         return jsString(UString(0, 0)); // return an empty string, avoding infinite recursion.
     179        return jsString(exec, UString(0, 0)); // return an empty string, avoding infinite recursion.
    180180
    181181    UChar comma = ',';
     
    208208    }
    209209    exec->dynamicGlobalObject()->arrayVisitedElements().remove(thisObj);
    210     return jsString(UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
     210    return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
    211211}
    212212
     
    241241        ++it;
    242242    }
    243     arr->put(exec, exec->propertyNames().length, jsNumber(n));
     243    arr->put(exec, exec->propertyNames().length, jsNumber(exec, n));
    244244    return arr;
    245245}
     
    250250    unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
    251251    if (length == 0) {
    252         thisObj->put(exec, exec->propertyNames().length, jsNumber(length));
     252        thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length));
    253253        result = jsUndefined();
    254254    } else {
    255255        result = thisObj->get(exec, length - 1);
    256256        thisObj->deleteProperty(exec, length - 1);
    257         thisObj->put(exec, exec->propertyNames().length, jsNumber(length - 1));
     257        thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - 1));
    258258    }
    259259    return result;
     
    266266        thisObj->put(exec, length + n, args[n]);
    267267    length += args.size();
    268     thisObj->put(exec, exec->propertyNames().length, jsNumber(length));
    269     return jsNumber(length);
     268    thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length));
     269    return jsNumber(exec, length);
    270270}
    271271
     
    299299    unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
    300300    if (length == 0) {
    301         thisObj->put(exec, exec->propertyNames().length, jsNumber(length));
     301        thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length));
    302302        result = jsUndefined();
    303303    } else {
     
    310310        }
    311311        thisObj->deleteProperty(exec, length - 1);
    312         thisObj->put(exec, exec->propertyNames().length, jsNumber(length - 1));
     312        thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - 1));
    313313    }
    314314    return result;
     
    354354            resObj->put(exec, n, v);
    355355    }
    356     resObj->put(exec, exec->propertyNames().length, jsNumber(n));
     356    resObj->put(exec, exec->propertyNames().length, jsNumber(exec, n));
    357357    return result;
    358358}
     
    439439            resObj->put(exec, k, v);
    440440    }
    441     resObj->put(exec, exec->propertyNames().length, jsNumber(deleteCount));
     441    resObj->put(exec, exec->propertyNames().length, jsNumber(exec, deleteCount));
    442442
    443443    unsigned additionalArgs = std::max<int>(args.size() - 2, 0);
     
    464464        thisObj->put(exec, k + begin, args[k + 2]);
    465465
    466     thisObj->put(exec, exec->propertyNames().length, jsNumber(length - deleteCount + additionalArgs));
     466    thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - deleteCount + additionalArgs));
    467467    return result;
    468468}
     
    483483    for (unsigned k = 0; k < nrArgs; ++k)
    484484        thisObj->put(exec, k, args[k]);
    485     JSValue* result = jsNumber(length + nrArgs);
     485    JSValue* result = jsNumber(exec, length + nrArgs);
    486486    thisObj->put(exec, exec->propertyNames().length, result);
    487487    return result;
     
    511511
    512512        eachArguments.append(v);
    513         eachArguments.append(jsNumber(k));
     513        eachArguments.append(jsNumber(exec, k));
    514514        eachArguments.append(thisObj);
    515515
     
    533533
    534534    List mapArgs;
    535     mapArgs.append(jsNumber(length));
     535    mapArgs.append(jsNumber(exec, length));
    536536    JSObject* resultArray = static_cast<JSObject*>(exec->lexicalGlobalObject()->arrayConstructor()->construct(exec, mapArgs));
    537537
     
    546546
    547547        eachArguments.append(v);
    548         eachArguments.append(jsNumber(k));
     548        eachArguments.append(jsNumber(exec, k));
    549549        eachArguments.append(thisObj);
    550550
     
    582582
    583583        eachArguments.append(slot.getValue(exec, thisObj, k));
    584         eachArguments.append(jsNumber(k));
     584        eachArguments.append(jsNumber(exec, k));
    585585        eachArguments.append(thisObj);
    586586
     
    613613        List eachArguments;
    614614        eachArguments.append(slot.getValue(exec, thisObj, k));
    615         eachArguments.append(jsNumber(k));
     615        eachArguments.append(jsNumber(exec, k));
    616616        eachArguments.append(thisObj);
    617617
     
    640640        List eachArguments;
    641641        eachArguments.append(slot.getValue(exec, thisObj, k));
    642         eachArguments.append(jsNumber(k));
     642        eachArguments.append(jsNumber(exec, k));
    643643        eachArguments.append(thisObj);
    644644
     
    676676            continue;
    677677        if (strictEqual(exec, searchElement, e))
    678             return jsNumber(index);
    679     }
    680 
    681     return jsNumber(-1);
     678            return jsNumber(exec, index);
     679    }
     680
     681    return jsNumber(exec, -1);
    682682}
    683683
     
    694694        d += length;
    695695        if (d < 0)
    696             return jsNumber(-1);
     696            return jsNumber(exec, -1);
    697697    }
    698698    if (d < length)
     
    705705            continue;
    706706        if (strictEqual(exec, searchElement, e))
    707             return jsNumber(index);
    708     }
    709 
    710     return jsNumber(-1);
     707            return jsNumber(exec, index);
     708    }
     709
     710    return jsNumber(exec, -1);
    711711}
    712712
     
    720720
    721721    // no. of arguments for constructor
    722     putDirect(exec->propertyNames().length, jsNumber(1), ReadOnly|DontDelete|DontEnum);
     722    putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
    723723}
    724724
     
    736736        if (n != args[0]->toNumber(exec))
    737737            return throwError(exec, RangeError, "Array size is not a small enough positive integer.");
    738         return new ArrayInstance(exec->lexicalGlobalObject()->arrayPrototype(), n);
     738        return new (exec) ArrayInstance(exec->lexicalGlobalObject()->arrayPrototype(), n);
    739739    }
    740740
    741741    // otherwise the array is constructed with the arguments in it
    742     return new ArrayInstance(exec->lexicalGlobalObject()->arrayPrototype(), args);
     742    return new (exec) ArrayInstance(exec->lexicalGlobalObject()->arrayPrototype(), args);
    743743}
    744744
  • trunk/JavaScriptCore/kjs/bool_object.cpp

    r32652 r32807  
    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 List&)
     
    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* BooleanObjectImp::construct(ExecState* exec, const List& args)
    103103{
    104     BooleanInstance* obj(new BooleanInstance(exec->lexicalGlobalObject()->booleanPrototype()));
     104    BooleanInstance* obj(new (exec) BooleanInstance(exec->lexicalGlobalObject()->booleanPrototype()));
    105105    obj->setInternalValue(jsBoolean(args[0]->toBoolean(exec)));
    106106    return obj;
  • trunk/JavaScriptCore/kjs/collector.cpp

    r32502 r32807  
    3737#if USE(MULTIPLE_THREADS)
    3838#include <pthread.h>
     39#include <wtf/ThreadSpecific.h>
    3940#endif
    4041
     
    7576
    7677using std::max;
     78using namespace WTF;
    7779
    7880namespace KJS {
     
    8082// tunable parameters
    8183
    82 const size_t SPARE_EMPTY_BLOCKS = 2;
    83 const size_t MIN_ARRAY_SIZE = 14;
    84 const size_t GROWTH_FACTOR = 2;
    85 const size_t LOW_WATER_FACTOR = 4;
    86 const size_t ALLOCATIONS_PER_COLLECTION = 4000;
    87 
    88 static CollectorHeap primaryHeap = { 0, 0, 0, 0, 0, 0, 0, NoOperation };
    89 static CollectorHeap numberHeap = { 0, 0, 0, 0, 0, 0, 0, NoOperation };
    90 
    91 // FIXME: I don't think this needs to be a static data member of the Collector class.
    92 // Just a private global like "heap" above would be fine.
    93 size_t Collector::mainThreadOnlyObjectCount = 0;
    94 
    95 static CollectorBlock* allocateBlock()
     84#define SPARE_EMPTY_BLOCKS 2UL
     85#define MIN_ARRAY_SIZE 14UL
     86#define GROWTH_FACTOR 2UL
     87#define LOW_WATER_FACTOR 4UL
     88#define ALLOCATIONS_PER_COLLECTION 4000UL
     89
     90Heap::Heap()
     91{
     92    memset(this, 0, sizeof(Heap));
     93}
     94
     95Heap* Heap::threadHeap()
     96{
     97#if USE(MULTIPLE_THREADS)
     98    static ThreadSpecific<Heap> sharedInstance;
     99    return sharedInstance;
     100#else
     101    static Heap sharedInstance;
     102    return &sharedInstance;
     103#endif
     104}
     105
     106static NEVER_INLINE CollectorBlock* allocateBlock()
    96107{
    97108#if PLATFORM(DARWIN)   
     
    145156}
    146157
    147 void Collector::recordExtraCost(size_t cost)
     158void Heap::recordExtraCost(size_t cost)
    148159{
    149160    // Our frequency of garbage collection tries to balance memory use against speed
     
    162173}
    163174
    164 template <Collector::HeapType heapType> struct HeapConstants;
    165 
    166 template <> struct HeapConstants<Collector::PrimaryHeap> {
     175template <Heap::HeapType heapType> struct HeapConstants;
     176
     177template <> struct HeapConstants<Heap::PrimaryHeap> {
    167178    static const size_t cellSize = CELL_SIZE;
    168179    static const size_t cellsPerBlock = CELLS_PER_BLOCK;
     
    172183};
    173184
    174 template <> struct HeapConstants<Collector::NumberHeap> {
     185template <> struct HeapConstants<Heap::NumberHeap> {
    175186    static const size_t cellSize = SMALL_CELL_SIZE;
    176187    static const size_t cellsPerBlock = SMALL_CELLS_PER_BLOCK;
     
    180191};
    181192
    182 template <Collector::HeapType heapType> void* Collector::heapAllocate(size_t s)
     193template <Heap::HeapType heapType> void* Heap::heapAllocate(size_t s)
    183194{
    184195  typedef typename HeapConstants<heapType>::Block Block;
     
    188199  ASSERT(JSLock::lockCount() > 0);
    189200  ASSERT(JSLock::currentThreadIsHoldingLock());
     201  ASSERT(this == threadHeap());
    190202  ASSERT(s <= HeapConstants<heapType>::cellSize);
    191203  UNUSED_PARAM(s); // s is now only used for the above assert
     
    270282    targetBlock = (Block*)allocateBlock();
    271283    targetBlock->freeList = targetBlock->cells;
     284    targetBlock->heap = this;
    272285    targetBlockUsedCells = 0;
    273286    heap.blocks[usedBlocks] = (CollectorBlock*)targetBlock;
     
    293306}
    294307
    295 void* Collector::allocate(size_t s)
     308void* Heap::allocate(size_t s)
    296309{
    297310    return heapAllocate<PrimaryHeap>(s);
    298311}
    299312
    300 void* Collector::allocateNumber(size_t s)
     313void* Heap::allocateNumber(size_t s)
    301314{
    302315    return heapAllocate<NumberHeap>(s);
     
    359372}
    360373
    361 #if USE(MULTIPLE_THREADS)
    362 static pthread_t mainThread;
    363 #endif
    364 
    365 void Collector::registerAsMainThread()
    366 {
    367 #if USE(MULTIPLE_THREADS)
    368     mainThread = pthread_self();
    369 #endif
    370 }
    371 
    372 static inline bool onMainThread()
    373 {
    374 #if USE(MULTIPLE_THREADS)
    375 #if PLATFORM(DARWIN)
    376     return pthread_main_np();
    377 #else
    378     return !!pthread_equal(pthread_self(), mainThread);
    379 #endif
    380 #else
    381     return true;
    382 #endif
    383 }
    384 
    385 #if USE(MULTIPLE_THREADS)
    386 
    387 #if PLATFORM(DARWIN)
    388 typedef mach_port_t PlatformThread;
    389 #elif PLATFORM(WIN_OS)
    390 struct PlatformThread {
    391     PlatformThread(DWORD _id, HANDLE _handle) : id(_id), handle(_handle) {}
    392     DWORD id;
    393     HANDLE handle;
    394 };
    395 #endif
    396 
    397 static inline PlatformThread getCurrentPlatformThread()
    398 {
    399 #if PLATFORM(DARWIN)
    400     return pthread_mach_thread_np(pthread_self());
    401 #elif PLATFORM(WIN_OS)
    402     HANDLE threadHandle = pthread_getw32threadhandle_np(pthread_self());
    403     return PlatformThread(GetCurrentThreadId(), threadHandle);
    404 #endif
    405 }
    406 
    407 class Collector::Thread {
    408 public:
    409   Thread(pthread_t pthread, const PlatformThread& platThread, void* base)
    410   : posixThread(pthread), platformThread(platThread), stackBase(base) {}
    411   Thread* next;
    412   pthread_t posixThread;
    413   PlatformThread platformThread;
    414   void* stackBase;
    415 };
    416 
    417 pthread_key_t registeredThreadKey;
    418 pthread_once_t registeredThreadKeyOnce = PTHREAD_ONCE_INIT;
    419 Collector::Thread* registeredThreads;
    420 
    421 static void destroyRegisteredThread(void* data)
    422 {
    423   Collector::Thread* thread = (Collector::Thread*)data;
    424 
    425   // Can't use JSLock convenience object here because we don't want to re-register
    426   // an exiting thread.
    427   JSLock::lock();
    428  
    429   if (registeredThreads == thread) {
    430     registeredThreads = registeredThreads->next;
    431   } else {
    432     Collector::Thread *last = registeredThreads;
    433     Collector::Thread *t;
    434     for (t = registeredThreads->next; t != NULL; t = t->next) {
    435       if (t == thread) {         
    436           last->next = t->next;
    437           break;
    438       }
    439       last = t;
    440     }
    441     ASSERT(t); // If t is NULL, we never found ourselves in the list.
    442   }
    443 
    444   JSLock::unlock();
    445 
    446   delete thread;
    447 }
    448 
    449 static void initializeRegisteredThreadKey()
    450 {
    451   pthread_key_create(&registeredThreadKey, destroyRegisteredThread);
    452 }
    453 
    454 void Collector::registerThread()
    455 {
    456   ASSERT(JSLock::lockCount() > 0);
    457   ASSERT(JSLock::currentThreadIsHoldingLock());
    458  
    459   pthread_once(&registeredThreadKeyOnce, initializeRegisteredThreadKey);
    460 
    461   if (!pthread_getspecific(registeredThreadKey)) {
    462 #if PLATFORM(DARWIN)
    463       if (onMainThread())
    464           CollectorHeapIntrospector::init(&primaryHeap, &numberHeap);
    465 #endif
    466 
    467     Collector::Thread *thread = new Collector::Thread(pthread_self(), getCurrentPlatformThread(), currentThreadStackBase());
    468 
    469     thread->next = registeredThreads;
    470     registeredThreads = thread;
    471     pthread_setspecific(registeredThreadKey, thread);
    472   }
    473 }
    474 
    475 #endif
    476 
    477374#define IS_POINTER_ALIGNED(p) (((intptr_t)(p) & (sizeof(char *) - 1)) == 0)
    478375
     
    480377#define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0)
    481378
    482 void Collector::markStackObjectsConservatively(void *start, void *end)
     379void Heap::markStackObjectsConservatively(void *start, void *end)
    483380{
    484381  if (start > end) {
     
    512409          for (size_t block = 0; block < usedNumberBlocks; block++) {
    513410              if ((numberBlocks[block] == blockAddr) & (offset <= lastCellOffset)) {
    514                   Collector::markCell(reinterpret_cast<JSCell*>(xAsBits));
     411                  Heap::markCell(reinterpret_cast<JSCell*>(xAsBits));
    515412                  goto endMarkLoop;
    516413              }
     
    534431}
    535432
    536 void NEVER_INLINE Collector::markCurrentThreadConservativelyInternal()
     433void NEVER_INLINE Heap::markStackObjectsConservativelyInternal()
    537434{
    538435    void* dummy;
     
    542439}
    543440
    544 void Collector::markCurrentThreadConservatively()
     441void Heap::markStackObjectsConservatively()
    545442{
    546443    // setjmp forces volatile registers onto the stack
     
    555452#endif
    556453
    557     markCurrentThreadConservativelyInternal();
    558 }
    559 
    560 #if USE(MULTIPLE_THREADS)
    561 
    562 static inline void suspendThread(const PlatformThread& platformThread)
    563 {
    564 #if PLATFORM(DARWIN)
    565   thread_suspend(platformThread);
    566 #elif PLATFORM(WIN_OS)
    567   SuspendThread(platformThread.handle);
    568 #else
    569 #error Need a way to suspend threads on this platform
    570 #endif
    571 }
    572 
    573 static inline void resumeThread(const PlatformThread& platformThread)
    574 {
    575 #if PLATFORM(DARWIN)
    576   thread_resume(platformThread);
    577 #elif PLATFORM(WIN_OS)
    578   ResumeThread(platformThread.handle);
    579 #else
    580 #error Need a way to resume threads on this platform
    581 #endif
    582 }
    583 
    584 typedef unsigned long usword_t; // word size, assumed to be either 32 or 64 bit
    585 
    586 #if PLATFORM(DARWIN)
    587 
    588 #if     PLATFORM(X86)
    589 typedef i386_thread_state_t PlatformThreadRegisters;
    590 #elif   PLATFORM(X86_64)
    591 typedef x86_thread_state64_t PlatformThreadRegisters;
    592 #elif   PLATFORM(PPC)
    593 typedef ppc_thread_state_t PlatformThreadRegisters;
    594 #elif   PLATFORM(PPC64)
    595 typedef ppc_thread_state64_t PlatformThreadRegisters;
    596 #else
    597 #error Unknown Architecture
    598 #endif
    599 
    600 #elif PLATFORM(WIN_OS)&& PLATFORM(X86)
    601 typedef CONTEXT PlatformThreadRegisters;
    602 #else
    603 #error Need a thread register struct for this platform
    604 #endif
    605 
    606 size_t getPlatformThreadRegisters(const PlatformThread& platformThread, PlatformThreadRegisters& regs)
    607 {
    608 #if PLATFORM(DARWIN)
    609 
    610 #if     PLATFORM(X86)
    611   unsigned user_count = sizeof(regs)/sizeof(int);
    612   thread_state_flavor_t flavor = i386_THREAD_STATE;
    613 #elif   PLATFORM(X86_64)
    614   unsigned user_count = x86_THREAD_STATE64_COUNT;
    615   thread_state_flavor_t flavor = x86_THREAD_STATE64;
    616 #elif   PLATFORM(PPC)
    617   unsigned user_count = PPC_THREAD_STATE_COUNT;
    618   thread_state_flavor_t flavor = PPC_THREAD_STATE;
    619 #elif   PLATFORM(PPC64)
    620   unsigned user_count = PPC_THREAD_STATE64_COUNT;
    621   thread_state_flavor_t flavor = PPC_THREAD_STATE64;
    622 #else
    623 #error Unknown Architecture
    624 #endif
    625 
    626   kern_return_t result = thread_get_state(platformThread, flavor, (thread_state_t)&regs, &user_count);
    627   if (result != KERN_SUCCESS) {
    628     WTFReportFatalError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION,
    629                         "JavaScript garbage collection failed because thread_get_state returned an error (%d). This is probably the result of running inside Rosetta, which is not supported.", result);
    630     CRASH();
    631   }
    632   return user_count * sizeof(usword_t);
    633 // end PLATFORM(DARWIN)
    634 
    635 #elif PLATFORM(WIN_OS) && PLATFORM(X86)
    636   regs.ContextFlags = CONTEXT_INTEGER | CONTEXT_CONTROL | CONTEXT_SEGMENTS;
    637   GetThreadContext(platformThread.handle, &regs);
    638   return sizeof(CONTEXT);
    639 #else
    640 #error Need a way to get thread registers on this platform
    641 #endif
    642 }
    643 
    644 static inline void* otherThreadStackPointer(const PlatformThreadRegisters& regs)
    645 {
    646 #if PLATFORM(DARWIN)
    647 
    648 #if __DARWIN_UNIX03
    649 
    650 #if PLATFORM(X86)
    651   return (void*)regs.__esp;
    652 #elif PLATFORM(X86_64)
    653   return (void*)regs.__rsp;
    654 #elif PLATFORM(PPC) || PLATFORM(PPC64)
    655   return (void*)regs.__r1;
    656 #else
    657 #error Unknown Architecture
    658 #endif
    659 
    660 #else // !__DARWIN_UNIX03
    661 
    662 #if PLATFORM(X86)
    663   return (void*)regs.esp;
    664 #elif PLATFORM(X86_64)
    665   return (void*)regs.rsp;
    666 #elif (PLATFORM(PPC) || PLATFORM(PPC64))
    667   return (void*)regs.r1;
    668 #else
    669 #error Unknown Architecture
    670 #endif
    671 
    672 #endif // __DARWIN_UNIX03
    673 
    674 // end PLATFORM(DARWIN)
    675 #elif PLATFORM(X86) && PLATFORM(WIN_OS)
    676   return (void*)(uintptr_t)regs.Esp;
    677 #else
    678 #error Need a way to get the stack pointer for another thread on this platform
    679 #endif
    680 }
    681 
    682 void Collector::markOtherThreadConservatively(Thread* thread)
    683 {
    684   suspendThread(thread->platformThread);
    685 
    686   PlatformThreadRegisters regs;
    687   size_t regSize = getPlatformThreadRegisters(thread->platformThread, regs);
    688 
    689   // mark the thread's registers
    690   markStackObjectsConservatively((void*)&regs, (void*)((char*)&regs + regSize));
    691  
    692   void* stackPointer = otherThreadStackPointer(regs);
    693   markStackObjectsConservatively(stackPointer, thread->stackBase);
    694 
    695   resumeThread(thread->platformThread);
    696 }
    697 
    698 #endif
    699 
    700 void Collector::markStackObjectsConservatively()
    701 {
    702   markCurrentThreadConservatively();
    703 
    704 #if USE(MULTIPLE_THREADS)
    705   for (Thread *thread = registeredThreads; thread != NULL; thread = thread->next) {
    706     if (!pthread_equal(thread->posixThread, pthread_self())) {
    707       markOtherThreadConservatively(thread);
    708     }
    709   }
    710 #endif
    711 }
    712 
    713 typedef HashCountedSet<JSCell*> ProtectCountSet;
    714 
    715 static ProtectCountSet& protectedValues()
    716 {
    717     static ProtectCountSet staticProtectCountSet;
    718     return staticProtectCountSet;
    719 }
    720 
    721 void Collector::protect(JSValue *k)
     454    markStackObjectsConservativelyInternal();
     455}
     456
     457void Heap::protect(JSValue *k)
    722458{
    723459    ASSERT(k);
     
    728464      return;
    729465
    730     protectedValues().add(k->asCell());
    731 }
    732 
    733 void Collector::unprotect(JSValue *k)
     466    protectedValues.add(k->asCell());
     467}
     468
     469void Heap::unprotect(JSValue *k)
    734470{
    735471    ASSERT(k);
     
    740476      return;
    741477
    742     protectedValues().remove(k->asCell());
    743 }
    744 
    745 void Collector::collectOnMainThreadOnly(JSValue* value)
    746 {
    747     ASSERT(value);
    748     ASSERT(JSLock::lockCount() > 0);
    749     ASSERT(JSLock::currentThreadIsHoldingLock());
    750 
    751     if (JSImmediate::isImmediate(value))
    752       return;
    753 
    754     JSCell* cell = value->asCell();
    755     cellBlock(cell)->collectOnMainThreadOnly.set(cellOffset(cell));
    756     ++mainThreadOnlyObjectCount;
    757 }
    758 
    759 void Collector::markProtectedObjects()
    760 {
    761   ProtectCountSet& protectedValues = KJS::protectedValues();
    762   ProtectCountSet::iterator end = protectedValues.end();
    763   for (ProtectCountSet::iterator it = protectedValues.begin(); it != end; ++it) {
     478    protectedValues.remove(k->asCell());
     479}
     480
     481Heap* Heap::heap(const JSValue* v)
     482{
     483    if (JSImmediate::isImmediate(v))
     484        return 0;
     485    // FIXME: should assert that the result equals threadHeap(), but currently, this fails as database code uses gcUnprotect from a different thread.
     486    // That's a race condition and should be fixed.
     487    return Heap::cellBlock(v->asCell())->heap;
     488}
     489
     490void Heap::markProtectedObjects()
     491{
     492  HashCountedSet<JSCell*>::iterator end = protectedValues.end();
     493  for (HashCountedSet<JSCell*>::iterator it = protectedValues.begin(); it != end; ++it) {
    764494    JSCell *val = it->first;
    765495    if (!val->marked())
     
    768498}
    769499
    770 void Collector::markMainThreadOnlyObjects()
    771 {
    772 #if USE(MULTIPLE_THREADS)
    773     ASSERT(!onMainThread());
    774 #endif
    775 
    776     // Optimization for clients that never register "main thread only" objects.
    777     if (!mainThreadOnlyObjectCount)
    778         return;
    779 
    780     // FIXME: We can optimize this marking algorithm by keeping an exact set of
    781     // "main thread only" objects when the "main thread only" object count is
    782     // small. We don't want to keep an exact set all the time, because WebCore
    783     // tends to create lots of "main thread only" objects, and all that set
    784     // thrashing can be expensive.
    785    
    786     size_t count = 0;
    787    
    788     // We don't look at the numberHeap as primitive values can never be marked as main thread only
    789     for (size_t block = 0; block < primaryHeap.usedBlocks; block++) {
    790         ASSERT(count < mainThreadOnlyObjectCount);
    791        
    792         CollectorBlock* curBlock = primaryHeap.blocks[block];
    793         size_t minimumCellsToProcess = curBlock->usedCells;
    794         for (size_t i = 0; (i < minimumCellsToProcess) & (i < CELLS_PER_BLOCK); i++) {
    795             CollectorCell* cell = curBlock->cells + i;
    796             if (cell->u.freeCell.zeroIfFree == 0)
    797                 ++minimumCellsToProcess;
    798             else {
    799                 if (curBlock->collectOnMainThreadOnly.get(i)) {
    800                     if (!curBlock->marked.get(i)) {
    801                         JSCell* imp = reinterpret_cast<JSCell*>(cell);
    802                         imp->mark();
    803                     }
    804                     if (++count == mainThreadOnlyObjectCount)
    805                         return;
    806                 }
    807             }
    808         }
    809     }
    810 }
    811 
    812 template <Collector::HeapType heapType> size_t Collector::sweep(bool currentThreadIsMainThread)
     500template <Heap::HeapType heapType> size_t Heap::sweep()
    813501{
    814502    typedef typename HeapConstants<heapType>::Block Block;
    815503    typedef typename HeapConstants<heapType>::Cell Cell;
    816504
    817     UNUSED_PARAM(currentThreadIsMainThread); // currentThreadIsMainThread is only used in ASSERTs
    818505    // SWEEP: delete everything with a zero refcount (garbage) and unmark everything else
    819     CollectorHeap& heap = heapType == Collector::PrimaryHeap ? primaryHeap : numberHeap;
     506    CollectorHeap& heap = heapType == Heap::PrimaryHeap ? primaryHeap : numberHeap;
    820507   
    821508    size_t emptyBlocks = 0;
     
    834521                    Cell* cell = curBlock->cells + i;
    835522                   
    836                     if (heapType != Collector::NumberHeap) {
     523                    if (heapType != Heap::NumberHeap) {
    837524                        JSCell* imp = reinterpret_cast<JSCell*>(cell);
    838525                        // special case for allocated but uninitialized object
     
    842529                            continue;
    843530                       
    844                         ASSERT(currentThreadIsMainThread || !curBlock->collectOnMainThreadOnly.get(i));
    845                         if (curBlock->collectOnMainThreadOnly.get(i)) {
    846                             curBlock->collectOnMainThreadOnly.clear(i);
    847                             --Collector::mainThreadOnlyObjectCount;
    848                         }
    849531                        imp->~JSCell();
    850532                    }
     
    867549                } else {
    868550                    if (!curBlock->marked.get(i >> HeapConstants<heapType>::bitmapShift)) {
    869                         if (heapType != Collector::NumberHeap) {
     551                        if (heapType != Heap::NumberHeap) {
    870552                            JSCell *imp = reinterpret_cast<JSCell*>(cell);
    871                             ASSERT(currentThreadIsMainThread || !curBlock->collectOnMainThreadOnly.get(i));
    872                             if (curBlock->collectOnMainThreadOnly.get(i)) {
    873                                 curBlock->collectOnMainThreadOnly.clear(i);
    874                                 --Collector::mainThreadOnlyObjectCount;
    875                             }
    876553                            imp->~JSCell();
    877554                        }
     
    920597}
    921598   
    922 bool Collector::collect()
     599bool Heap::collect()
    923600{
    924601  ASSERT(JSLock::lockCount() > 0);
    925602  ASSERT(JSLock::currentThreadIsHoldingLock());
     603  ASSERT(this == threadHeap());
    926604
    927605  ASSERT((primaryHeap.operationInProgress == NoOperation) | (numberHeap.operationInProgress == NoOperation));
     
    932610  numberHeap.operationInProgress = Collection;
    933611
    934   bool currentThreadIsMainThread = onMainThread();
    935 
    936612  // MARK: first mark all referenced objects recursively starting out from the set of root objects
    937613
     
    945621  markStackObjectsConservatively();
    946622  markProtectedObjects();
    947   List::markProtectedLists();
    948 #if USE(MULTIPLE_THREADS)
    949   if (!currentThreadIsMainThread)
    950     markMainThreadOnlyObjects();
    951 #endif
     623  if (m_markListSet.size())
     624    List::markProtectedLists(m_markListSet);
    952625
    953626#ifndef NDEBUG
     
    956629   
    957630  size_t originalLiveObjects = primaryHeap.numLiveObjects + numberHeap.numLiveObjects;
    958   size_t numLiveObjects = sweep<PrimaryHeap>(currentThreadIsMainThread);
    959   numLiveObjects += sweep<NumberHeap>(currentThreadIsMainThread);
     631  size_t numLiveObjects = sweep<PrimaryHeap>();
     632  numLiveObjects += sweep<NumberHeap>();
    960633 
    961634  primaryHeap.operationInProgress = NoOperation;
     
    965638}
    966639
    967 size_t Collector::size()
     640size_t Heap::size()
    968641{
    969642  return primaryHeap.numLiveObjects + numberHeap.numLiveObjects;
    970643}
    971644
    972 size_t Collector::globalObjectCount()
     645size_t Heap::globalObjectCount()
    973646{
    974647  size_t count = 0;
     
    983656}
    984657
    985 size_t Collector::protectedGlobalObjectCount()
     658size_t Heap::protectedGlobalObjectCount()
    986659{
    987660  size_t count = 0;
     
    989662    JSGlobalObject* o = JSGlobalObject::head();
    990663    do {
    991       if (protectedValues().contains(o))
     664      if (protectedValues.contains(o))
    992665        ++count;
    993666      o = o->next();
     
    997670}
    998671
    999 size_t Collector::protectedObjectCount()
    1000 {
    1001   return protectedValues().size();
     672size_t Heap::protectedObjectCount()
     673{
     674  return protectedValues.size();
    1002675}
    1003676
     
    1035708}
    1036709
    1037 HashCountedSet<const char*>* Collector::protectedObjectTypeCounts()
     710HashCountedSet<const char*>* Heap::protectedObjectTypeCounts()
    1038711{
    1039712    HashCountedSet<const char*>* counts = new HashCountedSet<const char*>;
    1040713
    1041     ProtectCountSet& protectedValues = KJS::protectedValues();
    1042     ProtectCountSet::iterator end = protectedValues.end();
    1043     for (ProtectCountSet::iterator it = protectedValues.begin(); it != end; ++it)
     714    HashCountedSet<JSCell*>::iterator end = protectedValues.end();
     715    for (HashCountedSet<JSCell*>::iterator it = protectedValues.begin(); it != end; ++it)
    1044716        counts->add(typeName(it->first));
    1045717
     
    1047719}
    1048720
    1049 bool Collector::isBusy()
     721bool Heap::isBusy()
    1050722{
    1051723    return (primaryHeap.operationInProgress != NoOperation) | (numberHeap.operationInProgress != NoOperation);
    1052724}
    1053725
    1054 void Collector::reportOutOfMemoryToAllExecStates()
     726void Heap::reportOutOfMemoryToAllExecStates()
    1055727{
    1056728    if (!JSGlobalObject::head())
  • trunk/JavaScriptCore/kjs/collector.h

    r31787 r32807  
    2727#include <string.h>
    2828#include <wtf/HashCountedSet.h>
     29#include <wtf/HashSet.h>
     30
     31namespace WTF {
     32  template<typename T> class ThreadSpecific;
     33}
    2934
    3035namespace KJS {
    3136
     37  class CollectorBlock;
    3238  class JSCell;
    3339  class JSValue;
    34   class CollectorBlock;
    35 
    36   class Collector {
     40  class List;
     41
     42  enum OperationInProgress { NoOperation, Allocation, Collection };
     43
     44  struct CollectorHeap {
     45    CollectorBlock** blocks;
     46    size_t numBlocks;
     47    size_t usedBlocks;
     48    size_t firstBlockWithPossibleSpace;
     49
     50    size_t numLiveObjects;
     51    size_t numLiveObjectsAtLastCollect;
     52    size_t extraCost;
     53
     54    OperationInProgress operationInProgress;
     55  };
     56
     57  class Heap {
    3758  public:
    38     static void* allocate(size_t s);
    39     static void* allocateNumber(size_t s);
    40     static bool collect();
    41     static bool isBusy(); // true if an allocation or collection is in progress
     59    static Heap* threadHeap();
     60
     61    void* allocate(size_t s);
     62    void* allocateNumber(size_t s);
     63    bool collect();
     64    bool isBusy(); // true if an allocation or collection is in progress
    4265
    4366    static const size_t minExtraCostSize = 256;
    4467
    45     static void reportExtraMemoryCost(size_t cost);
    46 
    47     static size_t size();
    48 
    49     static void protect(JSValue*);
    50     static void unprotect(JSValue*);
     68    void reportExtraMemoryCost(size_t cost);
     69
     70    size_t size();
     71
     72    void protect(JSValue*);
     73    void unprotect(JSValue*);
    5174   
    52     static void collectOnMainThreadOnly(JSValue*);
    53 
    54     static size_t globalObjectCount();
    55     static size_t protectedObjectCount();
    56     static size_t protectedGlobalObjectCount();
    57     static HashCountedSet<const char*>* protectedObjectTypeCounts();
    58 
    59     class Thread;
    60     static void registerThread();
    61    
    62     static void registerAsMainThread();
     75    static Heap* heap(const JSValue*); // 0 for immediate values
     76
     77    size_t globalObjectCount();
     78    size_t protectedObjectCount();
     79    size_t protectedGlobalObjectCount();
     80    HashCountedSet<const char*>* protectedObjectTypeCounts();
    6381
    6482    static bool isCellMarked(const JSCell*);
    6583    static void markCell(JSCell*);
    6684
     85    HashSet<List*>& markListSet() { return m_markListSet; }
    6786    enum HeapType { PrimaryHeap, NumberHeap };
    6887
    6988  private:
    70     template <Collector::HeapType heapType> static void* heapAllocate(size_t s);
    71     template <Collector::HeapType heapType> static size_t sweep(bool);
     89    friend class WTF::ThreadSpecific<Heap>;
     90
     91    Heap();
     92    Heap(const Heap&);
     93
     94    template <Heap::HeapType heapType> void* heapAllocate(size_t s);
     95    template <Heap::HeapType heapType> size_t sweep();
    7296    static const CollectorBlock* cellBlock(const JSCell*);
    7397    static CollectorBlock* cellBlock(JSCell*);
    7498    static size_t cellOffset(const JSCell*);
    7599
    76     Collector();
    77 
    78     static void recordExtraCost(size_t);
    79     static void markProtectedObjects();
    80     static void markMainThreadOnlyObjects();
    81     static void markCurrentThreadConservatively();
    82     static void markCurrentThreadConservativelyInternal();
    83     static void markOtherThreadConservatively(Thread*);
    84     static void markStackObjectsConservatively();
    85     static void markStackObjectsConservatively(void* start, void* end);
    86 
    87     static size_t mainThreadOnlyObjectCount;
    88     static bool memoryFull;
    89     static void reportOutOfMemoryToAllExecStates();
     100    void recordExtraCost(size_t);
     101    void markProtectedObjects();
     102    void markStackObjectsConservativelyInternal();
     103    void markStackObjectsConservatively();
     104    void markStackObjectsConservatively(void* start, void* end);
     105
     106    bool memoryFull;
     107    void reportOutOfMemoryToAllExecStates();
     108
     109    CollectorHeap primaryHeap;
     110    CollectorHeap numberHeap;
     111    HashCountedSet<JSCell*> protectedValues;
     112    HashSet<List*> m_markListSet;
    90113  };
    91114
     
    146169    CollectorCell* freeList;
    147170    CollectorBitmap marked;
    148     CollectorBitmap collectOnMainThreadOnly;
     171    Heap* heap;
    149172  };
    150173
     
    155178    SmallCollectorCell* freeList;
    156179    CollectorBitmap marked;
    157     CollectorBitmap collectOnMainThreadOnly;
    158   };
    159 
    160   enum OperationInProgress { NoOperation, Allocation, Collection };
    161 
    162   struct CollectorHeap {
    163     CollectorBlock** blocks;
    164     size_t numBlocks;
    165     size_t usedBlocks;
    166     size_t firstBlockWithPossibleSpace;
    167 
    168     size_t numLiveObjects;
    169     size_t numLiveObjectsAtLastCollect;
    170     size_t extraCost;
    171 
    172     OperationInProgress operationInProgress;
    173   };
    174 
    175   inline const CollectorBlock* Collector::cellBlock(const JSCell* cell)
     180    Heap* heap;
     181  };
     182
     183  inline const CollectorBlock* Heap::cellBlock(const JSCell* cell)
    176184  {
    177185    return reinterpret_cast<const CollectorBlock*>(reinterpret_cast<uintptr_t>(cell) & BLOCK_MASK);
    178186  }
    179187
    180   inline CollectorBlock* Collector::cellBlock(JSCell* cell)
     188  inline CollectorBlock* Heap::cellBlock(JSCell* cell)
    181189  {
    182190    return const_cast<CollectorBlock*>(cellBlock(const_cast<const JSCell*>(cell)));
    183191  }
    184192
    185   inline size_t Collector::cellOffset(const JSCell* cell)
     193  inline size_t Heap::cellOffset(const JSCell* cell)
    186194  {
    187195    return (reinterpret_cast<uintptr_t>(cell) & BLOCK_OFFSET_MASK) / CELL_SIZE;
    188196  }
    189197
    190   inline bool Collector::isCellMarked(const JSCell* cell)
     198  inline bool Heap::isCellMarked(const JSCell* cell)
    191199  {
    192200    return cellBlock(cell)->marked.get(cellOffset(cell));
    193201  }
    194202
    195   inline void Collector::markCell(JSCell* cell)
     203  inline void Heap::markCell(JSCell* cell)
    196204  {
    197205    cellBlock(cell)->marked.set(cellOffset(cell));
    198206  }
    199207
    200   inline void Collector::reportExtraMemoryCost(size_t cost)
     208  inline void Heap::reportExtraMemoryCost(size_t cost)
    201209  {
    202210    if (cost > minExtraCostSize)
  • trunk/JavaScriptCore/kjs/date_object.cpp

    r32652 r32807  
    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)
     472DatePrototype::DatePrototype(ExecState* exec, ObjectPrototype *objectProto)
    473473  : DateInstance(objectProto)
    474474{
    475     setInternalValue(jsNaN());
     475    setInternalValue(jsNaN(exec));
    476476    // The constructor will be added later, after DateObjectImp has been built.
    477477}
     
    490490{
    491491  putDirect(exec->propertyNames().prototype, dateProto, DontEnum|DontDelete|ReadOnly);
    492   putDirectFunction(new DateObjectFuncImp(exec, funcProto, DateObjectFuncImp::Parse, 1, exec->propertyNames().parse), DontEnum);
    493   putDirectFunction(new DateObjectFuncImp(exec, funcProto, DateObjectFuncImp::UTC, 7, exec->propertyNames().UTC), DontEnum);
    494   putDirect(exec->propertyNames().length, 7, ReadOnly|DontDelete|DontEnum);
     492  putDirectFunction(new (exec) DateObjectFuncImp(exec, funcProto, DateObjectFuncImp::Parse, 1, exec->propertyNames().parse), DontEnum);
     493  putDirectFunction(new (exec) DateObjectFuncImp(exec, funcProto, DateObjectFuncImp::UTC, 7, exec->propertyNames().UTC), DontEnum);
     494  putDirect(exec, exec->propertyNames().length, 7, ReadOnly|DontDelete|DontEnum);
    495495}
    496496
     
    543543  }
    544544 
    545   DateInstance *ret = new DateInstance(exec->lexicalGlobalObject()->datePrototype());
    546   ret->setInternalValue(jsNumber(timeClip(value)));
     545  DateInstance* ret = new (exec) DateInstance(exec->lexicalGlobalObject()->datePrototype());
     546  ret->setInternalValue(jsNumber(exec, timeClip(value)));
    547547  return ret;
    548548}
    549549
    550550// ECMA 15.9.2
    551 JSValue *DateObjectImp::callAsFunction(ExecState * /*exec*/, JSObject * /*thisObj*/, const List &/*args*/)
     551JSValue* DateObjectImp::callAsFunction(ExecState* exec, JSObject* /*thisObj*/, const List& /*args*/)
    552552{
    553553    time_t localTime = time(0);
     
    555555    getLocalTime(&localTime, &localTM);
    556556    GregorianDateTime ts(localTM);
    557     return jsString(formatDate(ts) + " " + formatTime(ts, false));
     557    return jsString(exec, formatDate(ts) + " " + formatTime(ts, false));
    558558}
    559559
     
    563563    : InternalFunctionImp(funcProto, name), id(i)
    564564{
    565     putDirect(exec->propertyNames().length, len, DontDelete|ReadOnly|DontEnum);
     565    putDirect(exec, exec->propertyNames().length, len, DontDelete|ReadOnly|DontEnum);
    566566}
    567567
     
    570570{
    571571  if (id == Parse) {
    572     return jsNumber(parseDate(args[0]->toString(exec)));
     572    return jsNumber(exec, parseDate(args[0]->toString(exec)));
    573573  }
    574574  else { // UTC
     
    581581        || (n >= 6 && isnan(args[5]->toNumber(exec)))
    582582        || (n >= 7 && isnan(args[6]->toNumber(exec)))) {
    583       return jsNaN();
     583      return jsNaN(exec);
    584584    }
    585585
     
    593593    t.second = args[5]->toInt32(exec);
    594594    double ms = (n >= 7) ? args[6]->toNumber(exec) : 0;
    595     return jsNumber(gregorianDateTimeToMS(t, ms, true));
     595    return jsNumber(exec, gregorianDateTimeToMS(t, ms, true));
    596596  }
    597597}
     
    988988    double milli = v->toNumber(exec);
    989989    if (isnan(milli))
    990         return jsString("Invalid Date");
    991 
    992     GregorianDateTime t;
    993     thisDateObj->msToGregorianDateTime(milli, utc, t);
    994     return jsString(formatDate(t) + " " + formatTime(t, utc));
     990        return jsString(exec, "Invalid Date");
     991
     992    GregorianDateTime t;
     993    thisDateObj->msToGregorianDateTime(milli, utc, t);
     994    return jsString(exec, formatDate(t) + " " + formatTime(t, utc));
    995995}
    996996
     
    10061006    double milli = v->toNumber(exec);
    10071007    if (isnan(milli))
    1008         return jsString("Invalid Date");
    1009 
    1010     GregorianDateTime t;
    1011     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1012     return jsString(formatDateUTCVariant(t) + " " + formatTime(t, utc));
     1008        return jsString(exec, "Invalid Date");
     1009
     1010    GregorianDateTime t;
     1011    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1012    return jsString(exec, formatDateUTCVariant(t) + " " + formatTime(t, utc));
    10131013}
    10141014
     
    10241024    double milli = v->toNumber(exec);
    10251025    if (isnan(milli))
    1026         return jsString("Invalid Date");
    1027 
    1028     GregorianDateTime t;
    1029     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1030     return jsString(formatDate(t));
     1026        return jsString(exec, "Invalid Date");
     1027
     1028    GregorianDateTime t;
     1029    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1030    return jsString(exec, formatDate(t));
    10311031}
    10321032
     
    10421042    double milli = v->toNumber(exec);
    10431043    if (isnan(milli))
    1044         return jsString("Invalid Date");
    1045 
    1046     GregorianDateTime t;
    1047     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1048     return jsString(formatTime(t, utc));
     1044        return jsString(exec, "Invalid Date");
     1045
     1046    GregorianDateTime t;
     1047    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1048    return jsString(exec, formatTime(t, utc));
    10491049}
    10501050
     
    10581058    double milli = v->toNumber(exec);
    10591059    if (isnan(milli))
    1060         return jsString("Invalid Date");
     1060        return jsString(exec, "Invalid Date");
    10611061
    10621062#if PLATFORM(MAC)
    10631063    double secs = floor(milli / msPerSecond);
    1064     return jsString(formatLocaleDate(exec, secs, true, true, args));
     1064    return jsString(exec, formatLocaleDate(exec, secs, true, true, args));
    10651065#else
    10661066    UNUSED_PARAM(args);
     
    10701070    GregorianDateTime t;
    10711071    thisDateObj->msToGregorianDateTime(milli, utc, t);
    1072     return formatLocaleDate(t, LocaleDateAndTime);
     1072    return formatLocaleDate(exec, t, LocaleDateAndTime);
    10731073#endif
    10741074}
     
    10831083    double milli = v->toNumber(exec);
    10841084    if (isnan(milli))
    1085         return jsString("Invalid Date");
     1085        return jsString(exec, "Invalid Date");
    10861086
    10871087#if PLATFORM(MAC)
    10881088    double secs = floor(milli / msPerSecond);
    1089     return jsString(formatLocaleDate(exec, secs, true, false, args));
     1089    return jsString(exec, formatLocaleDate(exec, secs, true, false, args));
    10901090#else
    10911091    UNUSED_PARAM(args);
     
    10951095    GregorianDateTime t;
    10961096    thisDateObj->msToGregorianDateTime(milli, utc, t);
    1097     return formatLocaleDate(t, LocaleDate);
     1097    return formatLocaleDate(exec, t, LocaleDate);
    10981098#endif
    10991099}
     
    11081108    double milli = v->toNumber(exec);
    11091109    if (isnan(milli))
    1110         return jsString("Invalid Date");
     1110        return jsString(exec, "Invalid Date");
    11111111
    11121112#if PLATFORM(MAC)
    11131113    double secs = floor(milli / msPerSecond);
    1114     return jsString(formatLocaleDate(exec, secs, false, true, args));
     1114    return jsString(exec, formatLocaleDate(exec, secs, false, true, args));
    11151115#else
    11161116    UNUSED_PARAM(args);
     
    11201120    GregorianDateTime t;
    11211121    thisDateObj->msToGregorianDateTime(milli, utc, t);
    1122     return formatLocaleDate(t, LocaleTime);
     1122    return formatLocaleDate(exec, t, LocaleTime);
    11231123#endif
    11241124}
     
    11331133    double milli = v->toNumber(exec);
    11341134    if (isnan(milli))
    1135         return jsNaN();
    1136 
    1137     return jsNumber(milli);
     1135        return jsNaN(exec);
     1136
     1137    return jsNumber(exec, milli);
    11381138}
    11391139
     
    11471147    double milli = v->toNumber(exec);
    11481148    if (isnan(milli))
    1149         return jsNaN();
    1150 
    1151     return jsNumber(milli);
     1149        return jsNaN(exec);
     1150
     1151    return jsNumber(exec, milli);
    11521152}
    11531153
     
    11631163    double milli = v->toNumber(exec);
    11641164    if (isnan(milli))
    1165         return jsNaN();
    1166 
    1167     GregorianDateTime t;
    1168     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1169     return jsNumber(1900 + t.year);
     1165        return jsNaN(exec);
     1166
     1167    GregorianDateTime t;
     1168    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1169    return jsNumber(exec, 1900 + t.year);
    11701170}
    11711171
     
    11811181    double milli = v->toNumber(exec);
    11821182    if (isnan(milli))
    1183         return jsNaN();
    1184 
    1185     GregorianDateTime t;
    1186     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1187     return jsNumber(1900 + t.year);
     1183        return jsNaN(exec);
     1184
     1185    GregorianDateTime t;
     1186    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1187    return jsNumber(exec, 1900 + t.year);
    11881188}
    11891189
     
    11991199    double milli = v->toNumber(exec);
    12001200    if (isnan(milli))
    1201         return jsString("Invalid Date");
    1202 
    1203     GregorianDateTime t;
    1204     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1205     return jsString(formatDateUTCVariant(t) + " " + formatTime(t, utc));
     1201        return jsString(exec, "Invalid Date");
     1202
     1203    GregorianDateTime t;
     1204    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1205    return jsString(exec, formatDateUTCVariant(t) + " " + formatTime(t, utc));
    12061206}
    12071207
     
    12171217    double milli = v->toNumber(exec);
    12181218    if (isnan(milli))
    1219         return jsNaN();
    1220 
    1221     GregorianDateTime t;
    1222     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1223     return jsNumber(t.month);
     1219        return jsNaN(exec);
     1220
     1221    GregorianDateTime t;
     1222    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1223    return jsNumber(exec, t.month);
    12241224}
    12251225
     
    12351235    double milli = v->toNumber(exec);
    12361236    if (isnan(milli))
    1237         return jsNaN();
    1238 
    1239     GregorianDateTime t;
    1240     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1241     return jsNumber(t.month);
     1237        return jsNaN(exec);
     1238
     1239    GregorianDateTime t;
     1240    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1241    return jsNumber(exec, t.month);
    12421242}
    12431243
     
    12531253    double milli = v->toNumber(exec);
    12541254    if (isnan(milli))
    1255         return jsNaN();
    1256 
    1257     GregorianDateTime t;
    1258     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1259     return jsNumber(t.monthDay);
     1255        return jsNaN(exec);
     1256
     1257    GregorianDateTime t;
     1258    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1259    return jsNumber(exec, t.monthDay);
    12601260}
    12611261
     
    12711271    double milli = v->toNumber(exec);
    12721272    if (isnan(milli))
    1273         return jsNaN();
    1274 
    1275     GregorianDateTime t;
    1276     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1277     return jsNumber(t.monthDay);
     1273        return jsNaN(exec);
     1274
     1275    GregorianDateTime t;
     1276    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1277    return jsNumber(exec, t.monthDay);
    12781278}
    12791279
     
    12891289    double milli = v->toNumber(exec);
    12901290    if (isnan(milli))
    1291         return jsNaN();
    1292 
    1293     GregorianDateTime t;
    1294     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1295     return jsNumber(t.weekDay);
     1291        return jsNaN(exec);
     1292
     1293    GregorianDateTime t;
     1294    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1295    return jsNumber(exec, t.weekDay);
    12961296}
    12971297
     
    13071307    double milli = v->toNumber(exec);
    13081308    if (isnan(milli))
    1309         return jsNaN();
    1310 
    1311     GregorianDateTime t;
    1312     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1313     return jsNumber(t.weekDay);
     1309        return jsNaN(exec);
     1310
     1311    GregorianDateTime t;
     1312    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1313    return jsNumber(exec, t.weekDay);
    13141314}
    13151315
     
    13251325    double milli = v->toNumber(exec);
    13261326    if (isnan(milli))
    1327         return jsNaN();
    1328 
    1329     GregorianDateTime t;
    1330     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1331     return jsNumber(t.hour);
     1327        return jsNaN(exec);
     1328
     1329    GregorianDateTime t;
     1330    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1331    return jsNumber(exec, t.hour);
    13321332}
    13331333
     
    13431343    double milli = v->toNumber(exec);
    13441344    if (isnan(milli))
    1345         return jsNaN();
    1346 
    1347     GregorianDateTime t;
    1348     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1349     return jsNumber(t.hour);
     1345        return jsNaN(exec);
     1346
     1347    GregorianDateTime t;
     1348    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1349    return jsNumber(exec, t.hour);
    13501350}
    13511351
     
    13611361    double milli = v->toNumber(exec);
    13621362    if (isnan(milli))
    1363         return jsNaN();
    1364 
    1365     GregorianDateTime t;
    1366     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1367     return jsNumber(t.minute);
     1363        return jsNaN(exec);
     1364
     1365    GregorianDateTime t;
     1366    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1367    return jsNumber(exec, t.minute);
    13681368}
    13691369
     
    13791379    double milli = v->toNumber(exec);
    13801380    if (isnan(milli))
    1381         return jsNaN();
    1382 
    1383     GregorianDateTime t;
    1384     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1385     return jsNumber(t.minute);
     1381        return jsNaN(exec);
     1382
     1383    GregorianDateTime t;
     1384    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1385    return jsNumber(exec, t.minute);
    13861386}
    13871387
     
    13971397    double milli = v->toNumber(exec);
    13981398    if (isnan(milli))
    1399         return jsNaN();
    1400 
    1401     GregorianDateTime t;
    1402     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1403     return jsNumber(t.second);
     1399        return jsNaN(exec);
     1400
     1401    GregorianDateTime t;
     1402    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1403    return jsNumber(exec, t.second);
    14041404}
    14051405
     
    14151415    double milli = v->toNumber(exec);
    14161416    if (isnan(milli))
    1417         return jsNaN();
    1418 
    1419     GregorianDateTime t;
    1420     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1421     return jsNumber(t.second);
     1417        return jsNaN(exec);
     1418
     1419    GregorianDateTime t;
     1420    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1421    return jsNumber(exec, t.second);
    14221422}
    14231423
     
    14311431    double milli = v->toNumber(exec);
    14321432    if (isnan(milli))
    1433         return jsNaN();
     1433        return jsNaN(exec);
    14341434
    14351435    double secs = floor(milli / msPerSecond);
    14361436    double ms = milli - secs * msPerSecond;
    1437     return jsNumber(ms);
     1437    return jsNumber(exec, ms);
    14381438}
    14391439
     
    14471447    double milli = v->toNumber(exec);
    14481448    if (isnan(milli))
    1449         return jsNaN();
     1449        return jsNaN(exec);
    14501450
    14511451    double secs = floor(milli / msPerSecond);
    14521452    double ms = milli - secs * msPerSecond;
    1453     return jsNumber(ms);
     1453    return jsNumber(exec, ms);
    14541454}
    14551455
     
    14651465    double milli = v->toNumber(exec);
    14661466    if (isnan(milli))
    1467         return jsNaN();
    1468 
    1469     GregorianDateTime t;
    1470     thisDateObj->msToGregorianDateTime(milli, utc, t);
    1471     return jsNumber(-gmtoffset(t) / minutesPerHour);
     1467        return jsNaN(exec);
     1468
     1469    GregorianDateTime t;
     1470    thisDateObj->msToGregorianDateTime(milli, utc, t);
     1471    return jsNumber(exec, -gmtoffset(t) / minutesPerHour);
    14721472}
    14731473
     
    14801480
    14811481    double milli = timeClip(args[0]->toNumber(exec));
    1482     JSValue* result = jsNumber(milli);
     1482    JSValue* result = jsNumber(exec, milli);
    14831483    thisDateObj->setInternalValue(result);
    14841484    return result;
     
    14951495   
    14961496    if (args.isEmpty() || isnan(milli)) {
    1497         JSValue* result = jsNaN();
     1497        JSValue* result = jsNaN(exec);
    14981498        thisDateObj->setInternalValue(result);
    14991499        return result;
     
    15071507
    15081508    if (!fillStructuresUsingTimeArgs(exec, args, numArgsToUse, &ms, &t)) {
    1509         JSValue* result = jsNaN();
     1509        JSValue* result = jsNaN(exec);
    15101510        thisDateObj->setInternalValue(result);
    15111511        return result;
    15121512    }
    15131513   
    1514     JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, inputIsUTC));
     1514    JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, inputIsUTC));
    15151515    thisDateObj->setInternalValue(result);
    15161516    return result;
     
    15241524    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj);
    15251525    if (args.isEmpty()) {
    1526         JSValue* result = jsNaN();
     1526        JSValue* result = jsNaN(exec);
    15271527        thisDateObj->setInternalValue(result);
    15281528        return result;
     
    15451545   
    15461546    if (!fillStructuresUsingDateArgs(exec, args, numArgsToUse, &ms, &t)) {
    1547         JSValue* result = jsNaN();
     1547        JSValue* result = jsNaN(exec);
    15481548        thisDateObj->setInternalValue(result);
    15491549        return result;
    15501550    }
    15511551           
    1552     JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, inputIsUTC));
     1552    JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, inputIsUTC));
    15531553    thisDateObj->setInternalValue(result);
    15541554    return result;
     
    16481648    DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj);     
    16491649    if (args.isEmpty()) {
    1650         JSValue* result = jsNaN();
     1650        JSValue* result = jsNaN(exec);
    16511651        thisDateObj->setInternalValue(result);
    16521652        return result;
     
    16711671    int32_t year = args[0]->toInt32(exec, ok);
    16721672    if (!ok) {
    1673         JSValue* result = jsNaN();
     1673        JSValue* result = jsNaN(exec);
    16741674        thisDateObj->setInternalValue(result);
    16751675        return result;
     
    16771677           
    16781678    t.year = (year > 99 || year < 0) ? year - 1900 : year;
    1679     JSValue* result = jsNumber(gregorianDateTimeToMS(t, ms, utc));
     1679    JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, utc));
    16801680    thisDateObj->setInternalValue(result);
    16811681    return result;
     
    16931693    double milli = v->toNumber(exec);
    16941694    if (isnan(milli))
    1695         return jsNaN();
     1695        return jsNaN(exec);
    16961696
    16971697    GregorianDateTime t;
     
    16991699
    17001700    // NOTE: IE returns the full year even in getYear.
    1701     return jsNumber(t.year);
     1701    return jsNumber(exec, t.year);
    17021702}
    17031703
  • trunk/JavaScriptCore/kjs/error_object.cpp

    r32652 r32807  
    4747    // The constructor will be added later in ErrorObjectImp's constructor
    4848
    49     putDirect(exec->propertyNames().name, jsString("Error"), DontEnum);
    50     putDirect(exec->propertyNames().message, jsString("Unknown error"), DontEnum);
     49    putDirect(exec->propertyNames().name, jsString(exec, "Error"), DontEnum);
     50    putDirect(exec->propertyNames().message, jsString(exec, "Unknown error"), DontEnum);
    5151
    52     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, errorProtoFuncToString), DontEnum);
     52    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, errorProtoFuncToString), DontEnum);
    5353}
    5454
     
    6666        s += ": " + v->toString(exec);
    6767
    68     return jsString(s);
     68    return jsString(exec, s);
    6969}
    7070
     
    7676    // ECMA 15.11.3.1 Error.prototype
    7777    putDirect(exec->propertyNames().prototype, errorProto, DontEnum|DontDelete|ReadOnly);
    78     putDirect(exec->propertyNames().length, jsNumber(1), DontDelete|ReadOnly|DontEnum);
     78    putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum);
    7979}
    8080
     
    8888{
    8989    JSObject* proto = static_cast<JSObject*>(exec->lexicalGlobalObject()->errorPrototype());
    90     JSObject* imp = new ErrorInstance(proto);
     90    JSObject* imp = new (exec) ErrorInstance(proto);
    9191    JSObject* obj(imp);
    9292
    9393    if (!args[0]->isUndefined())
    94         imp->putDirect(exec->propertyNames().message, jsString(args[0]->toString(exec)));
     94        imp->putDirect(exec->propertyNames().message, jsString(exec, args[0]->toString(exec)));
    9595
    9696    return obj;
     
    109109    : JSObject(errorProto)
    110110{
    111     putDirect(exec->propertyNames().name, jsString(name), 0);
    112     putDirect(exec->propertyNames().message, jsString(message), 0);
     111    putDirect(exec->propertyNames().name, jsString(exec, name), 0);
     112    putDirect(exec->propertyNames().message, jsString(exec, message), 0);
    113113}
    114114
     
    121121    , proto(prot)
    122122{
    123     putDirect(exec->propertyNames().length, jsNumber(1), DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5
     123    putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5
    124124    putDirect(exec->propertyNames().prototype, proto, DontDelete|ReadOnly|DontEnum);
    125125}
     
    132132JSObject* NativeErrorImp::construct(ExecState* exec, const List& args)
    133133{
    134     JSObject* imp = new ErrorInstance(proto);
     134    JSObject* imp = new (exec) ErrorInstance(proto);
    135135    JSObject* obj(imp);
    136136    if (!args[0]->isUndefined())
    137         imp->putDirect(exec->propertyNames().message, jsString(args[0]->toString(exec)));
     137        imp->putDirect(exec->propertyNames().message, jsString(exec, args[0]->toString(exec)));
    138138    return obj;
    139139}
  • trunk/JavaScriptCore/kjs/function.cpp

    r32652 r32807  
    123123}
    124124
    125 JSValue* FunctionImp::lengthGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot& slot)
     125JSValue* FunctionImp::lengthGetter(ExecState* exec, JSObject*, const Identifier&, const PropertySlot& slot)
    126126{
    127127    FunctionImp* thisObj = static_cast<FunctionImp*>(slot.slotBase());
    128     return jsNumber(thisObj->body->parameters().size());
     128    return jsNumber(exec, thisObj->body->parameters().size());
    129129}
    130130
     
    200200    proto = exec->lexicalGlobalObject()->objectPrototype();
    201201
    202   JSObject* obj(new JSObject(proto));
     202  JSObject* obj(new (exec) JSObject(proto));
    203203
    204204  JSValue* res = call(exec,obj,args);
     
    289289{
    290290    putDirect(exec->propertyNames().callee, func, DontEnum);
    291     putDirect(exec->propertyNames().length, args.size(), DontEnum);
     291    putDirect(exec, exec->propertyNames().length, args.size(), DontEnum);
    292292 
    293293    int i = 0;
     
    465465    // we can retrieve our argument list from the ExecState for our function
    466466    // call instead of storing the list ourselves.
    467     d()->argumentsObject = new Arguments(exec, d()->exec->function(), *d()->exec->arguments(), this);
     467    d()->argumentsObject = new (exec) Arguments(exec, d()->exec->function(), *d()->exec->arguments(), this);
    468468}
    469469
     
    506506    }
    507507  }
    508   return jsString(r);
     508  return jsString(exec, r);
    509509}
    510510
     
    571571    s.append(c);
    572572  }
    573   return jsString(s);
     573  return jsString(exec, s);
    574574}
    575575
     
    765765JSValue* globalFuncParseInt(ExecState* exec, JSObject*, const List& args)
    766766{
    767     return jsNumber(parseInt(args[0]->toString(exec), args[1]->toInt32(exec)));
     767    return jsNumber(exec, parseInt(args[0]->toString(exec), args[1]->toInt32(exec)));
    768768}
    769769
    770770JSValue* globalFuncParseFloat(ExecState* exec, JSObject*, const List& args)
    771771{
    772     return jsNumber(parseFloat(args[0]->toString(exec)));
     772    return jsNumber(exec, parseFloat(args[0]->toString(exec)));
    773773}
    774774
     
    845845    }
    846846
    847     return jsString(r);
     847    return jsString(exec, r);
    848848}
    849849
     
    870870    }
    871871
    872     return jsString(s);
     872    return jsString(exec, s);
    873873}
    874874
     
    890890{
    891891    ASSERT_ARG(function, function);
    892     putDirect(exec->propertyNames().length, jsNumber(len), DontDelete | ReadOnly | DontEnum);
     892    putDirect(exec->propertyNames().length, jsNumber(exec, len), DontDelete | ReadOnly | DontEnum);
    893893}
    894894
     
    898898{
    899899    ASSERT_ARG(function, function);
    900     putDirect(exec->propertyNames().length, jsNumber(len), DontDelete | ReadOnly | DontEnum);
     900    putDirect(exec->propertyNames().length, jsNumber(exec, len), DontDelete | ReadOnly | DontEnum);
    901901}
    902902
     
    915915    ASSERT_ARG(function, function);
    916916    ASSERT_ARG(cachedGlobalObject, cachedGlobalObject);
    917     putDirect(exec->propertyNames().length, jsNumber(len), DontDelete | ReadOnly | DontEnum);
     917    putDirect(exec->propertyNames().length, jsNumber(exec, len), DontDelete | ReadOnly | DontEnum);
    918918}
    919919
  • trunk/JavaScriptCore/kjs/function_object.cpp

    r32652 r32807  
    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(&FunctionImp::info)) {
    7272        FunctionImp* fi = static_cast<FunctionImp*>(thisObj);
    73         return jsString("function " + fi->functionName().ustring() + "(" + fi->body->paramString() + ") " + fi->body->toString());
    74     }
    75 
    76     return jsString("function " + static_cast<InternalFunctionImp*>(thisObj)->functionName().ustring() + "() {\n    [native code]\n}");
     73        return jsString(exec, "function " + fi->functionName().ustring() + "(" + fi->body->paramString() + ") " + fi->body->toString());
     74    }
     75
     76    return jsString(exec, "function " + static_cast<InternalFunctionImp*>(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
     
    169169    Debugger* dbg = exec->dynamicGlobalObject()->debugger();
    170170    if (dbg && !dbg->sourceParsed(exec, sourceId, UString(), body, lineNumber, errLine, errMsg))
    171         return new JSObject();
     171        return new (exec) JSObject();
    172172
    173173    // No program node == syntax error - throw a syntax error
     
    180180    scopeChain.push(exec->lexicalGlobalObject());
    181181
    182     FunctionImp* fimp = new FunctionImp(exec, functionName, functionBody.get(), scopeChain);
     182    FunctionImp* fimp = new (exec) FunctionImp(exec, functionName, functionBody.get(), scopeChain);
    183183
    184184    // parse parameter list. throw syntax error on illegal identifiers
  • trunk/JavaScriptCore/kjs/internal.cpp

    r32652 r32807  
    8181JSObject* StringImp::toObject(ExecState *exec) const
    8282{
    83     return new StringInstance(exec->lexicalGlobalObject()->stringPrototype(), const_cast<StringImp*>(this));
     83    return new (exec) StringInstance(exec->lexicalGlobalObject()->stringPrototype(), const_cast<StringImp*>(this));
    8484}
    8585
  • trunk/JavaScriptCore/kjs/internal.h

    r32609 r32807  
    4646  class StringImp : public JSCell {
    4747  public:
    48     StringImp(const UString& v) : val(v) { Collector::reportExtraMemoryCost(v.cost()); }
     48    StringImp(const UString& v) : val(v) { Heap::heap(this)->reportExtraMemoryCost(v.cost()); }
    4949    enum HasOtherOwnerType { HasOtherOwner };
    5050    StringImp(const UString& value, HasOtherOwnerType) : val(value) { }
     
    6666  class NumberImp : public JSCell {
    6767    friend class ConstantValues;
    68     friend JSValue *jsNumberCell(double);
     68    friend JSValue* jsNumberCell(ExecState*, double);
    6969  public:
    7070    double value() const { return val; }
     
    7979    virtual JSObject *toObject(ExecState *exec) const;
    8080   
    81     void* operator new(size_t size)
     81    void* operator new(size_t size, ExecState* exec)
    8282    {
    83         return Collector::allocateNumber(size);
     83        return exec->heap()->allocateNumber(size);
    8484    }
     85
    8586  private:
    8687    NumberImp(double v) : val(v) { }
  • trunk/JavaScriptCore/kjs/list.cpp

    r29067 r32807  
    3232}
    3333
    34 List::ListSet& List::markSet()
     34void List::markProtectedLists(ListSet& markSet)
    3535{
    36     static ListSet staticMarkSet;
    37     return staticMarkSet;
    38 }
    39 
    40 void List::markProtectedListsSlowCase()
    41 {
    42     ListSet::iterator end = markSet().end();
    43     for (ListSet::iterator it = markSet().begin(); it != end; ++it) {
     36    ListSet::iterator end = markSet.end();
     37    for (ListSet::iterator it = markSet.begin(); it != end; ++it) {
    4438        List* list = *it;
    4539
     
    6660    // our Vector's inline capacity, though, our values move to the
    6761    // heap, where they do need explicit marking.
    68     if (!m_isInMarkSet) {
    69         markSet().add(this);
    70         m_isInMarkSet = true;
     62    if (!m_markSet) {
     63        ListSet& markSet = Heap::threadHeap()->markListSet();
     64        markSet.add(this);
     65        m_markSet = &markSet;
    7166    }
    7267
  • trunk/JavaScriptCore/kjs/list.h

    r29067 r32807  
    4343
    4444        List()
    45             : m_isInMarkSet(false)
     45            : m_markSet(0)
    4646        {
    4747        }
     
    4949        ~List()
    5050        {
    51             if (m_isInMarkSet)
    52                 markSet().remove(this);
     51            if (m_markSet)
     52                m_markSet->remove(this);
    5353        }
    5454
     
    8686        const_iterator end() const { return m_vector.end(); }
    8787
    88         static void markProtectedLists()
    89         {
    90             if (!markSet().size())
    91                 return;
    92             markProtectedListsSlowCase();
    93         }
     88        static void markProtectedLists(ListSet&);
    9489
    9590    private:
    96         static ListSet& markSet();
    97         static void markProtectedListsSlowCase();
    98 
    9991        void expandAndAppend(JSValue*);
    10092
    10193        VectorType m_vector;
    102         bool m_isInMarkSet;
     94        ListSet* m_markSet;
    10395
    10496    private:
  • trunk/JavaScriptCore/kjs/lookup.h

    r32652 r32807  
    9393
    9494      const HashEntry* entry = slot.staticEntry();
    95       JSValue* val = new PrototypeFunction(exec, entry->length, propertyName, entry->functionValue);
     95      JSValue* val = new (exec) PrototypeFunction(exec, entry->length, propertyName, entry->functionValue);
    9696      thisObj->putDirect(propertyName, val, entry->attributes);
    9797      return val;
     
    233233      return static_cast<JSObject* >(obj);
    234234    }
    235     JSObject* newObject = new ClassCtor(exec);
     235    JSObject* newObject = new (exec) ClassCtor(exec);
    236236    globalObject->putDirect(propertyName, newObject, DontEnum);
    237237    return newObject;
  • trunk/JavaScriptCore/kjs/math_object.cpp

    r32652 r32807  
    7777}
    7878
    79 JSValue* MathObjectImp::getValueProperty(ExecState*, int token) const
     79JSValue* MathObjectImp::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 List& 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 List& 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 List& 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 List& 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 List& 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 List& 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 List& 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 jsNumber(NaN);
     203        return jsNumber(exec, NaN);
    204204    if (isinf(arg2) && fabs(arg) == 1)
    205         return jsNumber(NaN);
    206     return jsNumber(pow(arg, arg2));
    207 }
    208 
    209 JSValue* mathProtoFuncRandom(ExecState*, JSObject*, const List&)
     205        return jsNumber(exec, NaN);
     206    return jsNumber(exec, pow(arg, arg2));
     207}
     208
     209JSValue* mathProtoFuncRandom(ExecState* exec, JSObject*, const List&)
    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 List& 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 List& 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 List& args)
    241241{
    242     return jsNumber(tan(args[0]->toNumber(exec)));
     242    return jsNumber(exec, tan(args[0]->toNumber(exec)));
    243243}
    244244
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r32578 r32807  
    361361        JSObject* exception = static_cast<JSObject*>(exceptionValue);
    362362        if (!exception->hasProperty(exec, "line") && !exception->hasProperty(exec, "sourceURL")) {
    363             exception->put(exec, "line", jsNumber(m_line));
    364             exception->put(exec, "sourceURL", jsString(currentSourceURL(exec)));
     363            exception->put(exec, "line", jsNumber(exec, m_line));
     364            exception->put(exec, "sourceURL", jsString(exec, currentSourceURL(exec)));
    365365        }
    366366    }
     
    454454// ------------------------------ NumberNode -----------------------------------
    455455
    456 JSValue* NumberNode::evaluate(ExecState*)
     456JSValue* NumberNode::evaluate(ExecState* exec)
    457457{
    458458    // Number nodes are only created when the number can't fit in a JSImmediate, so no need to check again.
    459     return jsNumberCell(m_double);
     459    return jsNumberCell(exec, m_double);
    460460}
    461461
     
    503503// ------------------------------ StringNode -----------------------------------
    504504
    505 JSValue* StringNode::evaluate(ExecState*)
    506 {
    507     return jsOwnedString(m_value);
     505JSValue* StringNode::evaluate(ExecState* exec)
     506{
     507    return jsOwnedString(exec, m_value);
    508508}
    509509
     
    820820
    821821    if (m_optional)
    822         array->put(exec, exec->propertyNames().length, jsNumber(m_elision + length));
     822        array->put(exec, exec->propertyNames().length, jsNumber(exec, m_elision + length));
    823823
    824824    return array;
     
    15671567            JSObject* base = *iter;
    15681568            JSValue* v = slot.getValue(exec, base, m_ident)->toJSNumber(exec);
    1569             base->put(exec, m_ident, jsNumber(v->toNumber(exec) + 1));
     1569            base->put(exec, m_ident, jsNumber(exec, v->toNumber(exec) + 1));
    15701570            return v;
    15711571        }
     
    15881588    JSValue** slot = &exec->localStorage()[m_index].value;
    15891589    JSValue* v = (*slot)->toJSNumber(exec);
    1590     *slot = jsNumber(v->toNumber(exec) + 1);
     1590    *slot = jsNumber(exec, v->toNumber(exec) + 1);
    15911591    return v;
    15921592}
     
    16281628            JSObject* base = *iter;
    16291629            JSValue* v = slot.getValue(exec, base, m_ident)->toJSNumber(exec);
    1630             base->put(exec, m_ident, jsNumber(v->toNumber(exec) - 1));
     1630            base->put(exec, m_ident, jsNumber(exec, v->toNumber(exec) - 1));
    16311631            return v;
    16321632        }
     
    16491649    JSValue** slot = &exec->localStorage()[m_index].value;
    16501650    JSValue* v = (*slot)->toJSNumber(exec);
    1651     *slot = jsNumber(v->toNumber(exec) - 1);
     1651    *slot = jsNumber(exec, v->toNumber(exec) - 1);
    16521652    return v;
    16531653}
     
    16591659    JSValue** slot = &exec->localStorage()[m_index].value;
    16601660    double n = (*slot)->toNumber(exec);
    1661     *slot = jsNumber(n - 1);
     1661    *slot = jsNumber(exec, n - 1);
    16621662    return n;
    16631663}
     
    17131713
    17141714        JSValue* v2 = v->toJSNumber(exec);
    1715         base->put(exec, propertyIndex, jsNumber(v2->toNumber(exec) + 1));
     1715        base->put(exec, propertyIndex, jsNumber(exec, v2->toNumber(exec) + 1));
    17161716
    17171717        return v2;
     
    17241724
    17251725    JSValue* v2 = v->toJSNumber(exec);
    1726     base->put(exec, propertyName, jsNumber(v2->toNumber(exec) + 1));
     1726    base->put(exec, propertyName, jsNumber(exec, v2->toNumber(exec) + 1));
    17271727    return v2;
    17281728}
     
    17441744
    17451745        JSValue* v2 = v->toJSNumber(exec);
    1746         base->put(exec, propertyIndex, jsNumber(v2->toNumber(exec) - 1));
     1746        base->put(exec, propertyIndex, jsNumber(exec, v2->toNumber(exec) - 1));
    17471747        return v2;
    17481748    }
     
    17541754
    17551755    JSValue* v2 = v->toJSNumber(exec);
    1756     base->put(exec, propertyName, jsNumber(v2->toNumber(exec) - 1));
     1756    base->put(exec, propertyName, jsNumber(exec, v2->toNumber(exec) - 1));
    17571757    return v2;
    17581758}
     
    17761776
    17771777    JSValue* v2 = v->toJSNumber(exec);
    1778     base->put(exec, m_ident, jsNumber(v2->toNumber(exec) + 1));
     1778    base->put(exec, m_ident, jsNumber(exec, v2->toNumber(exec) + 1));
    17791779    return v2;
    17801780}
     
    17911791
    17921792    JSValue* v2 = v->toJSNumber(exec);
    1793     base->put(exec, m_ident, jsNumber(v2->toNumber(exec) - 1));
     1793    base->put(exec, m_ident, jsNumber(exec, v2->toNumber(exec) - 1));
    17941794    return v2;
    17951795}
     
    19281928}
    19291929
    1930 static JSValue* typeStringForValue(JSValue* v) KJS_FAST_CALL;
    1931 static JSValue* typeStringForValue(JSValue* v)
     1930static JSValue* typeStringForValue(ExecState*, JSValue*) KJS_FAST_CALL;
     1931static JSValue* typeStringForValue(ExecState* exec, JSValue* v)
    19321932{
    19331933    switch (v->type()) {
    19341934        case UndefinedType:
    1935             return jsString("undefined");
     1935            return jsString(exec, "undefined");
    19361936        case NullType:
    1937             return jsString("object");
     1937            return jsString(exec, "object");
    19381938        case BooleanType:
    1939             return jsString("boolean");
     1939            return jsString(exec, "boolean");
    19401940        case NumberType:
    1941             return jsString("number");
     1941            return jsString(exec, "number");
    19421942        case StringType:
    1943             return jsString("string");
     1943            return jsString(exec, "string");
    19441944        default:
    19451945            if (v->isObject()) {
     
    19471947                // as null when doing comparisons.
    19481948                if (static_cast<JSObject*>(v)->masqueradeAsUndefined())
    1949                     return jsString("undefined");
     1949                    return jsString(exec, "undefined");
    19501950                else if (static_cast<JSObject*>(v)->implementsCall())
    1951                     return jsString("function");
     1951                    return jsString(exec, "function");
    19521952            }
    19531953
    1954             return jsString("object");
     1954            return jsString(exec, "object");
    19551955    }
    19561956}
     
    19671967    ASSERT(exec->variableObject() == exec->scopeChain().top());
    19681968
    1969     return typeStringForValue(exec->localStorage()[m_index].value);
     1969    return typeStringForValue(exec, exec->localStorage()[m_index].value);
    19701970}
    19711971
     
    19851985        if (base->getPropertySlot(exec, m_ident, slot)) {
    19861986            JSValue* v = slot.getValue(exec, base, m_ident);
    1987             return typeStringForValue(v);
     1987            return typeStringForValue(exec, v);
    19881988        }
    19891989
     
    19911991    } while (iter != end);
    19921992
    1993     return jsString("undefined");
     1993    return jsString(exec, "undefined");
    19941994}
    19951995
     
    20012001    KJS_CHECKEXCEPTIONVALUE
    20022002
    2003     return typeStringForValue(v);
     2003    return typeStringForValue(exec, v);
    20042004}
    20052005
     
    20252025
    20262026    double n = (*slot)->toNumber(exec);
    2027     JSValue* n2 = jsNumber(n + 1);
     2027    JSValue* n2 = jsNumber(exec, n + 1);
    20282028    *slot = n2;
    20292029    return n2;
     
    20482048
    20492049            double n = v->toNumber(exec);
    2050             JSValue* n2 = jsNumber(n + 1);
     2050            JSValue* n2 = jsNumber(exec, n + 1);
    20512051            base->put(exec, m_ident, n2);
    20522052
     
    20772077
    20782078    double n = (*slot)->toNumber(exec);
    2079     JSValue* n2 = jsNumber(n - 1);
     2079    JSValue* n2 = jsNumber(exec, n - 1);
    20802080    *slot = n2;
    20812081    return n2;
     
    21002100
    21012101            double n = v->toNumber(exec);
    2102             JSValue* n2 = jsNumber(n - 1);
     2102            JSValue* n2 = jsNumber(exec, n - 1);
    21032103            base->put(exec, m_ident, n2);
    21042104
     
    21172117{
    21182118    ASSERT(exec->variableObject() == exec->scopeChain().top());
    2119     return jsNumber(exec->localStorage()[m_index].value->toNumber(exec) + 1);
     2119    return jsNumber(exec, exec->localStorage()[m_index].value->toNumber(exec) + 1);
    21202120}
    21212121
     
    21252125{
    21262126    ASSERT(exec->variableObject() == exec->scopeChain().top());
    2127     return jsNumber(exec->localStorage()[m_index].value->toNumber(exec) - 1);
     2127    return jsNumber(exec, exec->localStorage()[m_index].value->toNumber(exec) - 1);
    21282128}
    21292129
     
    21332133{
    21342134    ASSERT(exec->variableObject() == exec->scopeChain().top());
    2135     return jsNumber(exec->localStorage()[m_index].value->toNumber(exec));
     2135    return jsNumber(exec, exec->localStorage()[m_index].value->toNumber(exec));
    21362136}
    21372137
     
    21412141{
    21422142    ASSERT(exec->variableObject() == exec->scopeChain().top());
    2143     return jsNumber(exec->localStorage()[m_index].value->toNumber(exec));
     2143    return jsNumber(exec, exec->localStorage()[m_index].value->toNumber(exec));
    21442144}
    21452145
     
    21672167        KJS_CHECKEXCEPTIONVALUE
    21682168
    2169         JSValue* n2 = jsNumber(v->toNumber(exec) + 1);
     2169        JSValue* n2 = jsNumber(exec, v->toNumber(exec) + 1);
    21702170        base->put(exec, propertyIndex, n2);
    21712171
     
    21782178    KJS_CHECKEXCEPTIONVALUE
    21792179
    2180     JSValue* n2 = jsNumber(v->toNumber(exec) + 1);
     2180    JSValue* n2 = jsNumber(exec, v->toNumber(exec) + 1);
    21812181    base->put(exec, propertyName, n2);
    21822182
     
    21992199        KJS_CHECKEXCEPTIONVALUE
    22002200
    2201         JSValue* n2 = jsNumber(v->toNumber(exec) - 1);
     2201        JSValue* n2 = jsNumber(exec, v->toNumber(exec) - 1);
    22022202        base->put(exec, propertyIndex, n2);
    22032203
     
    22102210    KJS_CHECKEXCEPTIONVALUE
    22112211
    2212     JSValue* n2 = jsNumber(v->toNumber(exec) - 1);
     2212    JSValue* n2 = jsNumber(exec, v->toNumber(exec) - 1);
    22132213    base->put(exec, propertyName, n2);
    22142214
     
    22342234
    22352235    double n = v->toNumber(exec);
    2236     JSValue* n2 = jsNumber(n + 1);
     2236    JSValue* n2 = jsNumber(exec, n + 1);
    22372237    base->put(exec, m_ident, n2);
    22382238
     
    22512251
    22522252    double n = v->toNumber(exec);
    2253     JSValue* n2 = jsNumber(n - 1);
     2253    JSValue* n2 = jsNumber(exec, n - 1);
    22542254    base->put(exec, m_ident, n2);
    22552255
     
    23132313{
    23142314    // No need to check exception, caller will do so right after evaluate()
    2315     return jsNumber(-m_expr->evaluateToNumber(exec));
     2315    return jsNumber(exec, -m_expr->evaluateToNumber(exec));
    23162316}
    23172317
     
    23372337JSValue* BitwiseNotNode::evaluate(ExecState* exec)
    23382338{
    2339     return jsNumber(inlineEvaluateToInt32(exec));
     2339    return jsNumber(exec, inlineEvaluateToInt32(exec));
    23402340}
    23412341
     
    23972397JSValue* MultNode::evaluate(ExecState* exec)
    23982398{
    2399     return jsNumber(inlineEvaluateToNumber(exec));
     2399    return jsNumber(exec, inlineEvaluateToNumber(exec));
    24002400}
    24012401
     
    24382438JSValue* DivNode::evaluate(ExecState* exec)
    24392439{
    2440     return jsNumber(inlineEvaluateToNumber(exec));
     2440    return jsNumber(exec, inlineEvaluateToNumber(exec));
    24412441}
    24422442
     
    24732473JSValue* ModNode::evaluate(ExecState* exec)
    24742474{
    2475     return jsNumber(inlineEvaluateToNumber(exec));
     2475    return jsNumber(exec, inlineEvaluateToNumber(exec));
    24762476}
    24772477
     
    25242524        if (value.isNull())
    25252525            return throwOutOfMemoryError(exec);
    2526         return jsString(value);
    2527     }
    2528 
    2529     return jsNumber(p1->toNumber(exec) + p2->toNumber(exec));
     2526        return jsString(exec, value);
     2527    }
     2528
     2529    return jsNumber(exec, p1->toNumber(exec) + p2->toNumber(exec));
    25302530}
    25312531
     
    25632563
    25642564    if (bothTypes == ((NumberType << 3) | NumberType))
    2565         return jsNumber(v1->toNumber(exec) + v2->toNumber(exec));
     2565        return jsNumber(exec, v1->toNumber(exec) + v2->toNumber(exec));
    25662566    if (bothTypes == ((StringType << 3) | StringType)) {
    25672567        UString value = static_cast<StringImp*>(v1)->value() + static_cast<StringImp*>(v2)->value();
    25682568        if (value.isNull())
    25692569            return throwOutOfMemoryError(exec);
    2570         return jsString(value);
     2570        return jsString(exec, value);
    25712571    }
    25722572
     
    26482648JSValue* AddNumbersNode::evaluate(ExecState* exec)
    26492649{
    2650     return jsNumber(inlineEvaluateToNumber(exec));
     2650    return jsNumber(exec, inlineEvaluateToNumber(exec));
    26512651}
    26522652
     
    26742674    KJS_CHECKEXCEPTIONVALUE
    26752675
    2676     return jsString(static_cast<StringImp*>(v1)->value() + static_cast<StringImp*>(v2)->value());
     2676    return jsString(exec, static_cast<StringImp*>(v1)->value() + static_cast<StringImp*>(v2)->value());
    26772677}
    26782678
     
    26862686
    26872687    JSValue* p2 = v2->toPrimitive(exec, UnspecifiedType);
    2688     return jsString(static_cast<StringImp*>(v1)->value() + p2->toString(exec));
     2688    return jsString(exec, static_cast<StringImp*>(v1)->value() + p2->toString(exec));
    26892689}
    26902690
     
    26982698
    26992699    JSValue* p1 = v1->toPrimitive(exec, UnspecifiedType);
    2700     return jsString(p1->toString(exec) + static_cast<StringImp*>(v2)->value());
     2700    return jsString(exec, p1->toString(exec) + static_cast<StringImp*>(v2)->value());
    27012701}
    27022702
     
    27182718JSValue* SubNode::evaluate(ExecState* exec)
    27192719{
    2720     return jsNumber(inlineEvaluateToNumber(exec));
     2720    return jsNumber(exec, inlineEvaluateToNumber(exec));
    27212721}
    27222722
     
    27552755JSValue* LeftShiftNode::evaluate(ExecState* exec)
    27562756{
    2757     return jsNumber(inlineEvaluateToInt32(exec));
     2757    return jsNumber(exec, inlineEvaluateToInt32(exec));
    27582758}
    27592759
     
    27902790JSValue* RightShiftNode::evaluate(ExecState* exec)
    27912791{
    2792     return jsNumber(inlineEvaluateToInt32(exec));
     2792    return jsNumber(exec, inlineEvaluateToInt32(exec));
    27932793}
    27942794
     
    28252825JSValue* UnsignedRightShiftNode::evaluate(ExecState* exec)
    28262826{
    2827     return jsNumber(inlineEvaluateToUInt32(exec));
     2827    return jsNumber(exec, inlineEvaluateToUInt32(exec));
    28282828}
    28292829
     
    32763276JSValue* BitXOrNode::evaluate(ExecState* exec)
    32773277{
    3278     return jsNumber(inlineEvaluateToInt32(exec));
     3278    return jsNumber(exec, inlineEvaluateToInt32(exec));
    32793279}
    32803280
     
    33153315JSValue* BitOrNode::evaluate(ExecState* exec)
    33163316{
    3317     return jsNumber(inlineEvaluateToInt32(exec));
     3317    return jsNumber(exec, inlineEvaluateToInt32(exec));
    33183318}
    33193319
     
    34453445    switch (oper) {
    34463446        case OpMultEq:
    3447             v = jsNumber(current->toNumber(exec) * right->evaluateToNumber(exec));
     3447            v = jsNumber(exec, current->toNumber(exec) * right->evaluateToNumber(exec));
    34483448            break;
    34493449        case OpDivEq:
    3450             v = jsNumber(current->toNumber(exec) / right->evaluateToNumber(exec));
     3450            v = jsNumber(exec, current->toNumber(exec) / right->evaluateToNumber(exec));
    34513451            break;
    34523452        case OpPlusEq:
     
    34543454            break;
    34553455        case OpMinusEq:
    3456             v = jsNumber(current->toNumber(exec) - right->evaluateToNumber(exec));
     3456            v = jsNumber(exec, current->toNumber(exec) - right->evaluateToNumber(exec));
    34573457            break;
    34583458        case OpLShift:
    34593459            i1 = current->toInt32(exec);
    34603460            i2 = right->evaluateToInt32(exec);
    3461             v = jsNumber(i1 << i2);
     3461            v = jsNumber(exec, i1 << i2);
    34623462            break;
    34633463        case OpRShift:
    34643464            i1 = current->toInt32(exec);
    34653465            i2 = right->evaluateToInt32(exec);
    3466             v = jsNumber(i1 >> i2);
     3466            v = jsNumber(exec, i1 >> i2);
    34673467            break;
    34683468        case OpURShift:
    34693469            ui = current->toUInt32(exec);
    34703470            i2 = right->evaluateToInt32(exec);
    3471             v = jsNumber(ui >> i2);
     3471            v = jsNumber(exec, ui >> i2);
    34723472            break;
    34733473        case OpAndEq:
    34743474            i1 = current->toInt32(exec);
    34753475            i2 = right->evaluateToInt32(exec);
    3476             v = jsNumber(i1 & i2);
     3476            v = jsNumber(exec, i1 & i2);
    34773477            break;
    34783478        case OpXOrEq:
    34793479            i1 = current->toInt32(exec);
    34803480            i2 = right->evaluateToInt32(exec);
    3481             v = jsNumber(i1 ^ i2);
     3481            v = jsNumber(exec, i1 ^ i2);
    34823482            break;
    34833483        case OpOrEq:
    34843484            i1 = current->toInt32(exec);
    34853485            i2 = right->evaluateToInt32(exec);
    3486             v = jsNumber(i1 | i2);
     3486            v = jsNumber(exec, i1 | i2);
    34873487            break;
    34883488        case OpModEq: {
    34893489            double d1 = current->toNumber(exec);
    34903490            double d2 = right->evaluateToNumber(exec);
    3491             v = jsNumber(fmod(d1, d2));
     3491            v = jsNumber(exec, fmod(d1, d2));
    34923492        }
    34933493            break;
     
    42414241            continue;
    42424242
    4243         JSValue* str = jsOwnedString(name.ustring());
     4243        JSValue* str = jsOwnedString(exec, name.ustring());
    42444244
    42454245        if (m_lexpr->isResolveNode()) {
     
    45674567
    45684568    if (m_catchBlock && exec->completionType() == Throw) {
    4569         JSObject* obj = new JSObject;
     4569        JSObject* obj = new (exec) JSObject;
    45704570        obj->putDirect(m_exceptionIdent, result, DontDelete);
    45714571        exec->dynamicGlobalObject()->tearOffActivation(exec);
     
    49274927FunctionImp* FuncDeclNode::makeFunction(ExecState* exec)
    49284928{
    4929     FunctionImp* func = new FunctionImp(exec, m_ident, m_body.get(), exec->scopeChain());
     4929    FunctionImp* func = new (exec) FunctionImp(exec, m_ident, m_body.get(), exec->scopeChain());
    49304930
    49314931    JSObject* proto = exec->lexicalGlobalObject()->objectConstructor()->construct(exec, exec->emptyList());
    49324932    proto->putDirect(exec->propertyNames().constructor, func, DontEnum);
    49334933    func->putDirect(exec->propertyNames().prototype, proto, DontDelete);
    4934     func->putDirect(exec->propertyNames().length, jsNumber(m_body->parameters().size()), ReadOnly | DontDelete | DontEnum);
     4934    func->putDirect(exec->propertyNames().length, jsNumber(exec, m_body->parameters().size()), ReadOnly | DontDelete | DontEnum);
    49354935    return func;
    49364936}
     
    49614961        // but they won't register with the current scope chain and should
    49624962        // be contained as single property in an anonymous object.
    4963         functionScopeObject = new JSObject;
     4963        functionScopeObject = new (exec) JSObject;
    49644964        exec->pushScope(functionScopeObject);
    49654965    }
    49664966
    4967     FunctionImp* func = new FunctionImp(exec, m_ident, m_body.get(), exec->scopeChain());
     4967    FunctionImp* func = new (exec) FunctionImp(exec, m_ident, m_body.get(), exec->scopeChain());
    49684968    JSObject* proto = exec->lexicalGlobalObject()->objectConstructor()->construct(exec, exec->emptyList());
    49694969    proto->putDirect(exec->propertyNames().constructor, func, DontEnum);
  • trunk/JavaScriptCore/kjs/number_object.cpp

    r32652 r32807  
    5656    : NumberInstance(objectPrototype)
    5757{
    58     setInternalValue(jsNumber(0));
     58    setInternalValue(jsNumber(exec, 0));
    5959
    6060    // The constructor will be added later, after NumberObjectImp 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<NumberInstance*>(thisObj)->internalValue()->toString(exec));
     216    return jsString(exec, static_cast<NumberInstance*>(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* NumberObjectImp::getValueProperty(ExecState*, int token) const
     479JSValue* NumberObjectImp::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     NumberInstance* obj = new NumberInstance(proto);
     507    NumberInstance* obj = new (exec) NumberInstance(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/object.cpp

    r32652 r32807  
    167167JSValue *JSObject::get(ExecState *exec, const Identifier &propertyName) const
    168168{
     169  ASSERT(Heap::threadHeap() == Heap::heap(this));
     170
    169171  PropertySlot slot;
    170172
     
    177179JSValue *JSObject::get(ExecState *exec, unsigned propertyName) const
    178180{
     181  ASSERT(Heap::threadHeap() == Heap::heap(this));
     182
    179183  PropertySlot slot;
    180184  if (const_cast<JSObject *>(this)->getPropertySlot(exec, propertyName, slot))
     
    216220{
    217221  ASSERT(value);
     222  ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this));
    218223
    219224  if (propertyName == exec->propertyNames().underscoreProto) {
     
    406411}
    407412
    408 void JSObject::defineGetter(ExecState*, const Identifier& propertyName, JSObject* getterFunc)
     413void JSObject::defineGetter(ExecState* exec, const Identifier& propertyName, JSObject* getterFunc)
    409414{
    410415    JSValue *o = getDirect(propertyName);
     
    414419        gs = static_cast<GetterSetterImp *>(o);
    415420    } else {
    416         gs = new GetterSetterImp;
     421        gs = new (exec) GetterSetterImp;
    417422        putDirect(propertyName, gs, GetterSetter);
    418423    }
     
    422427}
    423428
    424 void JSObject::defineSetter(ExecState*, const Identifier& propertyName, JSObject* setterFunc)
     429void JSObject::defineSetter(ExecState* exec, const Identifier& propertyName, JSObject* setterFunc)
    425430{
    426431    JSValue *o = getDirect(propertyName);
     
    430435        gs = static_cast<GetterSetterImp *>(o);
    431436    } else {
    432         gs = new GetterSetterImp;
     437        gs = new (exec) GetterSetterImp;
    433438        putDirect(propertyName, gs, GetterSetter);
    434439    }
     
    619624}
    620625
    621 void JSObject::putDirect(const Identifier &propertyName, int value, int attr)
    622 {
    623     _prop.put(propertyName, jsNumber(value), attr);
     626void JSObject::putDirect(ExecState* exec, const Identifier &propertyName, int value, int attr)
     627{
     628    _prop.put(propertyName, jsNumber(exec, value), attr);
    624629}
    625630
     
    688693  List args;
    689694  if (message.isEmpty())
    690     args.append(jsString(errorNames[errtype]));
     695    args.append(jsString(exec, errorNames[errtype]));
    691696  else
    692     args.append(jsString(message));
     697    args.append(jsString(exec, message));
    693698  JSObject *err = static_cast<JSObject *>(cons->construct(exec,args));
    694699
    695700  if (lineno != -1)
    696     err->put(exec, "line", jsNumber(lineno));
     701    err->put(exec, "line", jsNumber(exec, lineno));
    697702  if (sourceId != -1)
    698     err->put(exec, "sourceId", jsNumber(sourceId));
     703    err->put(exec, "sourceId", jsNumber(exec, sourceId));
    699704
    700705  if(!sourceURL.isNull())
    701     err->put(exec, "sourceURL", jsString(sourceURL));
     706    err->put(exec, "sourceURL", jsString(exec, sourceURL));
    702707 
    703708  return err;
  • trunk/JavaScriptCore/kjs/object.h

    r32652 r32807  
    433433        { return _prop.getLocation(propertyName); }
    434434    void putDirect(const Identifier &propertyName, JSValue *value, int attr = 0);
    435     void putDirect(const Identifier &propertyName, int value, int attr = 0);
     435    void putDirect(ExecState*, const Identifier &propertyName, int value, int attr = 0);
    436436    void removeDirect(const Identifier &propertyName);
    437437   
  • trunk/JavaScriptCore/kjs/object_object.cpp

    r32652 r32807  
    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 List&)
    126126{
    127     return jsString(thisObj->toString(exec));
     127    return jsString(exec, thisObj->toString(exec));
    128128}
    129129
    130 JSValue* objectProtoFuncToString(ExecState*, JSObject* thisObj, const List&)
     130JSValue* objectProtoFuncToString(ExecState*exec, JSObject* thisObj, const List&)
    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
     
    163163  case NullType:
    164164  case UndefinedType:
    165       return new JSObject(exec->lexicalGlobalObject()->objectPrototype());
     165      return new (exec) JSObject(exec->lexicalGlobalObject()->objectPrototype());
    166166  default:
    167167      ASSERT_NOT_REACHED();
  • trunk/JavaScriptCore/kjs/property_map.h

    r32587 r32807  
    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 {
     
    11089    {
    11190    }
    112 
    113     inline SavedProperty::SavedProperty()
    114 #ifndef NDEBUG
    115         : m_name(0)
    116         , m_value(0)
    117         , m_attributes(0)
    118 #endif
    119     {
    120     }
    121 
    122     inline void SavedProperty::init(UString::Rep* name, JSValue* value, unsigned attributes)
    123     {
    124         ASSERT(name);
    125         ASSERT(value);
    126 
    127         ASSERT(!m_name);
    128         ASSERT(!m_value);
    129         ASSERT(!m_attributes);
    130 
    131         m_name = name;
    132         m_value = value;
    133         m_attributes = attributes;
    134         name->ref();
    135         gcProtect(value);
    136     }
    137 
    138     inline SavedProperty::~SavedProperty()
    139     {
    140         ASSERT(m_name);
    141         ASSERT(m_value);
    142 
    143         m_name->deref();
    144         gcUnprotect(m_value);
    145     }
    146 
    147     inline UString::Rep* SavedProperty::name() const
    148     {
    149         ASSERT(m_name);
    150         ASSERT(m_value);
    151 
    152         return m_name;
    153     }
    154 
    155     inline JSValue* SavedProperty::value() const
    156     {
    157         ASSERT(m_name);
    158         ASSERT(m_value);
    159 
    160         return m_value;
    161     }
    162 
    163     inline unsigned SavedProperty::attributes() const
    164     {
    165         ASSERT(m_name);
    166         ASSERT(m_value);
    167 
    168         return m_attributes;
    169     }
    170 
    17191} // namespace
    17292
  • trunk/JavaScriptCore/kjs/protect.h

    r14834 r32807  
    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/regexp_object.cpp

    r32652 r32807  
    5252    : JSObject(objectPrototype)
    5353{
    54     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().compile, regExpProtoFuncCompile), DontEnum);
    55     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().exec, regExpProtoFuncExec), DontEnum);
    56     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().test, regExpProtoFuncTest), DontEnum);
    57     putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, regExpProtoFuncToString), DontEnum);
     54    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().compile, regExpProtoFuncCompile), DontEnum);
     55    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().exec, regExpProtoFuncExec), DontEnum);
     56    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().test, regExpProtoFuncTest), DontEnum);
     57    putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, regExpProtoFuncToString), DontEnum);
    5858}
    5959
     
    107107    if (!thisObj->inherits(&RegExpImp::info)) {
    108108        if (thisObj->inherits(&RegExpPrototype::info))
    109             return jsString("//");
     109            return jsString(exec, "//");
    110110        return throwError(exec, TypeError);
    111111    }
     
    118118    if (thisObj->get(exec, exec->propertyNames().multiline)->toBoolean(exec))
    119119        result += "m";
    120     return jsString(result);
     120    return jsString(exec, result);
    121121}
    122122
     
    151151}
    152152
    153 JSValue* RegExpImp::getValueProperty(ExecState*, int token) const
     153JSValue* RegExpImp::getValueProperty(ExecState* exec, int token) const
    154154{
    155155    switch (token) {
     
    161161            return jsBoolean(m_regExp->multiline());
    162162        case Source:
    163             return jsString(m_regExp->pattern());
     163            return jsString(exec, m_regExp->pattern());
    164164        case LastIndex:
    165             return jsNumber(m_lastIndex);
     165            return jsNumber(exec, m_lastIndex);
    166166    }
    167167   
     
    288288
    289289  // no. of arguments for constructor
    290   putDirect(exec->propertyNames().length, jsNumber(2), ReadOnly | DontDelete | DontEnum);
     290  putDirect(exec->propertyNames().length, jsNumber(exec, 2), ReadOnly | DontDelete | DontEnum);
    291291}
    292292
     
    318318{
    319319  unsigned lastNumSubpatterns = d->lastNumSubPatterns;
    320   ArrayInstance* arr = new ArrayInstance(exec->lexicalGlobalObject()->arrayPrototype(), lastNumSubpatterns + 1);
     320  ArrayInstance* arr = new (exec) ArrayInstance(exec->lexicalGlobalObject()->arrayPrototype(), lastNumSubpatterns + 1);
    321321  for (unsigned i = 0; i <= lastNumSubpatterns; ++i) {
    322322    int start = d->lastOvector[2 * i];
    323323    if (start >= 0)
    324       arr->put(exec, i, jsString(d->lastInput.substr(start, d->lastOvector[2 * i + 1] - start)));
    325   }
    326   arr->put(exec, exec->propertyNames().index, jsNumber(d->lastOvector[0]));
    327   arr->put(exec, exec->propertyNames().input, jsString(d->lastInput));
     324      arr->put(exec, i, jsString(exec, d->lastInput.substr(start, d->lastOvector[2 * i + 1] - start)));
     325  }
     326  arr->put(exec, exec->propertyNames().index, jsNumber(exec, d->lastOvector[0]));
     327  arr->put(exec, exec->propertyNames().input, jsString(exec, d->lastInput));
    328328  return arr;
    329329}
    330330
    331 JSValue* RegExpObjectImp::getBackref(unsigned i) const
     331JSValue* RegExpObjectImp::getBackref(ExecState* exec, unsigned i) const
    332332{
    333333  if (d->lastOvector && i <= d->lastNumSubPatterns)
    334     return jsString(d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));
    335   return jsString("");
    336 }
    337 
    338 JSValue* RegExpObjectImp::getLastParen() const
     334    return jsString(exec, d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));
     335  return jsString(exec, "");
     336}
     337
     338JSValue* RegExpObjectImp::getLastParen(ExecState* exec) const
    339339{
    340340  unsigned i = d->lastNumSubPatterns;
    341341  if (i > 0) {
    342342    ASSERT(d->lastOvector);
    343     return jsString(d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));
    344   }
    345   return jsString("");
    346 }
    347 
    348 JSValue *RegExpObjectImp::getLeftContext() const
     343    return jsString(exec, d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));
     344  }
     345  return jsString(exec, "");
     346}
     347
     348JSValue *RegExpObjectImp::getLeftContext(ExecState* exec) const
    349349{
    350350  if (d->lastOvector)
    351     return jsString(d->lastInput.substr(0, d->lastOvector[0]));
    352   return jsString("");
    353 }
    354 
    355 JSValue *RegExpObjectImp::getRightContext() const
     351    return jsString(exec, d->lastInput.substr(0, d->lastOvector[0]));
     352  return jsString(exec, "");
     353}
     354
     355JSValue *RegExpObjectImp::getRightContext(ExecState* exec) const
    356356{
    357357  if (d->lastOvector) {
    358358    UString s = d->lastInput;
    359     return jsString(s.substr(d->lastOvector[1], s.size() - d->lastOvector[1]));
    360   }
    361   return jsString("");
     359    return jsString(exec, s.substr(d->lastOvector[1], s.size() - d->lastOvector[1]));
     360  }
     361  return jsString(exec, "");
    362362}
    363363
     
    367367}
    368368
    369 JSValue *RegExpObjectImp::getValueProperty(ExecState*, int token) const
     369JSValue *RegExpObjectImp::getValueProperty(ExecState* exec, int token) const
    370370{
    371371  switch (token) {
    372372    case Dollar1:
    373       return getBackref(1);
     373      return getBackref(exec, 1);
    374374    case Dollar2:
    375       return getBackref(2);
     375      return getBackref(exec, 2);
    376376    case Dollar3:
    377       return getBackref(3);
     377      return getBackref(exec, 3);
    378378    case Dollar4:
    379       return getBackref(4);
     379      return getBackref(exec, 4);
    380380    case Dollar5:
    381       return getBackref(5);
     381      return getBackref(exec, 5);
    382382    case Dollar6:
    383       return getBackref(6);
     383      return getBackref(exec, 6);
    384384    case Dollar7:
    385       return getBackref(7);
     385      return getBackref(exec, 7);
    386386    case Dollar8:
    387       return getBackref(8);
     387      return getBackref(exec, 8);
    388388    case Dollar9:
    389       return getBackref(9);
     389      return getBackref(exec, 9);
    390390    case Input:
    391       return jsString(d->lastInput);
     391      return jsString(exec, d->lastInput);
    392392    case Multiline:
    393393      return jsBoolean(d->multiline);
    394394    case LastMatch:
    395       return getBackref(0);
     395      return getBackref(exec, 0);
    396396    case LastParen:
    397       return getLastParen();
     397      return getLastParen(exec);
    398398    case LeftContext:
    399       return getLeftContext();
     399      return getLeftContext(exec);
    400400    case RightContext:
    401       return getRightContext();
     401      return getRightContext(exec);
    402402    default:
    403403      ASSERT(0);
    404404  }
    405405
    406   return jsString("");
     406  return jsString(exec, "");
    407407}
    408408
     
    452452{
    453453    return regExp->isValid()
    454         ? new RegExpImp(static_cast<RegExpPrototype*>(exec->lexicalGlobalObject()->regExpPrototype()), regExp)
     454        ? new (exec) RegExpImp(static_cast<RegExpPrototype*>(exec->lexicalGlobalObject()->regExpPrototype()), regExp)
    455455        : throwError(exec, SyntaxError, UString("Invalid regular expression: ").append(regExp->errorMessage()));
    456456}
  • trunk/JavaScriptCore/kjs/regexp_object.h

    r30534 r32807  
    9191
    9292    private:
    93         JSValue* getBackref(unsigned) const;
    94         JSValue* getLastParen() const;
    95         JSValue* getLeftContext() const;
    96         JSValue* getRightContext() const;
     93        JSValue* getBackref(ExecState*, unsigned) const;
     94        JSValue* getLastParen(ExecState*) const;
     95        JSValue* getLeftContext(ExecState*) const;
     96        JSValue* getRightContext(ExecState*) const;
    9797
    9898        OwnPtr<RegExpObjectImpPrivate> d;
  • trunk/JavaScriptCore/kjs/string_object.cpp

    r32652 r32807  
    4141const ClassInfo StringInstance::info = { "String", 0, 0, 0 };
    4242
    43 StringInstance::StringInstance(JSObject *proto)
     43StringInstance::StringInstance(ExecState* exec, JSObject* proto)
    4444  : JSWrapperObject(proto)
    4545{
    46   setInternalValue(jsString(""));
     46  setInternalValue(jsString(exec, ""));
    4747}
    4848
     
    5353}
    5454
    55 StringInstance::StringInstance(JSObject *proto, const UString &string)
     55StringInstance::StringInstance(ExecState* exec, JSObject* proto, const UString &string)
    5656  : JSWrapperObject(proto)
    5757{
    58   setInternalValue(jsString(string));
    59 }
    60 
    61 JSValue *StringInstance::lengthGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot &slot)
    62 {
    63     return jsNumber(static_cast<StringInstance*>(slot.slotBase())->internalValue()->value().size());
    64 }
    65 
    66 JSValue* StringInstance::indexGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot& slot)
    67 {
    68     return jsString(static_cast<StringInstance*>(slot.slotBase())->internalValue()->value().substr(slot.index(), 1));
    69 }
    70 
    71 static JSValue* stringInstanceNumericPropertyGetter(ExecState*, JSObject*, unsigned index, const PropertySlot& slot)
    72 {
    73     return jsString(static_cast<StringInstance*>(slot.slotBase())->internalValue()->value().substr(index, 1));
     58  setInternalValue(jsString(exec, string));
     59}
     60
     61JSValue* StringInstance::lengthGetter(ExecState* exec, JSObject*, const Identifier&, const PropertySlot& slot)
     62{
     63    return jsNumber(exec, static_cast<StringInstance*>(slot.slotBase())->internalValue()->value().size());
     64}
     65
     66JSValue* StringInstance::indexGetter(ExecState* exec, JSObject*, const Identifier&, const PropertySlot& slot)
     67{
     68    return jsString(exec, static_cast<StringInstance*>(slot.slotBase())->internalValue()->value().substr(slot.index(), 1));
     69}
     70
     71static JSValue* stringInstanceNumericPropertyGetter(ExecState* exec, JSObject*, unsigned index, const PropertySlot& slot)
     72{
     73    return jsString(exec, static_cast<StringInstance*>(slot.slotBase())->internalValue()->value().substr(index, 1));
    7474}
    7575
     
    166166// ECMA 15.5.4
    167167StringPrototype::StringPrototype(ExecState* exec, ObjectPrototype* objProto)
    168   : StringInstance(objProto)
     168  : StringInstance(exec, objProto)
    169169{
    170170  // The constructor will be added later, after StringObjectImp has been built
    171   putDirect(exec->propertyNames().length, jsNumber(0), DontDelete | ReadOnly | DontEnum);
     171  putDirect(exec->propertyNames().length, jsNumber(exec, 0), DontDelete | ReadOnly | DontEnum);
    172172}
    173173
     
    345345                args.append(jsUndefined());
    346346              else
    347                 args.append(jsString(source.substr(matchStart, matchLen)));
     347                args.append(jsString(exec, source.substr(matchStart, matchLen)));
    348348          }
    349349         
    350           args.append(jsNumber(completeMatchStart));
     350          args.append(jsNumber(exec, completeMatchStart));
    351351          args.append(sourceVal);
    352352
     
    382382      return sourceVal;
    383383
    384     return jsString(result);
     384    return jsString(exec, result);
    385385  }
    386386 
     
    396396      List args;
    397397     
    398       args.append(jsString(source.substr(matchPos, matchLen)));
    399       args.append(jsNumber(matchPos));
     398      args.append(jsString(exec, source.substr(matchPos, matchLen)));
     399      args.append(jsNumber(exec, matchPos));
    400400      args.append(sourceVal);
    401401     
     
    403403  }
    404404
    405   return jsString(source.substr(0, matchPos) + replacementString + source.substr(matchPos + matchLen));
     405  return jsString(exec, source.substr(0, matchPos) + replacementString + source.substr(matchPos + matchLen));
    406406}
    407407
     
    435435    else
    436436      u = "";
    437     return jsString(u);
     437    return jsString(exec, u);
    438438}
    439439
     
    449449    double dpos = a0->toInteger(exec);
    450450    if (dpos >= 0 && dpos < len)
    451       result = jsNumber(s[static_cast<int>(dpos)]);
     451      result = jsNumber(exec, s[static_cast<int>(dpos)]);
    452452    else
    453       result = jsNaN();
     453      result = jsNaN(exec);
    454454    return result;
    455455}
     
    464464        s += (*it)->toString(exec);
    465465    }
    466     return jsString(s);
     466    return jsString(exec, s);
    467467}
    468468
     
    481481    else if (dpos > len)
    482482        dpos = len;
    483     return jsNumber(s.find(u2, static_cast<int>(dpos)));
     483    return jsNumber(exec, s.find(u2, static_cast<int>(dpos)));
    484484}
    485485
     
    499499    else if (!(dpos <= len)) // true for NaN
    500500        dpos = len;
    501     return jsNumber(s.rfind(u2, static_cast<int>(dpos)));
     501    return jsNumber(exec, s.rfind(u2, static_cast<int>(dpos)));
    502502}
    503503
     
    538538      int lastIndex = 0;
    539539      while (pos >= 0) {
    540         list.append(jsString(u.substr(pos, matchLength)));
     540        list.append(jsString(exec, u.substr(pos, matchLength)));
    541541        lastIndex = pos;
    542542        pos += matchLength == 0 ? 1 : matchLength;
     
    580580    int matchLength;
    581581    regExpObj->performMatch(reg.get(), u, 0, pos, matchLength);
    582     return jsNumber(pos);
     582    return jsNumber(exec, pos);
    583583}
    584584
     
    590590    StringImp* sVal = thisObj->inherits(&StringInstance::info) ?
    591591      static_cast<StringInstance*>(thisObj)->internalValue() :
    592       static_cast<StringImp*>(jsString(s));
     592      static_cast<StringImp*>(jsString(exec, s));
    593593
    594594    JSValue* a0 = args[0];
     
    617617        if (to > len)
    618618            to = len;
    619         return jsString(s.substr(static_cast<int>(from), static_cast<int>(to - from)));
    620     }
    621 
    622     return jsString("");
     619        return jsString(exec, s.substr(static_cast<int>(from), static_cast<int>(to - from)));
     620    }
     621
     622    return jsString(exec, "");
    623623}
    624624
     
    643643      if (u.isEmpty() && reg->match(u, 0) >= 0) {
    644644        // empty string matched by regexp -> empty array
    645         res->put(exec, exec->propertyNames().length, jsNumber(0));
     645        res->put(exec, exec->propertyNames().length, jsNumber(exec, 0));
    646646        return result;
    647647      }
     
    655655        pos = mpos + (mlen == 0 ? 1 : mlen);
    656656        if (mpos != p0 || mlen) {
    657           res->put(exec,i, jsString(u.substr(p0, mpos-p0)));
     657          res->put(exec,i, jsString(exec, u.substr(p0, mpos-p0)));
    658658          p0 = mpos + mlen;
    659659          i++;
     
    664664            res->put(exec, i++, jsUndefined());
    665665          else
    666             res->put(exec, i++, jsString(u.substr(spos, ovector[si * 2 + 1] - spos)));
     666            res->put(exec, i++, jsString(exec, u.substr(spos, ovector[si * 2 + 1] - spos)));
    667667        }
    668668      }
     
    672672        if (u.isEmpty()) {
    673673          // empty separator matches empty string -> empty array
    674           res->put(exec, exec->propertyNames().length, jsNumber(0));
     674          res->put(exec, exec->propertyNames().length, jsNumber(exec, 0));
    675675          return result;
    676676        } else {
    677677          while (static_cast<uint32_t>(i) != limit && i < u.size()-1)
    678             res->put(exec, i++, jsString(u.substr(p0++, 1)));
     678            res->put(exec, i++, jsString(exec, u.substr(p0++, 1)));
    679679        }
    680680      } else {
    681681        while (static_cast<uint32_t>(i) != limit && (pos = u.find(u2, p0)) >= 0) {
    682           res->put(exec, i, jsString(u.substr(p0, pos-p0)));
     682          res->put(exec, i, jsString(exec, u.substr(p0, pos - p0)));
    683683          p0 = pos + u2.size();
    684684          i++;
     
    688688    // add remaining string, if any
    689689    if (static_cast<uint32_t>(i) != limit)
    690       res->put(exec, i++, jsString(u.substr(p0)));
    691     res->put(exec, exec->propertyNames().length, jsNumber(i));
     690      res->put(exec, i++, jsString(exec, u.substr(p0)));
     691    res->put(exec, exec->propertyNames().length, jsNumber(exec, i));
    692692    return result;
    693693}
     
    705705    double length = a1->isUndefined() ? len : a1->toInteger(exec);
    706706    if (start >= len)
    707       return jsString("");
     707      return jsString(exec, "");
    708708    if (length < 0)
    709       return jsString("");
     709      return jsString(exec, "");
    710710    if (start < 0) {
    711711      start += len;
     
    715715    if (length > len)
    716716      length = len;
    717     return jsString(s.substr(static_cast<int>(start), static_cast<int>(length)));
     717    return jsString(exec, s.substr(static_cast<int>(start), static_cast<int>(length)));
    718718}
    719719
     
    748748      start = temp;
    749749    }
    750     return jsString(s.substr((int)start, (int)end-(int)start));
     750    return jsString(exec, s.substr((int)start, (int)end-(int)start));
    751751}
    752752
     
    758758    StringImp* sVal = thisObj->inherits(&StringInstance::info)
    759759        ? static_cast<StringInstance*>(thisObj)->internalValue()
    760         : static_cast<StringImp*>(jsString(s));
     760        : static_cast<StringImp*>(jsString(exec, s));
    761761    int ssize = s.size();
    762762    if (!ssize)
     
    773773    if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0)
    774774        return sVal;
    775     return jsString(UString(buffer.releaseBuffer(), length, false));
     775    return jsString(exec, UString(buffer.releaseBuffer(), length, false));
    776776}
    777777
     
    783783    StringImp* sVal = thisObj->inherits(&StringInstance::info)
    784784        ? static_cast<StringInstance*>(thisObj)->internalValue()
    785         : static_cast<StringImp*>(jsString(s));
     785        : static_cast<StringImp*>(jsString(exec, s));
    786786    int ssize = s.size();
    787787    if (!ssize)
     
    798798    if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0)
    799799        return sVal;
    800     return jsString(UString(buffer.releaseBuffer(), length, false));
     800    return jsString(exec, UString(buffer.releaseBuffer(), length, false));
    801801}
    802802
     
    809809    StringImp* sVal = thisObj->inherits(&StringInstance::info)
    810810        ? static_cast<StringInstance*>(thisObj)->internalValue()
    811         : static_cast<StringImp*>(jsString(s));
     811        : static_cast<StringImp*>(jsString(exec, s));
    812812    int ssize = s.size();
    813813    if (!ssize)
     
    824824    if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0)
    825825        return sVal;
    826     return jsString(UString(buffer.releaseBuffer(), length, false));
     826    return jsString(exec, UString(buffer.releaseBuffer(), length, false));
    827827}
    828828
     
    834834    StringImp* sVal = thisObj->inherits(&StringInstance::info)
    835835        ? static_cast<StringInstance*>(thisObj)->internalValue()
    836         : static_cast<StringImp*>(jsString(s));
     836        : static_cast<StringImp*>(jsString(exec, s));
    837837    int ssize = s.size();
    838838    if (!ssize)
     
    849849    if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0)
    850850        return sVal;
    851     return jsString(UString(buffer.releaseBuffer(), length, false));
     851    return jsString(exec, UString(buffer.releaseBuffer(), length, false));
    852852}
    853853
     
    855855{
    856856    if (args.size() < 1)
    857       return jsNumber(0);
    858 
    859     // This optimizes the common case that thisObj is a StringInstance
    860     UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    861     JSValue* a0 = args[0];
    862     return jsNumber(localeCompare(s, a0->toString(exec)));
     857      return jsNumber(exec, 0);
     858
     859    // This optimizes the common case that thisObj is a StringInstance
     860    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
     861    JSValue* a0 = args[0];
     862    return jsNumber(exec, localeCompare(s, a0->toString(exec)));
    863863}
    864864
     
    867867    // This optimizes the common case that thisObj is a StringInstance
    868868    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    869     return jsString("<big>" + s + "</big>");
     869    return jsString(exec, "<big>" + s + "</big>");
    870870}
    871871
     
    874874    // This optimizes the common case that thisObj is a StringInstance
    875875    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    876     return jsString("<small>" + s + "</small>");
     876    return jsString(exec, "<small>" + s + "</small>");
    877877}
    878878
     
    881881    // This optimizes the common case that thisObj is a StringInstance
    882882    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    883     return jsString("<blink>" + s + "</blink>");
     883    return jsString(exec, "<blink>" + s + "</blink>");
    884884}
    885885
     
    888888    // This optimizes the common case that thisObj is a StringInstance
    889889    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    890     return jsString("<b>" + s + "</b>");
     890    return jsString(exec, "<b>" + s + "</b>");
    891891}
    892892
     
    895895    // This optimizes the common case that thisObj is a StringInstance
    896896    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    897     return jsString("<tt>" + s + "</tt>");
     897    return jsString(exec, "<tt>" + s + "</tt>");
    898898}
    899899
     
    902902    // This optimizes the common case that thisObj is a StringInstance
    903903    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    904     return jsString("<i>" + s + "</i>");
     904    return jsString(exec, "<i>" + s + "</i>");
    905905}
    906906
     
    909909    // This optimizes the common case that thisObj is a StringInstance
    910910    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    911     return jsString("<strike>" + s + "</strike>");
     911    return jsString(exec, "<strike>" + s + "</strike>");
    912912}
    913913
     
    916916    // This optimizes the common case that thisObj is a StringInstance
    917917    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    918     return jsString("<sub>" + s + "</sub>");
     918    return jsString(exec, "<sub>" + s + "</sub>");
    919919}
    920920
     
    923923    // This optimizes the common case that thisObj is a StringInstance
    924924    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    925     return jsString("<sup>" + s + "</sup>");
     925    return jsString(exec, "<sup>" + s + "</sup>");
    926926}
    927927
     
    931931    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    932932    JSValue* a0 = args[0];
    933     return jsString("<font color=\"" + a0->toString(exec) + "\">" + s + "</font>");
     933    return jsString(exec, "<font color=\"" + a0->toString(exec) + "\">" + s + "</font>");
    934934}
    935935
     
    939939    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    940940    JSValue* a0 = args[0];
    941     return jsString("<font size=\"" + a0->toString(exec) + "\">" + s + "</font>");
     941    return jsString(exec, "<font size=\"" + a0->toString(exec) + "\">" + s + "</font>");
    942942}
    943943
     
    947947    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    948948    JSValue* a0 = args[0];
    949     return jsString("<a name=\"" + a0->toString(exec) + "\">" + s + "</a>");
     949    return jsString(exec, "<a name=\"" + a0->toString(exec) + "\">" + s + "</a>");
    950950}
    951951
     
    955955    UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec);
    956956    JSValue* a0 = args[0];
    957     return jsString("<a href=\"" + a0->toString(exec) + "\">" + s + "</a>");
     957    return jsString(exec, "<a href=\"" + a0->toString(exec) + "\">" + s + "</a>");
    958958}
    959959
     
    966966  putDirect(exec->propertyNames().prototype, stringProto, DontEnum|DontDelete|ReadOnly);
    967967
    968   putDirectFunction(new StringObjectFuncImp(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum);
     968  putDirectFunction(new (exec) StringObjectFuncImp(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum);
    969969
    970970  // no. of arguments for constructor
    971   putDirect(exec->propertyNames().length, jsNumber(1), ReadOnly|DontDelete|DontEnum);
     971  putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
    972972}
    973973
     
    983983  JSObject *proto = exec->lexicalGlobalObject()->stringPrototype();
    984984  if (args.size() == 0)
    985     return new StringInstance(proto);
    986   return new StringInstance(proto, args[0]->toString(exec));
     985    return new (exec) StringInstance(exec, proto);
     986  return new (exec) StringInstance(exec, proto, args[0]->toString(exec));
    987987}
    988988
     
    991991{
    992992  if (args.isEmpty())
    993     return jsString("");
     993    return jsString(exec, "");
    994994  else {
    995995    JSValue *v = args[0];
    996     return jsString(v->toString(exec));
     996    return jsString(exec, v->toString(exec));
    997997  }
    998998}
     
    10041004  : InternalFunctionImp(funcProto, name)
    10051005{
    1006   putDirect(exec->propertyNames().length, jsNumber(1), DontDelete|ReadOnly|DontEnum);
     1006  putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum);
    10071007}
    10081008
     
    10221022    s = "";
    10231023
    1024   return jsString(s);
     1024  return jsString(exec, s);
    10251025}
    10261026
  • trunk/JavaScriptCore/kjs/string_object.h

    r30534 r32807  
    3232  class StringInstance : public JSWrapperObject {
    3333  public:
    34     StringInstance(JSObject *proto);
     34    StringInstance(ExecState*, JSObject* proto);
    3535    StringInstance(JSObject *proto, StringImp*);
    36     StringInstance(JSObject *proto, const UString&);
     36    StringInstance(ExecState*, JSObject* proto, const UString&);
    3737
    3838    virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
     
    5858  class StringInstanceThatMasqueradesAsUndefined : public StringInstance {
    5959  public:
    60       StringInstanceThatMasqueradesAsUndefined(JSObject* proto, const UString& string)
    61           : StringInstance(proto, string) { }
     60      StringInstanceThatMasqueradesAsUndefined(ExecState* exec, JSObject* proto, const UString& string)
     61          : StringInstance(exec, proto, string) { }
    6262      virtual bool masqueradeAsUndefined() const { return true; }
    6363      virtual bool toBoolean(ExecState*) const { return false; }
  • trunk/JavaScriptCore/kjs/testkjs.cpp

    r31404 r32807  
    132132GlobalObject::GlobalObject(Vector<UString>& arguments)
    133133{
    134     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, "debug", functionDebug));
    135     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, "print", functionPrint));
    136     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 0, "quit", functionQuit));
    137     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 0, "gc", functionGC));
    138     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, "version", functionVersion));
    139     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, "run", functionRun));
    140     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, "load", functionLoad));
    141     putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 0, "readline", functionReadline));
     134    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, "debug", functionDebug));
     135    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, "print", functionPrint));
     136    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, "quit", functionQuit));
     137    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, "gc", functionGC));
     138    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, "version", functionVersion));
     139    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, "run", functionRun));
     140    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, "load", functionLoad));
     141    putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, "readline", functionReadline));
    142142
    143143    JSObject* array = arrayConstructor()->construct(globalExec(), globalExec()->emptyList());
    144144    for (size_t i = 0; i < arguments.size(); ++i)
    145         array->put(globalExec(), i, jsString(arguments[i]));
     145        array->put(globalExec(), i, jsString(globalExec(), arguments[i]));
    146146    putDirect("arguments", array);
    147147
     
    162162}
    163163
    164 JSValue* functionGC(ExecState*, JSObject*, const List&)
     164JSValue* functionGC(ExecState* exec, JSObject*, const List&)
    165165{
    166166    JSLock lock;
    167     Collector::collect();
     167    exec->heap()->collect();
    168168    return jsUndefined();
    169169}
     
    188188    stopWatch.stop();
    189189
    190     return jsNumber(stopWatch.getElapsedMS());
     190    return jsNumber(exec, stopWatch.getElapsedMS());
    191191}
    192192
     
    203203}
    204204
    205 JSValue* functionReadline(ExecState*, JSObject*, const List&)
     205JSValue* functionReadline(ExecState* exec, JSObject*, const List&)
    206206{
    207207    Vector<char, 256> line;
     
    214214    }
    215215    line.append('\0');
    216     return jsString(line.data());
     216    return jsString(exec, line.data());
    217217}
    218218
     
    346346
    347347#ifndef NDEBUG
    348     Collector::collect();
     348    Heap::threadHeap()->collect();
    349349#endif
    350350
  • trunk/JavaScriptCore/kjs/ustring.h

    r32609 r32807  
    397397// FIXME: this should be size_t but that would cause warnings until we
    398398// fix UString sizes to be size_t instead of int
    399 static const int minShareSize = Collector::minExtraCostSize / sizeof(UChar);
     399static const int minShareSize = Heap::minExtraCostSize / sizeof(UChar);
    400400
    401401inline size_t UString::cost() const
  • trunk/JavaScriptCore/kjs/value.cpp

    r29243 r32807  
    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    return exec->heap()->allocate(size);
    8686}
    8787
     
    208208}
    209209
    210 JSCell* jsString(const char* s)
    211 {
    212     return new StringImp(s ? s : "");
    213 }
    214 
    215 JSCell* jsString(const UString& s)
    216 {
    217     return s.isNull() ? new StringImp("") : new StringImp(s);
    218 }
    219 
    220 JSCell* jsOwnedString(const UString& s)
    221 {
    222     return s.isNull() ? new StringImp("", StringImp::HasOtherOwner) : new StringImp(s, StringImp::HasOtherOwner);
     210JSCell* jsString(ExecState* exec, const char* s)
     211{
     212    return new (exec) StringImp(s ? s : "");
     213}
     214
     215JSCell* jsString(ExecState* exec, const UString& s)
     216{
     217    return s.isNull() ? new (exec) StringImp("") : new (exec) StringImp(s);
     218}
     219
     220JSCell* jsOwnedString(ExecState* exec, const UString& s)
     221{
     222    return s.isNull() ? new (exec) StringImp("", StringImp::HasOtherOwner) : new (exec) StringImp(s, StringImp::HasOtherOwner);
    223223}
    224224
    225225// This method includes a PIC branch to set up the NumberImp's vtable, so we quarantine
    226226// it in a separate function to keep the normal case speedy.
    227 JSValue *jsNumberCell(double d)
    228 {
    229     return new NumberImp(d);
     227JSValue* jsNumberCell(ExecState* exec, double d)
     228{
     229    return new (exec) NumberImp(d);
    230230}
    231231
  • trunk/JavaScriptCore/kjs/value.h

    r31208 r32807  
    4747class JSValue : Noncopyable {
    4848    friend class JSCell; // so it can derive from this class
    49     friend class Collector; // so it can call asCell()
     49    friend class Heap; // so it can call asCell()
    5050
    5151private:
     
    126126
    127127class JSCell : public JSValue {
    128     friend class Collector;
     128    friend class Heap;
    129129    friend class NumberImp;
    130130    friend class StringImp;
     
    164164
    165165    // Garbage collection.
    166     void *operator new(size_t);
     166    void* operator new(size_t, ExecState*);
    167167    virtual void mark();
    168168    bool marked() const;
    169169};
    170170
    171 JSValue *jsNumberCell(double);
    172 
    173 JSCell *jsString(const UString&); // returns empty string if passed null string
    174 JSCell *jsString(const char* = ""); // returns empty string if passed 0
     171JSValue* jsNumberCell(ExecState*, double);
     172
     173JSCell* jsString(ExecState*, const UString&); // returns empty string if passed null string
     174JSCell* jsString(ExecState*, const char* = ""); // returns empty string if passed 0
    175175
    176176// should be used for strings that are owned by an object that will
    177177// likely outlive the JSValue this makes, such as the parse tree or a
    178178// DOM object that contains a UString
    179 JSCell *jsOwnedString(const UString&);
     179JSCell* jsOwnedString(ExecState*, const UString&);
    180180
    181181extern const double NaN;
     
    192192}
    193193
    194 inline JSValue *jsNaN()
    195 {
    196     return jsNumberCell(NaN);
     194inline JSValue* jsNaN(ExecState* exec)
     195{
     196    return jsNumberCell(exec, NaN);
    197197}
    198198
     
    202202}
    203203
    204 ALWAYS_INLINE JSValue* jsNumber(double d)
     204ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, double d)
    205205{
    206206    JSValue* v = JSImmediate::from(d);
    207     return v ? v : jsNumberCell(d);
    208 }
    209 
    210 ALWAYS_INLINE JSValue* jsNumber(int i)
     207    return v ? v : jsNumberCell(exec, d);
     208}
     209
     210ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, int i)
    211211{
    212212    JSValue* v = JSImmediate::from(i);
    213     return v ? v : jsNumberCell(i);
    214 }
    215 
    216 ALWAYS_INLINE JSValue* jsNumber(unsigned i)
     213    return v ? v : jsNumberCell(exec, i);
     214}
     215
     216ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned i)
    217217{
    218218    JSValue* v = JSImmediate::from(i);
    219     return v ? v : jsNumberCell(i);
    220 }
    221 
    222 ALWAYS_INLINE JSValue* jsNumber(long i)
     219    return v ? v : jsNumberCell(exec, i);
     220}
     221
     222ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, long i)
    223223{
    224224    JSValue* v = JSImmediate::from(i);
    225     return v ? v : jsNumberCell(i);
    226 }
    227 
    228 ALWAYS_INLINE JSValue* jsNumber(unsigned long i)
     225    return v ? v : jsNumberCell(exec, i);
     226}
     227
     228ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned long i)
    229229{
    230230    JSValue* v = JSImmediate::from(i);
    231     return v ? v : jsNumberCell(i);
    232 }
    233 
    234 ALWAYS_INLINE JSValue* jsNumber(long long i)
     231    return v ? v : jsNumberCell(exec, i);
     232}
     233
     234ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, long long i)
    235235{
    236236    JSValue* v = JSImmediate::from(i);
    237     return v ? v : jsNumberCell(static_cast<double>(i));
    238 }
    239 
    240 ALWAYS_INLINE JSValue* jsNumber(unsigned long long i)
     237    return v ? v : jsNumberCell(exec, static_cast<double>(i));
     238}
     239
     240ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned long long i)
    241241{
    242242    JSValue* v = JSImmediate::from(i);
    243     return v ? v : jsNumberCell(static_cast<double>(i));
     243    return v ? v : jsNumberCell(exec, static_cast<double>(i));
    244244}
    245245
     
    248248    if (JSImmediate::areBothImmediateNumbers(v1, v2))
    249249        return JSImmediate::andImmediateNumbers(v1, v2);
    250     return jsNumber(v1->toInt32(exec) & v2->toInt32(exec));
     250    return jsNumber(exec, v1->toInt32(exec) & v2->toInt32(exec));
    251251}
    252252
     
    284284inline bool JSCell::marked() const
    285285{
    286     return Collector::isCellMarked(this);
     286    return Heap::isCellMarked(this);
    287287}
    288288
    289289inline void JSCell::mark()
    290290{
    291     return Collector::markCell(this);
     291    return Heap::markCell(this);
    292292}
    293293
     
    446446ALWAYS_INLINE JSValue* JSValue::toJSNumber(ExecState* exec) const
    447447{
    448     return JSImmediate::isNumber(this) ? const_cast<JSValue*>(this) : jsNumber(this->toNumber(exec));
     448    return JSImmediate::isNumber(this) ? const_cast<JSValue*>(this) : jsNumber(exec, this->toNumber(exec));
    449449}
    450450
  • trunk/JavaScriptCore/wtf/ThreadSpecific.h

    r32000 r32807  
    110110    T* ptr = static_cast<T*>(get());
    111111    if (!ptr) {
    112         ptr = new T;
     112        ptr = new T();
    113113        set(ptr);
    114114    }
Note: See TracChangeset for help on using the changeset viewer.