Changeset 32807 in webkit for trunk/JavaScriptCore
- Timestamp:
- May 2, 2008, 3:07:53 AM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 44 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/API/JSBase.cpp
r29663 r32807 80 80 { 81 81 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(); 84 88 // FIXME: Perhaps we should trigger a second mark and sweep 85 89 // once the garbage collector is done if this is called when -
trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h
r32609 r32807 467 467 if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) { 468 468 if (JSObjectCallAsFunctionCallback callAsFunction = entry->callAsFunction) { 469 JSObject* o = new JSCallbackFunction(exec, callAsFunction, propertyName);469 JSObject* o = new (exec) JSCallbackFunction(exec, callAsFunction, propertyName); 470 470 thisObj->putDirect(propertyName, o, entry->attributes); 471 471 return o; -
trunk/JavaScriptCore/API/JSClassRef.cpp
r31872 r32807 163 163 if (!parentPrototype) 164 164 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 destruction165 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 166 166 } 167 167 return cachedPrototype; -
trunk/JavaScriptCore/API/JSObjectRef.cpp
r32609 r32807 75 75 76 76 if (!jsClass) 77 return toRef(new JSObject(exec->lexicalGlobalObject()->objectPrototype())); // slightly more efficient77 return toRef(new (exec) JSObject(exec->lexicalGlobalObject()->objectPrototype())); // slightly more efficient 78 78 79 79 JSValue* jsPrototype = jsClass->prototype(ctx); … … 81 81 jsPrototype = exec->lexicalGlobalObject()->objectPrototype(); 82 82 83 return toRef(new JSCallbackObject<JSObject>(exec, jsClass, jsPrototype, data));83 return toRef(new (exec) JSCallbackObject<JSObject>(exec, jsClass, jsPrototype, data)); 84 84 } 85 85 … … 90 90 Identifier nameID = name ? Identifier(toJS(name)) : Identifier("anonymous"); 91 91 92 return toRef(new JSCallbackFunction(exec, callAsFunction, nameID));92 return toRef(new (exec) JSCallbackFunction(exec, callAsFunction, nameID)); 93 93 } 94 94 … … 102 102 : exec->dynamicGlobalObject()->objectPrototype(); 103 103 104 JSCallbackConstructor* constructor = new JSCallbackConstructor(exec, jsClass, callAsConstructor);104 JSCallbackConstructor* constructor = new (exec) JSCallbackConstructor(exec, jsClass, callAsConstructor); 105 105 constructor->putDirect(exec->propertyNames().prototype, jsPrototype, DontEnum | DontDelete | ReadOnly); 106 106 return toRef(constructor); … … 119 119 List args; 120 120 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))); 123 123 124 124 JSObject* result = exec->dynamicGlobalObject()->functionConstructor()->construct(exec, args, nameID, UString(sourceURLRep), startingLineNumber); -
trunk/JavaScriptCore/API/JSValueRef.cpp
r29663 r32807 177 177 } 178 178 179 JSValueRef JSValueMakeNumber(JSContextRef , double value)180 { 181 JSLock lock; 182 return toRef(jsNumber( value));183 } 184 185 JSValueRef JSValueMakeString(JSContextRef , JSStringRef string)179 JSValueRef JSValueMakeNumber(JSContextRef ctx, double value) 180 { 181 JSLock lock; 182 return toRef(jsNumber(toJS(ctx), value)); 183 } 184 185 JSValueRef JSValueMakeString(JSContextRef ctx, JSStringRef string) 186 186 { 187 187 JSLock lock; 188 188 UString::Rep* rep = toJS(string); 189 return toRef(jsString( UString(rep)));189 return toRef(jsString(toJS(ctx), UString(rep))); 190 190 } 191 191 -
trunk/JavaScriptCore/ChangeLog
r32805 r32807 1 2008-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 1 362 2008-05-02 Dan Bernstein <[email protected]> 2 363 -
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 1 216 _JSCheckScriptSyntax 2 217 _JSClassCreate … … 4 219 _JSClassRetain 5 220 _JSContextGetGlobalObject 221 _jscore_collector_introspection 222 _jscore_fastmalloc_introspection 6 223 _JSEvaluateScript 7 224 _JSGarbageCollect … … 67 284 _JSValueToStringCopy 68 285 _JSValueUnprotect 286 _kJSClassDefinitionEmpty 69 287 _WTFLog 70 288 _WTFLogVerbose … … 74 292 _WTFReportError 75 293 _WTFReportFatalError 76 __Z12jsRegExpFreeP8JSRegExp77 __Z15jsRegExpCompilePKti24JSRegExpIgnoreCaseOption23JSRegExpMultilineOptionPjPPKc78 __Z15jsRegExpExecutePK8JSRegExpPKtiiPii79 __ZN3KJS10Identifier11addSlowCaseEPNS_7UString3RepE80 __ZN3KJS10Identifier3addEPKc81 __ZN3KJS10Identifier3addEPKti82 __ZN3KJS10Identifier5equalEPKNS_7UString3RepEPKc83 __ZN3KJS10throwErrorEPNS_9ExecStateENS_9ErrorTypeE84 __ZN3KJS10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc85 __ZN3KJS10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringE86 __ZN3KJS11Interpreter11checkSyntaxEPNS_9ExecStateERKNS_7UStringEiPKti87 __ZN3KJS11Interpreter21shouldPrintExceptionsEv88 __ZN3KJS11Interpreter24setShouldPrintExceptionsEb89 __ZN3KJS11Interpreter8evaluateEPNS_9ExecStateERKNS_7UStringEiPKtiPNS_7JSValueE90 __ZN3KJS11Interpreter8evaluateEPNS_9ExecStateERKNS_7UStringEiS5_PNS_7JSValueE91 __ZN3KJS11JSImmediate4typeEPKNS_7JSValueE92 __ZN3KJS11JSImmediate8toObjectEPKNS_7JSValueEPNS_9ExecStateE93 __ZN3KJS11JSImmediate8toStringEPKNS_7JSValueE94 __ZN3KJS11ProgramNode6createEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS4_IPNS_12FuncDeclNodeELm16EEEbb95 __ZN3KJS11PropertyMap11getLocationERKNS_10IdentifierE96 __ZN3KJS11PropertyMap5clearEv97 __ZN3KJS11PropertyMapD1Ev98 __ZN3KJS12DateInstance4infoE99 __ZN3KJS12PropertySlot15undefinedGetterEPNS_9ExecStateEPNS_8JSObjectERKNS_10IdentifierERKS0_100 __ZN3KJS12jsNumberCellEd101 __ZN3KJS13ArrayInstance4infoE102 __ZN3KJS13StatementNode6setLocEii103 __ZN3KJS13jsOwnedStringERKNS_7UStringE104 __ZN3KJS14JSGlobalObject10globalExecEv105 __ZN3KJS14JSGlobalObject16stopTimeoutCheckEv106 __ZN3KJS14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueEj107 __ZN3KJS14JSGlobalObject17startTimeoutCheckEv108 __ZN3KJS14JSGlobalObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE109 __ZN3KJS14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE110 __ZN3KJS14JSGlobalObject4initEPNS_8JSObjectE111 __ZN3KJS14JSGlobalObject4markEv112 __ZN3KJS14JSGlobalObject5resetEPNS_7JSValueE113 __ZN3KJS14JSGlobalObjectD2Ev114 __ZN3KJS14StringInstance14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE115 __ZN3KJS14StringInstance16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE116 __ZN3KJS14StringInstance18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE117 __ZN3KJS14StringInstance18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE118 __ZN3KJS14StringInstance3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE119 __ZN3KJS14StringInstance4infoE120 __ZN3KJS14StringInstanceC1EPNS_8JSObjectERKNS_7UStringE121 __ZN3KJS14StringInstanceC2EPNS_8JSObjectERKNS_7UStringE122 __ZN3KJS15GlobalExecStateC1EPNS_14JSGlobalObjectEPNS_8JSObjectE123 __ZN3KJS15GlobalExecStateD1Ev124 __ZN3KJS15JSWrapperObject4markEv125 __ZN3KJS16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE126 __ZN3KJS16JSVariableObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE127 __ZN3KJS16ParserRefCounted3refEv128 __ZN3KJS16ParserRefCounted5derefEv129 __ZN3KJS17PropertyNameArray3addEPNS_7UString3RepE130 __ZN3KJS17PrototypeFunctionC1EPNS_9ExecStateEPNS_17FunctionPrototypeEiRKNS_10IdentifierEPFPNS_7JSValueES2_PNS_8JSObjectERKNS_4ListEE131 __ZN3KJS17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFPNS_7JSValueES2_PNS_8JSObjectERKNS_4ListEE132 __ZN3KJS19InternalFunctionImp4infoE133 __ZN3KJS19InternalFunctionImpC2EPNS_17FunctionPrototypeERKNS_10IdentifierE134 __ZN3KJS19initializeThreadingEv135 __ZN3KJS23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectERKNS_4ListE136 __ZN3KJS4List15expandAndAppendEPNS_7JSValueE137 __ZN3KJS4List7markSetEv138 __ZN3KJS6JSCell9getObjectEv139 __ZN3KJS6JSCellnwEm140 __ZN3KJS6JSLock12DropAllLocksC1Ev141 __ZN3KJS6JSLock12DropAllLocksD1Ev142 __ZN3KJS6JSLock14registerThreadEv143 __ZN3KJS6JSLock4lockEv144 __ZN3KJS6JSLock6unlockEv145 __ZN3KJS6JSLock9lockCountEv146 __ZN3KJS6Parser5parseEiPKtjPiS3_PNS_7UStringE147 __ZN3KJS6parserEv148 __ZN3KJS6strtodEPKcPPc149 __ZN3KJS7CStringD1Ev150 __ZN3KJS7CStringaSERKS0_151 __ZN3KJS7UString3Rep11computeHashEPKti152 __ZN3KJS7UString3Rep4nullE153 __ZN3KJS7UString3Rep7destroyEv154 __ZN3KJS7UString4fromEj155 __ZN3KJS7UString6appendEPKc156 __ZN3KJS7UString6appendERKS0_157 __ZN3KJS7UStringC1EPKc158 __ZN3KJS7UStringC1EPKti159 __ZN3KJS7UStringC1ERKS0_S2_160 __ZN3KJS7UStringaSEPKc161 __ZN3KJS8Debugger12sourceUnusedEPNS_9ExecStateEi162 __ZN3KJS8Debugger6attachEPNS_14JSGlobalObjectE163 __ZN3KJS8Debugger6detachEPNS_14JSGlobalObjectE164 __ZN3KJS8Debugger9exceptionEPNS_9ExecStateEiiPNS_7JSValueE165 __ZN3KJS8DebuggerC2Ev166 __ZN3KJS8DebuggerD2Ev167 __ZN3KJS8JSObject11hasInstanceEPNS_9ExecStateEPNS_7JSValueE168 __ZN3KJS8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_169 __ZN3KJS8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_170 __ZN3KJS8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE171 __ZN3KJS8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE172 __ZN3KJS8JSObject12removeDirectERKNS_10IdentifierE173 __ZN3KJS8JSObject14callAsFunctionEPNS_9ExecStateEPS0_RKNS_4ListE174 __ZN3KJS8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE175 __ZN3KJS8JSObject14deletePropertyEPNS_9ExecStateEj176 __ZN3KJS8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE177 __ZN3KJS8JSObject17putDirectFunctionEPNS_19InternalFunctionImpEi178 __ZN3KJS8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueEj179 __ZN3KJS8JSObject17putWithAttributesEPNS_9ExecStateEjPNS_7JSValueEj180 __ZN3KJS8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE181 __ZN3KJS8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRPNS_7JSValueE182 __ZN3KJS8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPPNS_7JSValueE183 __ZN3KJS8JSObject3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE184 __ZN3KJS8JSObject3putEPNS_9ExecStateEjPNS_7JSValueE185 __ZN3KJS8JSObject4callEPNS_9ExecStateEPS0_RKNS_4ListE186 __ZN3KJS8JSObject4markEv187 __ZN3KJS8JSObject9constructEPNS_9ExecStateERKNS_4ListE188 __ZN3KJS8JSObject9constructEPNS_9ExecStateERKNS_4ListERKNS_10IdentifierERKNS_7UStringEi189 __ZN3KJS8JSObject9putDirectERKNS_10IdentifierEPNS_7JSValueEi190 __ZN3KJS8JSObject9putDirectERKNS_10IdentifierEii191 __ZN3KJS8Profiler13stopProfilingEv192 __ZN3KJS8Profiler14startProfilingEj193 __ZN3KJS8Profiler8profilerEv194 __ZN3KJS8jsStringEPKc195 __ZN3KJS8jsStringERKNS_7UStringE196 __ZN3KJS9Collector15recordExtraCostEm197 __ZN3KJS9Collector17globalObjectCountEv198 __ZN3KJS9Collector20protectedObjectCountEv199 __ZN3KJS9Collector23collectOnMainThreadOnlyEPNS_7JSValueE200 __ZN3KJS9Collector25protectedObjectTypeCountsEv201 __ZN3KJS9Collector26protectedGlobalObjectCountEv202 __ZN3KJS9Collector4sizeEv203 __ZN3KJS9Collector7collectEv204 __ZN3KJS9Collector7protectEPNS_7JSValueE205 __ZN3KJS9Collector9unprotectEPNS_7JSValueE206 __ZN3KJSeqERKNS_7UStringEPKc207 __ZN3WTF10fastCallocEmm208 __ZN3WTF10fastMallocEm209 __ZN3WTF11fastReallocEPvm210 __ZN3WTF12createThreadEPFPvS0_ES0_211 __ZN3WTF12detachThreadEj212 __ZN3WTF12isMainThreadEv213 __ZN3WTF13currentThreadEv214 __ZN3WTF15ThreadCondition4waitERNS_5MutexE215 __ZN3WTF15ThreadCondition6signalEv216 __ZN3WTF15ThreadCondition9broadcastEv217 __ZN3WTF15ThreadCondition9timedWaitERNS_5MutexEd218 __ZN3WTF15ThreadConditionC1Ev219 __ZN3WTF15ThreadConditionD1Ev220 __ZN3WTF16callOnMainThreadEPFvPvES0_221 __ZN3WTF16fastZeroedMallocEm222 __ZN3WTF19initializeThreadingEv223 __ZN3WTF23waitForThreadCompletionEjPPv224 __ZN3WTF32atomicallyInitializedStaticMutexE225 __ZN3WTF5Mutex4lockEv226 __ZN3WTF5Mutex6unlockEv227 __ZN3WTF5Mutex7tryLockEv228 __ZN3WTF5MutexC1Ev229 __ZN3WTF5MutexD1Ev230 __ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b231 __ZN3WTF8Collator18setOrderLowerFirstEb232 __ZN3WTF8CollatorC1EPKc233 __ZN3WTF8CollatorD1Ev234 __ZN3WTF8fastFreeEPv235 __ZNK3KJS11PropertyMap3getERKNS_10IdentifierE236 __ZNK3KJS12DateInstance7getTimeERdRi237 __ZNK3KJS13ArrayInstance7getItemEj238 __ZNK3KJS14JSGlobalObject14isDynamicScopeEv239 __ZNK3KJS14JSGlobalObject14toGlobalObjectEPNS_9ExecStateE240 __ZNK3KJS16JSVariableObject16isVariableObjectEv241 __ZNK3KJS16JSVariableObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj242 __ZNK3KJS19InternalFunctionImp14implementsCallEv243 __ZNK3KJS19InternalFunctionImp21implementsHasInstanceEv244 __ZNK3KJS4List8getSliceEiRS0_245 __ZNK3KJS4Node8toStringEv246 __ZNK3KJS6JSCell17getTruncatedInt32ERi247 __ZNK3KJS6JSCell18getTruncatedUInt32ERj248 __ZNK3KJS6JSCell9getNumberERd249 __ZNK3KJS6JSCell9getNumberEv250 __ZNK3KJS6JSCell9getStringERNS_7UStringE251 __ZNK3KJS6JSCell9getStringEv252 __ZNK3KJS6JSCell9getUInt32ERj253 __ZNK3KJS7JSValue15toInt32SlowCaseEPNS_9ExecStateERb254 __ZNK3KJS7JSValue16toUInt32SlowCaseEPNS_9ExecStateERb255 __ZNK3KJS7JSValue7toFloatEPNS_9ExecStateE256 __ZNK3KJS7JSValue9toIntegerEPNS_9ExecStateE257 __ZNK3KJS7UString10UTF8StringEb258 __ZNK3KJS7UString14toStrictUInt32EPb259 __ZNK3KJS7UString5asciiEv260 __ZNK3KJS7UString6is8BitEv261 __ZNK3KJS7UString8toUInt32EPb262 __ZNK3KJS7UString8toUInt32EPbb263 __ZNK3KJS8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE264 __ZNK3KJS8JSObject11hasPropertyEPNS_9ExecStateEj265 __ZNK3KJS8JSObject12defaultValueEPNS_9ExecStateENS_6JSTypeE266 __ZNK3KJS8JSObject12toThisObjectEPNS_9ExecStateE267 __ZNK3KJS8JSObject14implementsCallEv268 __ZNK3KJS8JSObject14toGlobalObjectEPNS_9ExecStateE269 __ZNK3KJS8JSObject19implementsConstructEv270 __ZNK3KJS8JSObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj271 __ZNK3KJS8JSObject21implementsHasInstanceEv272 __ZNK3KJS8JSObject3getEPNS_9ExecStateERKNS_10IdentifierE273 __ZNK3KJS8JSObject3getEPNS_9ExecStateEj274 __ZNK3KJS8JSObject4typeEv275 __ZNK3KJS8JSObject8toNumberEPNS_9ExecStateE276 __ZNK3KJS8JSObject8toObjectEPNS_9ExecStateE277 __ZNK3KJS8JSObject8toStringEPNS_9ExecStateE278 __ZNK3KJS8JSObject9classInfoEv279 __ZNK3KJS8JSObject9classNameEv280 __ZNK3KJS8JSObject9toBooleanEPNS_9ExecStateE281 __ZNK3KJS8Profiler20printDataSampleStyleEv282 __ZNK3KJS8Profiler23printDataInspectorStyleEv283 __ZNK3KJS9ExecState19lexicalGlobalObjectEv284 __ZNK3KJS9HashTable11createTableEv285 __ZNK3WTF8Collator7collateEPKtmS2_m286 __ZTVN3KJS14JSGlobalObjectE287 __ZTVN3KJS14StringInstanceE288 __ZTVN3KJS15JSWrapperObjectE289 __ZTVN3KJS16JSVariableObjectE290 __ZTVN3KJS19InternalFunctionImpE291 __ZTVN3KJS8JSObjectE292 _jscore_collector_introspection293 _jscore_fastmalloc_introspection294 _kJSClassDefinitionEmpty -
trunk/JavaScriptCore/kjs/ExecState.h
r32654 r32807 59 59 CommonIdentifiers* propertyNames; 60 60 List emptyList; 61 62 Heap* heap; 61 63 }; 62 64 … … 121 123 static const HashTable* stringTable(ExecState* exec) { return exec->m_perThreadData->stringTable; } 122 124 125 Heap* heap() const { return m_perThreadData->heap; } 126 123 127 LocalStorage& localStorage() { return *m_localStorage; } 124 128 void setLocalStorage(LocalStorage* s) { m_localStorage = s; } -
trunk/JavaScriptCore/kjs/InitializeThreading.cpp
r32652 r32807 48 48 if (!s_dtoaP5Mutex) { 49 49 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(); 53 51 UString::null(); 54 52 Identifier::initializeIdentifierThreading(); … … 57 55 initDateMath(); 58 56 JSGlobalObject::threadClassInfoHashTables(); 57 JSGlobalObject::head(); 59 58 } 60 59 #endif -
trunk/JavaScriptCore/kjs/JSGlobalObject.cpp
r32687 r32807 103 103 } 104 104 105 JSGlobalObject* JSGlobalObject::s_head = 0;106 107 105 void JSGlobalObject::deleteActivationStack() 108 106 { … … 123 121 d()->next->d()->prev = d()->prev; 124 122 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; 128 128 129 129 deleteActivationStack(); … … 187 187 } 188 188 189 JSGlobalObject*& 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 189 200 void JSGlobalObject::init(JSObject* thisValue) 190 201 { 191 202 ASSERT(JSLock::currentThreadIsHoldingLock()); 192 203 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; 198 209 } else 199 s_head= d()->next = d()->prev = this;210 headObject = d()->next = d()->prev = this; 200 211 201 212 resetTimeoutCheck(); … … 219 230 d()->perThreadData.stringTable = &threadClassInfoHashTables()->stringTable; 220 231 d()->perThreadData.propertyNames = CommonIdentifiers::shared(); 232 d()->perThreadData.heap = Heap::threadHeap(); 221 233 222 234 d()->globalExec.set(new GlobalExecState(this, thisValue)); … … 236 248 void JSGlobalObject::put(ExecState* exec, const Identifier& propertyName, JSValue* value) 237 249 { 250 ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 251 238 252 if (symbolTablePut(propertyName, value)) 239 253 return; … … 314 328 315 329 // 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); 318 332 d()->functionPrototype->setPrototype(d()->objectPrototype); 319 333 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"); 334 348 335 349 // 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); 352 366 353 367 d()->functionPrototype->putDirect(exec->propertyNames().constructor, d()->functionConstructor, DontEnum); … … 391 405 // Set global values. 392 406 Identifier mathIdent = "Math"; 393 JSValue* mathObject = new MathObjectImp(exec, d()->objectPrototype);407 JSValue* mathObject = new (exec) MathObjectImp(exec, d()->objectPrototype); 394 408 symbolTableInsert(mathIdent, mathObject, DontEnum | DontDelete); 395 409 396 410 Identifier nanIdent = "NaN"; 397 JSValue* nanValue = jsNaN( );411 JSValue* nanValue = jsNaN(exec); 398 412 symbolTableInsert(nanIdent, nanValue, DontEnum | DontDelete); 399 413 400 414 Identifier infinityIdent = "Infinity"; 401 JSValue* infinityValue = jsNumber( Inf);415 JSValue* infinityValue = jsNumber(exec, Inf); 402 416 symbolTableInsert(infinityIdent, infinityValue, DontEnum | DontDelete); 403 417 … … 408 422 // Set global functions. 409 423 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); 411 425 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); 422 436 #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); 424 438 #endif 425 439 … … 552 566 553 567 ASSERT(exec->codeType() == FunctionCode); 554 ActivationImp* newActivation = new ActivationImp(*oldActivation->d(), leaveRelic);568 ActivationImp* newActivation = new (exec) ActivationImp(*oldActivation->d(), leaveRelic); 555 569 556 570 if (!leaveRelic) { … … 572 586 } 573 587 588 void* JSGlobalObject::operator new(size_t size) 589 { 590 return Heap::threadHeap()->allocate(size); 591 } 574 592 575 593 } // namespace KJS -
trunk/JavaScriptCore/kjs/JSGlobalObject.h
r32652 r32807 167 167 virtual void putWithAttributes(ExecState*, const Identifier& propertyName, JSValue* value, unsigned attributes); 168 168 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(); 171 171 JSGlobalObject* next() { return d()->next; } 172 172 … … 256 256 static ThreadClassInfoHashTables* threadClassInfoHashTables(); 257 257 258 void* operator new(size_t); 259 258 260 private: 259 261 void init(JSObject* thisValue); … … 266 268 void deleteActivationStack(); 267 269 void checkActivationCount(); 268 269 static JSGlobalObject* s_head;270 270 }; 271 271 -
trunk/JavaScriptCore/kjs/JSLock.cpp
r21122 r32807 81 81 } 82 82 83 void JSLock::registerThread()84 {85 Collector::registerThread();86 }87 88 83 JSLock::DropAllLocks::DropAllLocks() 89 84 : m_lockCount(0) … … 122 117 } 123 118 124 void JSLock::registerThread()125 {126 }127 128 119 JSLock::DropAllLocks::DropAllLocks() 129 120 { -
trunk/JavaScriptCore/kjs/JSLock.h
r28468 r32807 52 52 { 53 53 lock(); 54 registerThread();55 54 } 56 55 … … 64 63 static int lockCount(); 65 64 static bool currentThreadIsHoldingLock(); 66 67 static void registerThread();68 65 69 66 class DropAllLocks : Noncopyable { -
trunk/JavaScriptCore/kjs/array_instance.cpp
r32652 r32807 77 77 m_storage = static_cast<ArrayStorage*>(fastZeroedMalloc(storageSize(initialCapacity))); 78 78 79 Collector::reportExtraMemoryCost(initialCapacity * sizeof(JSValue*));79 Heap::heap(this)->reportExtraMemoryCost(initialCapacity * sizeof(JSValue*)); 80 80 } 81 81 … … 129 129 } 130 130 131 JSValue* ArrayInstance::lengthGetter(ExecState* , JSObject*, const Identifier&, const PropertySlot& slot)132 { 133 return jsNumber( static_cast<ArrayInstance*>(slot.slotBase())->m_length);131 JSValue* ArrayInstance::lengthGetter(ExecState* exec, JSObject*, const Identifier&, const PropertySlot& slot) 132 { 133 return jsNumber(exec, static_cast<ArrayInstance*>(slot.slotBase())->m_length); 134 134 } 135 135 -
trunk/JavaScriptCore/kjs/array_object.cpp
r32652 r32807 96 96 Vector<UChar, 256> strBuffer; 97 97 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. 99 99 100 100 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); … … 124 124 } 125 125 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)); 127 127 } 128 128 … … 135 135 Vector<UChar, 256> strBuffer; 136 136 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. 138 138 139 139 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); … … 169 169 } 170 170 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)); 172 172 } 173 173 … … 177 177 Vector<UChar, 256> strBuffer; 178 178 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. 180 180 181 181 UChar comma = ','; … … 208 208 } 209 209 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)); 211 211 } 212 212 … … 241 241 ++it; 242 242 } 243 arr->put(exec, exec->propertyNames().length, jsNumber( n));243 arr->put(exec, exec->propertyNames().length, jsNumber(exec, n)); 244 244 return arr; 245 245 } … … 250 250 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); 251 251 if (length == 0) { 252 thisObj->put(exec, exec->propertyNames().length, jsNumber( length));252 thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length)); 253 253 result = jsUndefined(); 254 254 } else { 255 255 result = thisObj->get(exec, length - 1); 256 256 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)); 258 258 } 259 259 return result; … … 266 266 thisObj->put(exec, length + n, args[n]); 267 267 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); 270 270 } 271 271 … … 299 299 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); 300 300 if (length == 0) { 301 thisObj->put(exec, exec->propertyNames().length, jsNumber( length));301 thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length)); 302 302 result = jsUndefined(); 303 303 } else { … … 310 310 } 311 311 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)); 313 313 } 314 314 return result; … … 354 354 resObj->put(exec, n, v); 355 355 } 356 resObj->put(exec, exec->propertyNames().length, jsNumber( n));356 resObj->put(exec, exec->propertyNames().length, jsNumber(exec, n)); 357 357 return result; 358 358 } … … 439 439 resObj->put(exec, k, v); 440 440 } 441 resObj->put(exec, exec->propertyNames().length, jsNumber( deleteCount));441 resObj->put(exec, exec->propertyNames().length, jsNumber(exec, deleteCount)); 442 442 443 443 unsigned additionalArgs = std::max<int>(args.size() - 2, 0); … … 464 464 thisObj->put(exec, k + begin, args[k + 2]); 465 465 466 thisObj->put(exec, exec->propertyNames().length, jsNumber( length - deleteCount + additionalArgs));466 thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - deleteCount + additionalArgs)); 467 467 return result; 468 468 } … … 483 483 for (unsigned k = 0; k < nrArgs; ++k) 484 484 thisObj->put(exec, k, args[k]); 485 JSValue* result = jsNumber( length + nrArgs);485 JSValue* result = jsNumber(exec, length + nrArgs); 486 486 thisObj->put(exec, exec->propertyNames().length, result); 487 487 return result; … … 511 511 512 512 eachArguments.append(v); 513 eachArguments.append(jsNumber( k));513 eachArguments.append(jsNumber(exec, k)); 514 514 eachArguments.append(thisObj); 515 515 … … 533 533 534 534 List mapArgs; 535 mapArgs.append(jsNumber( length));535 mapArgs.append(jsNumber(exec, length)); 536 536 JSObject* resultArray = static_cast<JSObject*>(exec->lexicalGlobalObject()->arrayConstructor()->construct(exec, mapArgs)); 537 537 … … 546 546 547 547 eachArguments.append(v); 548 eachArguments.append(jsNumber( k));548 eachArguments.append(jsNumber(exec, k)); 549 549 eachArguments.append(thisObj); 550 550 … … 582 582 583 583 eachArguments.append(slot.getValue(exec, thisObj, k)); 584 eachArguments.append(jsNumber( k));584 eachArguments.append(jsNumber(exec, k)); 585 585 eachArguments.append(thisObj); 586 586 … … 613 613 List eachArguments; 614 614 eachArguments.append(slot.getValue(exec, thisObj, k)); 615 eachArguments.append(jsNumber( k));615 eachArguments.append(jsNumber(exec, k)); 616 616 eachArguments.append(thisObj); 617 617 … … 640 640 List eachArguments; 641 641 eachArguments.append(slot.getValue(exec, thisObj, k)); 642 eachArguments.append(jsNumber( k));642 eachArguments.append(jsNumber(exec, k)); 643 643 eachArguments.append(thisObj); 644 644 … … 676 676 continue; 677 677 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); 682 682 } 683 683 … … 694 694 d += length; 695 695 if (d < 0) 696 return jsNumber( -1);696 return jsNumber(exec, -1); 697 697 } 698 698 if (d < length) … … 705 705 continue; 706 706 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); 711 711 } 712 712 … … 720 720 721 721 // 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); 723 723 } 724 724 … … 736 736 if (n != args[0]->toNumber(exec)) 737 737 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); 739 739 } 740 740 741 741 // 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); 743 743 } 744 744 -
trunk/JavaScriptCore/kjs/bool_object.cpp
r32652 r32807 51 51 setInternalValue(jsBoolean(false)); 52 52 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); 55 55 } 56 56 … … 68 68 ASSERT(v); 69 69 70 return jsString( v->toString(exec));70 return jsString(exec, v->toString(exec)); 71 71 } 72 72 JSValue* booleanProtoFuncValueOf(ExecState* exec, JSObject* thisObj, const List&) … … 91 91 92 92 // 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); 94 94 } 95 95 … … 102 102 JSObject* BooleanObjectImp::construct(ExecState* exec, const List& args) 103 103 { 104 BooleanInstance* obj(new BooleanInstance(exec->lexicalGlobalObject()->booleanPrototype()));104 BooleanInstance* obj(new (exec) BooleanInstance(exec->lexicalGlobalObject()->booleanPrototype())); 105 105 obj->setInternalValue(jsBoolean(args[0]->toBoolean(exec))); 106 106 return obj; -
trunk/JavaScriptCore/kjs/collector.cpp
r32502 r32807 37 37 #if USE(MULTIPLE_THREADS) 38 38 #include <pthread.h> 39 #include <wtf/ThreadSpecific.h> 39 40 #endif 40 41 … … 75 76 76 77 using std::max; 78 using namespace WTF; 77 79 78 80 namespace KJS { … … 80 82 // tunable parameters 81 83 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 90 Heap::Heap() 91 { 92 memset(this, 0, sizeof(Heap)); 93 } 94 95 Heap* 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 106 static NEVER_INLINE CollectorBlock* allocateBlock() 96 107 { 97 108 #if PLATFORM(DARWIN) … … 145 156 } 146 157 147 void Collector::recordExtraCost(size_t cost)158 void Heap::recordExtraCost(size_t cost) 148 159 { 149 160 // Our frequency of garbage collection tries to balance memory use against speed … … 162 173 } 163 174 164 template < Collector::HeapType heapType> struct HeapConstants;165 166 template <> struct HeapConstants< Collector::PrimaryHeap> {175 template <Heap::HeapType heapType> struct HeapConstants; 176 177 template <> struct HeapConstants<Heap::PrimaryHeap> { 167 178 static const size_t cellSize = CELL_SIZE; 168 179 static const size_t cellsPerBlock = CELLS_PER_BLOCK; … … 172 183 }; 173 184 174 template <> struct HeapConstants< Collector::NumberHeap> {185 template <> struct HeapConstants<Heap::NumberHeap> { 175 186 static const size_t cellSize = SMALL_CELL_SIZE; 176 187 static const size_t cellsPerBlock = SMALL_CELLS_PER_BLOCK; … … 180 191 }; 181 192 182 template < Collector::HeapType heapType> void* Collector::heapAllocate(size_t s)193 template <Heap::HeapType heapType> void* Heap::heapAllocate(size_t s) 183 194 { 184 195 typedef typename HeapConstants<heapType>::Block Block; … … 188 199 ASSERT(JSLock::lockCount() > 0); 189 200 ASSERT(JSLock::currentThreadIsHoldingLock()); 201 ASSERT(this == threadHeap()); 190 202 ASSERT(s <= HeapConstants<heapType>::cellSize); 191 203 UNUSED_PARAM(s); // s is now only used for the above assert … … 270 282 targetBlock = (Block*)allocateBlock(); 271 283 targetBlock->freeList = targetBlock->cells; 284 targetBlock->heap = this; 272 285 targetBlockUsedCells = 0; 273 286 heap.blocks[usedBlocks] = (CollectorBlock*)targetBlock; … … 293 306 } 294 307 295 void* Collector::allocate(size_t s)308 void* Heap::allocate(size_t s) 296 309 { 297 310 return heapAllocate<PrimaryHeap>(s); 298 311 } 299 312 300 void* Collector::allocateNumber(size_t s)313 void* Heap::allocateNumber(size_t s) 301 314 { 302 315 return heapAllocate<NumberHeap>(s); … … 359 372 } 360 373 361 #if USE(MULTIPLE_THREADS)362 static pthread_t mainThread;363 #endif364 365 void Collector::registerAsMainThread()366 {367 #if USE(MULTIPLE_THREADS)368 mainThread = pthread_self();369 #endif370 }371 372 static inline bool onMainThread()373 {374 #if USE(MULTIPLE_THREADS)375 #if PLATFORM(DARWIN)376 return pthread_main_np();377 #else378 return !!pthread_equal(pthread_self(), mainThread);379 #endif380 #else381 return true;382 #endif383 }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 #endif396 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 #endif405 }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-register426 // 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(®isteredThreadKey, destroyRegisteredThread);452 }453 454 void Collector::registerThread()455 {456 ASSERT(JSLock::lockCount() > 0);457 ASSERT(JSLock::currentThreadIsHoldingLock());458 459 pthread_once(®isteredThreadKeyOnce, initializeRegisteredThreadKey);460 461 if (!pthread_getspecific(registeredThreadKey)) {462 #if PLATFORM(DARWIN)463 if (onMainThread())464 CollectorHeapIntrospector::init(&primaryHeap, &numberHeap);465 #endif466 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 #endif476 477 374 #define IS_POINTER_ALIGNED(p) (((intptr_t)(p) & (sizeof(char *) - 1)) == 0) 478 375 … … 480 377 #define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0) 481 378 482 void Collector::markStackObjectsConservatively(void *start, void *end)379 void Heap::markStackObjectsConservatively(void *start, void *end) 483 380 { 484 381 if (start > end) { … … 512 409 for (size_t block = 0; block < usedNumberBlocks; block++) { 513 410 if ((numberBlocks[block] == blockAddr) & (offset <= lastCellOffset)) { 514 Collector::markCell(reinterpret_cast<JSCell*>(xAsBits));411 Heap::markCell(reinterpret_cast<JSCell*>(xAsBits)); 515 412 goto endMarkLoop; 516 413 } … … 534 431 } 535 432 536 void NEVER_INLINE Collector::markCurrentThreadConservativelyInternal()433 void NEVER_INLINE Heap::markStackObjectsConservativelyInternal() 537 434 { 538 435 void* dummy; … … 542 439 } 543 440 544 void Collector::markCurrentThreadConservatively()441 void Heap::markStackObjectsConservatively() 545 442 { 546 443 // setjmp forces volatile registers onto the stack … … 555 452 #endif 556 453 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)®s, &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, ®s); 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*)®s, (void*)((char*)®s + 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 457 void Heap::protect(JSValue *k) 722 458 { 723 459 ASSERT(k); … … 728 464 return; 729 465 730 protectedValues ().add(k->asCell());731 } 732 733 void Collector::unprotect(JSValue *k)466 protectedValues.add(k->asCell()); 467 } 468 469 void Heap::unprotect(JSValue *k) 734 470 { 735 471 ASSERT(k); … … 740 476 return; 741 477 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 481 Heap* 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 490 void Heap::markProtectedObjects() 491 { 492 HashCountedSet<JSCell*>::iterator end = protectedValues.end(); 493 for (HashCountedSet<JSCell*>::iterator it = protectedValues.begin(); it != end; ++it) { 764 494 JSCell *val = it->first; 765 495 if (!val->marked()) … … 768 498 } 769 499 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) 500 template <Heap::HeapType heapType> size_t Heap::sweep() 813 501 { 814 502 typedef typename HeapConstants<heapType>::Block Block; 815 503 typedef typename HeapConstants<heapType>::Cell Cell; 816 504 817 UNUSED_PARAM(currentThreadIsMainThread); // currentThreadIsMainThread is only used in ASSERTs818 505 // 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; 820 507 821 508 size_t emptyBlocks = 0; … … 834 521 Cell* cell = curBlock->cells + i; 835 522 836 if (heapType != Collector::NumberHeap) {523 if (heapType != Heap::NumberHeap) { 837 524 JSCell* imp = reinterpret_cast<JSCell*>(cell); 838 525 // special case for allocated but uninitialized object … … 842 529 continue; 843 530 844 ASSERT(currentThreadIsMainThread || !curBlock->collectOnMainThreadOnly.get(i));845 if (curBlock->collectOnMainThreadOnly.get(i)) {846 curBlock->collectOnMainThreadOnly.clear(i);847 --Collector::mainThreadOnlyObjectCount;848 }849 531 imp->~JSCell(); 850 532 } … … 867 549 } else { 868 550 if (!curBlock->marked.get(i >> HeapConstants<heapType>::bitmapShift)) { 869 if (heapType != Collector::NumberHeap) {551 if (heapType != Heap::NumberHeap) { 870 552 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 }876 553 imp->~JSCell(); 877 554 } … … 920 597 } 921 598 922 bool Collector::collect()599 bool Heap::collect() 923 600 { 924 601 ASSERT(JSLock::lockCount() > 0); 925 602 ASSERT(JSLock::currentThreadIsHoldingLock()); 603 ASSERT(this == threadHeap()); 926 604 927 605 ASSERT((primaryHeap.operationInProgress == NoOperation) | (numberHeap.operationInProgress == NoOperation)); … … 932 610 numberHeap.operationInProgress = Collection; 933 611 934 bool currentThreadIsMainThread = onMainThread();935 936 612 // MARK: first mark all referenced objects recursively starting out from the set of root objects 937 613 … … 945 621 markStackObjectsConservatively(); 946 622 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); 952 625 953 626 #ifndef NDEBUG … … 956 629 957 630 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>(); 960 633 961 634 primaryHeap.operationInProgress = NoOperation; … … 965 638 } 966 639 967 size_t Collector::size()640 size_t Heap::size() 968 641 { 969 642 return primaryHeap.numLiveObjects + numberHeap.numLiveObjects; 970 643 } 971 644 972 size_t Collector::globalObjectCount()645 size_t Heap::globalObjectCount() 973 646 { 974 647 size_t count = 0; … … 983 656 } 984 657 985 size_t Collector::protectedGlobalObjectCount()658 size_t Heap::protectedGlobalObjectCount() 986 659 { 987 660 size_t count = 0; … … 989 662 JSGlobalObject* o = JSGlobalObject::head(); 990 663 do { 991 if (protectedValues ().contains(o))664 if (protectedValues.contains(o)) 992 665 ++count; 993 666 o = o->next(); … … 997 670 } 998 671 999 size_t Collector::protectedObjectCount()1000 { 1001 return protectedValues ().size();672 size_t Heap::protectedObjectCount() 673 { 674 return protectedValues.size(); 1002 675 } 1003 676 … … 1035 708 } 1036 709 1037 HashCountedSet<const char*>* Collector::protectedObjectTypeCounts()710 HashCountedSet<const char*>* Heap::protectedObjectTypeCounts() 1038 711 { 1039 712 HashCountedSet<const char*>* counts = new HashCountedSet<const char*>; 1040 713 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) 1044 716 counts->add(typeName(it->first)); 1045 717 … … 1047 719 } 1048 720 1049 bool Collector::isBusy()721 bool Heap::isBusy() 1050 722 { 1051 723 return (primaryHeap.operationInProgress != NoOperation) | (numberHeap.operationInProgress != NoOperation); 1052 724 } 1053 725 1054 void Collector::reportOutOfMemoryToAllExecStates()726 void Heap::reportOutOfMemoryToAllExecStates() 1055 727 { 1056 728 if (!JSGlobalObject::head()) -
trunk/JavaScriptCore/kjs/collector.h
r31787 r32807 27 27 #include <string.h> 28 28 #include <wtf/HashCountedSet.h> 29 #include <wtf/HashSet.h> 30 31 namespace WTF { 32 template<typename T> class ThreadSpecific; 33 } 29 34 30 35 namespace KJS { 31 36 37 class CollectorBlock; 32 38 class JSCell; 33 39 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 { 37 58 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 42 65 43 66 static const size_t minExtraCostSize = 256; 44 67 45 staticvoid reportExtraMemoryCost(size_t cost);46 47 s tatic size_t size();48 49 staticvoid protect(JSValue*);50 staticvoid unprotect(JSValue*);68 void reportExtraMemoryCost(size_t cost); 69 70 size_t size(); 71 72 void protect(JSValue*); 73 void unprotect(JSValue*); 51 74 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(); 63 81 64 82 static bool isCellMarked(const JSCell*); 65 83 static void markCell(JSCell*); 66 84 85 HashSet<List*>& markListSet() { return m_markListSet; } 67 86 enum HeapType { PrimaryHeap, NumberHeap }; 68 87 69 88 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(); 72 96 static const CollectorBlock* cellBlock(const JSCell*); 73 97 static CollectorBlock* cellBlock(JSCell*); 74 98 static size_t cellOffset(const JSCell*); 75 99 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; 90 113 }; 91 114 … … 146 169 CollectorCell* freeList; 147 170 CollectorBitmap marked; 148 CollectorBitmap collectOnMainThreadOnly;171 Heap* heap; 149 172 }; 150 173 … … 155 178 SmallCollectorCell* freeList; 156 179 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) 176 184 { 177 185 return reinterpret_cast<const CollectorBlock*>(reinterpret_cast<uintptr_t>(cell) & BLOCK_MASK); 178 186 } 179 187 180 inline CollectorBlock* Collector::cellBlock(JSCell* cell)188 inline CollectorBlock* Heap::cellBlock(JSCell* cell) 181 189 { 182 190 return const_cast<CollectorBlock*>(cellBlock(const_cast<const JSCell*>(cell))); 183 191 } 184 192 185 inline size_t Collector::cellOffset(const JSCell* cell)193 inline size_t Heap::cellOffset(const JSCell* cell) 186 194 { 187 195 return (reinterpret_cast<uintptr_t>(cell) & BLOCK_OFFSET_MASK) / CELL_SIZE; 188 196 } 189 197 190 inline bool Collector::isCellMarked(const JSCell* cell)198 inline bool Heap::isCellMarked(const JSCell* cell) 191 199 { 192 200 return cellBlock(cell)->marked.get(cellOffset(cell)); 193 201 } 194 202 195 inline void Collector::markCell(JSCell* cell)203 inline void Heap::markCell(JSCell* cell) 196 204 { 197 205 cellBlock(cell)->marked.set(cellOffset(cell)); 198 206 } 199 207 200 inline void Collector::reportExtraMemoryCost(size_t cost)208 inline void Heap::reportExtraMemoryCost(size_t cost) 201 209 { 202 210 if (cost > minExtraCostSize) -
trunk/JavaScriptCore/kjs/date_object.cpp
r32652 r32807 171 171 enum LocaleDateTimeFormat { LocaleDateAndTime, LocaleDate, LocaleTime }; 172 172 173 static JSCell* formatLocaleDate( const GregorianDateTime& gdt, const LocaleDateTimeFormat format)173 static JSCell* formatLocaleDate(ExecState* exec, const GregorianDateTime& gdt, const LocaleDateTimeFormat format) 174 174 { 175 175 static const char* formatStrings[] = {"%#c", "%#x", "%X"}; … … 189 189 190 190 if ( ret == 0 ) 191 return jsString( "");191 return jsString(exec, ""); 192 192 193 193 // Copy original into the buffer … … 203 203 } 204 204 205 return jsString( timebuffer);205 return jsString(exec, timebuffer); 206 206 } 207 207 … … 470 470 // ECMA 15.9.4 471 471 472 DatePrototype::DatePrototype(ExecState *, ObjectPrototype *objectProto)472 DatePrototype::DatePrototype(ExecState* exec, ObjectPrototype *objectProto) 473 473 : DateInstance(objectProto) 474 474 { 475 setInternalValue(jsNaN( ));475 setInternalValue(jsNaN(exec)); 476 476 // The constructor will be added later, after DateObjectImp has been built. 477 477 } … … 490 490 { 491 491 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); 495 495 } 496 496 … … 543 543 } 544 544 545 DateInstance *ret = newDateInstance(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))); 547 547 return ret; 548 548 } 549 549 550 550 // ECMA 15.9.2 551 JSValue *DateObjectImp::callAsFunction(ExecState * /*exec*/, JSObject * /*thisObj*/, const List &/*args*/)551 JSValue* DateObjectImp::callAsFunction(ExecState* exec, JSObject* /*thisObj*/, const List& /*args*/) 552 552 { 553 553 time_t localTime = time(0); … … 555 555 getLocalTime(&localTime, &localTM); 556 556 GregorianDateTime ts(localTM); 557 return jsString( formatDate(ts) + " " + formatTime(ts, false));557 return jsString(exec, formatDate(ts) + " " + formatTime(ts, false)); 558 558 } 559 559 … … 563 563 : InternalFunctionImp(funcProto, name), id(i) 564 564 { 565 putDirect(exec ->propertyNames().length, len, DontDelete|ReadOnly|DontEnum);565 putDirect(exec, exec->propertyNames().length, len, DontDelete|ReadOnly|DontEnum); 566 566 } 567 567 … … 570 570 { 571 571 if (id == Parse) { 572 return jsNumber( parseDate(args[0]->toString(exec)));572 return jsNumber(exec, parseDate(args[0]->toString(exec))); 573 573 } 574 574 else { // UTC … … 581 581 || (n >= 6 && isnan(args[5]->toNumber(exec))) 582 582 || (n >= 7 && isnan(args[6]->toNumber(exec)))) { 583 return jsNaN( );583 return jsNaN(exec); 584 584 } 585 585 … … 593 593 t.second = args[5]->toInt32(exec); 594 594 double ms = (n >= 7) ? args[6]->toNumber(exec) : 0; 595 return jsNumber( gregorianDateTimeToMS(t, ms, true));595 return jsNumber(exec, gregorianDateTimeToMS(t, ms, true)); 596 596 } 597 597 } … … 988 988 double milli = v->toNumber(exec); 989 989 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)); 995 995 } 996 996 … … 1006 1006 double milli = v->toNumber(exec); 1007 1007 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)); 1013 1013 } 1014 1014 … … 1024 1024 double milli = v->toNumber(exec); 1025 1025 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)); 1031 1031 } 1032 1032 … … 1042 1042 double milli = v->toNumber(exec); 1043 1043 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)); 1049 1049 } 1050 1050 … … 1058 1058 double milli = v->toNumber(exec); 1059 1059 if (isnan(milli)) 1060 return jsString( "Invalid Date");1060 return jsString(exec, "Invalid Date"); 1061 1061 1062 1062 #if PLATFORM(MAC) 1063 1063 double secs = floor(milli / msPerSecond); 1064 return jsString( formatLocaleDate(exec, secs, true, true, args));1064 return jsString(exec, formatLocaleDate(exec, secs, true, true, args)); 1065 1065 #else 1066 1066 UNUSED_PARAM(args); … … 1070 1070 GregorianDateTime t; 1071 1071 thisDateObj->msToGregorianDateTime(milli, utc, t); 1072 return formatLocaleDate( t, LocaleDateAndTime);1072 return formatLocaleDate(exec, t, LocaleDateAndTime); 1073 1073 #endif 1074 1074 } … … 1083 1083 double milli = v->toNumber(exec); 1084 1084 if (isnan(milli)) 1085 return jsString( "Invalid Date");1085 return jsString(exec, "Invalid Date"); 1086 1086 1087 1087 #if PLATFORM(MAC) 1088 1088 double secs = floor(milli / msPerSecond); 1089 return jsString( formatLocaleDate(exec, secs, true, false, args));1089 return jsString(exec, formatLocaleDate(exec, secs, true, false, args)); 1090 1090 #else 1091 1091 UNUSED_PARAM(args); … … 1095 1095 GregorianDateTime t; 1096 1096 thisDateObj->msToGregorianDateTime(milli, utc, t); 1097 return formatLocaleDate( t, LocaleDate);1097 return formatLocaleDate(exec, t, LocaleDate); 1098 1098 #endif 1099 1099 } … … 1108 1108 double milli = v->toNumber(exec); 1109 1109 if (isnan(milli)) 1110 return jsString( "Invalid Date");1110 return jsString(exec, "Invalid Date"); 1111 1111 1112 1112 #if PLATFORM(MAC) 1113 1113 double secs = floor(milli / msPerSecond); 1114 return jsString( formatLocaleDate(exec, secs, false, true, args));1114 return jsString(exec, formatLocaleDate(exec, secs, false, true, args)); 1115 1115 #else 1116 1116 UNUSED_PARAM(args); … … 1120 1120 GregorianDateTime t; 1121 1121 thisDateObj->msToGregorianDateTime(milli, utc, t); 1122 return formatLocaleDate( t, LocaleTime);1122 return formatLocaleDate(exec, t, LocaleTime); 1123 1123 #endif 1124 1124 } … … 1133 1133 double milli = v->toNumber(exec); 1134 1134 if (isnan(milli)) 1135 return jsNaN( );1136 1137 return jsNumber( milli);1135 return jsNaN(exec); 1136 1137 return jsNumber(exec, milli); 1138 1138 } 1139 1139 … … 1147 1147 double milli = v->toNumber(exec); 1148 1148 if (isnan(milli)) 1149 return jsNaN( );1150 1151 return jsNumber( milli);1149 return jsNaN(exec); 1150 1151 return jsNumber(exec, milli); 1152 1152 } 1153 1153 … … 1163 1163 double milli = v->toNumber(exec); 1164 1164 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); 1170 1170 } 1171 1171 … … 1181 1181 double milli = v->toNumber(exec); 1182 1182 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); 1188 1188 } 1189 1189 … … 1199 1199 double milli = v->toNumber(exec); 1200 1200 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)); 1206 1206 } 1207 1207 … … 1217 1217 double milli = v->toNumber(exec); 1218 1218 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); 1224 1224 } 1225 1225 … … 1235 1235 double milli = v->toNumber(exec); 1236 1236 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); 1242 1242 } 1243 1243 … … 1253 1253 double milli = v->toNumber(exec); 1254 1254 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); 1260 1260 } 1261 1261 … … 1271 1271 double milli = v->toNumber(exec); 1272 1272 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); 1278 1278 } 1279 1279 … … 1289 1289 double milli = v->toNumber(exec); 1290 1290 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); 1296 1296 } 1297 1297 … … 1307 1307 double milli = v->toNumber(exec); 1308 1308 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); 1314 1314 } 1315 1315 … … 1325 1325 double milli = v->toNumber(exec); 1326 1326 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); 1332 1332 } 1333 1333 … … 1343 1343 double milli = v->toNumber(exec); 1344 1344 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); 1350 1350 } 1351 1351 … … 1361 1361 double milli = v->toNumber(exec); 1362 1362 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); 1368 1368 } 1369 1369 … … 1379 1379 double milli = v->toNumber(exec); 1380 1380 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); 1386 1386 } 1387 1387 … … 1397 1397 double milli = v->toNumber(exec); 1398 1398 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); 1404 1404 } 1405 1405 … … 1415 1415 double milli = v->toNumber(exec); 1416 1416 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); 1422 1422 } 1423 1423 … … 1431 1431 double milli = v->toNumber(exec); 1432 1432 if (isnan(milli)) 1433 return jsNaN( );1433 return jsNaN(exec); 1434 1434 1435 1435 double secs = floor(milli / msPerSecond); 1436 1436 double ms = milli - secs * msPerSecond; 1437 return jsNumber( ms);1437 return jsNumber(exec, ms); 1438 1438 } 1439 1439 … … 1447 1447 double milli = v->toNumber(exec); 1448 1448 if (isnan(milli)) 1449 return jsNaN( );1449 return jsNaN(exec); 1450 1450 1451 1451 double secs = floor(milli / msPerSecond); 1452 1452 double ms = milli - secs * msPerSecond; 1453 return jsNumber( ms);1453 return jsNumber(exec, ms); 1454 1454 } 1455 1455 … … 1465 1465 double milli = v->toNumber(exec); 1466 1466 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); 1472 1472 } 1473 1473 … … 1480 1480 1481 1481 double milli = timeClip(args[0]->toNumber(exec)); 1482 JSValue* result = jsNumber( milli);1482 JSValue* result = jsNumber(exec, milli); 1483 1483 thisDateObj->setInternalValue(result); 1484 1484 return result; … … 1495 1495 1496 1496 if (args.isEmpty() || isnan(milli)) { 1497 JSValue* result = jsNaN( );1497 JSValue* result = jsNaN(exec); 1498 1498 thisDateObj->setInternalValue(result); 1499 1499 return result; … … 1507 1507 1508 1508 if (!fillStructuresUsingTimeArgs(exec, args, numArgsToUse, &ms, &t)) { 1509 JSValue* result = jsNaN( );1509 JSValue* result = jsNaN(exec); 1510 1510 thisDateObj->setInternalValue(result); 1511 1511 return result; 1512 1512 } 1513 1513 1514 JSValue* result = jsNumber( gregorianDateTimeToMS(t, ms, inputIsUTC));1514 JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, inputIsUTC)); 1515 1515 thisDateObj->setInternalValue(result); 1516 1516 return result; … … 1524 1524 DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 1525 1525 if (args.isEmpty()) { 1526 JSValue* result = jsNaN( );1526 JSValue* result = jsNaN(exec); 1527 1527 thisDateObj->setInternalValue(result); 1528 1528 return result; … … 1545 1545 1546 1546 if (!fillStructuresUsingDateArgs(exec, args, numArgsToUse, &ms, &t)) { 1547 JSValue* result = jsNaN( );1547 JSValue* result = jsNaN(exec); 1548 1548 thisDateObj->setInternalValue(result); 1549 1549 return result; 1550 1550 } 1551 1551 1552 JSValue* result = jsNumber( gregorianDateTimeToMS(t, ms, inputIsUTC));1552 JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, inputIsUTC)); 1553 1553 thisDateObj->setInternalValue(result); 1554 1554 return result; … … 1648 1648 DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 1649 1649 if (args.isEmpty()) { 1650 JSValue* result = jsNaN( );1650 JSValue* result = jsNaN(exec); 1651 1651 thisDateObj->setInternalValue(result); 1652 1652 return result; … … 1671 1671 int32_t year = args[0]->toInt32(exec, ok); 1672 1672 if (!ok) { 1673 JSValue* result = jsNaN( );1673 JSValue* result = jsNaN(exec); 1674 1674 thisDateObj->setInternalValue(result); 1675 1675 return result; … … 1677 1677 1678 1678 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)); 1680 1680 thisDateObj->setInternalValue(result); 1681 1681 return result; … … 1693 1693 double milli = v->toNumber(exec); 1694 1694 if (isnan(milli)) 1695 return jsNaN( );1695 return jsNaN(exec); 1696 1696 1697 1697 GregorianDateTime t; … … 1699 1699 1700 1700 // NOTE: IE returns the full year even in getYear. 1701 return jsNumber( t.year);1701 return jsNumber(exec, t.year); 1702 1702 } 1703 1703 -
trunk/JavaScriptCore/kjs/error_object.cpp
r32652 r32807 47 47 // The constructor will be added later in ErrorObjectImp's constructor 48 48 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); 51 51 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); 53 53 } 54 54 … … 66 66 s += ": " + v->toString(exec); 67 67 68 return jsString( s);68 return jsString(exec, s); 69 69 } 70 70 … … 76 76 // ECMA 15.11.3.1 Error.prototype 77 77 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); 79 79 } 80 80 … … 88 88 { 89 89 JSObject* proto = static_cast<JSObject*>(exec->lexicalGlobalObject()->errorPrototype()); 90 JSObject* imp = new ErrorInstance(proto);90 JSObject* imp = new (exec) ErrorInstance(proto); 91 91 JSObject* obj(imp); 92 92 93 93 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))); 95 95 96 96 return obj; … … 109 109 : JSObject(errorProto) 110 110 { 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); 113 113 } 114 114 … … 121 121 , proto(prot) 122 122 { 123 putDirect(exec->propertyNames().length, jsNumber( 1), DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5123 putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5 124 124 putDirect(exec->propertyNames().prototype, proto, DontDelete|ReadOnly|DontEnum); 125 125 } … … 132 132 JSObject* NativeErrorImp::construct(ExecState* exec, const List& args) 133 133 { 134 JSObject* imp = new ErrorInstance(proto);134 JSObject* imp = new (exec) ErrorInstance(proto); 135 135 JSObject* obj(imp); 136 136 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))); 138 138 return obj; 139 139 } -
trunk/JavaScriptCore/kjs/function.cpp
r32652 r32807 123 123 } 124 124 125 JSValue* FunctionImp::lengthGetter(ExecState* , JSObject*, const Identifier&, const PropertySlot& slot)125 JSValue* FunctionImp::lengthGetter(ExecState* exec, JSObject*, const Identifier&, const PropertySlot& slot) 126 126 { 127 127 FunctionImp* thisObj = static_cast<FunctionImp*>(slot.slotBase()); 128 return jsNumber( thisObj->body->parameters().size());128 return jsNumber(exec, thisObj->body->parameters().size()); 129 129 } 130 130 … … 200 200 proto = exec->lexicalGlobalObject()->objectPrototype(); 201 201 202 JSObject* obj(new JSObject(proto));202 JSObject* obj(new (exec) JSObject(proto)); 203 203 204 204 JSValue* res = call(exec,obj,args); … … 289 289 { 290 290 putDirect(exec->propertyNames().callee, func, DontEnum); 291 putDirect(exec ->propertyNames().length, args.size(), DontEnum);291 putDirect(exec, exec->propertyNames().length, args.size(), DontEnum); 292 292 293 293 int i = 0; … … 465 465 // we can retrieve our argument list from the ExecState for our function 466 466 // 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); 468 468 } 469 469 … … 506 506 } 507 507 } 508 return jsString( r);508 return jsString(exec, r); 509 509 } 510 510 … … 571 571 s.append(c); 572 572 } 573 return jsString( s);573 return jsString(exec, s); 574 574 } 575 575 … … 765 765 JSValue* globalFuncParseInt(ExecState* exec, JSObject*, const List& args) 766 766 { 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))); 768 768 } 769 769 770 770 JSValue* globalFuncParseFloat(ExecState* exec, JSObject*, const List& args) 771 771 { 772 return jsNumber( parseFloat(args[0]->toString(exec)));772 return jsNumber(exec, parseFloat(args[0]->toString(exec))); 773 773 } 774 774 … … 845 845 } 846 846 847 return jsString( r);847 return jsString(exec, r); 848 848 } 849 849 … … 870 870 } 871 871 872 return jsString( s);872 return jsString(exec, s); 873 873 } 874 874 … … 890 890 { 891 891 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); 893 893 } 894 894 … … 898 898 { 899 899 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); 901 901 } 902 902 … … 915 915 ASSERT_ARG(function, function); 916 916 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); 918 918 } 919 919 -
trunk/JavaScriptCore/kjs/function_object.cpp
r32652 r32807 45 45 FunctionPrototype::FunctionPrototype(ExecState* exec) 46 46 { 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); 52 52 } 53 53 … … 71 71 if (thisObj->inherits(&FunctionImp::info)) { 72 72 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}"); 77 77 } 78 78 … … 134 134 135 135 // 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); 137 137 } 138 138 … … 169 169 Debugger* dbg = exec->dynamicGlobalObject()->debugger(); 170 170 if (dbg && !dbg->sourceParsed(exec, sourceId, UString(), body, lineNumber, errLine, errMsg)) 171 return new JSObject();171 return new (exec) JSObject(); 172 172 173 173 // No program node == syntax error - throw a syntax error … … 180 180 scopeChain.push(exec->lexicalGlobalObject()); 181 181 182 FunctionImp* fimp = new FunctionImp(exec, functionName, functionBody.get(), scopeChain);182 FunctionImp* fimp = new (exec) FunctionImp(exec, functionName, functionBody.get(), scopeChain); 183 183 184 184 // parse parameter list. throw syntax error on illegal identifiers -
trunk/JavaScriptCore/kjs/internal.cpp
r32652 r32807 81 81 JSObject* StringImp::toObject(ExecState *exec) const 82 82 { 83 return new StringInstance(exec->lexicalGlobalObject()->stringPrototype(), const_cast<StringImp*>(this));83 return new (exec) StringInstance(exec->lexicalGlobalObject()->stringPrototype(), const_cast<StringImp*>(this)); 84 84 } 85 85 -
trunk/JavaScriptCore/kjs/internal.h
r32609 r32807 46 46 class StringImp : public JSCell { 47 47 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()); } 49 49 enum HasOtherOwnerType { HasOtherOwner }; 50 50 StringImp(const UString& value, HasOtherOwnerType) : val(value) { } … … 66 66 class NumberImp : public JSCell { 67 67 friend class ConstantValues; 68 friend JSValue *jsNumberCell(double);68 friend JSValue* jsNumberCell(ExecState*, double); 69 69 public: 70 70 double value() const { return val; } … … 79 79 virtual JSObject *toObject(ExecState *exec) const; 80 80 81 void* operator new(size_t size )81 void* operator new(size_t size, ExecState* exec) 82 82 { 83 return Collector::allocateNumber(size);83 return exec->heap()->allocateNumber(size); 84 84 } 85 85 86 private: 86 87 NumberImp(double v) : val(v) { } -
trunk/JavaScriptCore/kjs/list.cpp
r29067 r32807 32 32 } 33 33 34 List::ListSet& List::markSet()34 void List::markProtectedLists(ListSet& markSet) 35 35 { 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) { 44 38 List* list = *it; 45 39 … … 66 60 // our Vector's inline capacity, though, our values move to the 67 61 // 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; 71 66 } 72 67 -
trunk/JavaScriptCore/kjs/list.h
r29067 r32807 43 43 44 44 List() 45 : m_ isInMarkSet(false)45 : m_markSet(0) 46 46 { 47 47 } … … 49 49 ~List() 50 50 { 51 if (m_ isInMarkSet)52 m arkSet().remove(this);51 if (m_markSet) 52 m_markSet->remove(this); 53 53 } 54 54 … … 86 86 const_iterator end() const { return m_vector.end(); } 87 87 88 static void markProtectedLists() 89 { 90 if (!markSet().size()) 91 return; 92 markProtectedListsSlowCase(); 93 } 88 static void markProtectedLists(ListSet&); 94 89 95 90 private: 96 static ListSet& markSet();97 static void markProtectedListsSlowCase();98 99 91 void expandAndAppend(JSValue*); 100 92 101 93 VectorType m_vector; 102 bool m_isInMarkSet;94 ListSet* m_markSet; 103 95 104 96 private: -
trunk/JavaScriptCore/kjs/lookup.h
r32652 r32807 93 93 94 94 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); 96 96 thisObj->putDirect(propertyName, val, entry->attributes); 97 97 return val; … … 233 233 return static_cast<JSObject* >(obj); 234 234 } 235 JSObject* newObject = new ClassCtor(exec);235 JSObject* newObject = new (exec) ClassCtor(exec); 236 236 globalObject->putDirect(propertyName, newObject, DontEnum); 237 237 return newObject; -
trunk/JavaScriptCore/kjs/math_object.cpp
r32652 r32807 77 77 } 78 78 79 JSValue* MathObjectImp::getValueProperty(ExecState* , int token) const79 JSValue* MathObjectImp::getValueProperty(ExecState* exec, int token) const 80 80 { 81 81 switch (token) { 82 82 case Euler: 83 return jsNumber(ex p(1.0));83 return jsNumber(exec, exp(1.0)); 84 84 case Ln2: 85 return jsNumber( log(2.0));85 return jsNumber(exec, log(2.0)); 86 86 case Ln10: 87 return jsNumber( log(10.0));87 return jsNumber(exec, log(10.0)); 88 88 case Log2E: 89 return jsNumber( 1.0 / log(2.0));89 return jsNumber(exec, 1.0 / log(2.0)); 90 90 case Log10E: 91 return jsNumber( 1.0 / log(10.0));91 return jsNumber(exec, 1.0 / log(10.0)); 92 92 case Pi: 93 return jsNumber( piDouble);93 return jsNumber(exec, piDouble); 94 94 case Sqrt1_2: 95 return jsNumber( sqrt(0.5));95 return jsNumber(exec, sqrt(0.5)); 96 96 case Sqrt2: 97 return jsNumber( sqrt(2.0));97 return jsNumber(exec, sqrt(2.0)); 98 98 } 99 99 … … 107 107 { 108 108 double arg = args[0]->toNumber(exec); 109 return signbit(arg) ? jsNumber( -arg) : jsNumber(arg);109 return signbit(arg) ? jsNumber(exec, -arg) : jsNumber(exec, arg); 110 110 } 111 111 112 112 JSValue* mathProtoFuncACos(ExecState* exec, JSObject*, const List& args) 113 113 { 114 return jsNumber( acos(args[0]->toNumber(exec)));114 return jsNumber(exec, acos(args[0]->toNumber(exec))); 115 115 } 116 116 117 117 JSValue* mathProtoFuncASin(ExecState* exec, JSObject*, const List& args) 118 118 { 119 return jsNumber( asin(args[0]->toNumber(exec)));119 return jsNumber(exec, asin(args[0]->toNumber(exec))); 120 120 } 121 121 122 122 JSValue* mathProtoFuncATan(ExecState* exec, JSObject*, const List& args) 123 123 { 124 return jsNumber( atan(args[0]->toNumber(exec)));124 return jsNumber(exec, atan(args[0]->toNumber(exec))); 125 125 } 126 126 127 127 JSValue* mathProtoFuncATan2(ExecState* exec, JSObject*, const List& args) 128 128 { 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))); 130 130 } 131 131 … … 134 134 double arg = args[0]->toNumber(exec); 135 135 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)); 138 138 } 139 139 140 140 JSValue* mathProtoFuncCos(ExecState* exec, JSObject*, const List& args) 141 141 { 142 return jsNumber( cos(args[0]->toNumber(exec)));142 return jsNumber(exec, cos(args[0]->toNumber(exec))); 143 143 } 144 144 145 145 JSValue* mathProtoFuncExp(ExecState* exec, JSObject*, const List& args) 146 146 { 147 return jsNumber(ex p(args[0]->toNumber(exec)));147 return jsNumber(exec, exp(args[0]->toNumber(exec))); 148 148 } 149 149 … … 152 152 double arg = args[0]->toNumber(exec); 153 153 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)); 156 156 } 157 157 158 158 JSValue* mathProtoFuncLog(ExecState* exec, JSObject*, const List& args) 159 159 { 160 return jsNumber( log(args[0]->toNumber(exec)));160 return jsNumber(exec, log(args[0]->toNumber(exec))); 161 161 } 162 162 … … 174 174 result = val; 175 175 } 176 return jsNumber( result);176 return jsNumber(exec, result); 177 177 } 178 178 … … 190 190 result = val; 191 191 } 192 return jsNumber( result);192 return jsNumber(exec, result); 193 193 } 194 194 … … 201 201 202 202 if (isnan(arg2)) 203 return jsNumber( NaN);203 return jsNumber(exec, NaN); 204 204 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 209 JSValue* mathProtoFuncRandom(ExecState* exec, JSObject*, const List&) 210 210 { 211 211 #if !USE(MULTIPLE_THREADS) … … 217 217 #endif 218 218 219 return jsNumber( wtf_random());219 return jsNumber(exec, wtf_random()); 220 220 } 221 221 … … 224 224 double arg = args[0]->toNumber(exec); 225 225 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)); 228 228 } 229 229 230 230 JSValue* mathProtoFuncSin(ExecState* exec, JSObject*, const List& args) 231 231 { 232 return jsNumber( sin(args[0]->toNumber(exec)));232 return jsNumber(exec, sin(args[0]->toNumber(exec))); 233 233 } 234 234 235 235 JSValue* mathProtoFuncSqrt(ExecState* exec, JSObject*, const List& args) 236 236 { 237 return jsNumber( sqrt(args[0]->toNumber(exec)));237 return jsNumber(exec, sqrt(args[0]->toNumber(exec))); 238 238 } 239 239 240 240 JSValue* mathProtoFuncTan(ExecState* exec, JSObject*, const List& args) 241 241 { 242 return jsNumber( tan(args[0]->toNumber(exec)));242 return jsNumber(exec, tan(args[0]->toNumber(exec))); 243 243 } 244 244 -
trunk/JavaScriptCore/kjs/nodes.cpp
r32578 r32807 361 361 JSObject* exception = static_cast<JSObject*>(exceptionValue); 362 362 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))); 365 365 } 366 366 } … … 454 454 // ------------------------------ NumberNode ----------------------------------- 455 455 456 JSValue* NumberNode::evaluate(ExecState* )456 JSValue* NumberNode::evaluate(ExecState* exec) 457 457 { 458 458 // 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); 460 460 } 461 461 … … 503 503 // ------------------------------ StringNode ----------------------------------- 504 504 505 JSValue* StringNode::evaluate(ExecState* )506 { 507 return jsOwnedString( m_value);505 JSValue* StringNode::evaluate(ExecState* exec) 506 { 507 return jsOwnedString(exec, m_value); 508 508 } 509 509 … … 820 820 821 821 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)); 823 823 824 824 return array; … … 1567 1567 JSObject* base = *iter; 1568 1568 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)); 1570 1570 return v; 1571 1571 } … … 1588 1588 JSValue** slot = &exec->localStorage()[m_index].value; 1589 1589 JSValue* v = (*slot)->toJSNumber(exec); 1590 *slot = jsNumber( v->toNumber(exec) + 1);1590 *slot = jsNumber(exec, v->toNumber(exec) + 1); 1591 1591 return v; 1592 1592 } … … 1628 1628 JSObject* base = *iter; 1629 1629 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)); 1631 1631 return v; 1632 1632 } … … 1649 1649 JSValue** slot = &exec->localStorage()[m_index].value; 1650 1650 JSValue* v = (*slot)->toJSNumber(exec); 1651 *slot = jsNumber( v->toNumber(exec) - 1);1651 *slot = jsNumber(exec, v->toNumber(exec) - 1); 1652 1652 return v; 1653 1653 } … … 1659 1659 JSValue** slot = &exec->localStorage()[m_index].value; 1660 1660 double n = (*slot)->toNumber(exec); 1661 *slot = jsNumber( n - 1);1661 *slot = jsNumber(exec, n - 1); 1662 1662 return n; 1663 1663 } … … 1713 1713 1714 1714 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)); 1716 1716 1717 1717 return v2; … … 1724 1724 1725 1725 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)); 1727 1727 return v2; 1728 1728 } … … 1744 1744 1745 1745 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)); 1747 1747 return v2; 1748 1748 } … … 1754 1754 1755 1755 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)); 1757 1757 return v2; 1758 1758 } … … 1776 1776 1777 1777 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)); 1779 1779 return v2; 1780 1780 } … … 1791 1791 1792 1792 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)); 1794 1794 return v2; 1795 1795 } … … 1928 1928 } 1929 1929 1930 static JSValue* typeStringForValue( JSValue* v) KJS_FAST_CALL;1931 static JSValue* typeStringForValue( JSValue* v)1930 static JSValue* typeStringForValue(ExecState*, JSValue*) KJS_FAST_CALL; 1931 static JSValue* typeStringForValue(ExecState* exec, JSValue* v) 1932 1932 { 1933 1933 switch (v->type()) { 1934 1934 case UndefinedType: 1935 return jsString( "undefined");1935 return jsString(exec, "undefined"); 1936 1936 case NullType: 1937 return jsString( "object");1937 return jsString(exec, "object"); 1938 1938 case BooleanType: 1939 return jsString( "boolean");1939 return jsString(exec, "boolean"); 1940 1940 case NumberType: 1941 return jsString( "number");1941 return jsString(exec, "number"); 1942 1942 case StringType: 1943 return jsString( "string");1943 return jsString(exec, "string"); 1944 1944 default: 1945 1945 if (v->isObject()) { … … 1947 1947 // as null when doing comparisons. 1948 1948 if (static_cast<JSObject*>(v)->masqueradeAsUndefined()) 1949 return jsString( "undefined");1949 return jsString(exec, "undefined"); 1950 1950 else if (static_cast<JSObject*>(v)->implementsCall()) 1951 return jsString( "function");1951 return jsString(exec, "function"); 1952 1952 } 1953 1953 1954 return jsString( "object");1954 return jsString(exec, "object"); 1955 1955 } 1956 1956 } … … 1967 1967 ASSERT(exec->variableObject() == exec->scopeChain().top()); 1968 1968 1969 return typeStringForValue(exec ->localStorage()[m_index].value);1969 return typeStringForValue(exec, exec->localStorage()[m_index].value); 1970 1970 } 1971 1971 … … 1985 1985 if (base->getPropertySlot(exec, m_ident, slot)) { 1986 1986 JSValue* v = slot.getValue(exec, base, m_ident); 1987 return typeStringForValue( v);1987 return typeStringForValue(exec, v); 1988 1988 } 1989 1989 … … 1991 1991 } while (iter != end); 1992 1992 1993 return jsString( "undefined");1993 return jsString(exec, "undefined"); 1994 1994 } 1995 1995 … … 2001 2001 KJS_CHECKEXCEPTIONVALUE 2002 2002 2003 return typeStringForValue( v);2003 return typeStringForValue(exec, v); 2004 2004 } 2005 2005 … … 2025 2025 2026 2026 double n = (*slot)->toNumber(exec); 2027 JSValue* n2 = jsNumber( n + 1);2027 JSValue* n2 = jsNumber(exec, n + 1); 2028 2028 *slot = n2; 2029 2029 return n2; … … 2048 2048 2049 2049 double n = v->toNumber(exec); 2050 JSValue* n2 = jsNumber( n + 1);2050 JSValue* n2 = jsNumber(exec, n + 1); 2051 2051 base->put(exec, m_ident, n2); 2052 2052 … … 2077 2077 2078 2078 double n = (*slot)->toNumber(exec); 2079 JSValue* n2 = jsNumber( n - 1);2079 JSValue* n2 = jsNumber(exec, n - 1); 2080 2080 *slot = n2; 2081 2081 return n2; … … 2100 2100 2101 2101 double n = v->toNumber(exec); 2102 JSValue* n2 = jsNumber( n - 1);2102 JSValue* n2 = jsNumber(exec, n - 1); 2103 2103 base->put(exec, m_ident, n2); 2104 2104 … … 2117 2117 { 2118 2118 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); 2120 2120 } 2121 2121 … … 2125 2125 { 2126 2126 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); 2128 2128 } 2129 2129 … … 2133 2133 { 2134 2134 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)); 2136 2136 } 2137 2137 … … 2141 2141 { 2142 2142 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)); 2144 2144 } 2145 2145 … … 2167 2167 KJS_CHECKEXCEPTIONVALUE 2168 2168 2169 JSValue* n2 = jsNumber( v->toNumber(exec) + 1);2169 JSValue* n2 = jsNumber(exec, v->toNumber(exec) + 1); 2170 2170 base->put(exec, propertyIndex, n2); 2171 2171 … … 2178 2178 KJS_CHECKEXCEPTIONVALUE 2179 2179 2180 JSValue* n2 = jsNumber( v->toNumber(exec) + 1);2180 JSValue* n2 = jsNumber(exec, v->toNumber(exec) + 1); 2181 2181 base->put(exec, propertyName, n2); 2182 2182 … … 2199 2199 KJS_CHECKEXCEPTIONVALUE 2200 2200 2201 JSValue* n2 = jsNumber( v->toNumber(exec) - 1);2201 JSValue* n2 = jsNumber(exec, v->toNumber(exec) - 1); 2202 2202 base->put(exec, propertyIndex, n2); 2203 2203 … … 2210 2210 KJS_CHECKEXCEPTIONVALUE 2211 2211 2212 JSValue* n2 = jsNumber( v->toNumber(exec) - 1);2212 JSValue* n2 = jsNumber(exec, v->toNumber(exec) - 1); 2213 2213 base->put(exec, propertyName, n2); 2214 2214 … … 2234 2234 2235 2235 double n = v->toNumber(exec); 2236 JSValue* n2 = jsNumber( n + 1);2236 JSValue* n2 = jsNumber(exec, n + 1); 2237 2237 base->put(exec, m_ident, n2); 2238 2238 … … 2251 2251 2252 2252 double n = v->toNumber(exec); 2253 JSValue* n2 = jsNumber( n - 1);2253 JSValue* n2 = jsNumber(exec, n - 1); 2254 2254 base->put(exec, m_ident, n2); 2255 2255 … … 2313 2313 { 2314 2314 // 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)); 2316 2316 } 2317 2317 … … 2337 2337 JSValue* BitwiseNotNode::evaluate(ExecState* exec) 2338 2338 { 2339 return jsNumber( inlineEvaluateToInt32(exec));2339 return jsNumber(exec, inlineEvaluateToInt32(exec)); 2340 2340 } 2341 2341 … … 2397 2397 JSValue* MultNode::evaluate(ExecState* exec) 2398 2398 { 2399 return jsNumber( inlineEvaluateToNumber(exec));2399 return jsNumber(exec, inlineEvaluateToNumber(exec)); 2400 2400 } 2401 2401 … … 2438 2438 JSValue* DivNode::evaluate(ExecState* exec) 2439 2439 { 2440 return jsNumber( inlineEvaluateToNumber(exec));2440 return jsNumber(exec, inlineEvaluateToNumber(exec)); 2441 2441 } 2442 2442 … … 2473 2473 JSValue* ModNode::evaluate(ExecState* exec) 2474 2474 { 2475 return jsNumber( inlineEvaluateToNumber(exec));2475 return jsNumber(exec, inlineEvaluateToNumber(exec)); 2476 2476 } 2477 2477 … … 2524 2524 if (value.isNull()) 2525 2525 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)); 2530 2530 } 2531 2531 … … 2563 2563 2564 2564 if (bothTypes == ((NumberType << 3) | NumberType)) 2565 return jsNumber( v1->toNumber(exec) + v2->toNumber(exec));2565 return jsNumber(exec, v1->toNumber(exec) + v2->toNumber(exec)); 2566 2566 if (bothTypes == ((StringType << 3) | StringType)) { 2567 2567 UString value = static_cast<StringImp*>(v1)->value() + static_cast<StringImp*>(v2)->value(); 2568 2568 if (value.isNull()) 2569 2569 return throwOutOfMemoryError(exec); 2570 return jsString( value);2570 return jsString(exec, value); 2571 2571 } 2572 2572 … … 2648 2648 JSValue* AddNumbersNode::evaluate(ExecState* exec) 2649 2649 { 2650 return jsNumber( inlineEvaluateToNumber(exec));2650 return jsNumber(exec, inlineEvaluateToNumber(exec)); 2651 2651 } 2652 2652 … … 2674 2674 KJS_CHECKEXCEPTIONVALUE 2675 2675 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()); 2677 2677 } 2678 2678 … … 2686 2686 2687 2687 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)); 2689 2689 } 2690 2690 … … 2698 2698 2699 2699 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()); 2701 2701 } 2702 2702 … … 2718 2718 JSValue* SubNode::evaluate(ExecState* exec) 2719 2719 { 2720 return jsNumber( inlineEvaluateToNumber(exec));2720 return jsNumber(exec, inlineEvaluateToNumber(exec)); 2721 2721 } 2722 2722 … … 2755 2755 JSValue* LeftShiftNode::evaluate(ExecState* exec) 2756 2756 { 2757 return jsNumber( inlineEvaluateToInt32(exec));2757 return jsNumber(exec, inlineEvaluateToInt32(exec)); 2758 2758 } 2759 2759 … … 2790 2790 JSValue* RightShiftNode::evaluate(ExecState* exec) 2791 2791 { 2792 return jsNumber( inlineEvaluateToInt32(exec));2792 return jsNumber(exec, inlineEvaluateToInt32(exec)); 2793 2793 } 2794 2794 … … 2825 2825 JSValue* UnsignedRightShiftNode::evaluate(ExecState* exec) 2826 2826 { 2827 return jsNumber( inlineEvaluateToUInt32(exec));2827 return jsNumber(exec, inlineEvaluateToUInt32(exec)); 2828 2828 } 2829 2829 … … 3276 3276 JSValue* BitXOrNode::evaluate(ExecState* exec) 3277 3277 { 3278 return jsNumber( inlineEvaluateToInt32(exec));3278 return jsNumber(exec, inlineEvaluateToInt32(exec)); 3279 3279 } 3280 3280 … … 3315 3315 JSValue* BitOrNode::evaluate(ExecState* exec) 3316 3316 { 3317 return jsNumber( inlineEvaluateToInt32(exec));3317 return jsNumber(exec, inlineEvaluateToInt32(exec)); 3318 3318 } 3319 3319 … … 3445 3445 switch (oper) { 3446 3446 case OpMultEq: 3447 v = jsNumber( current->toNumber(exec) * right->evaluateToNumber(exec));3447 v = jsNumber(exec, current->toNumber(exec) * right->evaluateToNumber(exec)); 3448 3448 break; 3449 3449 case OpDivEq: 3450 v = jsNumber( current->toNumber(exec) / right->evaluateToNumber(exec));3450 v = jsNumber(exec, current->toNumber(exec) / right->evaluateToNumber(exec)); 3451 3451 break; 3452 3452 case OpPlusEq: … … 3454 3454 break; 3455 3455 case OpMinusEq: 3456 v = jsNumber( current->toNumber(exec) - right->evaluateToNumber(exec));3456 v = jsNumber(exec, current->toNumber(exec) - right->evaluateToNumber(exec)); 3457 3457 break; 3458 3458 case OpLShift: 3459 3459 i1 = current->toInt32(exec); 3460 3460 i2 = right->evaluateToInt32(exec); 3461 v = jsNumber( i1 << i2);3461 v = jsNumber(exec, i1 << i2); 3462 3462 break; 3463 3463 case OpRShift: 3464 3464 i1 = current->toInt32(exec); 3465 3465 i2 = right->evaluateToInt32(exec); 3466 v = jsNumber( i1 >> i2);3466 v = jsNumber(exec, i1 >> i2); 3467 3467 break; 3468 3468 case OpURShift: 3469 3469 ui = current->toUInt32(exec); 3470 3470 i2 = right->evaluateToInt32(exec); 3471 v = jsNumber( ui >> i2);3471 v = jsNumber(exec, ui >> i2); 3472 3472 break; 3473 3473 case OpAndEq: 3474 3474 i1 = current->toInt32(exec); 3475 3475 i2 = right->evaluateToInt32(exec); 3476 v = jsNumber( i1 & i2);3476 v = jsNumber(exec, i1 & i2); 3477 3477 break; 3478 3478 case OpXOrEq: 3479 3479 i1 = current->toInt32(exec); 3480 3480 i2 = right->evaluateToInt32(exec); 3481 v = jsNumber( i1 ^ i2);3481 v = jsNumber(exec, i1 ^ i2); 3482 3482 break; 3483 3483 case OpOrEq: 3484 3484 i1 = current->toInt32(exec); 3485 3485 i2 = right->evaluateToInt32(exec); 3486 v = jsNumber( i1 | i2);3486 v = jsNumber(exec, i1 | i2); 3487 3487 break; 3488 3488 case OpModEq: { 3489 3489 double d1 = current->toNumber(exec); 3490 3490 double d2 = right->evaluateToNumber(exec); 3491 v = jsNumber( fmod(d1, d2));3491 v = jsNumber(exec, fmod(d1, d2)); 3492 3492 } 3493 3493 break; … … 4241 4241 continue; 4242 4242 4243 JSValue* str = jsOwnedString( name.ustring());4243 JSValue* str = jsOwnedString(exec, name.ustring()); 4244 4244 4245 4245 if (m_lexpr->isResolveNode()) { … … 4567 4567 4568 4568 if (m_catchBlock && exec->completionType() == Throw) { 4569 JSObject* obj = new JSObject;4569 JSObject* obj = new (exec) JSObject; 4570 4570 obj->putDirect(m_exceptionIdent, result, DontDelete); 4571 4571 exec->dynamicGlobalObject()->tearOffActivation(exec); … … 4927 4927 FunctionImp* FuncDeclNode::makeFunction(ExecState* exec) 4928 4928 { 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()); 4930 4930 4931 4931 JSObject* proto = exec->lexicalGlobalObject()->objectConstructor()->construct(exec, exec->emptyList()); 4932 4932 proto->putDirect(exec->propertyNames().constructor, func, DontEnum); 4933 4933 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); 4935 4935 return func; 4936 4936 } … … 4961 4961 // but they won't register with the current scope chain and should 4962 4962 // be contained as single property in an anonymous object. 4963 functionScopeObject = new JSObject;4963 functionScopeObject = new (exec) JSObject; 4964 4964 exec->pushScope(functionScopeObject); 4965 4965 } 4966 4966 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()); 4968 4968 JSObject* proto = exec->lexicalGlobalObject()->objectConstructor()->construct(exec, exec->emptyList()); 4969 4969 proto->putDirect(exec->propertyNames().constructor, func, DontEnum); -
trunk/JavaScriptCore/kjs/number_object.cpp
r32652 r32807 56 56 : NumberInstance(objectPrototype) 57 57 { 58 setInternalValue(jsNumber( 0));58 setInternalValue(jsNumber(exec, 0)); 59 59 60 60 // The constructor will be added later, after NumberObjectImp has been constructed 61 61 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); 68 68 } 69 69 … … 152 152 double radixAsDouble = args[0]->toInteger(exec); // nan -> 0 153 153 if (radixAsDouble == 10 || args[0]->isUndefined()) 154 return jsString( v->toString(exec));154 return jsString(exec, v->toString(exec)); 155 155 156 156 if (radixAsDouble < 2 || radixAsDouble > 36) … … 166 166 double x = v->toNumber(exec); 167 167 if (isnan(x) || isinf(x)) 168 return jsString( UString::from(x));168 return jsString(exec, UString::from(x)); 169 169 170 170 bool isNegative = x < 0.0; … … 205 205 ASSERT(p < s + sizeof(s)); 206 206 207 return jsString( startOfResultString);207 return jsString(exec, startOfResultString); 208 208 } 209 209 … … 214 214 215 215 // TODO 216 return jsString( static_cast<NumberInstance*>(thisObj)->internalValue()->toString(exec));216 return jsString(exec, static_cast<NumberInstance*>(thisObj)->internalValue()->toString(exec)); 217 217 } 218 218 … … 240 240 double x = v->toNumber(exec); 241 241 if (isnan(x)) 242 return jsString( "NaN");242 return jsString(exec, "NaN"); 243 243 244 244 UString s; … … 250 250 251 251 if (x >= pow(10.0, 21.0)) 252 return jsString( s + UString::from(x));252 return jsString(exec, s + UString::from(x)); 253 253 254 254 const double tenToTheF = pow(10.0, f); … … 270 270 int kMinusf = k - f; 271 271 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)); 274 274 } 275 275 … … 321 321 322 322 if (isnan(x) || isinf(x)) 323 return jsString( UString::from(x));323 return jsString(exec, UString::from(x)); 324 324 325 325 JSValue* fractionalDigitsValue = args[0]; … … 347 347 348 348 if (isnan(x)) 349 return jsString( "NaN");349 return jsString(exec, "NaN"); 350 350 351 351 if (x == -0.0) // (-0.0).toExponential() should print as 0 instead of -0 … … 379 379 freedtoa(result); 380 380 381 return jsString( buf);381 return jsString(exec, buf); 382 382 } 383 383 … … 392 392 double x = v->toNumber(exec); 393 393 if (args[0]->isUndefined() || isnan(x) || isinf(x)) 394 return jsString( v->toString(exec));394 return jsString(exec, v->toString(exec)); 395 395 396 396 UString s; … … 431 431 m = m.substr(0, 1) + "." + m.substr(1); 432 432 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)); 435 435 } 436 436 } else { … … 440 440 441 441 if (e == precision - 1) 442 return jsString( s + m);442 return jsString(exec, s + m); 443 443 if (e >= 0) { 444 444 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); 449 449 } 450 450 … … 469 469 470 470 // 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); 472 472 } 473 473 … … 477 477 } 478 478 479 JSValue* NumberObjectImp::getValueProperty(ExecState* , int token) const479 JSValue* NumberObjectImp::getValueProperty(ExecState* exec, int token) const 480 480 { 481 481 // ECMA 15.7.3 482 482 switch (token) { 483 483 case NaNValue: 484 return jsNaN( );484 return jsNaN(exec); 485 485 case NegInfinity: 486 return jsNumberCell( -Inf);486 return jsNumberCell(exec, -Inf); 487 487 case PosInfinity: 488 return jsNumberCell( Inf);488 return jsNumberCell(exec, Inf); 489 489 case MaxValue: 490 return jsNumberCell( 1.7976931348623157E+308);490 return jsNumberCell(exec, 1.7976931348623157E+308); 491 491 case MinValue: 492 return jsNumberCell( 5E-324);492 return jsNumberCell(exec, 5E-324); 493 493 } 494 494 ASSERT_NOT_REACHED(); … … 505 505 { 506 506 JSObject* proto = exec->lexicalGlobalObject()->numberPrototype(); 507 NumberInstance* obj = new NumberInstance(proto);507 NumberInstance* obj = new (exec) NumberInstance(proto); 508 508 509 509 // FIXME: Check args[0]->isUndefined() instead of args.isEmpty()? 510 510 double n = args.isEmpty() ? 0 : args[0]->toNumber(exec); 511 obj->setInternalValue(jsNumber( n));511 obj->setInternalValue(jsNumber(exec, n)); 512 512 return obj; 513 513 } … … 517 517 { 518 518 // 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)); 520 520 } 521 521 -
trunk/JavaScriptCore/kjs/object.cpp
r32652 r32807 167 167 JSValue *JSObject::get(ExecState *exec, const Identifier &propertyName) const 168 168 { 169 ASSERT(Heap::threadHeap() == Heap::heap(this)); 170 169 171 PropertySlot slot; 170 172 … … 177 179 JSValue *JSObject::get(ExecState *exec, unsigned propertyName) const 178 180 { 181 ASSERT(Heap::threadHeap() == Heap::heap(this)); 182 179 183 PropertySlot slot; 180 184 if (const_cast<JSObject *>(this)->getPropertySlot(exec, propertyName, slot)) … … 216 220 { 217 221 ASSERT(value); 222 ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 218 223 219 224 if (propertyName == exec->propertyNames().underscoreProto) { … … 406 411 } 407 412 408 void JSObject::defineGetter(ExecState* , const Identifier& propertyName, JSObject* getterFunc)413 void JSObject::defineGetter(ExecState* exec, const Identifier& propertyName, JSObject* getterFunc) 409 414 { 410 415 JSValue *o = getDirect(propertyName); … … 414 419 gs = static_cast<GetterSetterImp *>(o); 415 420 } else { 416 gs = new GetterSetterImp;421 gs = new (exec) GetterSetterImp; 417 422 putDirect(propertyName, gs, GetterSetter); 418 423 } … … 422 427 } 423 428 424 void JSObject::defineSetter(ExecState* , const Identifier& propertyName, JSObject* setterFunc)429 void JSObject::defineSetter(ExecState* exec, const Identifier& propertyName, JSObject* setterFunc) 425 430 { 426 431 JSValue *o = getDirect(propertyName); … … 430 435 gs = static_cast<GetterSetterImp *>(o); 431 436 } else { 432 gs = new GetterSetterImp;437 gs = new (exec) GetterSetterImp; 433 438 putDirect(propertyName, gs, GetterSetter); 434 439 } … … 619 624 } 620 625 621 void JSObject::putDirect( const Identifier &propertyName, int value, int attr)622 { 623 _prop.put(propertyName, jsNumber( value), attr);626 void JSObject::putDirect(ExecState* exec, const Identifier &propertyName, int value, int attr) 627 { 628 _prop.put(propertyName, jsNumber(exec, value), attr); 624 629 } 625 630 … … 688 693 List args; 689 694 if (message.isEmpty()) 690 args.append(jsString(e rrorNames[errtype]));695 args.append(jsString(exec, errorNames[errtype])); 691 696 else 692 args.append(jsString( message));697 args.append(jsString(exec, message)); 693 698 JSObject *err = static_cast<JSObject *>(cons->construct(exec,args)); 694 699 695 700 if (lineno != -1) 696 err->put(exec, "line", jsNumber( lineno));701 err->put(exec, "line", jsNumber(exec, lineno)); 697 702 if (sourceId != -1) 698 err->put(exec, "sourceId", jsNumber( sourceId));703 err->put(exec, "sourceId", jsNumber(exec, sourceId)); 699 704 700 705 if(!sourceURL.isNull()) 701 err->put(exec, "sourceURL", jsString( sourceURL));706 err->put(exec, "sourceURL", jsString(exec, sourceURL)); 702 707 703 708 return err; -
trunk/JavaScriptCore/kjs/object.h
r32652 r32807 433 433 { return _prop.getLocation(propertyName); } 434 434 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); 436 436 void removeDirect(const Identifier &propertyName); 437 437 -
trunk/JavaScriptCore/kjs/object_object.cpp
r32652 r32807 44 44 : JSObject() // [[Prototype]] is null 45 45 { 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); 52 52 53 53 // 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); 58 58 } 59 59 … … 125 125 JSValue* objectProtoFuncToLocaleString(ExecState* exec, JSObject* thisObj, const List&) 126 126 { 127 return jsString( thisObj->toString(exec));127 return jsString(exec, thisObj->toString(exec)); 128 128 } 129 129 130 JSValue* objectProtoFuncToString(ExecState* , JSObject* thisObj, const List&)130 JSValue* objectProtoFuncToString(ExecState*exec, JSObject* thisObj, const List&) 131 131 { 132 return jsString( "[object " + thisObj->className() + "]");132 return jsString(exec, "[object " + thisObj->className() + "]"); 133 133 } 134 134 … … 142 142 143 143 // 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); 145 145 } 146 146 … … 163 163 case NullType: 164 164 case UndefinedType: 165 return new JSObject(exec->lexicalGlobalObject()->objectPrototype());165 return new (exec) JSObject(exec->lexicalGlobalObject()->objectPrototype()); 166 166 default: 167 167 ASSERT_NOT_REACHED(); -
trunk/JavaScriptCore/kjs/property_map.h
r32587 r32807 35 35 struct PropertyMapEntry; 36 36 struct PropertyMapHashTable; 37 38 class SavedProperty : Noncopyable {39 public:40 // Since we use this in arrays, we allocate it uninitialized41 // and then explicitly initialize. This means we can allocate42 // the array without initializing every saved property in the43 // array twice. To accomplish this, the class uses data members44 // 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 };58 37 59 38 class PropertyMap : Noncopyable { … … 110 89 { 111 90 } 112 113 inline SavedProperty::SavedProperty()114 #ifndef NDEBUG115 : m_name(0)116 , m_value(0)117 , m_attributes(0)118 #endif119 {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() const148 {149 ASSERT(m_name);150 ASSERT(m_value);151 152 return m_name;153 }154 155 inline JSValue* SavedProperty::value() const156 {157 ASSERT(m_name);158 ASSERT(m_value);159 160 return m_value;161 }162 163 inline unsigned SavedProperty::attributes() const164 {165 ASSERT(m_name);166 ASSERT(m_value);167 168 return m_attributes;169 }170 171 91 } // namespace 172 92 -
trunk/JavaScriptCore/kjs/protect.h
r14834 r32807 31 31 namespace KJS { 32 32 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); 36 38 } 37 39 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); 41 45 } 42 46 -
trunk/JavaScriptCore/kjs/regexp_object.cpp
r32652 r32807 52 52 : JSObject(objectPrototype) 53 53 { 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); 58 58 } 59 59 … … 107 107 if (!thisObj->inherits(&RegExpImp::info)) { 108 108 if (thisObj->inherits(&RegExpPrototype::info)) 109 return jsString( "//");109 return jsString(exec, "//"); 110 110 return throwError(exec, TypeError); 111 111 } … … 118 118 if (thisObj->get(exec, exec->propertyNames().multiline)->toBoolean(exec)) 119 119 result += "m"; 120 return jsString( result);120 return jsString(exec, result); 121 121 } 122 122 … … 151 151 } 152 152 153 JSValue* RegExpImp::getValueProperty(ExecState* , int token) const153 JSValue* RegExpImp::getValueProperty(ExecState* exec, int token) const 154 154 { 155 155 switch (token) { … … 161 161 return jsBoolean(m_regExp->multiline()); 162 162 case Source: 163 return jsString( m_regExp->pattern());163 return jsString(exec, m_regExp->pattern()); 164 164 case LastIndex: 165 return jsNumber( m_lastIndex);165 return jsNumber(exec, m_lastIndex); 166 166 } 167 167 … … 288 288 289 289 // 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); 291 291 } 292 292 … … 318 318 { 319 319 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); 321 321 for (unsigned i = 0; i <= lastNumSubpatterns; ++i) { 322 322 int start = d->lastOvector[2 * i]; 323 323 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)); 328 328 return arr; 329 329 } 330 330 331 JSValue* RegExpObjectImp::getBackref( unsigned i) const331 JSValue* RegExpObjectImp::getBackref(ExecState* exec, unsigned i) const 332 332 { 333 333 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( ) const334 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 338 JSValue* RegExpObjectImp::getLastParen(ExecState* exec) const 339 339 { 340 340 unsigned i = d->lastNumSubPatterns; 341 341 if (i > 0) { 342 342 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( ) const343 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 348 JSValue *RegExpObjectImp::getLeftContext(ExecState* exec) const 349 349 { 350 350 if (d->lastOvector) 351 return jsString( d->lastInput.substr(0, d->lastOvector[0]));352 return jsString( "");353 } 354 355 JSValue *RegExpObjectImp::getRightContext( ) const351 return jsString(exec, d->lastInput.substr(0, d->lastOvector[0])); 352 return jsString(exec, ""); 353 } 354 355 JSValue *RegExpObjectImp::getRightContext(ExecState* exec) const 356 356 { 357 357 if (d->lastOvector) { 358 358 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, ""); 362 362 } 363 363 … … 367 367 } 368 368 369 JSValue *RegExpObjectImp::getValueProperty(ExecState* , int token) const369 JSValue *RegExpObjectImp::getValueProperty(ExecState* exec, int token) const 370 370 { 371 371 switch (token) { 372 372 case Dollar1: 373 return getBackref( 1);373 return getBackref(exec, 1); 374 374 case Dollar2: 375 return getBackref( 2);375 return getBackref(exec, 2); 376 376 case Dollar3: 377 return getBackref( 3);377 return getBackref(exec, 3); 378 378 case Dollar4: 379 return getBackref( 4);379 return getBackref(exec, 4); 380 380 case Dollar5: 381 return getBackref( 5);381 return getBackref(exec, 5); 382 382 case Dollar6: 383 return getBackref( 6);383 return getBackref(exec, 6); 384 384 case Dollar7: 385 return getBackref( 7);385 return getBackref(exec, 7); 386 386 case Dollar8: 387 return getBackref( 8);387 return getBackref(exec, 8); 388 388 case Dollar9: 389 return getBackref( 9);389 return getBackref(exec, 9); 390 390 case Input: 391 return jsString( d->lastInput);391 return jsString(exec, d->lastInput); 392 392 case Multiline: 393 393 return jsBoolean(d->multiline); 394 394 case LastMatch: 395 return getBackref( 0);395 return getBackref(exec, 0); 396 396 case LastParen: 397 return getLastParen( );397 return getLastParen(exec); 398 398 case LeftContext: 399 return getLeftContext( );399 return getLeftContext(exec); 400 400 case RightContext: 401 return getRightContext( );401 return getRightContext(exec); 402 402 default: 403 403 ASSERT(0); 404 404 } 405 405 406 return jsString( "");406 return jsString(exec, ""); 407 407 } 408 408 … … 452 452 { 453 453 return regExp->isValid() 454 ? new RegExpImp(static_cast<RegExpPrototype*>(exec->lexicalGlobalObject()->regExpPrototype()), regExp)454 ? new (exec) RegExpImp(static_cast<RegExpPrototype*>(exec->lexicalGlobalObject()->regExpPrototype()), regExp) 455 455 : throwError(exec, SyntaxError, UString("Invalid regular expression: ").append(regExp->errorMessage())); 456 456 } -
trunk/JavaScriptCore/kjs/regexp_object.h
r30534 r32807 91 91 92 92 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; 97 97 98 98 OwnPtr<RegExpObjectImpPrivate> d; -
trunk/JavaScriptCore/kjs/string_object.cpp
r32652 r32807 41 41 const ClassInfo StringInstance::info = { "String", 0, 0, 0 }; 42 42 43 StringInstance::StringInstance( JSObject *proto)43 StringInstance::StringInstance(ExecState* exec, JSObject* proto) 44 44 : JSWrapperObject(proto) 45 45 { 46 setInternalValue(jsString( ""));46 setInternalValue(jsString(exec, "")); 47 47 } 48 48 … … 53 53 } 54 54 55 StringInstance::StringInstance( JSObject *proto, const UString &string)55 StringInstance::StringInstance(ExecState* exec, JSObject* proto, const UString &string) 56 56 : JSWrapperObject(proto) 57 57 { 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 61 JSValue* 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 66 JSValue* 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 71 static 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)); 74 74 } 75 75 … … 166 166 // ECMA 15.5.4 167 167 StringPrototype::StringPrototype(ExecState* exec, ObjectPrototype* objProto) 168 : StringInstance( objProto)168 : StringInstance(exec, objProto) 169 169 { 170 170 // 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); 172 172 } 173 173 … … 345 345 args.append(jsUndefined()); 346 346 else 347 args.append(jsString( source.substr(matchStart, matchLen)));347 args.append(jsString(exec, source.substr(matchStart, matchLen))); 348 348 } 349 349 350 args.append(jsNumber( completeMatchStart));350 args.append(jsNumber(exec, completeMatchStart)); 351 351 args.append(sourceVal); 352 352 … … 382 382 return sourceVal; 383 383 384 return jsString( result);384 return jsString(exec, result); 385 385 } 386 386 … … 396 396 List args; 397 397 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)); 400 400 args.append(sourceVal); 401 401 … … 403 403 } 404 404 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)); 406 406 } 407 407 … … 435 435 else 436 436 u = ""; 437 return jsString( u);437 return jsString(exec, u); 438 438 } 439 439 … … 449 449 double dpos = a0->toInteger(exec); 450 450 if (dpos >= 0 && dpos < len) 451 result = jsNumber( s[static_cast<int>(dpos)]);451 result = jsNumber(exec, s[static_cast<int>(dpos)]); 452 452 else 453 result = jsNaN( );453 result = jsNaN(exec); 454 454 return result; 455 455 } … … 464 464 s += (*it)->toString(exec); 465 465 } 466 return jsString( s);466 return jsString(exec, s); 467 467 } 468 468 … … 481 481 else if (dpos > len) 482 482 dpos = len; 483 return jsNumber( s.find(u2, static_cast<int>(dpos)));483 return jsNumber(exec, s.find(u2, static_cast<int>(dpos))); 484 484 } 485 485 … … 499 499 else if (!(dpos <= len)) // true for NaN 500 500 dpos = len; 501 return jsNumber( s.rfind(u2, static_cast<int>(dpos)));501 return jsNumber(exec, s.rfind(u2, static_cast<int>(dpos))); 502 502 } 503 503 … … 538 538 int lastIndex = 0; 539 539 while (pos >= 0) { 540 list.append(jsString( u.substr(pos, matchLength)));540 list.append(jsString(exec, u.substr(pos, matchLength))); 541 541 lastIndex = pos; 542 542 pos += matchLength == 0 ? 1 : matchLength; … … 580 580 int matchLength; 581 581 regExpObj->performMatch(reg.get(), u, 0, pos, matchLength); 582 return jsNumber( pos);582 return jsNumber(exec, pos); 583 583 } 584 584 … … 590 590 StringImp* sVal = thisObj->inherits(&StringInstance::info) ? 591 591 static_cast<StringInstance*>(thisObj)->internalValue() : 592 static_cast<StringImp*>(jsString( s));592 static_cast<StringImp*>(jsString(exec, s)); 593 593 594 594 JSValue* a0 = args[0]; … … 617 617 if (to > len) 618 618 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, ""); 623 623 } 624 624 … … 643 643 if (u.isEmpty() && reg->match(u, 0) >= 0) { 644 644 // 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)); 646 646 return result; 647 647 } … … 655 655 pos = mpos + (mlen == 0 ? 1 : mlen); 656 656 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))); 658 658 p0 = mpos + mlen; 659 659 i++; … … 664 664 res->put(exec, i++, jsUndefined()); 665 665 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))); 667 667 } 668 668 } … … 672 672 if (u.isEmpty()) { 673 673 // 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)); 675 675 return result; 676 676 } else { 677 677 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))); 679 679 } 680 680 } else { 681 681 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))); 683 683 p0 = pos + u2.size(); 684 684 i++; … … 688 688 // add remaining string, if any 689 689 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)); 692 692 return result; 693 693 } … … 705 705 double length = a1->isUndefined() ? len : a1->toInteger(exec); 706 706 if (start >= len) 707 return jsString( "");707 return jsString(exec, ""); 708 708 if (length < 0) 709 return jsString( "");709 return jsString(exec, ""); 710 710 if (start < 0) { 711 711 start += len; … … 715 715 if (length > len) 716 716 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))); 718 718 } 719 719 … … 748 748 start = temp; 749 749 } 750 return jsString( s.substr((int)start, (int)end-(int)start));750 return jsString(exec, s.substr((int)start, (int)end-(int)start)); 751 751 } 752 752 … … 758 758 StringImp* sVal = thisObj->inherits(&StringInstance::info) 759 759 ? static_cast<StringInstance*>(thisObj)->internalValue() 760 : static_cast<StringImp*>(jsString( s));760 : static_cast<StringImp*>(jsString(exec, s)); 761 761 int ssize = s.size(); 762 762 if (!ssize) … … 773 773 if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0) 774 774 return sVal; 775 return jsString( UString(buffer.releaseBuffer(), length, false));775 return jsString(exec, UString(buffer.releaseBuffer(), length, false)); 776 776 } 777 777 … … 783 783 StringImp* sVal = thisObj->inherits(&StringInstance::info) 784 784 ? static_cast<StringInstance*>(thisObj)->internalValue() 785 : static_cast<StringImp*>(jsString( s));785 : static_cast<StringImp*>(jsString(exec, s)); 786 786 int ssize = s.size(); 787 787 if (!ssize) … … 798 798 if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0) 799 799 return sVal; 800 return jsString( UString(buffer.releaseBuffer(), length, false));800 return jsString(exec, UString(buffer.releaseBuffer(), length, false)); 801 801 } 802 802 … … 809 809 StringImp* sVal = thisObj->inherits(&StringInstance::info) 810 810 ? static_cast<StringInstance*>(thisObj)->internalValue() 811 : static_cast<StringImp*>(jsString( s));811 : static_cast<StringImp*>(jsString(exec, s)); 812 812 int ssize = s.size(); 813 813 if (!ssize) … … 824 824 if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0) 825 825 return sVal; 826 return jsString( UString(buffer.releaseBuffer(), length, false));826 return jsString(exec, UString(buffer.releaseBuffer(), length, false)); 827 827 } 828 828 … … 834 834 StringImp* sVal = thisObj->inherits(&StringInstance::info) 835 835 ? static_cast<StringInstance*>(thisObj)->internalValue() 836 : static_cast<StringImp*>(jsString( s));836 : static_cast<StringImp*>(jsString(exec, s)); 837 837 int ssize = s.size(); 838 838 if (!ssize) … … 849 849 if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0) 850 850 return sVal; 851 return jsString( UString(buffer.releaseBuffer(), length, false));851 return jsString(exec, UString(buffer.releaseBuffer(), length, false)); 852 852 } 853 853 … … 855 855 { 856 856 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))); 863 863 } 864 864 … … 867 867 // This optimizes the common case that thisObj is a StringInstance 868 868 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>"); 870 870 } 871 871 … … 874 874 // This optimizes the common case that thisObj is a StringInstance 875 875 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>"); 877 877 } 878 878 … … 881 881 // This optimizes the common case that thisObj is a StringInstance 882 882 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>"); 884 884 } 885 885 … … 888 888 // This optimizes the common case that thisObj is a StringInstance 889 889 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>"); 891 891 } 892 892 … … 895 895 // This optimizes the common case that thisObj is a StringInstance 896 896 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>"); 898 898 } 899 899 … … 902 902 // This optimizes the common case that thisObj is a StringInstance 903 903 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>"); 905 905 } 906 906 … … 909 909 // This optimizes the common case that thisObj is a StringInstance 910 910 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>"); 912 912 } 913 913 … … 916 916 // This optimizes the common case that thisObj is a StringInstance 917 917 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>"); 919 919 } 920 920 … … 923 923 // This optimizes the common case that thisObj is a StringInstance 924 924 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>"); 926 926 } 927 927 … … 931 931 UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 932 932 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>"); 934 934 } 935 935 … … 939 939 UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 940 940 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>"); 942 942 } 943 943 … … 947 947 UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 948 948 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>"); 950 950 } 951 951 … … 955 955 UString s = thisObj->inherits(&StringInstance::info) ? static_cast<StringInstance*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 956 956 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>"); 958 958 } 959 959 … … 966 966 putDirect(exec->propertyNames().prototype, stringProto, DontEnum|DontDelete|ReadOnly); 967 967 968 putDirectFunction(new StringObjectFuncImp(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum);968 putDirectFunction(new (exec) StringObjectFuncImp(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum); 969 969 970 970 // 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); 972 972 } 973 973 … … 983 983 JSObject *proto = exec->lexicalGlobalObject()->stringPrototype(); 984 984 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)); 987 987 } 988 988 … … 991 991 { 992 992 if (args.isEmpty()) 993 return jsString( "");993 return jsString(exec, ""); 994 994 else { 995 995 JSValue *v = args[0]; 996 return jsString( v->toString(exec));996 return jsString(exec, v->toString(exec)); 997 997 } 998 998 } … … 1004 1004 : InternalFunctionImp(funcProto, name) 1005 1005 { 1006 putDirect(exec->propertyNames().length, jsNumber( 1), DontDelete|ReadOnly|DontEnum);1006 putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum); 1007 1007 } 1008 1008 … … 1022 1022 s = ""; 1023 1023 1024 return jsString( s);1024 return jsString(exec, s); 1025 1025 } 1026 1026 -
trunk/JavaScriptCore/kjs/string_object.h
r30534 r32807 32 32 class StringInstance : public JSWrapperObject { 33 33 public: 34 StringInstance( JSObject *proto);34 StringInstance(ExecState*, JSObject* proto); 35 35 StringInstance(JSObject *proto, StringImp*); 36 StringInstance( JSObject *proto, const UString&);36 StringInstance(ExecState*, JSObject* proto, const UString&); 37 37 38 38 virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); … … 58 58 class StringInstanceThatMasqueradesAsUndefined : public StringInstance { 59 59 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) { } 62 62 virtual bool masqueradeAsUndefined() const { return true; } 63 63 virtual bool toBoolean(ExecState*) const { return false; } -
trunk/JavaScriptCore/kjs/testkjs.cpp
r31404 r32807 132 132 GlobalObject::GlobalObject(Vector<UString>& arguments) 133 133 { 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)); 142 142 143 143 JSObject* array = arrayConstructor()->construct(globalExec(), globalExec()->emptyList()); 144 144 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])); 146 146 putDirect("arguments", array); 147 147 … … 162 162 } 163 163 164 JSValue* functionGC(ExecState* , JSObject*, const List&)164 JSValue* functionGC(ExecState* exec, JSObject*, const List&) 165 165 { 166 166 JSLock lock; 167 Collector::collect();167 exec->heap()->collect(); 168 168 return jsUndefined(); 169 169 } … … 188 188 stopWatch.stop(); 189 189 190 return jsNumber( stopWatch.getElapsedMS());190 return jsNumber(exec, stopWatch.getElapsedMS()); 191 191 } 192 192 … … 203 203 } 204 204 205 JSValue* functionReadline(ExecState* , JSObject*, const List&)205 JSValue* functionReadline(ExecState* exec, JSObject*, const List&) 206 206 { 207 207 Vector<char, 256> line; … … 214 214 } 215 215 line.append('\0'); 216 return jsString( line.data());216 return jsString(exec, line.data()); 217 217 } 218 218 … … 346 346 347 347 #ifndef NDEBUG 348 Collector::collect();348 Heap::threadHeap()->collect(); 349 349 #endif 350 350 -
trunk/JavaScriptCore/kjs/ustring.h
r32609 r32807 397 397 // FIXME: this should be size_t but that would cause warnings until we 398 398 // fix UString sizes to be size_t instead of int 399 static const int minShareSize = Collector::minExtraCostSize / sizeof(UChar);399 static const int minShareSize = Heap::minExtraCostSize / sizeof(UChar); 400 400 401 401 inline size_t UString::cost() const -
trunk/JavaScriptCore/kjs/value.cpp
r29243 r32807 81 81 static const double D32 = 4294967296.0; 82 82 83 void *JSCell::operator new(size_t size)84 { 85 return Collector::allocate(size);83 void* JSCell::operator new(size_t size, ExecState* exec) 84 { 85 return exec->heap()->allocate(size); 86 86 } 87 87 … … 208 208 } 209 209 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("") : newStringImp(s);218 } 219 220 JSCell* jsOwnedString( const UString& s)221 { 222 return s.isNull() ? new StringImp("", StringImp::HasOtherOwner) : newStringImp(s, StringImp::HasOtherOwner);210 JSCell* jsString(ExecState* exec, const char* s) 211 { 212 return new (exec) StringImp(s ? s : ""); 213 } 214 215 JSCell* jsString(ExecState* exec, const UString& s) 216 { 217 return s.isNull() ? new (exec) StringImp("") : new (exec) StringImp(s); 218 } 219 220 JSCell* jsOwnedString(ExecState* exec, const UString& s) 221 { 222 return s.isNull() ? new (exec) StringImp("", StringImp::HasOtherOwner) : new (exec) StringImp(s, StringImp::HasOtherOwner); 223 223 } 224 224 225 225 // This method includes a PIC branch to set up the NumberImp's vtable, so we quarantine 226 226 // it in a separate function to keep the normal case speedy. 227 JSValue *jsNumberCell(double d)228 { 229 return new NumberImp(d);227 JSValue* jsNumberCell(ExecState* exec, double d) 228 { 229 return new (exec) NumberImp(d); 230 230 } 231 231 -
trunk/JavaScriptCore/kjs/value.h
r31208 r32807 47 47 class JSValue : Noncopyable { 48 48 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() 50 50 51 51 private: … … 126 126 127 127 class JSCell : public JSValue { 128 friend class Collector;128 friend class Heap; 129 129 friend class NumberImp; 130 130 friend class StringImp; … … 164 164 165 165 // Garbage collection. 166 void *operator new(size_t);166 void* operator new(size_t, ExecState*); 167 167 virtual void mark(); 168 168 bool marked() const; 169 169 }; 170 170 171 JSValue *jsNumberCell(double);172 173 JSCell *jsString(const UString&); // returns empty string if passed null string174 JSCell *jsString(const char* = ""); // returns empty string if passed 0171 JSValue* jsNumberCell(ExecState*, double); 172 173 JSCell* jsString(ExecState*, const UString&); // returns empty string if passed null string 174 JSCell* jsString(ExecState*, const char* = ""); // returns empty string if passed 0 175 175 176 176 // should be used for strings that are owned by an object that will 177 177 // likely outlive the JSValue this makes, such as the parse tree or a 178 178 // DOM object that contains a UString 179 JSCell *jsOwnedString(const UString&);179 JSCell* jsOwnedString(ExecState*, const UString&); 180 180 181 181 extern const double NaN; … … 192 192 } 193 193 194 inline JSValue *jsNaN()195 { 196 return jsNumberCell( NaN);194 inline JSValue* jsNaN(ExecState* exec) 195 { 196 return jsNumberCell(exec, NaN); 197 197 } 198 198 … … 202 202 } 203 203 204 ALWAYS_INLINE JSValue* jsNumber( double d)204 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, double d) 205 205 { 206 206 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 210 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, int i) 211 211 { 212 212 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 216 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned i) 217 217 { 218 218 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 222 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, long i) 223 223 { 224 224 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 228 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned long i) 229 229 { 230 230 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 234 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, long long i) 235 235 { 236 236 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 240 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned long long i) 241 241 { 242 242 JSValue* v = JSImmediate::from(i); 243 return v ? v : jsNumberCell( static_cast<double>(i));243 return v ? v : jsNumberCell(exec, static_cast<double>(i)); 244 244 } 245 245 … … 248 248 if (JSImmediate::areBothImmediateNumbers(v1, v2)) 249 249 return JSImmediate::andImmediateNumbers(v1, v2); 250 return jsNumber( v1->toInt32(exec) & v2->toInt32(exec));250 return jsNumber(exec, v1->toInt32(exec) & v2->toInt32(exec)); 251 251 } 252 252 … … 284 284 inline bool JSCell::marked() const 285 285 { 286 return Collector::isCellMarked(this);286 return Heap::isCellMarked(this); 287 287 } 288 288 289 289 inline void JSCell::mark() 290 290 { 291 return Collector::markCell(this);291 return Heap::markCell(this); 292 292 } 293 293 … … 446 446 ALWAYS_INLINE JSValue* JSValue::toJSNumber(ExecState* exec) const 447 447 { 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)); 449 449 } 450 450 -
trunk/JavaScriptCore/wtf/ThreadSpecific.h
r32000 r32807 110 110 T* ptr = static_cast<T*>(get()); 111 111 if (!ptr) { 112 ptr = new T ;112 ptr = new T(); 113 113 set(ptr); 114 114 }
Note:
See TracChangeset
for help on using the changeset viewer.